diff --git a/.eslintignore b/.eslintignore index aa378c93..309645a4 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ src/server/public/libs src/server/public/scripts/admin-compiled.js -src/server/public/scripts/template-engine-compiled.js \ No newline at end of file +src/server/public/scripts/template-engine-compiled.js +src/server/public/scripts/user-login-compiled.js \ No newline at end of file diff --git a/.gitignore b/.gitignore index 83a0b4d9..2866dcb6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules/* npm-debug.log +selenium-debug.log tasks/node_modules/* tasks/json/* tasks/npm-debug.log diff --git a/.npmignore b/.npmignore index 937b7358..bc763dc3 100644 --- a/.npmignore +++ b/.npmignore @@ -4,4 +4,5 @@ plugins/ .travis.yml .eslintrc.json .eslintignore -abe.json \ No newline at end of file +abe.json +selenium-debug.log \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 34add8e0..09995496 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,24 @@ node_js: - "5" - "6" - "7" +sudo: required +dist: trusty env: - NODE_ENV=PROD +before_install: + - export CHROME_BIN=/usr/bin/google-chrome + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - sudo apt-get update + - sudo apt-get install -y libappindicator1 fonts-liberation + - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + - sudo dpkg -i google-chrome*.deb install: - npm install +before_script: + - npm run distribute script: + - jdk_switcher use oraclejdk8 - npm run test-coveralls + - npm run test-func - npm run lint diff --git a/CHANGELOG.md b/CHANGELOG.md index 2668d833..7a6e5e0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,537 @@ +* [[`4bf5e7b129`](https://github.com/AdFabConnect/abejs/commit/4bf5e7b129)] - **ci**: simplifying nightwatch conf (gregorybesson) +* [[`33ea44f530`](https://github.com/AdFabConnect/abejs/commit/33ea44f530)] - **ci**: correct config (gregorybesson) +* [[`aca275b491`](https://github.com/AdFabConnect/abejs/commit/aca275b491)] - **ci**: trying to simplify the config 2 (gregorybesson) +* [[`7201cbd989`](https://github.com/AdFabConnect/abejs/commit/7201cbd989)] - **ci**: trying to simplify the config 2 (gregorybesson) +* [[`29f63f0fa4`](https://github.com/AdFabConnect/abejs/commit/29f63f0fa4)] - **ci**: trying to simplify the config (gregorybesson) +* [[`db8ea447ad`](https://github.com/AdFabConnect/abejs/commit/db8ea447ad)] - **ci**: adding missing directory (gregorybesson) +* [[`fea5dc8ebb`](https://github.com/AdFabConnect/abejs/commit/fea5dc8ebb)] - **ci**: demo website added (gregorybesson) +* [[`122d1b5512`](https://github.com/AdFabConnect/abejs/commit/122d1b5512)] - **ci**: removing submodule (gregorybesson) +* [[`a1ae34ac5e`](https://github.com/AdFabConnect/abejs/commit/a1ae34ac5e)] - **ci**: 6th try (gregorybesson) +* [[`f0575062fb`](https://github.com/AdFabConnect/abejs/commit/f0575062fb)] - **ci**: 5th try (gregorybesson) +* [[`8c6fb3b1e8`](https://github.com/AdFabConnect/abejs/commit/8c6fb3b1e8)] - **ci**: 4th try (gregorybesson) +* [[`7c39f11437`](https://github.com/AdFabConnect/abejs/commit/7c39f11437)] - **ci**: 3rd try (gregorybesson) +* [[`adb63b63c7`](https://github.com/AdFabConnect/abejs/commit/adb63b63c7)] - **ci**: 2nd try (gregorybesson) +* [[`7877387265`](https://github.com/AdFabConnect/abejs/commit/7877387265)] - **ci**: Functional tests 1st try (gregorybesson) +* [[`d8612b602a`](https://github.com/AdFabConnect/abejs/commit/d8612b602a)] - **ic**: linting (gregorybesson) +* [[`becbb87d53`](https://github.com/AdFabConnect/abejs/commit/becbb87d53)] - **fix**: typo (gregorybesson) +* [[`5b9fdd3164`](https://github.com/AdFabConnect/abejs/commit/5b9fdd3164)] - merge (gregorybesson) +* [[`03bbed932d`](https://github.com/AdFabConnect/abejs/commit/03bbed932d)] - **fix**: we want to protect only Abe with X-CSRF token (gregorybesson) +* [[`6f30158d5e`](https://github.com/AdFabConnect/abejs/commit/6f30158d5e)] - Merge pull request #63 from AdFabConnect/user_role_url (Greg Besson) +* [[`867b9663f7`](https://github.com/AdFabConnect/abejs/commit/867b9663f7)] - **enhancement**: add list-workflow with better explanation + bug url unpublish (nicolaslabbe) +* [[`7b9dc4a197`](https://github.com/AdFabConnect/abejs/commit/7b9dc4a197)] - Merge pull request #62 from AdFabConnect/user_role_url (Greg Besson) +* [[`143160617c`](https://github.com/AdFabConnect/abejs/commit/143160617c)] - Merge pull request #58 from AdFabConnect/bug_source_array (Greg Besson) +* [[`24ac7abcc2`](https://github.com/AdFabConnect/abejs/commit/24ac7abcc2)] - **enhancement**: user routes (nicolaslabbe) +* [[`7b364e43a6`](https://github.com/AdFabConnect/abejs/commit/7b364e43a6)] - **bug**: autocomplete display attribute (nicolaslabbe) +* [[`e919126b10`](https://github.com/AdFabConnect/abejs/commit/e919126b10)] - **bug**: autocomplete display attribute (nicolaslabbe) +* [[`23be6ba276`](https://github.com/AdFabConnect/abejs/commit/23be6ba276)] - **bug**: autocomplete display attribute (nicolaslabbe) +* [[`cd30368b56`](https://github.com/AdFabConnect/abejs/commit/cd30368b56)] - Merge pull request #57 from AdFabConnect/abe_import_variable (Greg Besson) +* [[`b89808dd74`](https://github.com/AdFabConnect/abejs/commit/b89808dd74)] - Merge pull request #60 from AdFabConnect/issue_48 (Greg Besson) +* [[`7a4db0058c`](https://github.com/AdFabConnect/abejs/commit/7a4db0058c)] - **fix**: redirect user logged if go to page login (nicolaslabbe) +* [[`b4df8f2926`](https://github.com/AdFabConnect/abejs/commit/b4df8f2926)] - **bug**: source attr (nicolaslabbe) +* [[`5381d0ac30`](https://github.com/AdFabConnect/abejs/commit/5381d0ac30)] - (nicolaslabbe) +* [[`38e50fc5b4`](https://github.com/AdFabConnect/abejs/commit/38e50fc5b4)] - **feature**: abe import with variable inside filename (nicolaslabbe) +* [[`2dc7b1f160`](https://github.com/AdFabConnect/abejs/commit/2dc7b1f160)] - **feature**: abe import with variable inside filename (nicolaslabbe) +* [[`77d5c46c45`](https://github.com/AdFabConnect/abejs/commit/77d5c46c45)] - Merge pull request #51 from AdFabConnect/issue-49 (Greg Besson) +* [[`e7502ef184`](https://github.com/AdFabConnect/abejs/commit/e7502ef184)] - **enhancement**: add alias for all cli cmd (nicolaslabbe) +* [[`749a97ab57`](https://github.com/AdFabConnect/abejs/commit/749a97ab57)] - **refactor**: cli program (nicolaslabbe) + +## [2.10.0] - 2016-11-29 +* [[`6ea79d9e40`](https://github.com/AdFabConnect/abejs/commit/6ea79d9e40)] - Merge pull request #44 from AdFabConnect/variable_abEditor (Greg Besson) +* [[`9cf608b8b9`](https://github.com/AdFabConnect/abejs/commit/9cf608b8b9)] - Merge pull request #50 from AdFabConnect/issue-46 (Greg Besson) +* [[`98ab9f557e`](https://github.com/AdFabConnect/abejs/commit/98ab9f557e)] - **Bug**: abe generate-post --thrid param bug (nicolaslabbe) +* [[`327c395b0b`](https://github.com/AdFabConnect/abejs/commit/327c395b0b)] - **UT**: fix workflow + new route + list-graph (nicolaslabbe) +* [[`1146a538e1`](https://github.com/AdFabConnect/abejs/commit/1146a538e1)] - **UT**: fix stub operations (losing coverage percent) (nicolaslabbe) +* [[`6d226f9e73`](https://github.com/AdFabConnect/abejs/commit/6d226f9e73)] - **fix**: #45 bug create same content twice (nicolaslabbe) +* [[`81bc0cca1e`](https://github.com/AdFabConnect/abejs/commit/81bc0cca1e)] - **UT**: template (stub/unstub) (nicolaslabbe) +* [[`083035c040`](https://github.com/AdFabConnect/abejs/commit/083035c040)] - **fix**: #46 bug delete (nicolaslabbe) +* [[`1a1a1751db`](https://github.com/AdFabConnect/abejs/commit/1a1a1751db)] - **Fix**: missing doc for abeEditor variable (nicolaslabbe) +* [[`1f9172b775`](https://github.com/AdFabConnect/abejs/commit/1f9172b775)] - **enhancement**: variable is editor (nicolaslabbe) +* [[`2f0cf82ef2`](https://github.com/AdFabConnect/abejs/commit/2f0cf82ef2)] - Merged branch master into fix_abe_update (nicolaslabbe) +* [[`34f5de122d`](https://github.com/AdFabConnect/abejs/commit/34f5de122d)] - **ci**: UT (gregorybesson) +* [[`8be05e9cd8`](https://github.com/AdFabConnect/abejs/commit/8be05e9cd8)] - **ci**: UT (gregorybesson) +* [[`8bee3adf8b`](https://github.com/AdFabConnect/abejs/commit/8bee3adf8b)] - **ci**: linting (gregorybesson) +* [[`4205bded17`](https://github.com/AdFabConnect/abejs/commit/4205bded17)] - **refactoring**: the display attribute ind a {{abe type=data ...}} is properly handled in any case (gregorybesson) +* [[`2d5f837779`](https://github.com/AdFabConnect/abejs/commit/2d5f837779)] - **fix**: Error was sent when no role existed (gregorybesson) +* [[`6c7e2fae9e`](https://github.com/AdFabConnect/abejs/commit/6c7e2fae9e)] - **fix**: the prefill refresh didn't had the referer path so the select was always done from data root (gregorybesson) +* [[`3f5cc06340`](https://github.com/AdFabConnect/abejs/commit/3f5cc06340)] - **ci**: linting (gregorybesson) +* [[`b04ca00d5a`](https://github.com/AdFabConnect/abejs/commit/b04ca00d5a)] - **fix**: The prefill was never triggered from the server (gregorybesson) +* [[`cb95fb03ea`](https://github.com/AdFabConnect/abejs/commit/cb95fb03ea)] - Merge pull request #39 from AdFabConnect/image-size (Greg Besson) +* [[`ad0d6a1181`](https://github.com/AdFabConnect/abejs/commit/ad0d6a1181)] - rebase from origin (wonknu10) +* [[`27b20f0b7e`](https://github.com/AdFabConnect/abejs/commit/27b20f0b7e)] - **doc**: Changelog updated to 2.9.0 (gregorybesson) + +## [2.9.0] - 2016-11-25 +* [[`18a1c66e62`](https://github.com/AdFabConnect/abejs/commit/18a1c66e62)] - Merge pull request #42 from AdFabConnect/abe-users-core (Greg Besson) +* [[`95b46008c1`](https://github.com/AdFabConnect/abejs/commit/95b46008c1)] - **fix**: missing nodemailer dep (nicolaslabbe) +* [[`949122fe3d`](https://github.com/AdFabConnect/abejs/commit/949122fe3d)] - Merge pull request #40 from AdFabConnect/abe-users-core (Greg Besson) +* [[`2e1819226d`](https://github.com/AdFabConnect/abejs/commit/2e1819226d)] - **fix**: user default authorize (nicolaslabbe) +* [[`bfa26f94e9`](https://github.com/AdFabConnect/abejs/commit/bfa26f94e9)] - **fix**: path sep for windows (wonknu10) +* [[`d0320f0af9`](https://github.com/AdFabConnect/abejs/commit/d0320f0af9)] - **fix**: path with separator for windows (wonknu10) +* [[`cf43231cfe`](https://github.com/AdFabConnect/abejs/commit/cf43231cfe)] - **fix**: bug printInput isAuthorized (nicolaslabbe) +* [[`2d89cf963b`](https://github.com/AdFabConnect/abejs/commit/2d89cf963b)] - **fix**: ut abe user (nicolaslabbe) +* [[`6a5f5b14c9`](https://github.com/AdFabConnect/abejs/commit/6a5f5b14c9)] - **UT**: fix path for window (wonknu10) +* [[`015dfc8197`](https://github.com/AdFabConnect/abejs/commit/015dfc8197)] - **fix**: user role (nicolaslabbe) +* [[`c27e94dab3`](https://github.com/AdFabConnect/abejs/commit/c27e94dab3)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs into image-size (wonknu10) + +## [2.8.4] - 2016-11-25 +* [[`bd345aea0c`](https://github.com/AdFabConnect/abejs/commit/bd345aea0c)] - **doc**: Changelog (gregorybesson) +* [[`becb7b9dee`](https://github.com/AdFabConnect/abejs/commit/becb7b9dee)] - Merge pull request #41 from AdFabConnect/fix_abe_update (Greg Besson) +* [[`454eeff71f`](https://github.com/AdFabConnect/abejs/commit/454eeff71f)] - **fix**: remove unused dependencies (nicolaslabbe) +* [[`b2b4ab0225`](https://github.com/AdFabConnect/abejs/commit/b2b4ab0225)] - **fix**: bug update admin (nicolaslabbe) +* [[`115f3d8d02`](https://github.com/AdFabConnect/abejs/commit/115f3d8d02)] - **enhancement**: abe user role (nicolaslabbe) +* [[`a86fb08f21`](https://github.com/AdFabConnect/abejs/commit/a86fb08f21)] - **UT**: test locale & editor (wonknu10) +* [[`9ff28a8784`](https://github.com/AdFabConnect/abejs/commit/9ff28a8784)] - merge from master (wonknu10) +* [[`c832732c09`](https://github.com/AdFabConnect/abejs/commit/c832732c09)] - **UT**: unit test cms media & printinput (wonknu10) +* [[`fc65b3b4ff`](https://github.com/AdFabConnect/abejs/commit/fc65b3b4ff)] - **enhancement**: invert user role (nicolaslabbe) +* [[`059ae3d762`](https://github.com/AdFabConnect/abejs/commit/059ae3d762)] - **bug**: user core (nicolaslabbe) +* [[`d2da713dad`](https://github.com/AdFabConnect/abejs/commit/d2da713dad)] - **bug**: user core (nicolaslabbe) +* [[`eac11601c8`](https://github.com/AdFabConnect/abejs/commit/eac11601c8)] - **fix**: UT handlebars (nicolaslabbe) +* [[`66249a704f`](https://github.com/AdFabConnect/abejs/commit/66249a704f)] - **fix**: UT abe user (nicolaslabbe) +* [[`37dc90fed6`](https://github.com/AdFabConnect/abejs/commit/37dc90fed6)] - **UT**: abe user (nicolaslabbe) +* [[`4eba1170d2`](https://github.com/AdFabConnect/abejs/commit/4eba1170d2)] - **fix**: don't remove User.isValid (nicolaslabbe) +* [[`d1a346d545`](https://github.com/AdFabConnect/abejs/commit/d1a346d545)] - Merged branch master into abe-users-core (nicolaslabbe) +* [[`16471183a2`](https://github.com/AdFabConnect/abejs/commit/16471183a2)] - **fix**: UT User core (nicolaslabbe) + +## [2.8.3] - 2016-11-24 +* [[`7bda2d9247`](https://github.com/AdFabConnect/abejs/commit/7bda2d9247)] - **doc**: changelog (gregorybesson) + +## [2.8.2] - 2016-11-24 +* [[`5fb32b7133`](https://github.com/AdFabConnect/abejs/commit/5fb32b7133)] - **fix**: linting (nicolaslabbe) +* [[`201e894f22`](https://github.com/AdFabConnect/abejs/commit/201e894f22)] - Merge branch 'master' (nicolaslabbe) +* [[`425b19a2c3`](https://github.com/AdFabConnect/abejs/commit/425b19a2c3)] - **UT**: user into core (nicolaslabbe) +* [[`b34b5f1c87`](https://github.com/AdFabConnect/abejs/commit/b34b5f1c87)] - Merge pull request #38 from AdFabConnect/bug-2.8.1 (Greg Besson) +* [[`0712b583fc`](https://github.com/AdFabConnect/abejs/commit/0712b583fc)] - Merge pull request #37 from marcbachmann/update-uuid (Greg Besson) +* [[`5a0b342856`](https://github.com/AdFabConnect/abejs/commit/5a0b342856)] - **enhancement**: image crop feature & refactoring upload files (wonknu10) +* [[`836379157b`](https://github.com/AdFabConnect/abejs/commit/836379157b)] - **fix**: bug abejs form multiple precontrib was selected on queryselector for structure path url (nicolaslabbe) +* [[`487d28817a`](https://github.com/AdFabConnect/abejs/commit/487d28817a)] - **fix**: tab slug autocomplete remove result glyph not visible (nicolaslabbe) +* [[`ca8528b5c6`](https://github.com/AdFabConnect/abejs/commit/ca8528b5c6)] - chore(package): update uuid to version 3.0.0 (Marc Bachmann) +* [[`092f9177bf`](https://github.com/AdFabConnect/abejs/commit/092f9177bf)] - **enhancement**: merge abe users into core (nicolaslabbe) +* [[`a0e7dccc3a`](https://github.com/AdFabConnect/abejs/commit/a0e7dccc3a)] - **enhancement**: merge abe users into core (nicolaslabbe) +* [[`38e5c731d5`](https://github.com/AdFabConnect/abejs/commit/38e5c731d5)] - **enhancement**: merge abe users into core (nicolaslabbe) +* [[`20c0d7d7e2`](https://github.com/AdFabConnect/abejs/commit/20c0d7d7e2)] - (nicolaslabbe) +* [[`e416161d0a`](https://github.com/AdFabConnect/abejs/commit/e416161d0a)] - **enhancement**: merge abe users into core (nicolaslabbe) +* [[`3e310d4658`](https://github.com/AdFabConnect/abejs/commit/3e310d4658)] - Merged branch master into master (nicolaslabbe) +* [[`a2d35c301b`](https://github.com/AdFabConnect/abejs/commit/a2d35c301b)] - **enhancement**: merge abe users into core (nicolaslabbe) +* [[`75b643bc40`](https://github.com/AdFabConnect/abejs/commit/75b643bc40)] - **doc**: changelog (gregorybesson) + +## [2.8.1] - 2016-11-21 + +## [2.8.0] - 2016-11-21 +* [[`97e96b0f09`](https://github.com/AdFabConnect/abejs/commit/97e96b0f09)] - **ci**: linting (gregorybesson) +* [[`82641aa647`](https://github.com/AdFabConnect/abejs/commit/82641aa647)] - Merge branch 'master' of https://github.com/adfabconnect/abejs (gregorybesson) +* [[`1e2d241bb8`](https://github.com/AdFabConnect/abejs/commit/1e2d241bb8)] - **refactoring**: New plugin system implemented (gregorybesson) +* [[`7ee59718e4`](https://github.com/AdFabConnect/abejs/commit/7ee59718e4)] - **fix**: broken link abe doc (nicolaslabbe) +* [[`b18dd4b9b3`](https://github.com/AdFabConnect/abejs/commit/b18dd4b9b3)] - Update doc for abe type and attribute (nicolaslabbe) +* [[`5a58775fe6`](https://github.com/AdFabConnect/abejs/commit/5a58775fe6)] - **doc**: abe type slug (nicolaslabbe) +* [[`8e9656db3b`](https://github.com/AdFabConnect/abejs/commit/8e9656db3b)] - Update README.md (Greg Besson) +* [[`2d02a26a1b`](https://github.com/AdFabConnect/abejs/commit/2d02a26a1b)] - Update README.md (Greg Besson) +* [[`f0b8f0bacd`](https://github.com/AdFabConnect/abejs/commit/f0b8f0bacd)] - **bug**: add watch partials forlder since enhancement (nicolaslabbe) + +## [2.7.8] - 2016-11-18 +* [[`bd1e4a8c6d`](https://github.com/AdFabConnect/abejs/commit/bd1e4a8c6d)] - **fix**: bug autocomplete (nicolaslabbe) +* [[`727f6a5474`](https://github.com/AdFabConnect/abejs/commit/727f6a5474)] - **fix**: bug autocomplete (nicolaslabbe) +* [[`9c8356108c`](https://github.com/AdFabConnect/abejs/commit/9c8356108c)] - **enhancement**: select autocomplete (nicolaslabbe) +* [[`b853a022cf`](https://github.com/AdFabConnect/abejs/commit/b853a022cf)] - Merged branch master into master (nicolaslabbe) +* [[`21686b8bf8`](https://github.com/AdFabConnect/abejs/commit/21686b8bf8)] - **fix**: autocomplete after precontribution enhancement (nicolaslabbe) + +## [2.7.7] - 2016-11-18 + +## [2.7.6] - 2016-11-18 + +## [2.7.5] - 2016-11-18 +* [[`b2a603df0a`](https://github.com/AdFabConnect/abejs/commit/b2a603df0a)] - **enhancement**: Add gig mimetype to upload files (gregorybesson) +* [[`b213dddb89`](https://github.com/AdFabConnect/abejs/commit/b213dddb89)] - Merged branch master into master (nicolaslabbe) +* [[`cdc98122e6`](https://github.com/AdFabConnect/abejs/commit/cdc98122e6)] - **enhancement**: look & feel precontrib (wonknu10) +* [[`6507abc0c1`](https://github.com/AdFabConnect/abejs/commit/6507abc0c1)] - Merged branch master into master (nicolaslabbe) +* [[`5f11f38cfa`](https://github.com/AdFabConnect/abejs/commit/5f11f38cfa)] - **enhancement**: autcomplete multiple display (nicolaslabbe) + +## [2.7.4] - 2016-11-17 +* [[`98e2501fde`](https://github.com/AdFabConnect/abejs/commit/98e2501fde)] - **fix**: unit test for partials (wonknu10) +* [[`fa6f7181b2`](https://github.com/AdFabConnect/abejs/commit/fa6f7181b2)] - **fix**: abe-locale with config to override default value (wonknu10) + +## [2.7.3] - 2016-11-17 +* [[`dbd5017098`](https://github.com/AdFabConnect/abejs/commit/dbd5017098)] - **refactoring**: moving partials inside root folder (wonknu10) +* [[`cac32e9661`](https://github.com/AdFabConnect/abejs/commit/cac32e9661)] - **bug**: precontrib plugin (nicolaslabbe) +* [[`0952eef7ee`](https://github.com/AdFabConnect/abejs/commit/0952eef7ee)] - **fix**: bug lock create when saving (nicolaslabbe) +* [[`bd41b84094`](https://github.com/AdFabConnect/abejs/commit/bd41b84094)] - **bug**: remove return (nicolaslabbe) +* [[`c6a999af0d`](https://github.com/AdFabConnect/abejs/commit/c6a999af0d)] - **fix**: bug leve-1 level-2 (nicolaslabbe) +* [[`21b9bbfbc7`](https://github.com/AdFabConnect/abejs/commit/21b9bbfbc7)] - **fix**: bug precontribution 33 (nicolaslabbe) +* [[`5ff82a3159`](https://github.com/AdFabConnect/abejs/commit/5ff82a3159)] - **fix**: precontribution 33 (nicolaslabbe) +* [[`5f12f591ae`](https://github.com/AdFabConnect/abejs/commit/5f12f591ae)] - **refactoring**: precontribution 33 (nicolaslabbe) +* [[`46c1b56916`](https://github.com/AdFabConnect/abejs/commit/46c1b56916)] - **fix**: UT #33 (nicolaslabbe) +* [[`a87f839271`](https://github.com/AdFabConnect/abejs/commit/a87f839271)] - **enhancement**: precontribution 33 (nicolaslabbe) +* [[`e58be0e4c7`](https://github.com/AdFabConnect/abejs/commit/e58be0e4c7)] - **enhancement**: precontribution 33 (nicolaslabbe) +* [[`ffc493083a`](https://github.com/AdFabConnect/abejs/commit/ffc493083a)] - **refactor**: precontrib (nicolaslabbe) +* [[`3d58fe80d0`](https://github.com/AdFabConnect/abejs/commit/3d58fe80d0)] - **fix**: sql request where no where attribute (nicolaslabbe) +* [[`85655519dc`](https://github.com/AdFabConnect/abejs/commit/85655519dc)] - **fix**: manager update selected template (nicolaslabbe) +* [[`87159f2c6d`](https://github.com/AdFabConnect/abejs/commit/87159f2c6d)] - **fix**: precontrib handlebars variable inside string & id level folder (wonknu10) +* [[`5bf7e4101a`](https://github.com/AdFabConnect/abejs/commit/5bf7e4101a)] - **fix**: precontrib (same tag in diffrentes templates) (wonknu10) +* [[`8538893784`](https://github.com/AdFabConnect/abejs/commit/8538893784)] - Merged branch master into master (wonknu10) +* [[`a2a0cd5a8e`](https://github.com/AdFabConnect/abejs/commit/a2a0cd5a8e)] - **feature**: precontrib for template (nicolaslabbe) +* [[`38a91bc0f7`](https://github.com/AdFabConnect/abejs/commit/38a91bc0f7)] - Merged branch master into master (nicolaslabbe) +* [[`e7f847a409`](https://github.com/AdFabConnect/abejs/commit/e7f847a409)] - **feature**: precontrib for templates (nicolaslabbe) + +## [2.7.2] - 2016-11-15 +* [[`e839e75503`](https://github.com/AdFabConnect/abejs/commit/e839e75503)] - **fix**: duplicate new file name is not slugified (wonknu10) +* [[`3864a14401`](https://github.com/AdFabConnect/abejs/commit/3864a14401)] - hide folder if no structure on precontrib (nicolaslabbe) + +## [2.7.1] - 2016-11-15 + +## [2.7.0] - 2016-11-15 +* [[`e6d53b6301`](https://github.com/AdFabConnect/abejs/commit/e6d53b6301)] - add abe precontrib doc (nicolaslabbe) +* [[`0067ae59bd`](https://github.com/AdFabConnect/abejs/commit/0067ae59bd)] - Merged branch master into master (nicolaslabbe) +* [[`1758a31bf7`](https://github.com/AdFabConnect/abejs/commit/1758a31bf7)] - default precontrib (nicolaslabbe) +* [[`a92ebbacd9`](https://github.com/AdFabConnect/abejs/commit/a92ebbacd9)] - Fake build (gregorybesson) +* [[`070f82695d`](https://github.com/AdFabConnect/abejs/commit/070f82695d)] - fix hook abe (nicolaslabbe) +* [[`c0b7e33a98`](https://github.com/AdFabConnect/abejs/commit/c0b7e33a98)] - **bug**: precontrib editor variable (nicolaslabbe) +* [[`0dcc554541`](https://github.com/AdFabConnect/abejs/commit/0dcc554541)] - **Feature**: precontrib bug update and duplicate (nicolaslabbe) +* [[`2980fc3751`](https://github.com/AdFabConnect/abejs/commit/2980fc3751)] - Merged precontrib into master (nicolaslabbe) +* [[`23f1687fa7`](https://github.com/AdFabConnect/abejs/commit/23f1687fa7)] - **feature**: precontrib (nicolaslabbe) +* [[`4b73fdb22b`](https://github.com/AdFabConnect/abejs/commit/4b73fdb22b)] - Merged master into precontrib (nicolaslabbe) + +## [2.6.9] - 2016-11-10 +* [[`e27d9ce82e`](https://github.com/AdFabConnect/abejs/commit/e27d9ce82e)] - Merged branch master into master (nicolaslabbe) +* [[`b1ff134883`](https://github.com/AdFabConnect/abejs/commit/b1ff134883)] - **fix**: abe install on windows (nicolaslabbe) +* [[`e72c9bbed2`](https://github.com/AdFabConnect/abejs/commit/e72c9bbed2)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (wonknu10) +* [[`51344ef48e`](https://github.com/AdFabConnect/abejs/commit/51344ef48e)] - Feature precontrib (nicolaslabbe) +* [[`a08d6895f3`](https://github.com/AdFabConnect/abejs/commit/a08d6895f3)] - **Fix**: abeUrl with status prefix (nicolaslabbe) + +## [2.6.8] - 2016-11-9 +* [[`7af6620c4c`](https://github.com/AdFabConnect/abejs/commit/7af6620c4c)] - **fix**: hook beforefirstsave, filepath is never used (wonknu10) + +## [2.6.7] - 2016-11-8 +* [[`fee529b089`](https://github.com/AdFabConnect/abejs/commit/fee529b089)] - **fix**: json is not updt when abe attribut inside bloc each has reload=true (wonknu10) +* [[`f64c6ed10f`](https://github.com/AdFabConnect/abejs/commit/f64c6ed10f)] - missing error log inside handlebar abe helper (wonknu10) +* [[`52d1c6c1ed`](https://github.com/AdFabConnect/abejs/commit/52d1c6c1ed)] - Merge pull request #25 from AdFabConnect/refactor_save_action (Labbé nicolas) +* [[`6ed093d266`](https://github.com/AdFabConnect/abejs/commit/6ed093d266)] - **Bug**: url absolute (nicolaslabbe) +* [[`c89a077b75`](https://github.com/AdFabConnect/abejs/commit/c89a077b75)] - **UT**: fix operations (nicolaslabbe) +* [[`ae2dd42ce6`](https://github.com/AdFabConnect/abejs/commit/ae2dd42ce6)] - Merge remote-tracking branch 'refs/remotes/origin/master' (nicolaslabbe) +* [[`260c629c43`](https://github.com/AdFabConnect/abejs/commit/260c629c43)] - **UT**: refactor save (nicolaslabbe) + +## [2.6.6] - 2016-11-7 +* [[`6da4337995`](https://github.com/AdFabConnect/abejs/commit/6da4337995)] - **fix**: update file + UT + other bugs (gregorybesson) +* [[`ba0eeac087`](https://github.com/AdFabConnect/abejs/commit/ba0eeac087)] - **UT**: cms operations (nicolaslabbe) +* [[`8aca564167`](https://github.com/AdFabConnect/abejs/commit/8aca564167)] - refactor unpublis (nicolaslabbe) + +## [2.6.5] - 2016-11-7 +* [[`bcef172ee9`](https://github.com/AdFabConnect/abejs/commit/bcef172ee9)] - Merge remote-tracking branch 'refs/remotes/origin/master' (nicolaslabbe) +* [[`5a74115bc8`](https://github.com/AdFabConnect/abejs/commit/5a74115bc8)] - **refactor**: save (nicolaslabbe) +* [[`7fb6c55c1a`](https://github.com/AdFabConnect/abejs/commit/7fb6c55c1a)] - win build status (Greg Besson) +* [[`a10e79e3ef`](https://github.com/AdFabConnect/abejs/commit/a10e79e3ef)] - **fix**: outdated dependencies (gregorybesson) +* [[`45f3da7882`](https://github.com/AdFabConnect/abejs/commit/45f3da7882)] - heroku button (Greg Besson) +* [[`f00a9a0cbc`](https://github.com/AdFabConnect/abejs/commit/f00a9a0cbc)] - **fix**: Windows filesystem (gregorybesson) +* [[`43463a34e4`](https://github.com/AdFabConnect/abejs/commit/43463a34e4)] - heroku deployment (gregorybesson) +* [[`7f643067c8`](https://github.com/AdFabConnect/abejs/commit/7f643067c8)] - fix UT config on Windows (gregorybesson) +* [[`489b9907b9`](https://github.com/AdFabConnect/abejs/commit/489b9907b9)] - **fix**: Windows create/duplicate post (gregorybesson) +* [[`05df009db1`](https://github.com/AdFabConnect/abejs/commit/05df009db1)] - **fix**: reverting to previous version b/c refactoring in progress from nlabbe (gregorybesson) +* [[`542b3679b4`](https://github.com/AdFabConnect/abejs/commit/542b3679b4)] - **fix**: linting (gregorybesson) +* [[`82a86735b4`](https://github.com/AdFabConnect/abejs/commit/82a86735b4)] - **fix**: linting (gregorybesson) +* [[`ad4939b631`](https://github.com/AdFabConnect/abejs/commit/ad4939b631)] - **fix**: windows bug getting file paths (gregorybesson) +* [[`a9f4321b2e`](https://github.com/AdFabConnect/abejs/commit/a9f4321b2e)] - **refactoring**: Add CI on windows (gregorybesson) +* [[`e389aea9aa`](https://github.com/AdFabConnect/abejs/commit/e389aea9aa)] - Merged branch master into master (wonknu10) +* [[`6a1b158330`](https://github.com/AdFabConnect/abejs/commit/6a1b158330)] - **fix**: iframe onload in firefox && retrieve cookie editor width server (wonknu10) +* [[`a775e9eab0`](https://github.com/AdFabConnect/abejs/commit/a775e9eab0)] - **Refactor**: remove slugify url on save because create alread do it (nicolaslabbe) +* [[`04e0b60804`](https://github.com/AdFabConnect/abejs/commit/04e0b60804)] - **Refactor**: remove Page._addSource because requestList do the same if request is editable (nicolaslabbe) +* [[`85242da082`](https://github.com/AdFabConnect/abejs/commit/85242da082)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (Mikael Lharidon) +* [[`13de0b21a4`](https://github.com/AdFabConnect/abejs/commit/13de0b21a4)] - **fix**: Under Windows Abe wasn't able to parse structure dir (Mikael Lharidon) +* [[`02f1a312dc`](https://github.com/AdFabConnect/abejs/commit/02f1a312dc)] - **fix**: Windows bug (Mikael Lharidon) + +## [2.6.4] - 2016-11-4 +* [[`cc6caa8277`](https://github.com/AdFabConnect/abejs/commit/cc6caa8277)] - test if iframe is loaded if not init onload event (wonknu10) + +## [2.6.3] - 2016-11-4 + +## [2.6.2] - 2016-11-4 +* [[`6253c16a5b`](https://github.com/AdFabConnect/abejs/commit/6253c16a5b)] - Merged branch master into master (nicolaslabbe) +* [[`6609a1bab9`](https://github.com/AdFabConnect/abejs/commit/6609a1bab9)] - remove publish-all / update-json and now use generate-post (nicolaslabbe) +* [[`4c6624a488`](https://github.com/AdFabConnect/abejs/commit/4c6624a488)] - **fix**: iframe onload event before inject iframe (wonknu10) + +## [2.6.1] - 2016-11-3 +* [[`12fb759a60`](https://github.com/AdFabConnect/abejs/commit/12fb759a60)] - **bug**: 2.6.0 plugin url getFoldersSync (nicolaslabbe) + +## [2.6.0] - 2016-11-3 +* [[`30a426f137`](https://github.com/AdFabConnect/abejs/commit/30a426f137)] - isTrue HBS helper tested (gregorybesson) +* [[`6cfb010e18`](https://github.com/AdFabConnect/abejs/commit/6cfb010e18)] - **fix**: update was not working properly (gregorybesson) +* [[`a00f3dbfae`](https://github.com/AdFabConnect/abejs/commit/a00f3dbfae)] - **fix**: update was not working properly (gregorybesson) +* [[`f4ef59df19`](https://github.com/AdFabConnect/abejs/commit/f4ef59df19)] - editor reload for v2.6.0 (nicolaslabbe) +* [[`5a20086eaa`](https://github.com/AdFabConnect/abejs/commit/5a20086eaa)] - fix CI on OSX (gregorybesson) +* [[`c945dfd13b`](https://github.com/AdFabConnect/abejs/commit/c945dfd13b)] - **refactoring**: atomic remove object from Manager list (gregorybesson) +* [[`46dcf2b94e`](https://github.com/AdFabConnect/abejs/commit/46dcf2b94e)] - fix UT (gregorybesson) +* [[`c1064f7107`](https://github.com/AdFabConnect/abejs/commit/c1064f7107)] - **fix**: lint (gregorybesson) +* [[`352554fbce`](https://github.com/AdFabConnect/abejs/commit/352554fbce)] - **fix**: wrong date + wrong revisions in Manager files (gregorybesson) +* [[`beada9b665`](https://github.com/AdFabConnect/abejs/commit/beada9b665)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`c825726a39`](https://github.com/AdFabConnect/abejs/commit/c825726a39)] - **refactoring**: removing dead code (gregorybesson) +* [[`552101e079`](https://github.com/AdFabConnect/abejs/commit/552101e079)] - Merge pull request #21 from AdFabConnect/reference-editor (Greg Besson) +* [[`2d0a061fef`](https://github.com/AdFabConnect/abejs/commit/2d0a061fef)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs into reference-editor (wonknu10) +* [[`429a0d501a`](https://github.com/AdFabConnect/abejs/commit/429a0d501a)] - **fix**: lint (gregorybesson) +* [[`49f328640e`](https://github.com/AdFabConnect/abejs/commit/49f328640e)] - **fix**: UT (gregorybesson) +* [[`307302db85`](https://github.com/AdFabConnect/abejs/commit/307302db85)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`51cb957186`](https://github.com/AdFabConnect/abejs/commit/51cb957186)] - **refactoring**: UT + incremental update of the list in Manager FIRST PART (gregorybesson) +* [[`7482d1c298`](https://github.com/AdFabConnect/abejs/commit/7482d1c298)] - remove log (wonknu10) +* [[`ff987f017c`](https://github.com/AdFabConnect/abejs/commit/ff987f017c)] - reference editor - lint && unit test (wonknu10) +* [[`e1b53fe264`](https://github.com/AdFabConnect/abejs/commit/e1b53fe264)] - lint reference editor (wonknu10) +* [[`f1bcc6fc9e`](https://github.com/AdFabConnect/abejs/commit/f1bcc6fc9e)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs into reference-editor (wonknu10) +* [[`8c3a140a9f`](https://github.com/AdFabConnect/abejs/commit/8c3a140a9f)] - refactor reference editor (wonknu10) +* [[`3ff50b1524`](https://github.com/AdFabConnect/abejs/commit/3ff50b1524)] - **refactoring**: Remove any reference to WEBPORT #12 (nicolaslabbe) +* [[`0a069937ea`](https://github.com/AdFabConnect/abejs/commit/0a069937ea)] - **bug**: \[Refill feature\] Bug on reload after a refill #19 (nicolaslabbe) +* [[`a1b69c41a8`](https://github.com/AdFabConnect/abejs/commit/a1b69c41a8)] - **bug**: missing res.sent mine type (nicolaslabbe) +* [[`d04667229c`](https://github.com/AdFabConnect/abejs/commit/d04667229c)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs into reference-editor (wonknu10) +* [[`0fd50e9b95`](https://github.com/AdFabConnect/abejs/commit/0fd50e9b95)] - **bug**: Path must be a string use folder.path instead of folder (nicolaslabbe) +* [[`7deabd4b88`](https://github.com/AdFabConnect/abejs/commit/7deabd4b88)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs into reference-editor (wonknu10) +* [[`37b38bd5c2`](https://github.com/AdFabConnect/abejs/commit/37b38bd5c2)] - zip cleanup reference feature (wonknu10) +* [[`e748129a79`](https://github.com/AdFabConnect/abejs/commit/e748129a79)] - **refactoring**: removing dead code (gregorybesson) +* [[`9f8ab87a5e`](https://github.com/AdFabConnect/abejs/commit/9f8ab87a5e)] - **fix**: structure display (gregorybesson) +* [[`527c72dab3`](https://github.com/AdFabConnect/abejs/commit/527c72dab3)] - **refactoring**: removing cleanNameNoExt from the code (gregorybesson) +* [[`00725d593b`](https://github.com/AdFabConnect/abejs/commit/00725d593b)] - **fix**: linting (gregorybesson) +* [[`830b487661`](https://github.com/AdFabConnect/abejs/commit/830b487661)] - **refactoring**: at last, cmsData getFiles() and read() have been killed. SoC (gregorybesson) +* [[`de94f88def`](https://github.com/AdFabConnect/abejs/commit/de94f88def)] - refactoring; uses coreUtils.file.getFilesSync (gregorybesson) +* [[`88fa0f375b`](https://github.com/AdFabConnect/abejs/commit/88fa0f375b)] - refactoring; uses coreUtils.file.getFilesSync (gregorybesson) +* [[`5e2b93ac58`](https://github.com/AdFabConnect/abejs/commit/5e2b93ac58)] - refactoring; remove.js uses coreUtils.file.getFilesSync (gregorybesson) +* [[`930790a3d3`](https://github.com/AdFabConnect/abejs/commit/930790a3d3)] - refactoring; refining template.js (gregorybesson) +* [[`a1f32ae6fb`](https://github.com/AdFabConnect/abejs/commit/a1f32ae6fb)] - **fix**: lint (gregorybesson) +* [[`24a602a687`](https://github.com/AdFabConnect/abejs/commit/24a602a687)] - refactoring; refining getStructureAndTemplates (gregorybesson) +* [[`e89f078988`](https://github.com/AdFabConnect/abejs/commit/e89f078988)] - **refactoring**: plugins do use core sync getFiles (gregorybesson) +* [[`c1e414fb58`](https://github.com/AdFabConnect/abejs/commit/c1e414fb58)] - **fix**: linting (gregorybesson) +* [[`a20d6f8635`](https://github.com/AdFabConnect/abejs/commit/a20d6f8635)] - **refactoring**: Parsing files and directories is a core feature (gregorybesson) +* [[`16cfcff994`](https://github.com/AdFabConnect/abejs/commit/16cfcff994)] - **fix**: linting (gregorybesson) +* [[`9558c1d896`](https://github.com/AdFabConnect/abejs/commit/9558c1d896)] - **fix**: linting (gregorybesson) +* [[`07f85dbf71`](https://github.com/AdFabConnect/abejs/commit/07f85dbf71)] - **refactoring**: change lib promise to adopt bluebird + asynhcornous getFiles in coreUtils (gregorybesson) +* [[`a05f1c2660`](https://github.com/AdFabConnect/abejs/commit/a05f1c2660)] - **refactoring**: UT done now on node4, 5, 6 & 7 (gregorybesson) +* [[`8f9eebf9eb`](https://github.com/AdFabConnect/abejs/commit/8f9eebf9eb)] - bug move assets (nicolaslabbe) +* [[`e229ade60f`](https://github.com/AdFabConnect/abejs/commit/e229ade60f)] - **fix**: editor is visible on page editing when hitting manager button (wonknu10) +* [[`7fce2e1bd6`](https://github.com/AdFabConnect/abejs/commit/7fce2e1bd6)] - editor for json references (wonknu10) +* [[`604b53381b`](https://github.com/AdFabConnect/abejs/commit/604b53381b)] - Merged branch master into master (nicolaslabbe) +* [[`40cc426d69`](https://github.com/AdFabConnect/abejs/commit/40cc426d69)] - change url abe (nicolaslabbe) +* [[`b212c30934`](https://github.com/AdFabConnect/abejs/commit/b212c30934)] - Update abe-handlebars-helpers.md (Greg Besson) +* [[`b0befef706`](https://github.com/AdFabConnect/abejs/commit/b0befef706)] - **fix**: linting (gregorybesson) +* [[`d41ae86d5d`](https://github.com/AdFabConnect/abejs/commit/d41ae86d5d)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`563ef7182b`](https://github.com/AdFabConnect/abejs/commit/563ef7182b)] - **features**: 2 new HBS helpers available - lowercase and uppercase (gregorybesson) +* [[`7b5fbfccce`](https://github.com/AdFabConnect/abejs/commit/7b5fbfccce)] - bug post page reload (/abe/post/*) (nicolaslabbe) +* [[`c89dcf5394`](https://github.com/AdFabConnect/abejs/commit/c89dcf5394)] - **refactor**: url /abe/ (nicolaslabbe) +* [[`3606af2546`](https://github.com/AdFabConnect/abejs/commit/3606af2546)] - **bug**: filePath != null (nicolaslabbe) +* [[`73b8dca25a`](https://github.com/AdFabConnect/abejs/commit/73b8dca25a)] - **bug**: editor html (nicolaslabbe) +* [[`75e460e50c`](https://github.com/AdFabConnect/abejs/commit/75e460e50c)] - **bug**: duplicate (nicolaslabbe) +* [[`76f6e45955`](https://github.com/AdFabConnect/abejs/commit/76f6e45955)] - **bug**: duplicate filename (nicolaslabbe) +* [[`e190d84ae6`](https://github.com/AdFabConnect/abejs/commit/e190d84ae6)] - **refactor**: remove logs + bug: on create (nicolaslabbe) +* [[`59e7815c85`](https://github.com/AdFabConnect/abejs/commit/59e7815c85)] - Merge remote-tracking branch 'refs/remotes/origin/master' (nicolaslabbe) +* [[`7de1681bca`](https://github.com/AdFabConnect/abejs/commit/7de1681bca)] - **fix**: Compatibility with Node 4.* : \[TypeError: fileCurrentLevel.includes is not a function\] (gregorybesson) +* [[`e08268eb88`](https://github.com/AdFabConnect/abejs/commit/e08268eb88)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`4712307e7e`](https://github.com/AdFabConnect/abejs/commit/4712307e7e)] - **fix**: Missing lib which generate a bug when under Node v4.* (gregorybesson) + +## [2.5.25] - 2016-10-27 +* [[`8b56e2d17c`](https://github.com/AdFabConnect/abejs/commit/8b56e2d17c)] - **fix**: FireFox - button remove bloc each not working (wonknu10) + +## [2.5.24] - 2016-10-27 +* [[`add38e7dd1`](https://github.com/AdFabConnect/abejs/commit/add38e7dd1)] - **fix**: missing /abe/ in url path (wonknu10) +* [[`c492ab8363`](https://github.com/AdFabConnect/abejs/commit/c492ab8363)] - Merged branch master into master (nicolaslabbe) +* [[`6ae83d9c1b`](https://github.com/AdFabConnect/abejs/commit/6ae83d9c1b)] - change all abe url (nicolaslabbe) + +## [2.5.23] - 2016-10-26 +* [[`7bd93e7dfb`](https://github.com/AdFabConnect/abejs/commit/7bd93e7dfb)] - **fix**: css class status after save don't update (wonknu10) +* [[`ecf81aba98`](https://github.com/AdFabConnect/abejs/commit/ecf81aba98)] - **fix**: lint (gregorybesson) +* [[`b6a5829a95`](https://github.com/AdFabConnect/abejs/commit/b6a5829a95)] - **bug**: manager close icon not displaying (nicolaslabbe) +* [[`f3f35b12ef`](https://github.com/AdFabConnect/abejs/commit/f3f35b12ef)] - **feature**: abe url under /abe/ (nicolaslabbe) + +## [2.5.22] - 2016-10-25 +* [[`b8ce329b72`](https://github.com/AdFabConnect/abejs/commit/b8ce329b72)] - patch on delete (nicolaslabbe) + +## [2.5.21] - 2016-10-25 + +## [2.5.20] - 2016-10-25 +* [[`42be777385`](https://github.com/AdFabConnect/abejs/commit/42be777385)] - **fix**: linting (gregorybesson) +* [[`35fd3e688b`](https://github.com/AdFabConnect/abejs/commit/35fd3e688b)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`b68ae8803b`](https://github.com/AdFabConnect/abejs/commit/b68ae8803b)] - fix lint + test (nicolaslabbe) +* [[`3b09fadecb`](https://github.com/AdFabConnect/abejs/commit/3b09fadecb)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`3da7022484`](https://github.com/AdFabConnect/abejs/commit/3da7022484)] - **fix**: relative static files in Abe are now accepted (gregorybesson) +* [[`7c5d193ec7`](https://github.com/AdFabConnect/abejs/commit/7c5d193ec7)] - refactor save (nicolaslabbe) +* [[`e013378e2a`](https://github.com/AdFabConnect/abejs/commit/e013378e2a)] - **fix**: coveralls bug due to missing lib (gregorybesson) +* [[`2e8f58e059`](https://github.com/AdFabConnect/abejs/commit/2e8f58e059)] - **fix**: coveralls bug due to missing lib (gregorybesson) +* [[`76c752aa2a`](https://github.com/AdFabConnect/abejs/commit/76c752aa2a)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`5cf811598c`](https://github.com/AdFabConnect/abejs/commit/5cf811598c)] - **fix**: package.json fixes (gregorybesson) +* [[`c642ba55e9`](https://github.com/AdFabConnect/abejs/commit/c642ba55e9)] - **bug**: Status DRAFT displayed in the manager (nicolaslabbe) + +## [2.5.19] - 2016-10-20 +* [[`3a14847def`](https://github.com/AdFabConnect/abejs/commit/3a14847def)] - Merged branch master into master (nicolaslabbe) + +## [2.5.18] - 2016-10-20 +* [[`1013c2844f`](https://github.com/AdFabConnect/abejs/commit/1013c2844f)] - **bug**: remove .lock file when abe restart to unlock processes (nicolaslabbe) +* [[`97115021c9`](https://github.com/AdFabConnect/abejs/commit/97115021c9)] - **fix**: FireFox srcElement not working #17 (wonknu10) +* [[`6325056e87`](https://github.com/AdFabConnect/abejs/commit/6325056e87)] - Merged branch master into master (wonknu10) +* [[`dab606430a`](https://github.com/AdFabConnect/abejs/commit/dab606430a)] - **fix**: editor scrollbar not working (window 7 / Firefox) (wonknu10) + +## [2.5.17] - 2016-10-20 +* [[`36e6c1dfee`](https://github.com/AdFabConnect/abejs/commit/36e6c1dfee)] - Merged branch master into master (nicolaslabbe) +* [[`e02f0b2035`](https://github.com/AdFabConnect/abejs/commit/e02f0b2035)] - **bug**: process fork lock file (nicolaslabbe) +* [[`e641b0e296`](https://github.com/AdFabConnect/abejs/commit/e641b0e296)] - **fix**: allow file upload with uppercase extensions (wonknu10) +* [[`1a86cff162`](https://github.com/AdFabConnect/abejs/commit/1a86cff162)] - Merged branch master into master (wonknu10) +* [[`e9c22bffbf`](https://github.com/AdFabConnect/abejs/commit/e9c22bffbf)] - Node version 4 added (gregorybesson) + +## [2.5.16] - 2016-10-19 +* [[`5136378556`](https://github.com/AdFabConnect/abejs/commit/5136378556)] - Merged branch master into master (wonknu10) +* [[`da00c4d547`](https://github.com/AdFabConnect/abejs/commit/da00c4d547)] - **fix**: reject page not working (wonknu10) +* [[`b1fdb8e111`](https://github.com/AdFabConnect/abejs/commit/b1fdb8e111)] - Merged branch master into master (nicolaslabbe) +* [[`8a8b52880c`](https://github.com/AdFabConnect/abejs/commit/8a8b52880c)] - **bug**: Update fonction KO (v 2.5.15) (nicolaslabbe) + +## [2.5.15] - 2016-10-19 +* [[`beef905b8c`](https://github.com/AdFabConnect/abejs/commit/beef905b8c)] - **fix**: sql without where clause always return an empty result (wonknu10) +* [[`113fbc0f0a`](https://github.com/AdFabConnect/abejs/commit/113fbc0f0a)] - **fix**: new button available in the manager (gregorybesson) +* [[`4a5b494719`](https://github.com/AdFabConnect/abejs/commit/4a5b494719)] - UT fix (gregorybesson) +* [[`93e9a7a617`](https://github.com/AdFabConnect/abejs/commit/93e9a7a617)] - linting (gregorybesson) +* [[`fd73879e4d`](https://github.com/AdFabConnect/abejs/commit/fd73879e4d)] - **refactoring**: SoC - The manager is the one responsible of the Abe env (gregorybesson) +* [[`e5393a2cde`](https://github.com/AdFabConnect/abejs/commit/e5393a2cde)] - fix #7 (gregorybesson) +* [[`7cdd5aa96e`](https://github.com/AdFabConnect/abejs/commit/7cdd5aa96e)] - force add structure (nicolaslabbe) +* [[`5f0748fe77`](https://github.com/AdFabConnect/abejs/commit/5f0748fe77)] - fix ut but possible memory leaks (nicolaslabbe) +* [[`ce2d56f93d`](https://github.com/AdFabConnect/abejs/commit/ce2d56f93d)] - remove console logs (nicolaslabbe) +* [[`3e1e2e7119`](https://github.com/AdFabConnect/abejs/commit/3e1e2e7119)] - watch structure folder (nicolaslabbe) + +## [2.5.14] - 2016-10-18 +* [[`f3adac77dc`](https://github.com/AdFabConnect/abejs/commit/f3adac77dc)] - **Bug**: template not update (nicolaslabbe) +* [[`139fece0c1`](https://github.com/AdFabConnect/abejs/commit/139fece0c1)] - **bug**: prefill (nicolaslabbe) +* [[`641f012252`](https://github.com/AdFabConnect/abejs/commit/641f012252)] - auto deploy on Heroku (gregorybesson) +* [[`17b91734b1`](https://github.com/AdFabConnect/abejs/commit/17b91734b1)] - **fix**: fix linting (gregorybesson) + +## [2.5.13] - 2016-10-17 +* [[`64dc818057`](https://github.com/AdFabConnect/abejs/commit/64dc818057)] - **refactoring**: Reject action put in the lib (gregorybesson) +* [[`5926db146e`](https://github.com/AdFabConnect/abejs/commit/5926db146e)] - **refactoring**: Reject action put in the lib (gregorybesson) +* [[`72dc975863`](https://github.com/AdFabConnect/abejs/commit/72dc975863)] - **refactoring**: Publish action returns to the lib (gregorybesson) +* [[`ce82d121fa`](https://github.com/AdFabConnect/abejs/commit/ce82d121fa)] - **fix**: improper json found in case when the same name of document did exist in mny place (/data/index.json and /data/anotherdir/index.json) (gregorybesson) + +## [2.5.12] - 2016-10-13 +* [[`b0e21e6a0c`](https://github.com/AdFabConnect/abejs/commit/b0e21e6a0c)] - **fix**: upload image when file is to big - header was sent two time (wonknu10) +* [[`d93bbfdfa0`](https://github.com/AdFabConnect/abejs/commit/d93bbfdfa0)] - **fix**: rm duplicate handlebars helper doc (wonknu10) + +## [2.5.11] - 2016-10-13 +* [[`261c712da7`](https://github.com/AdFabConnect/abejs/commit/261c712da7)] - **feature**: handlebarsJS helper raw (ommit compile server side) (wonknu10) + +## [2.5.10] - 2016-10-12 +* [[`56a78de90f`](https://github.com/AdFabConnect/abejs/commit/56a78de90f)] - **bug**: prefill auto (nicolaslabbe) + +## [2.5.9] - 2016-10-12 +* [[`9028e02272`](https://github.com/AdFabConnect/abejs/commit/9028e02272)] - Merged branch master into master (nicolaslabbe) +* [[`7c751378c3`](https://github.com/AdFabConnect/abejs/commit/7c751378c3)] - **feature**: prefill reload front (nicolaslabbe) + +## [2.5.8] - 2016-10-12 +* [[`35d769d428`](https://github.com/AdFabConnect/abejs/commit/35d769d428)] - don't display partials inside templates list (wonknu10) +* [[`b4fec490f6`](https://github.com/AdFabConnect/abejs/commit/b4fec490f6)] - **bug**: datarequest (nicolaslabbe) +* [[`caa2926379`](https://github.com/AdFabConnect/abejs/commit/caa2926379)] - **feature**: add new process (nicolaslabbe) +* [[`ea705bbe33`](https://github.com/AdFabConnect/abejs/commit/ea705bbe33)] - **feature**: add new process to abe-cli (nicolaslabbe) +* [[`345f91d3bc`](https://github.com/AdFabConnect/abejs/commit/345f91d3bc)] - Merged branch master into master (nicolaslabbe) +* [[`08afa20ad6`](https://github.com/AdFabConnect/abejs/commit/08afa20ad6)] - **feature**: processes generate (nicolaslabbe) +* [[`6b23d7d5c7`](https://github.com/AdFabConnect/abejs/commit/6b23d7d5c7)] - unmerged file (wonknu10) +* [[`48675a00b6`](https://github.com/AdFabConnect/abejs/commit/48675a00b6)] - **refactoring**: process, hooks, plugins (nicolaslabbe) +* [[`dc6b63070c`](https://github.com/AdFabConnect/abejs/commit/dc6b63070c)] - **refactoring**: lint (nicolaslabbe) + +## [2.5.7] - 2016-10-11 +* [[`f2b2604ca8`](https://github.com/AdFabConnect/abejs/commit/f2b2604ca8)] - fix error on reject status (gregorybesson) +* [[`5dcd2bcbf2`](https://github.com/AdFabConnect/abejs/commit/5dcd2bcbf2)] - missing function readded... (gregorybesson) +* [[`1825120b47`](https://github.com/AdFabConnect/abejs/commit/1825120b47)] - you can request abe version with -v (gregorybesson) + +## [2.5.6] - 2016-10-10 + +## [2.5.5] - 2016-10-10 +* [[`bd9e46b965`](https://github.com/AdFabConnect/abejs/commit/bd9e46b965)] - fix a miserable error removing functions... which is mandatory (gregorybesson) +* [[`9ab122777b`](https://github.com/AdFabConnect/abejs/commit/9ab122777b)] - fix attributes test (gregorybesson) + +## [2.5.4] - 2016-10-9 +* [[`d6c4e630db`](https://github.com/AdFabConnect/abejs/commit/d6c4e630db)] - exclusions in git and npm (gregorybesson) +* [[`85a8aa1dc5`](https://github.com/AdFabConnect/abejs/commit/85a8aa1dc5)] - back to normal (gregorybesson) +* [[`a8bb1b93f9`](https://github.com/AdFabConnect/abejs/commit/a8bb1b93f9)] - ***Revert*** "to stable version" (gregorybesson) +* [[`1195ed15bd`](https://github.com/AdFabConnect/abejs/commit/1195ed15bd)] - **refactoring**: fix bugs + linting (gregorybesson) +* [[`e79fdef2cd`](https://github.com/AdFabConnect/abejs/commit/e79fdef2cd)] - **refactoring**: linting (gregorybesson) +* [[`722e6584f9`](https://github.com/AdFabConnect/abejs/commit/722e6584f9)] - **refactoring**: version + linting (gregorybesson) +* [[`d9514167af`](https://github.com/AdFabConnect/abejs/commit/d9514167af)] - **refactoring**: bug fixing and linting (gregorybesson) +* [[`a65f2c536e`](https://github.com/AdFabConnect/abejs/commit/a65f2c536e)] - **refactoring**: object test + fix (gregorybesson) +* [[`f4829166d1`](https://github.com/AdFabConnect/abejs/commit/f4829166d1)] - **refactoring**: FileParser refactored into logical packages (gregorybesson) +* [[`39b560211c`](https://github.com/AdFabConnect/abejs/commit/39b560211c)] - **refactoring**: dead code (gregorybesson) +* [[`2b9986eab7`](https://github.com/AdFabConnect/abejs/commit/2b9986eab7)] - **refactoring**: linting (gregorybesson) +* [[`1fbf321409`](https://github.com/AdFabConnect/abejs/commit/1fbf321409)] - **refactoring**: cmsData (gregorybesson) +* [[`675e71bc7d`](https://github.com/AdFabConnect/abejs/commit/675e71bc7d)] - **refactoring**: cmsData (gregorybesson) +* [[`2f2c412444`](https://github.com/AdFabConnect/abejs/commit/2f2c412444)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`1fc2c9c9d8`](https://github.com/AdFabConnect/abejs/commit/1fc2c9c9d8)] - **refactoring**: unpublish (nicolaslabbe) +* [[`439767e0e5`](https://github.com/AdFabConnect/abejs/commit/439767e0e5)] - **refactoring**: fileparser copyasset -> asset.copy (nicolaslabbe) +* [[`2575abd763`](https://github.com/AdFabConnect/abejs/commit/2575abd763)] - **refactoring**: getProjectFiles + UT (nicolaslabbe) +* [[`375b66318a`](https://github.com/AdFabConnect/abejs/commit/375b66318a)] - **refactoring**: almost kill file-utils -> renamed as file (nicolaslabbe) +* [[`4669239c75`](https://github.com/AdFabConnect/abejs/commit/4669239c75)] - **refactoring**: lint (nicolaslabbe) +* [[`cf6f6f0e2c`](https://github.com/AdFabConnect/abejs/commit/cf6f6f0e2c)] - **refactoring**: fileutils (nicolaslabbe) +* [[`3a2c7ab03e`](https://github.com/AdFabConnect/abejs/commit/3a2c7ab03e)] - **refactoring**: remove concatpath (nicolaslabbe) +* [[`db4e0d98ef`](https://github.com/AdFabConnect/abejs/commit/db4e0d98ef)] - **refactoring**: remove folderUtils (nicolaslabbe) +* [[`f639117e28`](https://github.com/AdFabConnect/abejs/commit/f639117e28)] - **refactoring**: remove folderUtils (nicolaslabbe) +* [[`e0892aca88`](https://github.com/AdFabConnect/abejs/commit/e0892aca88)] - **refactoring**: lint (nicolaslabbe) +* [[`76ee4216d1`](https://github.com/AdFabConnect/abejs/commit/76ee4216d1)] - **refactoring**: locales (nicolaslabbe) +* [[`521651ea59`](https://github.com/AdFabConnect/abejs/commit/521651ea59)] - Merge branch 'master' of https://github.com/AdFabConnect/abejs (gregorybesson) +* [[`6ab8ac08cf`](https://github.com/AdFabConnect/abejs/commit/6ab8ac08cf)] - fix UT (nicolaslabbe) +* [[`469e753ed9`](https://github.com/AdFabConnect/abejs/commit/469e753ed9)] - **refactoring**: UT revisions (nicolaslabbe) +* [[`46e766ea91`](https://github.com/AdFabConnect/abejs/commit/46e766ea91)] - **refactoring**: (nicolaslabbe) + +## [2.5.3] - 2016-10-6 +* [[`2c560fcaf3`](https://github.com/AdFabConnect/abejs/commit/2c560fcaf3)] - **fix**: - (gregorybesson) +* [[`0b2bf92d10`](https://github.com/AdFabConnect/abejs/commit/0b2bf92d10)] - **fix**: limax BC break + refactoring to better handle file saving (gregorybesson) +* [[`51d53a5e94`](https://github.com/AdFabConnect/abejs/commit/51d53a5e94)] - replace dash with dot in image filename (wonknu10) +* [[`3925ecf5fd`](https://github.com/AdFabConnect/abejs/commit/3925ecf5fd)] - **refactoring**: kill abe-util (nicolaslabbe) +* [[`91e05886ac`](https://github.com/AdFabConnect/abejs/commit/91e05886ac)] - **refactoring**: lint abe-util (nicolaslabbe) +* [[`271bd58596`](https://github.com/AdFabConnect/abejs/commit/271bd58596)] - **refactoring**: remove replaceUnwantedChar from abe-util (nicolaslabbe) +* [[`434e7349e2`](https://github.com/AdFabConnect/abejs/commit/434e7349e2)] - **refactoring**: some linting (nicolaslabbe) +* [[`83288c406a`](https://github.com/AdFabConnect/abejs/commit/83288c406a)] - **refactoring**: remove getallattribute from from abe-util (nicolaslabbe) +* [[`194c7cf136`](https://github.com/AdFabConnect/abejs/commit/194c7cf136)] - **refactoring**: remove source from abe-util (nicolaslabbe) +* [[`d1844cf4d6`](https://github.com/AdFabConnect/abejs/commit/d1844cf4d6)] - **refactoring**: insertDebugtoolUtilities + UT (nicolaslabbe) +* [[`880c093825`](https://github.com/AdFabConnect/abejs/commit/880c093825)] - **refactoring**: encodeAbe + UT (nicolaslabbe) +* [[`273a12a6b3`](https://github.com/AdFabConnect/abejs/commit/273a12a6b3)] - **refactoring**: meta + UT (nicolaslabbe) +* [[`14cf1683ba`](https://github.com/AdFabConnect/abejs/commit/14cf1683ba)] - **refactoring**: save (nicolaslabbe) +* [[`9899dff719`](https://github.com/AdFabConnect/abejs/commit/9899dff719)] - **refactoring**: lint create and duplicate (nicolaslabbe) +* [[`51840e66e1`](https://github.com/AdFabConnect/abejs/commit/51840e66e1)] - **refactoring**: UT duplicate (nicolaslabbe) +* [[`81eefde412`](https://github.com/AdFabConnect/abejs/commit/81eefde412)] - **refactoring**: UT create (nicolaslabbe) +* [[`02e9e00230`](https://github.com/AdFabConnect/abejs/commit/02e9e00230)] - **refactoring**: duplicate and create (nicolaslabbe) +* [[`d8c47faa61`](https://github.com/AdFabConnect/abejs/commit/d8c47faa61)] - remove unused (nicolaslabbe) + +## [2.5.2] - 2016-10-5 +* [[`9b8ac76b0f`](https://github.com/AdFabConnect/abejs/commit/9b8ac76b0f)] - move config.json (nicolaslabbe) + +## [2.5.1] - 2016-10-5 + +## [2.5.0] - 2016-10-5 +* [[`06a208bc72`](https://github.com/AdFabConnect/abejs/commit/06a208bc72)] - bug on compare (nicolaslabbe) +* [[`d63ed2a507`](https://github.com/AdFabConnect/abejs/commit/d63ed2a507)] - remove strutil (nicolaslabbe) +* [[`4bc6dd6bcd`](https://github.com/AdFabConnect/abejs/commit/4bc6dd6bcd)] - **refactoring**: UT fileattr (nicolaslabbe) +* [[`ba793da4ff`](https://github.com/AdFabConnect/abejs/commit/ba793da4ff)] - **refactoring**: fileattr (nicolaslabbe) +* [[`1741bfc81f`](https://github.com/AdFabConnect/abejs/commit/1741bfc81f)] - refactoring; UT regex (nicolaslabbe) +* [[`9112207f30`](https://github.com/AdFabConnect/abejs/commit/9112207f30)] - **refactoring**: cms data regex utils (nicolaslabbe) +* [[`e26152e45a`](https://github.com/AdFabConnect/abejs/commit/e26152e45a)] - **refactoring**: cms data regex (nicolaslabbe) +* [[`3af0a6b958`](https://github.com/AdFabConnect/abejs/commit/3af0a6b958)] - **refactoring**: linting (gregorybesson) +* [[`27727b11de`](https://github.com/AdFabConnect/abejs/commit/27727b11de)] - **refactoring**: linting (gregorybesson) +* [[`64aac09b4a`](https://github.com/AdFabConnect/abejs/commit/64aac09b4a)] - **refactoring**: linting (gregorybesson) +* [[`991ce7fe5e`](https://github.com/AdFabConnect/abejs/commit/991ce7fe5e)] - revisions (nicolaslabbe) +* [[`6412ce121c`](https://github.com/AdFabConnect/abejs/commit/6412ce121c)] - change readme github double (nicolaslabbe) +* [[`4667cb701e`](https://github.com/AdFabConnect/abejs/commit/4667cb701e)] - comment sql method (nicolaslabbe) +* [[`49cb05d6d7`](https://github.com/AdFabConnect/abejs/commit/49cb05d6d7)] - fix bug sort on build (nicolaslabbe) +* [[`99a2daad51`](https://github.com/AdFabConnect/abejs/commit/99a2daad51)] - inverse logs for build fail (nicolaslabbe) +* [[`4e769efa4e`](https://github.com/AdFabConnect/abejs/commit/4e769efa4e)] - add comment sort.js (nicolaslabbe) +* [[`e2a49fb84b`](https://github.com/AdFabConnect/abejs/commit/e2a49fb84b)] - more losgs (nicolaslabbe) +* [[`74ce58b43b`](https://github.com/AdFabConnect/abejs/commit/74ce58b43b)] - add log because build fail on travis but not locally (nicolaslabbe) +* [[`12a351f22b`](https://github.com/AdFabConnect/abejs/commit/12a351f22b)] - lint sql.js (nicolaslabbe) +* [[`91ed9cdbfa`](https://github.com/AdFabConnect/abejs/commit/91ed9cdbfa)] - split sql and sort (+ UT for sort) (nicolaslabbe) +* [[`bdfcbecf0b`](https://github.com/AdFabConnect/abejs/commit/bdfcbecf0b)] - bug on builderjs (nicolaslabbe) +* [[`e3c8933d0f`](https://github.com/AdFabConnect/abejs/commit/e3c8933d0f)] - refactor (nicolaslabbe) +* [[`f37dd68515`](https://github.com/AdFabConnect/abejs/commit/f37dd68515)] - Merged branch master into master (nicolaslabbe) +* [[`ef82267191`](https://github.com/AdFabConnect/abejs/commit/ef82267191)] - Merge remote-tracking branch 'refs/remotes/origin/master' (nicolaslabbe) +* [[`2115c9d9a9`](https://github.com/AdFabConnect/abejs/commit/2115c9d9a9)] - sql (NOT IN) inside manager (wonknu10) +* [[`dc11833841`](https://github.com/AdFabConnect/abejs/commit/dc11833841)] - remove log before merge (nicolaslabbe) +* [[`8b9bbd696b`](https://github.com/AdFabConnect/abejs/commit/8b9bbd696b)] - refactor sql (nicolaslabbe) +* [[`922ed96336`](https://github.com/AdFabConnect/abejs/commit/922ed96336)] - refactor remove-duplicate-attr (nicolaslabbe) +* [[`87e1e60fd0`](https://github.com/AdFabConnect/abejs/commit/87e1e60fd0)] - Update CHANGELOG.md (Greg Besson) +* [[`ab57b7f4b7`](https://github.com/AdFabConnect/abejs/commit/ab57b7f4b7)] - Merged branch master into master (nicolaslabbe) +* [[`e590bccfaa`](https://github.com/AdFabConnect/abejs/commit/e590bccfaa)] - UT title (nicolaslabbe) +* [[`891dab2747`](https://github.com/AdFabConnect/abejs/commit/891dab2747)] - TU cleanSlug (wonknu10) +* [[`858b989dd0`](https://github.com/AdFabConnect/abejs/commit/858b989dd0)] - slugify image url with limax not cleanSlug (wonknu10) +* [[`08a083d37a`](https://github.com/AdFabConnect/abejs/commit/08a083d37a)] - Merged branch master into master (nicolaslabbe) +* [[`b392e68932`](https://github.com/AdFabConnect/abejs/commit/b392e68932)] - abe-sql test and doc (nicolaslabbe) +* [[`e8fa11e1af`](https://github.com/AdFabConnect/abejs/commit/e8fa11e1af)] - **refactoring**: templates (gregorybesson) +* [[`a10c333d33`](https://github.com/AdFabConnect/abejs/commit/a10c333d33)] - updating dependencies + refactoring cms operations (gregorybesson) +* [[`7b2ec6a95b`](https://github.com/AdFabConnect/abejs/commit/7b2ec6a95b)] - fix UT (nicolaslabbe) +* [[`15e74c7548`](https://github.com/AdFabConnect/abejs/commit/15e74c7548)] - Merged branch master into master (nicolaslabbe) +* [[`5ae72849f8`](https://github.com/AdFabConnect/abejs/commit/5ae72849f8)] - abe-sql fix where clause (nicolaslabbe) +* [[`1f5b3a8d45`](https://github.com/AdFabConnect/abejs/commit/1f5b3a8d45)] - fix UT (gregorybesson) +* [[`e7925e0c54`](https://github.com/AdFabConnect/abejs/commit/e7925e0c54)] - remove magick variable template (nicolaslabbe) +* [[`e601c9c2a8`](https://github.com/AdFabConnect/abejs/commit/e601c9c2a8)] - bug abe-sql (nicolaslabbe) +* [[`2d27682d34`](https://github.com/AdFabConnect/abejs/commit/2d27682d34)] - bug abe-sql where OR/And (reversed) (nicolaslabbe) * [[`8416acdbc8`](https://github.com/AdFabConnect/abejs/commit/8416acdbc8)] - Merge remote-tracking branch 'refs/remotes/origin/master' (nicolaslabbe) * [[`c7989111c6`](https://github.com/AdFabConnect/abejs/commit/c7989111c6)] - fix require only file (nicolaslabbe) * [[`f71997390a`](https://github.com/AdFabConnect/abejs/commit/f71997390a)] - merge (nicolaslabbe) diff --git a/README.md b/README.md index 8f060570..34bb1bdf 100755 --- a/README.md +++ b/README.md @@ -11,6 +11,9 @@ > Abe is your __static websites generator__ with revolutionnary __self-descriptive__ templates +[![NPM](https://nodei.co/npm/abe-cli.png?downloads=true&downloadRank=true)](https://nodei.co/npm/abe-cli/) +[![NPM](https://nodei.co/npm-dl/abe-cli.png?months=3&height=3)](https://nodei.co/npm/abe-cli/) + # Demo Deploy your own Abe demo on Heroku @@ -32,6 +35,28 @@ The separation between the engine, the API server and the front will be reinforc The documentation will be rewritten and included in the modules As a major new feature, it will be possible to create a template from partials. +## Roadmap of the next 2.x releases +- the stateful manager of Abe has to become responsible of pagination of articles (huge performance boost) +- A homepage will arrive (at last !) on the frontend +- It will be possible to create filtered views on the manager frontend +- Refactoring of the editor has to be done +- Unit testing will cover >60% of the code +- A full functional test scenario from blog creation to article manipulation will be written +- The load testing scenarii will be open sourced (based on Locust) +- Bugfixing +- Precompiling of templates has to be fully tested +- since Abe has become stateful, clustering has been removed. Implement a solution to permit clusters of Abe +- Add template creation from partials +- Structure will be editable from abe, as references +- templates and partials will be uploadable +- Video training will be produced + +## Roadmap of the 3.x releases +- Separate the engine, the REST server and the client +- rewrite the client in react +- create an Electron version +- More to come ! + ## Changelog See the complete [changelog](./CHANGELOG.md) @@ -158,7 +183,7 @@ Usage: abe [commande] {OPTIONS} Standard Options: ---version, -V Output the version number +--version, -v Output the version number --help, -h Show this message diff --git a/docs/abe-attibutes.md b/docs/abe-attibutes.md index 6d5ffddb..68ee6f3e 100755 --- a/docs/abe-attibutes.md +++ b/docs/abe-attibutes.md @@ -13,55 +13,234 @@ for example the type text, some required and other optional are always required for all content type -## Type of abe content +## Type of abe content -- text -- image -- textarea -- translate -- import -- file -- rich -- link +- [text](types/abe-text.md) +- [image](types/abe-image.md) +- [textarea](types/abe-textarea.md) +- [translate](types/abe-translate.md) +- [import](types/abe-import.md) +- [file](types/abe-file.md) +- [rich](types/abe-rich.md) +- [link](types/abe-link.md) +- [data](types/abe-data.md) +- [slug](types/abe-slug.md) ## Other attributes -- desc (String) -- tab (String) -- reload (Boolean) -- required (Boolean) -- visible (Boolean) -- order (Int) -- filetype (String) -- file (String) -- locale (String | variable) -- max-length (Int) -- min-length (Int) -- display (String) -- editable (Boolean) -- source (String | variables) -- autocomplete (Boolean) -- duplicate (Boolean) - -## Details - -type | example | description | types | Default ---- | --- | --- | --- | --- -desc | ```desc="some description for the contributor"``` | (text only) | all | (null) -tab | ```tab="Image"``` | Will show input into a tab (text only) | all | "default" -reload | ```reload="true"``` | Will reload the page on input blur (usefull to trigger some javascript on change) | all | "false" -required | ```required="true"``` | Calculate completion of content | all | "false" -visible | ```visible="false"``` | will not insert value into html | all | "false" -order | ```order="10"``` | Order input into admin form | all | (null) -filetype | ```filetype="image"``` | for upload | file | (null) -file | ```file="partial.html"``` | for partials import | import | (null) -locale | ```locale="fr"``` | for translate | translate | String or Variable (with {{lang}}) (default null) -max-length | ```max-length="5"``` | List max choice N | data | (null) -min-length | ```min-length="5"``` | List min choice N (used with required attribute) | data | (null) -display | ```display="title"``` | List from json source display title attribute | data | (null) -editable | ```editable="false"``` | List is editable | data | true -source | ```source="[ data source ]"``` | List json value (http url, local url, static json, select sql like) | data | (null) -autocomplete | ```autocomplete="true"``` | change the list to autocomplete | data | false -duplicate | ```duplicate="false"``` | the field will not be duplicate when user duplicate content | all | false +- [tab](#tab) +- [key](#key) +- [type](#type) +- [autocomplete](#autocomplete) +- [desc](#desc) +- [display](#display) +- [editable](#editable) +- [max-length](#max-length) +- [min-length](#min-length) +- [source](#source) +- [duplicate](#duplicate) +- [reload](#reload) +- [required](#required) +- [visible](#visible) +- [order](#order) +- [filetype](#filetype) +- [file](#file) +- [locale](#locale) +- [prefill](#prefill) +- [prefill-quantity](#prefill-quantity) +## tab (String) +Default: "default" + +```html +tab="NameOfTheTab" +``` + +Set the admin tab display + +## key (String) + +Default: "" + +```html +key="keyData" +``` + +the key used into json file + +## type (String) + +Default: "text" + +```html +type="text" +``` + +See abe [type](#abe-type) + +## autocomplete (Boolean) + +Default: null + +```html +autocomplete="true" +``` + +for abe type data, display input form autocomplete into admin + +## desc (String) + +Default: "" + +```html +desc="some description for the contributor" +``` + +The admin description input + +## display (String) + +Default: null + +```html +display="variable" +``` + +for abe type data (autocomplete true or false) + +## editable (Boolean) + +Default: true + +```html +editable="true" +``` + +if editable true user can change the value, if not abe will set the values + +## max-length (Int) + +Default: null + +```html +max-length="3" +``` + +for abe type data, array max selection + +## min-length (Int) + +Default: 0 + +```html +min-length="1" +``` + +for abe type data, array min selection (if required) + +## source (String | variables) + +Default: null + +```html +source="[ source type ]" +``` + +see abe type [data](abe-data.md) + +## duplicate (Boolean) + +Default: true + +```html +duplicate="true" +``` + +if set to false, when user duplicate a post. The value will not be diplcate into the new post + +## reload (Boolean) + +Default: false + +```html +reload="true" +``` + +if reload true, on blur event on the input field the post preview will be reloaded + +## required (Boolean) + +Default: false + +```html +required="true" +``` + +If set to true user cannot publish the post without required field + +## visible (Boolean) + +Default: true + +```html +visible="true" +``` + +if visible set to false, the value will not be set into post page (but will be visible on the admin and set into the json file) + +## order (Int) + +Default: 0 + +```html +order="1" +``` + +to order the input in the admin + +## filetype (String) + +Default: "" + +```html +filetype="image" +``` + +## file (String) + +Default: "" + +```html +file="partial.html" +``` + +see abe [import](abe-import.md) + +## locale (String | variable) + +Default: "" + +```html +locale="fr" +``` + +## prefill (Boolean) + +Default: false + +```html +prefill="true" +``` + +For abe type data, if set to true will add default values + +## prefill-quantity (Int) + +Default: null + +```html +prefill-quantity="3" +``` + +How many default values to prefill \ No newline at end of file diff --git a/docs/abe-handlebars-variables.md b/docs/abe-handlebars-variables.md new file mode 100755 index 00000000..7e7caa39 --- /dev/null +++ b/docs/abe-handlebars-variables.md @@ -0,0 +1,15 @@ +# Abe handlebars Variable + +> Abe admin is rendered with handlebar engine, global variables are added inside template rendering + +# Editor + +When on the admin edit view `abeEditor` is set to `true` otherwise set to `false` + +```html +{{#if abeEditor}} + Html rendered inside post when user edit the post +{{else}} + Html rendered when user "publish" the post (final output) +{{/if}} +``` \ No newline at end of file diff --git a/docs/abe-locale.md b/docs/abe-locale.md new file mode 100644 index 00000000..2f4b28e9 --- /dev/null +++ b/docs/abe-locale.md @@ -0,0 +1,27 @@ +# Abe locale + +> translate Abe backoffice texts + +## Config Abe + +set a property ```siteLocaleFolder``` to your abe.json file which link to your folder on your website source + +exemple : + +```javascript +{ + "siteLocaleFolder": "mylocales" +} +``` + +Under mylocales folder you can add a folder named en-US which is the default lang value or you can override this lang inside abe.json this way + +```javascript +{ + "intlData": { + "locales": "fr-FR" + } +} +``` + +After doing this you can add as many json files as you want inside mylocales/fr-FR/ and the json key values will be merged with exsting locales values diff --git a/docs/abe-plugins.md b/docs/abe-plugins.md index 58bf9edd..e2ae2085 100755 --- a/docs/abe-plugins.md +++ b/docs/abe-plugins.md @@ -1,19 +1,74 @@ # Abe Plugins -# Add Plugin +Abe plugin system is based on npm modules : You can install a plugin which has been deployed on npm or resides on github with a proper package.json. +Furthermore, you can create your own scripts without having to register it in npm (see below). + +# Install a plugin run ```shell -abe add https://github.com/AdFabConnect/some-plugin-name.git +abe install some-plugin-name +``` + +this will install the plugin in the node_modules directory and add a new entry inside abe.json file (it will create abe.json if it doesn't exist). + +```json +{ + "plugins": [ + "some-plugin-name" + ] +} +``` + +You can install a specific version of the plugin this way: + +```shell +abe install some-plugin-name@1.0.0 ``` -this will add a new entry inside abe.json file +this will install the plugin in the node_modules directory. The entry in abe.json: ```json { - "dependencies": [ - "https://github.com/AdFabConnect/some-plugin-name" + "plugins": [ + "some-plugin-name@1.0.0" + ] +} +``` + +You can also install a module hosted on github. This is particularly useful for modules you don't want to make public and don't have a private npm repo. +The syntax is abe install user_or_org/repo#branch +user_or_org being your user or organization github id, repo being the repo and branch being the branch or the tag + +run + +```shell +abe install user_or_org/myrepo +``` + +this will install the plugin in the node_modules directory and add a new entry inside abe.json file (it will create abe.json if it doesn't exist). + +```json +{ + "plugins": [ + "user_or_org/myrepo" + ] +} +``` + +You can install a specific version of the plugin this way: + +```shell +abe install user_or_org/myrepo#1.0.0 +``` + +The entry in abe.json: + +```json +{ + "plugins": [ + "user_or_org/myrepo#1.0.0" ] } ``` @@ -26,13 +81,36 @@ run abe install ``` -this will fetch all dependencies inside abe.json and clone + npm install package +this will fetch all plugins listed in abe.json and npm install the plugins + +# Use custom scripts + +Custom scripts are created under "scripts" directory. Follow the same structure as for a plugin. +Example for a module "abe-hint" under scripts: + +Example from abe-hint plugins + +``` +website/ + |_ scripts/ + |_ abe-hint/ + |_ hooks/ + | - hooks.js + |_ partials/ + | - some_partials.html ... + | - some ... + | - ... + |_ routes/ + - my_route.js ... +``` + +This way, you'll be able to create custom scripts which you don't want to share between your different Abe projects. You can name your module as you want. # Dev plugins > How to create plugins -Inside website (create plugins folders) then an other (you choose the folder name) +Inside website (under scripts folder) create a directory with the name of your choice (this name will be the name of your plugin) You can then add hooks or template override @@ -40,8 +118,8 @@ Example from abe-hint plugins ``` website/ - |_ plugins/ - |_ hint/ + |_ node_modules/ + |_ abe-hint/ |_ hooks/ | - hooks.js |_ partials/ @@ -52,8 +130,9 @@ website/ - my_route.js ... ``` -Plugins examples at [https://github.com/AdFabConnect/abe-plugins](https://github.com/AdFabConnect/abe-plugins) +Plugin examples at [https://github.com/AdFabConnect/abe-plugins](https://github.com/AdFabConnect/abe-plugins) +Once you'll be satisfied with the way your module works, you'll then be able to create a regular npm module and install it on your project with the command abe install my_module ## frontend javascript @@ -65,7 +144,7 @@ for example : ``` website/ - |_ plugins/ + |_ node_modules/ |_ my-plugin/ |_ partials/ - styles.html @@ -92,7 +171,7 @@ abe.json.saving(function (e) { ``` website/ - |_ plugins/ + |_ node_modules/ |_ my-plugin/ |_ routes/ - my_route.js ... diff --git a/docs/abe-precontrib.md b/docs/abe-precontrib.md deleted file mode 100644 index 5347acde..00000000 --- a/docs/abe-precontrib.md +++ /dev/null @@ -1,53 +0,0 @@ -# Abe precontrib - -> abe tags can have 3 new attributes to create precontribution form - -### Attributes - -- precontrib: true | false -- slug: true | variable_name_to_use -- slugType: path | name - -### precontrib attribute - -will add abe tag on precontribution form - -### precontrib slug - -if "true" the value into the form will be added to the slug url -you can use "variable_name" if the format is an object - -### precontrib slugType - -if slug type = "name" the value will be concatenated to last part of the slug separated with "-" -if slug type = "path" the value will be concatenated to slug separated with "/" - -# Examples: - -for example the type text, some required and other optional - -``` -{{abe type='text' key='text_key' precontrib="true" slug="true" slugType="path"}} -``` - -The value will look like /some/folders/[ input text_key value ]/filename - -``` -{{abe type='text' key='text_key' precontrib="true" slug="true" slugType="name"}} -``` - -The value will look like /some/folders/[ input text_key value ] - -``` -{{abe type='text' key='text_key' precontrib="true"}} -``` - -if you don't add "slug" attribute the input will be visible on the precontribution but not added to the slug url - -# Usefull attribute - -- required="true" -- order="[ position of the field ]" -- visible="false" - -if visible = false it will not be added to the post saved file \ No newline at end of file diff --git a/docs/handlebars-helpers/isAuthorized.md b/docs/handlebars-helpers/isAuthorized.md new file mode 100755 index 00000000..fb1b94a7 --- /dev/null +++ b/docs/handlebars-helpers/isAuthorized.md @@ -0,0 +1,37 @@ +# Abe handlebars helpers + +> Is user authorized for an action + +### Example + +if user authorized to call url `/abe/deleteAll` show button delete + +{{#isAuthorized '/abe/deleteAll' @root.user.role.workflow}} +
+ I can delete everything ! +
+{{/isAuthorized}} + +### Example of config into abe.json + +```json +{ + "users": { + "roles": [ + { + "workflow":"CustomUser", + "name":"CustomUser" + } + { + "workflow":"admin", + "name":"Admin" + } + ], + "routes": { + "admin": [], + "CustomUser": [ + "\/abe\/deleteAll.*" + ], +``` + +Because **CustomUser** has an entry with `\/abe\/deleteAll.*` he would not be allowed to call \ No newline at end of file diff --git a/docs/abe-data.md b/docs/types/abe-data.md similarity index 100% rename from docs/abe-data.md rename to docs/types/abe-data.md diff --git a/docs/types/abe-file.md b/docs/types/abe-file.md new file mode 100755 index 00000000..289f78db --- /dev/null +++ b/docs/types/abe-file.md @@ -0,0 +1,11 @@ +# Abe type file + +> Abe type __file__ + +###Basic example + +```html +{{abe type='file' filetype='file_type' key='file_key' desc='give some tips' tab='default'}} +``` + +###Parameters \ No newline at end of file diff --git a/docs/types/abe-image.md b/docs/types/abe-image.md new file mode 100755 index 00000000..0198d1d6 --- /dev/null +++ b/docs/types/abe-image.md @@ -0,0 +1,36 @@ +# Abe type image + +> Abe type __image__ + +###Basic example + +```html +{{abe type='image' key='image_key' desc='give some tips' thumbs='250x250,350x350'}} +``` + +###Parameters + +> __type__ = image +> +> __key__ = references key to use into your html + +optional parameters + +- desc = (String) +- display = (String) +- reload = (Boolean) +- thumbs = (Array[WIDTHxHEIGHT] separated with ",") + +###Thumbs + +If thumbs is used on your tag you can create thumbnails from the image you upload + +####Exemple : + +uploading a image named *my_image.jpg* will create a thumbs by default named my_image_thumb.jpg + +if the tag contains ```thumbs='250x250,350x350'``` this will also create *my_image_thumb_250x250.jpg* & *my_image_thumb_350x350.jpg* + +###Important + +thumb are created using https://github.com/jwagner/smartcrop-cli which require to have imagemagick installed on your computer, if you don't a fallback library full JS is used (https://github.com/oliver-moran/jimp) but doesn't crop in a smart way your images \ No newline at end of file diff --git a/docs/abe-import.md b/docs/types/abe-import.md similarity index 100% rename from docs/abe-import.md rename to docs/types/abe-import.md diff --git a/docs/types/abe-link.md b/docs/types/abe-link.md new file mode 100755 index 00000000..17693296 --- /dev/null +++ b/docs/types/abe-link.md @@ -0,0 +1,11 @@ +# Abe type Link + +> Abe type __link__ + +###Basic example + +```html +{{abe type='link' key='link_key' desc='give some tips' title='html title' tab='default'}} +``` + +###Parameters \ No newline at end of file diff --git a/docs/types/abe-rich.md b/docs/types/abe-rich.md new file mode 100755 index 00000000..70561330 --- /dev/null +++ b/docs/types/abe-rich.md @@ -0,0 +1,11 @@ +# Abe type rich + +> Abe type __rich__ + +###Basic example + +```html +{{abe type='rich' key='rich_key' desc='give some tips' tab='default'}} +``` + +###Parameters \ No newline at end of file diff --git a/docs/types/abe-slug.md b/docs/types/abe-slug.md new file mode 100644 index 00000000..c0ab346e --- /dev/null +++ b/docs/types/abe-slug.md @@ -0,0 +1,49 @@ +# Abe slug + +> abe type slug allow you to create custom url easily + +## Example + +> inside **template** folder open any template and add + +```html +{{abe type="slug" source="name-of-the-page"}} +``` + +Warning: + +- no extensions +- path will be concatened with **structure** folder selection + +## Variables + +variables can be added to slug url + +```slug +{{abe type="slug" source="{{variableName}}"}} + +{{abe type="text" key="variableName" desc="Name of the post" tab="slug"}} +``` + +Warning: + +- if you don't add `tab=slug` attribute the variable will not be avaliable on the slug form + +## Multiples variables + +```slug +{{abe type="slug" source="{{folderCustom}}/{{variableName}}"}} + +{{abe type="text" key="variableName" desc="Name of the post" tab="slug"}} +{{abe type="text" key="folderCustom" desc="Path of the post" tab="slug"}} +{{abe type="text" key="category" desc="Category of the post" tab="slug"}} +``` + +Warning: +Category is not used in abe slug source `source="{{folderCustom}}/{{variableName}}"` but will be contribued into the slug form + +- + +You can use all abe `type` in the slug form + +[abe-attributes](abe-attributes.md) \ No newline at end of file diff --git a/docs/abe-sql.md b/docs/types/abe-sql.md similarity index 100% rename from docs/abe-sql.md rename to docs/types/abe-sql.md diff --git a/docs/types/abe-textarea.md b/docs/types/abe-textarea.md new file mode 100755 index 00000000..537460a8 --- /dev/null +++ b/docs/types/abe-textarea.md @@ -0,0 +1,11 @@ +# Abe type textarea + +> Abe type __textarea__ + +###Basic example + +```html +{{abe type='textarea' key='textarea_key' desc='give some tips' tab='default'}} +``` + +###Parameters \ No newline at end of file diff --git a/docs/abe-translate.md b/docs/types/abe-translate.md similarity index 100% rename from docs/abe-translate.md rename to docs/types/abe-translate.md diff --git a/nightwatch.conf.js b/nightwatch.conf.js new file mode 100644 index 00000000..4cbcdc50 --- /dev/null +++ b/nightwatch.conf.js @@ -0,0 +1,90 @@ +const SCREENSHOT_PATH = "./screenshots/"; +const BINPATH = './node_modules/nightwatch/bin/'; + +module.exports = { + "src_folders": [ + "tests/functional" + ], + "output_folder": "./reports", + "test_runner" : "mocha", + "selenium": { + "start_process": true, + "server_path": "./node_modules/nightwatch/bin/selenium.jar", + "host": "127.0.0.1", + "port": 4444, + "cli_args": { + "webdriver.chrome.driver" : "./node_modules/nightwatch/bin/chromedriver" + } + }, + "test_settings": { + "default": { + "launch_url" : "http://localhost:3003/abe/editor", + "silent": true, + "screenshots": { + "enabled": false, + "path": '' + }, + "globals": { + "waitForConditionTimeout": 3000 + }, + "desiredCapabilities" : { + "browserName" : "chrome", + "javascriptEnabled" : true, + "acceptSslCerts" : true, + "chromeOptions" : { + "args" : ["start-fullscreen"] + } + } + }, + "chrome": { + "desiredCapabilities": { + "browserName": "chrome", + "javascriptEnabled": true, + "acceptSslCerts" : true, + "chromeOptions" : { + "args" : ["start-fullscreen"] + } + } + } + } +} +/** + * selenium-download does exactly what it's name suggests; + * downloads (or updates) the version of Selenium (& chromedriver) + * on your localhost where it will be used by Nightwatch. + /the following code checks for the existence of `selenium.jar` before trying to run our tests. + */ + +require('fs').stat(BINPATH + 'selenium.jar', function (err, stat) { // got it? + if (err || !stat || stat.size < 1) { + require('selenium-download').ensure(BINPATH, function(error) { + if (error) throw new Error(error); // no point continuing so exit! + console.log('✔ Selenium & Chromedriver downloaded to:', BINPATH); + }); + } +}); + +function padLeft (count) { + return count < 10 ? '0' + count : count.toString(); +} + +var FILECOUNT = 0; +/** + * The default is to save screenshots to the root of your project even though + * there is a screenshots path in the config object above! ... so we need a + * function that returns the correct path for storing our screenshots. + * While we're at it, we are adding some meta-data to the filename, specifically + * the Platform/Browser where the test was run and the test (file) name. + */ +function imgpath (browser) { + var a = browser.options.desiredCapabilities; + var meta = [a.platform]; + meta.push(a.browserName ? a.browserName : 'any'); + meta.push(a.version ? a.version : 'any'); + meta.push(a.name); // this is the test filename so always exists. + var metadata = meta.join('~').toLowerCase().replace(/ /g, ''); + return SCREENSHOT_PATH + metadata + '_' + padLeft(FILECOUNT++) + '_'; +} + +module.exports.imgpath = imgpath; +module.exports.SCREENSHOT_PATH = SCREENSHOT_PATH; \ No newline at end of file diff --git a/package.json b/package.json index 55124112..2c272d3f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "abe-cli", - "version": "2.7.2", + "version": "2.10.0", "description": "Abe command line tool", "main": "src/server/app.js", "repository": { @@ -8,27 +8,33 @@ "url": "git://github.com/AdFabConnect/abejs.git" }, "scripts": { + "postinstall": "node nightwatch.conf.js", "lint": "eslint src --fix", - "test": "mocha --compilers js:babel-register --require babel-polyfill", - "test-cov": "istanbul cover _mocha -- --compilers js:babel-register --require babel-polyfill", - "test-coveralls": "istanbul cover _mocha --report lcovonly -- --compilers js:babel-register --require babel-polyfill -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage", + "test": "mocha --recursive --compilers js:babel-register --require babel-polyfill", + "test-cov": "istanbul cover _mocha -- --recursive --compilers js:babel-register --require babel-polyfill", + "test-coveralls": "istanbul cover _mocha --report lcovonly -- --recursive --compilers js:babel-register --require babel-polyfill -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage", + "pretest-func": "ROOT=$PWD/tests/demo ./dist/index.js serve -p 3003 &", + "test-func": "sleep 6 && node_modules/.bin/nightwatch --config nightwatch.conf.js", + "posttest-func": "killall node", "start": "node --debug --harmony ./dist/server/index.js", "startpm2": "pm2 startOrRestart ./processes.json", - "babel": "babelify src/server/public/scripts/template-engine.js -o src/server/public/scripts/template-engine-compiled.js", - "watch": "./node_modules/.bin/parallelshell './node_modules/.bin/watchify -v -t babelify src/server/public/scripts/template-engine.js -o src/server/public/scripts/template-engine-compiled.js' './node_modules/.bin/watchify -v -t babelify src/server/public/scripts/admin.js -o src/server/public/scripts/admin-compiled.js' 'npm run watch:sass'", + "babel": "babelify --presets [ es2015 ] src/server/public/scripts/template-engine.js -o src/server/public/scripts/template-engine-compiled.js", + "watch": "./node_modules/.bin/parallelshell './node_modules/.bin/watchify -v -t [ babelify --presets [ es2015 ] ] src/server/public/scripts/template-engine.js -o src/server/public/scripts/template-engine-compiled.js' './node_modules/.bin/watchify -v -t [ babelify --presets [ es2015 ] ] src/server/public/scripts/admin.js -o src/server/public/scripts/admin-compiled.js' './node_modules/.bin/watchify -v -t [ babelify --presets [ es2015 ] ] src/server/public/scripts/user-login.js -o src/server/public/scripts/user-login-compiled.js' 'npm run watch:sass'", "watch:sass": "./node_modules/.bin/watch 'npm run sass' ./src/server/sass", "babel-app": "node_modules/.bin/babel-node --presets es2015", "build": "node_modules/.bin/babel-node --presets es2015 src/cli/build/template.js", "mvasset": "mkdirp dist/server/public && cp -r src/server/locale dist/server && cp -r src/server/views dist/server && cp -r src/server/public/css dist/server/public && cp -r src/server/public/fonts dist/server/public && cp -r src/server/public/image dist/server/public", "sass": "node ./src/tasks/sass.js", - "js:admin": "browserify -t babelify src/server/public/scripts/admin.js -o src/server/public/scripts/admin-compiled.js", - "js:engine": "browserify -t babelify src/server/public/scripts/template-engine.js -o src/server/public/scripts/template-engine-compiled.js", - "build:front": "npm run js:admin && npm run js:engine && npm run sass", + "js:users": "browserify -t [ babelify --presets [ es2015 ] ] src/server/public/scripts/user-login.js -o src/server/public/scripts/user-login-compiled.js", + "js:admin": "browserify -t [ babelify --presets [ es2015 ] ] src/server/public/scripts/admin.js -o src/server/public/scripts/admin-compiled.js", + "js:engine": "browserify -t [ babelify --presets [ es2015 ] ] src/server/public/scripts/template-engine.js -o src/server/public/scripts/template-engine-compiled.js", + "build:front": "npm run js:admin && npm run js:users && npm run js:engine && npm run sass", "build:scripts": "npm run build:front && ./node_modules/.bin/babel --presets es2015,stage-0 -d dist/server src/server/ && ./node_modules/.bin/babel --presets es2015,stage-0 -d dist/cli src/cli/ && npm run mvasset", "compile": "./node_modules/.bin/babel --presets es2015,stage-0 -d dist/ src/ && cp -r src/cli/core/config/config.json dist/cli/core/config/config.json", + "distribute": "npm run build:front && npm run compile && npm run mvasset", "watchdev": "npm run build:front && npm run compile && npm run mvasset && nodemon --debug --exec npm run compile && npm run mvasset --kill-others", "startdev": "npm run build:front && npm run compile && npm run mvasset && node src/tasks/nodemon.js & npm run watch --kill-others", - "startdevOnly": "npm run js:admin && npm run js:engine && node src/tasks/nodemon.js & npm run watch --kill-others" + "startdevOnly": "npm run js:admin && npm run js:users && npm run js:engine && node src/tasks/nodemon.js & npm run watch --kill-others" }, "author": "Adfab Connect", "license": "ISC", @@ -40,42 +46,58 @@ "ajax-request": "^1.2.1", "babel-polyfill": "^6.16.0", "babel-register": "^6.16.3", + "bcrypt-nodejs": "0.0.3", "bluebird": "^3.4.6", "body-parser": "^1.14.1", "child-process-promise": "^2.1.3", "cli-color": "^1.1.0", - "cli-table": "^0.3.1", "commander": "^2.9.0", "connect-busboy": "0.0.2", + "connect-flash": "^0.1.1", + "cookie-parser": "^1.4.1", + "cookies": "^0.6.1", + "csurf": "^1.8.3", "deepmerge": "^1.1.0", "dir-compare": "^1.2.0", - "exec": "^0.2.1", "express": "^4.13.3", "express-handlebars": "^3.0.0", "express-secure-handlebars": "^2.1.0", "express-session": "^1.13.0", "extend": "^3.0.0", "fs-extra": "^1.0.0", - "git-exec": "^0.2.1", "handlebars": "^4.0.3", "handlebars-helper-slugify": "^0.3.2", "handlebars-intl": "^1.1.1", "helmet": "^3.1.0", "html-minifier": "^3.1.0", "https": "^1.0.0", + "jimp": "^0.2.27", + "jwt-simple": "^0.4.1", "limax": "^1.4.0", "mkdirp": "^0.5.1", "moment": "^2.15.2", "nanoajax": "^0.4.0", "node-sqlparser": "^1.0.2", - "node-uuid": "^1.4.7", + "nodemailer": "^2.6.4", + "oauth2orize": "^1.2.2", "on": "^1.3.0", "openurl": "^1.1.0", + "owasp-password-strength-test": "^1.3.0", + "passport": "^0.3.2", + "passport-http": "^0.3.0", + "passport-http-bearer": "^1.0.1", + "passport-local": "^1.0.0", + "passport-oauth2-client-password": "^0.1.2", "pm2": "^2.0.18", "prettyjson": "^1.1.3", "prompt": "^1.0.0", "qs": "^6.0.1", + "ratelimiter": "^2.1.3", + "redis": "^2.6.0-1", "request": "^2.69.0", + "smartcrop-cli": "^1.0.2", + "smtp-server": "^1.11.1", + "uuid": "^3.0.0", "watch": "^1.0.1", "which": "^1.2.11", "xss": "^0.2.10" @@ -92,9 +114,14 @@ "eslint": "^3.6.0", "istanbul": "^1.1.0-alpha.1", "mocha": "^3.0.2", + "nightwatch": "^0.9.9", "node-sass": "^3.7.0", "nodemon": "^1.8.1", "parallelshell": "^2.0.0", + "phantomjs-prebuilt": "^2.1.13", + "selenium-download": "^2.0.7", + "sinon": "^1.17.6", + "sinon-chai": "^2.8.0", "watchify": "^3.4.0" } } diff --git a/src/cli/cms/Page.js b/src/cli/cms/Page.js index 55f83b17..16ef8668 100644 --- a/src/cli/cms/Page.js +++ b/src/cli/cms/Page.js @@ -140,7 +140,7 @@ export default class Page { } // I compile the text - var compiledTemplate = Handlebars.compile((!this._onlyHTML) ? cmsTemplates.insertDebugtoolUtilities(this.template) : this.template) + var compiledTemplate = Handlebars.compile(cmsTemplates.insertDebugtoolUtilities(this.template, this._onlyHTML)) // I create the html page ! yeah !!! this.html = compiledTemplate(json, {data: {intl: config.intlData}}) diff --git a/src/cli/cms/data/attributes.js b/src/cli/cms/data/attributes.js index 830bbeb0..c45b5025 100644 --- a/src/cli/cms/data/attributes.js +++ b/src/cli/cms/data/attributes.js @@ -30,9 +30,6 @@ export function getAll(str, json) { type: 'text', value: '', file: '', - precontrib: false, - slug: false, - slugType: false, visible: true } diff --git a/src/cli/cms/data/regex.js b/src/cli/cms/data/regex.js index 18a4d276..da5f78d6 100755 --- a/src/cli/cms/data/regex.js +++ b/src/cli/cms/data/regex.js @@ -70,20 +70,43 @@ export function getTagAbeTypeRequest(text) { } /** - * Test if a string contains string key from {{#each}} block statement - * @param {String} str string to test - * @return {Boolean} true = this is a block content */ -export function getTagAbePrecontribution(text) { - let listReg = /({{abe.*precontrib=[\'|\"].*}})/g +export function getTagAbeWithType(text, type) { + var listReg = new RegExp(`({{abe.*type=[\\'|\\"]${type}.*}})`, 'g') var matches = [] var match while (match = listReg.exec(text)) { - matches.push(match) + matches.push(match[0]) + } + return matches +} + +/** + */ +export function getTagAbeWithTab(text, tab) { + var listReg = new RegExp(`({{abe.*tab=[\\'|\\"]${tab}.*}})`, 'g') + var matches = [] + var match + while (match = listReg.exec(text)) { + matches.push(match[0]) } return matches } export function validDataAbe(str){ return str.replace(/\[([0-9]*)\]/g, '$1') +} + +export function getWorkflowFromOperationsUrl(str){ + let regUrl = /\/abe\/operations\/(.*?)\/(.*?)\// + var workflow = 'draft' + var match = str.match(regUrl) + if (match != null && match[2] != null) { + workflow = match[2] + } + var postUrl = str.replace(regUrl, '') + return { + workflow: workflow, + postUrl: postUrl + } } \ No newline at end of file diff --git a/src/cli/cms/data/source.js b/src/cli/cms/data/source.js index 38826a75..b3dd3f2f 100644 --- a/src/cli/cms/data/source.js +++ b/src/cli/cms/data/source.js @@ -22,7 +22,7 @@ export function requestList(obj, tplPath, match, jsonPage) { }else { jsonPage[obj.key] = data } - } else if ((jsonPage[obj.key] === null) && obj.prefill) { + } else if (jsonPage[obj.key] == null && obj.prefill) { if (obj['prefill-quantity'] && obj['max-length']) { jsonPage[obj.key] = data.slice(0, (obj['prefill-quantity'] > obj['max-length']) ? obj['max-length'] : obj['prefill-quantity']) }else if (obj['prefill-quantity']) { diff --git a/src/cli/cms/data/sql.js b/src/cli/cms/data/sql.js index 80a2cfd6..bfdc22ea 100755 --- a/src/cli/cms/data/sql.js +++ b/src/cli/cms/data/sql.js @@ -223,16 +223,35 @@ export function executeOrderByClause(files, orderby){ return files } +/** + * Keep only published post + * + * keepOnlyPublishedPost([files]) + * + * @param {Array} files paths + * @return {Array} files + */ +export function keepOnlyPublishedPost(files){ + var publishedValue = [] + Array.prototype.forEach.call(files, (file) => { + if (file.publish != null) { + publishedValue.push(file.publish) + } + }) + + return publishedValue +} + /** * Check array of files have path that match path statement * - * executeFromClause(['/'], ['/']) + * executeFromClause([array], ['/'], ['/']) * * @param {Array} statement paths * @param {Array} pathFromClause paths * @return {Array} files */ -export function executeFromClause(statement, pathFromClause){ +export function executeFromClause(files, statement, pathFromClause){ var from = sanitizeFromStatement(statement) // if the from clause ends with a dot, we won't recurse the directory analyze @@ -242,15 +261,13 @@ export function executeFromClause(statement, pathFromClause){ var fromDirectory = getFromDirectory(from, pathFromClause) - var list = Manager.instance.getList() - var files_array = list.filter((element) => { - if(element.publish) { - if (element.path.indexOf(fromDirectory) > -1) { - return true - } + var files_array = files.filter((element) => { + if (element.path.indexOf(fromDirectory) > -1) { + return true } return false }) + return files_array } @@ -263,10 +280,10 @@ export function executeFromClause(statement, pathFromClause){ * @return {Array} found object that match */ export function execQuery(pathQuery, match, jsonPage) { - var files + var files = keepOnlyPublishedPost(Manager.instance.getList()) var request = handleSqlRequest(cmsData.regex.getAttr(match, 'source'), jsonPage) - files = executeFromClause(request.from, pathQuery) + files = executeFromClause(files, request.from, pathQuery) files = executeWhereClause(files, request.where, request.limit, request.columns, jsonPage) files = executeOrderByClause(files, request.orderby) return files @@ -343,8 +360,8 @@ export function executeWhereClause(files, wheres, maxLimit, columns, jsonPage){ for(let file of files) { if(limit < maxLimit || maxLimit === -1) { if(wheres != null) { - if(file.publish && !recurseWhere(wheres, file.publish, jsonPage)) { - json = JSON.parse(JSON.stringify(file.publish)) + if(!recurseWhere(wheres, file, jsonPage)) { + json = JSON.parse(JSON.stringify(file)) jsonValues = {} if(columns != null && columns.length > 0 && columns[0] !== '*') { diff --git a/src/cli/cms/editor/form.js b/src/cli/cms/editor/form.js index c211c387..169f6536 100644 --- a/src/cli/cms/editor/form.js +++ b/src/cli/cms/editor/form.js @@ -56,10 +56,7 @@ export default class Form { type: 'text', value: '', visible: true, - precontrib: false, - precontribTemplates: '', - slug: false, - slugType: false + precontribTemplate: '' } obj = extend(true, defaultValues, obj) @@ -68,10 +65,6 @@ export default class Form { if(obj.key.indexOf('[') < 0 && obj.key.indexOf('.') > -1) { obj.block = obj.key.split('.')[0] } - - if (obj.precontrib === 'true') { - obj.tab = 'Precontribution' - } if(this._form[obj.tab] == null) this._form[obj.tab] = {item:[]} diff --git a/src/cli/cms/editor/handlebars/folders.js b/src/cli/cms/editor/handlebars/folders.js index d5c30567..e1667b98 100755 --- a/src/cli/cms/editor/handlebars/folders.js +++ b/src/cli/cms/editor/handlebars/folders.js @@ -1,16 +1,16 @@ import path from 'path' import recursiveFolder from './recursiveFolder' -export default function folders(obj, index, link) { +export default function folders(obj, index, link, translate) { var res if (obj.length > 0) { - if(link != null && link !== 'null') { - var links = link.replace(/^\//, '').split(path.sep) - links.pop() - res = recursiveFolder(obj, 1, '', links) - }else { - res = recursiveFolder(obj, 1) - } + if(link != null && link !== 'null') { + var links = link.replace(/^\//, '').split(path.sep) + links.pop() + res = recursiveFolder(obj, 1, '', links, false, translate) + }else { + res = recursiveFolder(obj, 1, '', null, false, translate) + } } return res } diff --git a/src/cli/cms/editor/handlebars/listPage.js b/src/cli/cms/editor/handlebars/listPage.js index 9880c7a6..b75d4d4e 100755 --- a/src/cli/cms/editor/handlebars/listPage.js +++ b/src/cli/cms/editor/handlebars/listPage.js @@ -3,6 +3,7 @@ import moment from 'moment' import { math ,abeExtend + ,config } from '../../../' export default function listPage(file, index, text) { @@ -13,7 +14,7 @@ export default function listPage(file, index, text) { res += '' res += `${math(index, '+', 1)} - + ${file.abe_meta.link} ` @@ -38,42 +39,44 @@ export default function listPage(file, index, text) { var workflow = '' - workflow += '' - if(file.draft != null) { - if((file.publish == null) - || (file.publish && file.publish.date < file.draft.date)) { - workflow += `draft` - }else { - workflow += `` + var status = file.abe_meta.status + var workflowUser = config.users.workflow + Array.prototype.forEach.call(workflowUser, (flow) => { + var hidden = '' + if(status !== flow) { + hidden = 'hidden' } - }else { - workflow += `` - } - workflow += '' - workflow += '' + workflow += `` + if(file[flow]) { + if (flow === 'publish') { + workflow += `` + }else { + workflow += `${flow}` + } + }else { - if (file.publish){ - workflow += `` - } - workflow += '' + } + workflow += '' + }) - workflow = abeExtend.hooks.instance.trigger('afterListPageDraft', workflow, file, index, text) res += workflow res += `
` + if(file.publish != null) { - res += ` ` } - - res += `
` Array.prototype.forEach.call(ctx, (item) => { - res += printInput(item) + if (precontrib) item.value = '' + res += printInput(item, root) }) res += '
' }else if(ctx[0].key.indexOf('[') > -1) { @@ -50,7 +60,8 @@ export default function printBlock (ctx) {
` Array.prototype.forEach.call(arrItem[i], (item) => { - res += printInput(item) + if (precontrib) item.value = '' + res += printInput(item, root) }) res += '
' }) @@ -59,7 +70,11 @@ export default function printBlock (ctx) { ` }else { - res += printInput(ctx[0]) + if (precontrib) ctx[0].value = '' + res += printInput(ctx[0], root) } + + // var template = cmsTemplates.Handlebars.compile(res) + // return new cmsTemplates.Handlebars.SafeString(template(ctx, {data: {intl: config.intlData}})) return res } diff --git a/src/cli/cms/editor/handlebars/printInput.js b/src/cli/cms/editor/handlebars/printInput.js index acb78c63..0c013a50 100755 --- a/src/cli/cms/editor/handlebars/printInput.js +++ b/src/cli/cms/editor/handlebars/printInput.js @@ -2,6 +2,7 @@ import sourceAutocomplete from './sourceAutocomplete' import sourceOption from './sourceOption' import { abeExtend + ,User } from '../../../' /** @@ -9,12 +10,13 @@ import { * && add appropriate attributs / data-attributs * @return {String|html} input / input group ... */ -export default function printInput () { - var params = arguments[0] +export default function printInput (params, root) { + // var params = arguments[0] params = abeExtend.hooks.instance.trigger('beforeEditorInput', params) + var desc = params.desc + ((params.required) ? ' *' : '') - var res = `
+ var res = `
' res += `` }else { + lastValues = JSON.stringify(params.value).replace(/\'/g, '"e;') res += ` ` @@ -31,7 +29,7 @@ export default function recursiveFolder(obj, index = 1, dataShow = '', links = n res += `` if(o.folders != null && o.folders.length > 0) { - sub += recursiveFolder(o.folders, index+1, name.replace(/\.| |\#/g, '_'), links, isVisible) + sub += recursiveFolder(o.folders, index+1, name.replace(/\.| |\#/g, '_'), links, isVisible, translate) } }) diff --git a/src/cli/cms/editor/handlebars/sourceAttr.js b/src/cli/cms/editor/handlebars/sourceAttr.js index dfcf1560..cdaf3a82 100755 --- a/src/cli/cms/editor/handlebars/sourceAttr.js +++ b/src/cli/cms/editor/handlebars/sourceAttr.js @@ -1,60 +1,88 @@ +export function isSelected(value, display, str) { + var selected = false -export default function sourceAttr(val, params) { - var hiddenVal = val + var pDisplay = prepareDisplay(value, str) + if (pDisplay === display) { + selected = true + } + + return selected +} + +export default function sourceAttr(obj, params) { + var str = params.display var selected = '' + var displayName = prepareDisplay(obj, str) - if(typeof hiddenVal === 'object' && Object.prototype.toString.call(hiddenVal) === '[object Object]') { - hiddenVal = JSON.stringify(hiddenVal).replace(/'/g, ''') - - try { - var displayVal = eval('val.' + params.display) - if(params.display != null&& displayVal != null) { - val = displayVal - }else { - val = val[Object.keys(val)[0]] - } - }catch(e) { - val = val[Object.keys(val)[0]] + Array.prototype.forEach.call(params.value, (pValue) => { + if (isSelected(pValue, displayName, str)) { + selected = 'selected' } + }) + + return { + hiddenVal: (typeof obj == 'object') ? JSON.stringify(obj).replace(/\'/g, '"e;') : obj, + selected: selected, + val: displayName } +} - if(typeof params.value === 'object' && Object.prototype.toString.call(params.value) === '[object Array]') { - Array.prototype.forEach.call(params.value, (v) => { - var item = v - try { - var displayV = eval('item.' + params.display) - if(params.display != null && displayV !== null) { - item = displayV - } else { - if(typeof v === 'string') { - item = v - } else { - item = v[Object.keys(v)[0]] - } - } - } catch(e) { - item = v[Object.keys(v)[0]] - } - - if(typeof val === 'object' && Object.prototype.toString.call(val) === '[object Array]' - && typeof item === 'object' && Object.prototype.toString.call(item) === '[object Array]') { - - Array.prototype.forEach.call(item, (i) => { - if(val.indexOf(i) >= 0) { - selected = 'selected="selected"' - } - }) - }else if(val === item) { - selected = 'selected="selected"' - } - }) - }else if(params.value === hiddenVal) { - selected = 'selected="selected"' +/** + * return the value from a json obj of a nested attribute + * @param {Object} obj the json object + * @param {string} path the path to object (dot notation) + * @return {[type]} the object containing the path object or undefined + */ +export function get(obj, path) { + if (path == null) { + return obj } + return path.split('.').reduce(function(prev, curr) { + return prev ? prev[curr] : undefined + }, obj || this) +} - return { - hiddenVal: hiddenVal, - selected: selected, - val: val +/** + * replace the variables in str by values from obj + * corresponding to keys + * @param {Object} obj the json object + * @param {string} str the string + * @return {string} the string with values + */ +export function prepareDisplay(obj, str = null) { + var keys = getKeys(str) + Array.prototype.forEach.call(keys, (key) => { + var val = get(obj, key) + var pattern = new RegExp('{{'+key+'}}|'+key, 'g') + str = str.replace(pattern, val) + }) + + if (str == null) { + str = obj + } + + return str +} + +/** + * return array of variables {{variable}} extracted from str + * @param {string} str the string containing variables + * @return {Array} the array of variables + */ +export function getKeys(str){ + var regex = /\{\{(.*?)\}\}/g + var variables = [] + var match + + while ((match = regex.exec(str)) !== null) { + if (match[1] != null) { + variables.push(match[1]) + } } + + if (variables.length == 0 && str != null) { + variables.push(str) + } + + return variables } diff --git a/src/cli/cms/media/image.js b/src/cli/cms/media/image.js new file mode 100644 index 00000000..a5b56f60 --- /dev/null +++ b/src/cli/cms/media/image.js @@ -0,0 +1,212 @@ +import execPromise from 'child-process-promise' +import mkdirp from 'mkdirp' +import fse from 'fs-extra' +import limax from 'limax' +import Jimp from 'jimp' +import path from 'path' +import {Promise} from 'bluebird' + +import { + abeExtend, + coreUtils, + cmsData, + config +} from '../../' + +export function cropAndSaveFile(imageSize, file, newFile) { + var p = new Promise((resolve) => { + Jimp.read(file).then(function (lenna) { + lenna.crop(0, 0, parseInt(imageSize[0]), parseInt(imageSize[1])).write(newFile) + }).catch(function (err) { + console.error(err) + }) + resolve() + }) + return p +} + +export function smartCropAndSaveFile(imageSize, file, newFile) { + var cmd = `node node_modules/smartcrop-cli/smartcrop-cli.js --width ${parseInt(imageSize[0])} --height ${parseInt(imageSize[1])} ${file} ${newFile}` + var p = execPromise.exec(cmd) + return p +} + +export function cropAndSaveFiles(images, file, resp) { + var length = images.length + var cropedImage = 0 + resp.thumbs = [] + var p = new Promise((resolve) => { + for (var i = 0; i < length; i++) { + var image = images[i] + var ext = path.extname(file) + var newFile = file.replace(ext, `_${images[i]}${ext}`) + resp.thumbs.push({ + name: newFile.replace(path.join(config.root, config.publish.url), ''), + size: image + }) + smartCropAndSaveFile(image.split('x'), file, newFile) + .then(function (result) { + if(result.stderr) { + cropAndSaveFile(image.split('x'), file, newFile).then(function () { + if(++cropedImage === length) { + resolve(resp) + } + }) + } + else if(++cropedImage === length) { + resolve(resp) + } + }) + .catch(function (err) { + console.log(err) + }) + } + }) + + return p +} + +export function generateThumbnail(file) { + var ext = path.extname(file).toLowerCase() + var thumbFileName = file.replace(ext, `_thumb${ext}`) + var thumbFileNameRelative = thumbFileName.replace(path.join(config.root, config.publish.url), '') + var p = new Promise((resolve) => { + var cropThumb = smartCropAndSaveFile([250, 250], file, thumbFileName) + cropThumb.then(function (result) { + var stderr = result.stderr + if(thumbsList != null) { + thumbsList.push({ + originalFile: file.replace(path.join(config.root, config.publish.url), ''), + thumbFile: thumbFileNameRelative + }) + } + if(stderr) { + cropAndSaveFile([250, 250], file, thumbFileName).then(function () { + resolve({thumb: thumbFileNameRelative}) + }) + } + else resolve({thumb: thumbFileNameRelative}) + }) + }) + + return p +} + +export function saveFile(req) { + var p = new Promise((resolve) => { + var folderFilePath = createMediaFolder(req) + var resp = {success: 1} + var filePath + req.pipe(req.busboy) + req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { + var ext = path.extname(filename).toLowerCase() + var slug = createMediaSlug(filename, ext) + var hasSentHeader = false + + filePath = path.join(folderFilePath, slug) + resp['filePath'] = path.join('/' + config.upload.image, slug) + + var returnErr = function (msg) { + hasSentHeader = true + file.resume() + resolve({error: 1, response: msg}) + } + + file.on('limit', function() { + returnErr('file is too big') + }) + + var isValid = isValidMedia(mimetype, ext) + if(isValid.error) returnErr(isValid.error) + + var fstream = fse.createWriteStream(filePath) + fstream.on('finish', function() { + if(hasSentHeader) return + if(/\.(jpg|png|gif|svg)/.test(filePath)) resp = abeExtend.hooks.instance.trigger('afterSaveImage', resp, req) + + var thumbPromise = generateThumbnail(filePath) + thumbPromise.then(function (thumbResp) { + resp.thumbnail = thumbResp.thumb + if(req.query.input.indexOf('data-size') > -1){ + var thumbsSizes = cmsData.regex.getAttr(req.query.input, 'data-size').split(',') + cropAndSaveFiles(thumbsSizes, filePath, resp).then(function (resp) { + resolve(resp) + }) + } + else resolve(resp) + }) + }) + file.pipe(fstream) + }) + }) + + return p +} + +export function isValidMedia(mimetype, ext) { + var allowedExtensions = ['.gif', '.jpg', '.jpeg', '.png', '.svg', '.mp4'] + var allowedMimetype = ['image/gif', 'image/jpeg', 'image/png', 'image/svg+xml', 'video/mp4'] + var error = false + if (allowedMimetype.indexOf(mimetype) < 0) error = 'unauthorized file' + else if (allowedExtensions.indexOf(ext) < 0) error = 'not a valid asset' + + return {error: error} +} + +export function createMediaSlug(filename, ext) { + var filenameNoExt = path.basename(filename, ext) + return limax(filenameNoExt, {separateNumbers: false}) + '-' + coreUtils.random.generateUniqueIdentifier(2) + ext +} + +export function createMediaFolder(req) { + var folderWebPath = '/' + config.upload.image + folderWebPath = abeExtend.hooks.instance.trigger('beforeSaveImage', folderWebPath, req) + var folderFilePath = path.join(config.root, config.publish.url, folderWebPath) + mkdirp.sync(folderFilePath) + + return folderFilePath +} + +var thumbsList + +export function getThumbsList() { + if(thumbsList != null) return thumbsList + thumbsList = [] + var pathToThumbs = path.join(config.root, config.publish.url, config.upload.image) + var files = coreUtils.file.getFilesSync(pathToThumbs, true) + Array.prototype.forEach.call(files, (pathFile) => { + pathFile = pathFile.replace(path.join(config.root, config.publish.url), '') + if(pathFile.indexOf('_thumb.') > -1){ + thumbsList.push({ + originalFile: pathFile.replace('_thumb.', '.'), + thumbFile: pathFile + }) + } + }) + + return thumbsList +} + +export function getAssociatedImageFileFromThumb(name) { + var rexMatchImageName = /_(thumb|\d+x\d+)/ + name = path.join(path.sep, name) + var originalName = path.join(path.sep, name.replace(rexMatchImageName, '')) + var imageList = { + thumbFile: name, + originalFile: originalName, + thumbs: [] + } + var pathThumb = name.split('/') + pathThumb.pop() + pathThumb = path.join(config.root, config.publish.url, pathThumb.join('/')) + + var files = coreUtils.file.getFilesSync(pathThumb, true) + Array.prototype.forEach.call(files, (pathFile) => { + pathFile = pathFile.replace(path.join(config.root, config.publish.url), '') + if(pathFile !== originalName && pathFile !== name && pathFile.replace(rexMatchImageName, '') === originalName){ + imageList.thumbs.push(pathFile) + } + }) + + return imageList +} diff --git a/src/cli/cms/media/index.js b/src/cli/cms/media/index.js new file mode 100644 index 00000000..7e7a3cb9 --- /dev/null +++ b/src/cli/cms/media/index.js @@ -0,0 +1,5 @@ +import * as image from './image' + +export { + image +} diff --git a/src/cli/cms/operations/create.js b/src/cli/cms/operations/create.js index f5c8af6f..7cd935e5 100644 --- a/src/cli/cms/operations/create.js +++ b/src/cli/cms/operations/create.js @@ -1,9 +1,9 @@ import path from 'path' import { + Manager, coreUtils, cmsTemplates, cmsOperations, - config, abeExtend, cmsData } from '../../' @@ -15,6 +15,13 @@ var create = function(template, pathCreate, name, req, forceJson = {}, duplicate var postUrl = path.join('/', pathCreate, name) postUrl = coreUtils.slug.clean(postUrl) + var postExist = Manager.instance.postExist(postUrl) + if (postExist) { + var postJson = cmsData.revision.getDocumentRevision(postUrl) + resolve(postJson) + return + } + var json = (forceJson) ? forceJson : {} json = cmsData.metas.create(json, template, postUrl) @@ -25,10 +32,10 @@ var create = function(template, pathCreate, name, req, forceJson = {}, duplicate var templateText = cmsTemplates.template.getTemplate(template) json = cmsData.values.removeDuplicate(templateText, json) } + var resHook = abeExtend.hooks.instance.trigger('beforeFirstSave', postUrl, req.body, json) postUrl = resHook.postUrl json = resHook.json - var p2 = cmsOperations.post.draft( postUrl, json, diff --git a/src/cli/cms/operations/post.js b/src/cli/cms/operations/post.js index fee27385..00545890 100644 --- a/src/cli/cms/operations/post.js +++ b/src/cli/cms/operations/post.js @@ -20,7 +20,7 @@ export function draft(filePath, json, workflow = 'draft') { var date = coreUtils.file.getDate(revisionPath) cmsData.metas.add(json, workflow, date) - var template = cmsTemplates.template.getTemplate(json.abe_meta.template) + var template = cmsTemplates.template.getTemplate(json.abe_meta.template, json) cmsData.source.getDataList(path.dirname(json.abe_meta.link), template, json) .then(() => { @@ -57,7 +57,7 @@ export function publish(filePath, json) { // revisionPath = coreUtils.file.addDateIsoToRevisionPath(revisionPath, workflow) cmsData.metas.add(json, 'publish') - var template = cmsTemplates.template.getTemplate(json.abe_meta.template) + var template = cmsTemplates.template.getTemplate(json.abe_meta.template, json) cmsData.source.getDataList(path.dirname(json.abe_meta.link), template, json) .then(() => { @@ -69,16 +69,17 @@ export function publish(filePath, json) { if (!cmsOperations.save.saveHtml(postPath, page.html)) { result = { success: 0, - error: 'cannot html save file' + error: 'cannot save html file' } }else { if (!cmsOperations.save.saveJson(revisionPath, json)) { result = { success: 0, - error: 'cannot json save file' + error: 'cannot save json file' } }else { Manager.instance.updatePostInList(revisionPath) + abeExtend.hooks.instance.trigger('afterPublish', json, filePath) result = { success: 1, json: json @@ -104,7 +105,7 @@ export function unpublish(filePath) { delete json.abe_meta.publish } - var p = draft( + var p = cmsOperations.post.draft( filePath, json, 'draft' @@ -126,17 +127,42 @@ export function unpublish(filePath) { return p } -export function reject(filePath, json) { +export function submit(filePath, json, workflow) { + var p + if (workflow === 'publish') { + p = cmsOperations.post.publish(filePath, json) + }else { + p = cmsOperations.post.draft(filePath, json, workflow) + } + + return p +} + +export function reject(filePath, json, workflow) { abeExtend.hooks.instance.trigger('beforeReject', filePath) + var rejectToWorkflow + var found = false + Array.prototype.forEach.call(config.users.workflow, (flow) => { + if (workflow === flow) { + found = true + } + if (!found) { + rejectToWorkflow = flow + } + }) + if (!found) { + rejectToWorkflow = 'draft' + } + var p = new Promise((resolve) => { if(json.abe_meta.publish != null) { delete json.abe_meta.publish } - var p2 = draft( + var p2 = cmsOperations.post.draft( filePath, json, - 'draft' + rejectToWorkflow ) p2.then((result) => { abeExtend.hooks.instance.trigger('afterReject', result) diff --git a/src/cli/cms/operations/remove.js b/src/cli/cms/operations/remove.js index 1832d381..9a6c8b2d 100644 --- a/src/cli/cms/operations/remove.js +++ b/src/cli/cms/operations/remove.js @@ -20,6 +20,8 @@ export function remove(filePath) { cmsOperations.remove.removeFile(revision.path, revision.htmlPath) }) + filePath = abeExtend.hooks.instance.trigger('afterDeleteFile', filePath, {}) + Manager.instance.removePostFromList(filePath.replace(new RegExp('\\/', 'g'), path.sep)) } @@ -32,21 +34,3 @@ export function removeFile(file, json) { fse.removeSync(json) } } - -export function olderRevisionByType(filePath, type) { - - const folder = path.dirname(filePath) - const file = path.basename(filePath) - const extension = path.extname(filePath) - - const files = coreUtils.file.getFilesSync(folder, false, extension) - Array.prototype.forEach.call(files, (fileItem) => { - const fname = cmsData.fileAttr.delete(fileItem) - const ftype = cmsData.fileAttr.get(fileItem).s - if(fname === file && ftype === type){ - const fileDraft = fileItem.replace(/-abe-./, '-abe-d') - cmsOperations.remove.removeFile(fileItem, coreUtils.file.changePath(fileItem, config.data.url).replace(extension, '.json')) - cmsOperations.remove.removeFile(fileDraft, coreUtils.file.changePath(fileDraft, config.data.url).replace(extension, '.json')) - } - }) -} diff --git a/src/cli/cms/templates/handlebars/concat.js b/src/cli/cms/templates/handlebars/concat.js new file mode 100644 index 00000000..849e6854 --- /dev/null +++ b/src/cli/cms/templates/handlebars/concat.js @@ -0,0 +1,5 @@ +export default function concat() { + var arg = Array.prototype.slice.call(arguments,0) + arg.pop() + return arg.join('') +} \ No newline at end of file diff --git a/src/cli/cms/templates/handlebars/getCurrentuserRole.js b/src/cli/cms/templates/handlebars/getCurrentuserRole.js new file mode 100644 index 00000000..05f74eed --- /dev/null +++ b/src/cli/cms/templates/handlebars/getCurrentuserRole.js @@ -0,0 +1,29 @@ +import Cookies from 'cookies' +import jwt from 'jwt-simple' + +import { + config, + User +} from '../../../' + +/** + * Handlebars helper, to print className and escape it string + */ +export default function getCurrentuserRole(obj) { + if(typeof obj.express !== 'undefined' && obj.express !== null) { + var cookies = new Cookies(obj.express.req, obj.express.res, { + secure: config.cookie.secure + }) + var token = cookies.get('x-access-token') + if(typeof token !== 'undefined' && token !== null && token !== '') { + var secret = config.users.secret + var decoded = jwt.decode(token, secret) + var user = User.utils.findSync(decoded.iss) + if (user && user.role) + return user.role.workflow + + return null + } + } + return '' +} diff --git a/src/cli/cms/templates/handlebars/isAuthorized.js b/src/cli/cms/templates/handlebars/isAuthorized.js new file mode 100644 index 00000000..c6a4ec17 --- /dev/null +++ b/src/cli/cms/templates/handlebars/isAuthorized.js @@ -0,0 +1,15 @@ +import { + config, + User +} from '../../../' + +/** + * Handlebars helper, to print className and escape it string + */ +export default function isAuthorized(route, role, ctx) { + if (User.utils.isUserAllowedOnRoute(role, route)) { + return ctx.fn(this) + }else { + return ctx.inverse(this) + } +} diff --git a/src/cli/cms/templates/handlebars/setVariable.js b/src/cli/cms/templates/handlebars/setVariable.js new file mode 100644 index 00000000..41124588 --- /dev/null +++ b/src/cli/cms/templates/handlebars/setVariable.js @@ -0,0 +1,13 @@ + +/** + * Handlebars helper, to add variable inside template file + */ +export default function setVariable(varName, varValue, options){ + if (varValue === 'true') { + varValue = true + } + if (varValue === 'false') { + varValue = false + } + options.data.root[varName] = varValue +} \ No newline at end of file diff --git a/src/cli/cms/templates/index.js b/src/cli/cms/templates/index.js index a8960683..9c8b519f 100755 --- a/src/cli/cms/templates/index.js +++ b/src/cli/cms/templates/index.js @@ -19,6 +19,10 @@ import truncate from './handlebars/truncate' import lowercase from './handlebars/lowercase' import uppercase from './handlebars/uppercase' import removeRootPath from './handlebars/removeRootPath' +import setVariable from './handlebars/setVariable' +import isAuthorized from './handlebars/isAuthorized' +import concat from './handlebars/concat' +import getCurrentuserRole from './handlebars/getCurrentuserRole' import * as template from './template' import * as assets from './assets' @@ -43,10 +47,15 @@ Handlebars.registerHelper('truncate', truncate) Handlebars.registerHelper('lowercase', lowercase) Handlebars.registerHelper('uppercase', uppercase) Handlebars.registerHelper('removeRootPath', removeRootPath) +Handlebars.registerHelper('setVariable', setVariable) +Handlebars.registerHelper('isAuthorized', isAuthorized) +Handlebars.registerHelper('concat', concat) +Handlebars.registerHelper('getCurrentuserRole', getCurrentuserRole) HandlebarsIntl.registerWith(Handlebars) export { + Handlebars, template, assets, encodeAbeTagAsComment, @@ -60,6 +69,10 @@ export { truncate, lowercase, uppercase, + setVariable, + isAuthorized, + concat, + getCurrentuserRole, math, moduloIf, notEmpty, diff --git a/src/cli/cms/templates/insertDebugtoolUtilities.js b/src/cli/cms/templates/insertDebugtoolUtilities.js index cfbdc09f..8baf759e 100644 --- a/src/cli/cms/templates/insertDebugtoolUtilities.js +++ b/src/cli/cms/templates/insertDebugtoolUtilities.js @@ -1,14 +1,20 @@ -export default function insertDebugtoolUtilities(text){ - return text.replace( - /<\/body>/, - ` - ` - ) +export default function insertDebugtoolUtilities(text, onlyHTML){ + if (onlyHTML) { + text = `{{&setVariable "abeEditor" false}}\n${text}` + }else { + text = `{{&setVariable "abeEditor" true}}\n${text}` + text = text.replace( + /<\/body>/, + ` + ` + ) + } + return text } \ No newline at end of file diff --git a/src/cli/cms/templates/template.js b/src/cli/cms/templates/template.js index e41c5fd4..11bb6810 100755 --- a/src/cli/cms/templates/template.js +++ b/src/cli/cms/templates/template.js @@ -5,8 +5,10 @@ import { config, coreUtils, cmsData, - abeExtend + abeExtend, + cmsTemplates } from '../../' +import * as sourceAttr from '../../cms/editor/handlebars/sourceAttr' export function getTemplatesAndPartials(templatesPath) { var p = new Promise((resolve) => { @@ -44,7 +46,7 @@ export function addOrder(text) { export function getAbeImport(text) { var partials = [] - let listReg = /({{abe.*?type=[\'|\"]import.*?}})/g + let listReg = /({{abe.*type=[\'|\"]import.*}})/g var match while (match = listReg.exec(text)) { partials.push(match[0]) @@ -53,8 +55,8 @@ export function getAbeImport(text) { return partials } -export function includePartials(text) { - var abeImports = getAbeImport(text) +export function includePartials(text, json) { + var abeImports = cmsTemplates.template.getAbeImport(text) Array.prototype.forEach.call(abeImports, (abeImport) => { var obj = cmsData.attributes.getAll(abeImport, {}) @@ -62,8 +64,20 @@ export function includePartials(text) { var file = obj.file var partial = '' file = path.join(config.root, config.partials, file) + + if (file.indexOf('{{') > -1) { + var keys = sourceAttr.getKeys(file) + Array.prototype.forEach.call(keys, (key) => { + try { + var toEval = `${key.replace(/(\[|\.|\])/g, '\\$1')}` + file = file.replace(new RegExp(`\{\{${toEval}\}\}`, 'g'), eval(`json.${key}`)) + }catch(e) { + } + }) + } + if(coreUtils.file.exist(file)) { - partial = includePartials(fse.readFileSync(file, 'utf8')) + partial = cmsTemplates.template.includePartials(fse.readFileSync(file, 'utf8'), json) } text = text.replace(cmsData.regex.escapeTextToRegex(abeImport, 'g'), partial) }) @@ -71,7 +85,7 @@ export function includePartials(text) { return text } -function translate(text) { +export function translate(text) { var importReg = /({{abe.*type=[\'|\"]translate.*}})/g var matches = text.match(importReg) @@ -113,7 +127,7 @@ function translate(text) { return text } -export function getTemplate (file) { +export function getTemplate (file, json = {}) { var text = '' // HOOKS beforeGetTemplate @@ -127,9 +141,9 @@ export function getTemplate (file) { file = path.join(config.root, config.templates.url, file + '.' + config.files.templates.extension) if(coreUtils.file.exist(file)) { text = fse.readFileSync(file, 'utf8') - text = includePartials(text) - text = translate(text) - text = addOrder(text) + text = cmsTemplates.template.includePartials(text, json) + text = cmsTemplates.template.translate(text) + text = cmsTemplates.template.addOrder(text) }else { text = `[ ERROR ] template ${file + '.' + config.files.templates.extension} doesn't exist anymore` } @@ -187,13 +201,13 @@ export function recurseWhereVariables (where) { var arRight switch(where.operator) { case 'AND': - arLeft = recurseWhereVariables(where.left) - arRight = recurseWhereVariables(where.right) + arLeft = cmsTemplates.template.recurseWhereVariables(where.left) + arRight = cmsTemplates.template.recurseWhereVariables(where.right) return arLeft.concat(arRight) break case 'OR': - arLeft = recurseWhereVariables(where.left) - arRight = recurseWhereVariables(where.right) + arLeft = cmsTemplates.template.recurseWhereVariables(where.left) + arRight = cmsTemplates.template.recurseWhereVariables(where.right) return arLeft.concat(arRight) break default: @@ -204,12 +218,12 @@ export function recurseWhereVariables (where) { return ar } -export function getTemplatesTexts(templatesList) { +export function getTemplatesTexts(templatesList, json) { var templates = [] var p = new Promise((resolve) => { Array.prototype.forEach.call(templatesList, (file) => { var template = fse.readFileSync(file, 'utf8') - template = includePartials(template) + template = cmsTemplates.template.includePartials(template, json) var name = file.replace(path.join(config.root, config.templates.url, path.sep), '').replace(`.${config.files.templates.extension}`, '') templates.push({ name: name, @@ -238,7 +252,7 @@ export function execRequestColumns(tpl) { }) } if(typeof request.where !== 'undefined' && request.where !== null) { - ar = ar.concat(recurseWhereVariables(request.where)) + ar = ar.concat(cmsTemplates.template.recurseWhereVariables(request.where)) } } }) @@ -250,7 +264,7 @@ export function getAbeRequestWhereKeysFromTemplates(templatesList) { var whereKeys = [] var p = new Promise((resolve) => { Array.prototype.forEach.call(templatesList, (file) => { - whereKeys = whereKeys.concat(execRequestColumns(file.template)) + whereKeys = whereKeys.concat(cmsTemplates.template.execRequestColumns(file.template)) }) whereKeys = whereKeys.filter(function (item, pos) {return whereKeys.indexOf(item) == pos}) resolve(whereKeys) @@ -259,33 +273,55 @@ export function getAbeRequestWhereKeysFromTemplates(templatesList) { return p } -export function getAbePrecontributionAttributesFromTemplates(templatesList) { - var ar = {} +export function setAbeSlugDefaultValueIfDoesntExist(templateText) { + var matches = cmsData.regex.getTagAbeWithType(templateText, 'slug') + if(matches == null || matches[0] == null) { + templateText = `{{abe type="slug" source="{{name}}"}}\n${templateText}` + } + + return templateText +} + +export function getAbeSlugFromTemplates(templatesList) { + var slugs = {} + Array.prototype.forEach.call(templatesList, (file) => { + var templateText = cmsTemplates.template.setAbeSlugDefaultValueIfDoesntExist(file.template) + var matchesSlug = cmsData.regex.getTagAbeWithType(templateText, 'slug') + var obj = cmsData.attributes.getAll(matchesSlug[0], {}) + slugs[file.name] = obj.sourceString + }) + return slugs +} + +export function setAbePrecontribDefaultValueIfDoesntExist(templateText) { + var matches = cmsData.regex.getTagAbeWithTab(templateText, 'slug') + if(matches == null || matches[0] == null) { + templateText = `{{abe type='text' key='name' desc='Name' required="true" tab="slug" visible="false"}}\n${templateText}` + } + + return templateText +} + +export function getAbePrecontribFromTemplates(templatesList) { var fields = [] var precontributionTemplate = '' Array.prototype.forEach.call(templatesList, (file) => { - var matches = cmsData.regex.getTagAbePrecontribution(file.template) - Array.prototype.forEach.call(matches, (match) => { - var obj = cmsData.attributes.getAll(match[0], {}) - if (ar[obj.key] == null) { - ar[obj.key] = obj - ar[obj.key].precontribTemplates = [] - } - ar[obj.key].precontribTemplates.push(file.name) - ar[obj.key].match = match[0] - }) - }) + var slugMatch = cmsData.regex.getTagAbeWithType(file.template, 'slug') + var templateText = file.template + if(slugMatch == null || slugMatch[0] == null) { + templateText = cmsTemplates.template.setAbePrecontribDefaultValueIfDoesntExist(file.template) + } - Array.prototype.forEach.call(Object.keys(ar), (key) => { - fields.push(ar[key]) - precontributionTemplate += ar[key].match.replace(/\}\}$/, ' precontribTemplates="' + ar[key].precontribTemplates.join(',') + '"}}') + '\n' + var matchesTabSlug = cmsData.regex.getTagAbeWithTab(templateText, 'slug') + Array.prototype.forEach.call(matchesTabSlug, (match) => { + fields.push(cmsData.attributes.getAll(match, {})) + var tag = match.replace(/\}\}$/, ' precontribTemplate="' + file.name + '"}}') + tag = tag.replace(/(key=[\'|\"])(.*?)([\'|\"])/, '$1/' + file.name + '/$2$3') + precontributionTemplate += `${tag}\n` + }) }) - if (precontributionTemplate === '') { // should always have a filename at least - precontributionTemplate = '{{abe type=\'text\' key=\'abe_filename\' desc=\'Name\' required="true" precontrib="true" slug="true" slugType="name" visible="false"}}' - var obj = cmsData.attributes.getAll(precontributionTemplate, {}) - fields.push(obj) - } + precontributionTemplate = cmsTemplates.template.addOrder(precontributionTemplate) return { fields: fields, diff --git a/src/cli/core/config/config.js b/src/cli/core/config/config.js index e2c90c7b..49c5a0b2 100755 --- a/src/cli/core/config/config.js +++ b/src/cli/core/config/config.js @@ -1,23 +1,27 @@ import fse from 'fs-extra' import clc from 'cli-color' import extend from 'extend' +import path from 'path' import config from './config.json' var result = config -result.root = result.root.replace(/\/$/, '') +result.root = process.cwd() +if(process.env.ROOT) { + result.root = process.env.ROOT.replace(/\/$/, '') +} + var hintAbeJson = false var loadLocalConfig = (result) => { - var website = result.root.replace(/\/$/, '') - if(website !==''){ + if(result.root !==''){ try{ - var stat = fse.statSync(website) + var stat = fse.statSync(result.root) if (stat && stat.isDirectory()) { try{ - stat = fse.statSync(website + '/abe.json') + stat = fse.statSync(path.join(result.root,'abe.json')) if (stat) { - var json = fse.readJsonSync(website + '/abe.json') + var json = fse.readJsonSync(path.join(result.root,'abe.json')) result = extend(true, result, json) } }catch(e) { @@ -25,7 +29,7 @@ var loadLocalConfig = (result) => { hintAbeJson = true console.log( clc.green('[ Hint ]'), - 'create abe.json to config', + 'you can create a specific config file named abe.json to customize your abe install', clc.cyan.underline('https://github.com/AdFabConnect/abejs/blob/master/docs/abe-config.md') ) } @@ -58,6 +62,37 @@ result.exist = (conf, json) => { } } +result.localConfigExist = () => { + if(result.root !==''){ + try{ + var stat = fse.statSync(result.root) + if (stat && stat.isDirectory()) { + try{ + stat = fse.statSync(path.join(result.root,'abe.json')) + if (stat) { + return true + } + }catch(e) { + return false + } + } + }catch(e){ + + return false + } + } + + return false +} + +result.getLocalConfig = () => { + if (result.localConfigExist()){ + return fse.readJsonSync(path.join(result.root,'abe.json')) + } else { + return {} + } +} + result.getDefault = (conf) => { return result[conf] } @@ -72,11 +107,15 @@ result.set = (json) => { loadLocalConfig(result) } -result.save = (website, json) => { - extend(true, result, json) +result.save = (json) => { + // extend(true, result, json) - var confPath = result.root.replace(/\/$/, '') + '/abe.json' - fse.writeJsonSync(confPath, json, { space: 2, encoding: 'utf-8' }) + if (result.localConfigExist()){ + // var abeJson = fse.readJsonSync(path.join(result.root,'abe.json')) + // extend(true, abeJson, json) + var confPath = path.join(result.root,'abe.json') + fse.writeJsonSync(confPath, json, { space: 2, encoding: 'utf-8' }) + } } result.getConfigByWebsite = () => { diff --git a/src/cli/core/config/config.json b/src/cli/core/config/config.json index 42dfc45a..55f723c4 100755 --- a/src/cli/core/config/config.json +++ b/src/cli/core/config/config.json @@ -4,9 +4,6 @@ "intlData": { "locales": "en-US" }, - "plugins": { - "url":"plugins" - }, "templates": { "url": "templates" }, @@ -93,8 +90,57 @@ "abeEngine": "../views/template-engine", "defaultPartials": "../../../../server/views/partials", "pluginsPartials": "partials", - "partials": "templates/partials", + "partials": "partials", "custom": "custom", "siteUrl": false, - "sitePort": false + "sitePort": false, + "users": { + "enable": false, + "secret": "GoNinjaGo", + "smtp": null, + "forgotExpire": 60, + "email": { + "from": "ABE Support ", + "subject": "Reset your password", + "text": "Reset your password {{forgotUrl}}", + "html": "Reset your password
{{forgotUrl}}" + }, + "mostCommonPassword": ["password", "123456", "12345678", "1234", "qwerty", "12345", "dragon", "pussy", "baseball", "football", "letmein", "monkey", "696969", "abc123", "mustang", "michael", "shadow", "master", "jennifer", "111111", "2000", "jordan", "superman", "harley", "1234567", "fuckme", "hunter", "fuckyou", "trustno1", "ranger", "buster", "thomas", "tigger", "robert", "soccer", "fuck", "batman", "test", "pass", "killer", "hockey", "george", "charlie", "andrew", "michelle", "love", "sunshine", "jessica", "asshole", "6969", "pepper", "daniel", "access", "123456789", "654321", "joshua", "maggie", "starwars", "silver", "william", "dallas", "yankees", "123123", "ashley", "666666", "hello", "amanda", "orange", "biteme", "freedom", "computer", "sexy", "thunder", "nicole", "ginger", "heather", "hammer", "summer", "corvette", "taylor", "fucker", "austin", "1111", "merlin", "matthew", "121212", "golfer", "cheese", "princess", "martin", "chelsea", "patrick", "richard", "diamond", "yellow", "bigdog", "secret", "asdfgh", "sparky", "cowboy"], + "owasp": { + "allowPassphrases": true, + "maxLength": 128, + "minLength": 10, + "minPhraseLength": 20, + "minOptionalTestsToPass": 4, + "sameAsUser": true, + "mostCommon": true + }, + "limiter": { + "duration": 6000, + "max": 100 + }, + "manage": ["admin"], + "roles": [ + { + "workflow":"admin", + "name":"Admin" + } + ], + "workflow": ["draft", "publish"], + "routes": { + "admin": [ + "/abe.*" + ] + }, + "default": { + "username": "admin", + "name": "admin", + "email": "admin@test.com", + "password": "Adm1n@test", + "role": { + "workflow":"admin", + "name":"Admin" + } + } + } } diff --git a/src/cli/core/manager/Manager.js b/src/cli/core/manager/Manager.js index 6b3d7926..0ba9ee00 100644 --- a/src/cli/core/manager/Manager.js +++ b/src/cli/core/manager/Manager.js @@ -33,6 +33,7 @@ class Manager { } init() { + this._pathPartials = path.join(config.root, config.partials) this._pathTemplate = path.join(config.root, config.templates.url) this._pathStructure = path.join(config.root, config.structure.url) this._pathReference = path.join(config.root, config.reference.url) @@ -64,6 +65,7 @@ class Manager { reference: new events.EventEmitter(0), } + // watch template folder try { fse.accessSync(this._pathTemplate, fse.F_OK) this._watchTemplateFolder = watch.createMonitor(this._pathTemplate, (monitor) => { @@ -88,6 +90,31 @@ class Manager { console.log('the directory ' + this._pathTemplate + ' does not exist') } + // watch partial folder + try { + fse.accessSync(this._pathPartials, fse.F_OK) + this._watchPartialsFolder = watch.createMonitor(this._pathPartials, (monitor) => { + monitor.on('created', (f, stat) => { + this.getKeysFromSelect() + this.updateStructureAndTemplates() + this.events.template.emit('update') + }) + monitor.on('changed', (f, curr, prev) => { + this.getKeysFromSelect() + this.updateStructureAndTemplates() + this.events.template.emit('update') + + }) + monitor.on('removed', (f, stat) => { + this.getKeysFromSelect() + this.updateStructureAndTemplates() + this.events.template.emit('update') + }) + }) + } catch (e) { + console.log('the directory ' + this._pathPartials + ' does not exist') + } + try { fse.accessSync(this._pathStructure, fse.F_OK) this._watchStructure = watch.createMonitor(this._pathStructure, (monitor) => { @@ -143,7 +170,8 @@ class Manager { return cmsTemplates.template.getAbeRequestWhereKeysFromTemplates(templatesText) .then((whereKeys) => { this._whereKeys = whereKeys - this._precontribution = cmsTemplates.template.getAbePrecontributionAttributesFromTemplates(templatesText) + this._slugs = cmsTemplates.template.getAbeSlugFromTemplates(templatesText) + this._precontribution = cmsTemplates.template.getAbePrecontribFromTemplates(templatesText) this.updateList() resolve() }, @@ -178,6 +206,10 @@ class Manager { return this._precontribution } + getSlugs() { + return this._slugs + } + updateReferences(referenceName) { var references = cmsReference.reference.getFiles() if(referenceName && references[referenceName]) this._references[referenceName] = references[referenceName] @@ -209,6 +241,20 @@ class Manager { return this } + /** + * return true if postUrl is found in the Manager list + * @param {String} postUrl The url path of the file + */ + postExist(postUrl){ + var parentRelativePath = cmsData.fileAttr.delete(postUrl.split('/').join(path.sep).replace(`.${config.files.templates.extension}`, '.json')).replace(/^\//, '') + const found = coreUtils.array.find(this._list, 'parentRelativePath', parentRelativePath) + + if (found.length > 0) { + return true + } + return false + } + /** * When a post is modified or created, this method is called so that the manager updates the list with the updated/new item * @param {String} pathFile The full path to the post @@ -266,8 +312,29 @@ class Manager { this._list = cmsData.file.getAllWithKeys(this._whereKeys) this._list.sort(coreUtils.sort.predicatBy('date', -1)) console.log('Manager updated') - - return this + } + + getPage(currentPage = 1, pageSize = 2, sortField = 'date', sortOrder = -1){ + const total = this._list.length + const pageCount = total/pageSize + const start = (currentPage - 1)*pageSize + const end = currentPage*pageSize + let list + if(sortField != 'date' || sortOrder != -1){ + const tmpList = this._list + tmpList.sort(coreUtils.sort.predicatBy(sortField, sortOrder)) + list = tmpList.slice(start, end) + } else { + list = this._list.slice(start, end) + } + + return { + 'currentPage': currentPage, + 'pageSize': pageSize, + 'total': total, + 'pageCount': pageCount, + 'list': list + } } addHbsTemplate(templateId) { diff --git a/src/cli/core/utils/array.js b/src/cli/core/utils/array.js index 5da72f75..d00322e9 100644 --- a/src/cli/core/utils/array.js +++ b/src/cli/core/utils/array.js @@ -62,4 +62,14 @@ export function removeByAttr(arr, attr, value){ } return arr -} \ No newline at end of file +} + +export function contains(arr, obj) { + var i = arr.length + while (i--) { + if (arr[i] === obj) { + return true + } + } + return false +} diff --git a/src/cli/core/utils/index.js b/src/cli/core/utils/index.js index f6fa46d4..e42f41a0 100644 --- a/src/cli/core/utils/index.js +++ b/src/cli/core/utils/index.js @@ -4,6 +4,7 @@ import * as text from './text' import locales from './locales' import * as slug from './slug' import * as file from './file' +import * as random from './random' export { array, @@ -11,5 +12,6 @@ export { text, locales, slug, - file + file, + random } \ No newline at end of file diff --git a/src/cli/core/utils/random.js b/src/cli/core/utils/random.js new file mode 100644 index 00000000..166e12be --- /dev/null +++ b/src/cli/core/utils/random.js @@ -0,0 +1,3 @@ +export function generateUniqueIdentifier(substring = 0) { + return (((1+Math.random())*0x100000)|0).toString(16).substring(substring) +} \ No newline at end of file diff --git a/src/cli/core/utils/text.js b/src/cli/core/utils/text.js index 2323136f..896e077c 100644 --- a/src/cli/core/utils/text.js +++ b/src/cli/core/utils/text.js @@ -1,5 +1,25 @@ +import xss from 'xss' + export function replaceUnwantedChar(str) { var chars = {'’': '', '\'': '', '"': '', 'Š': 'S', 'š': 's', 'Ž': 'Z', 'ž': 'z', 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'A', 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I', 'Ï': 'I', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ý': 'Y', 'Þ': 'B', 'ß': 'Ss', 'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'a', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'œ': 'oe', 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'o', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ý': 'y', 'þ': 'b', 'ÿ': 'y'} for(var prop in chars) str = str.replace(new RegExp(prop, 'g'), chars[prop]) return str +} + +export function checkXss(newUser) { + var newUserStr = JSON.stringify(newUser) + var testXSS = xss(newUserStr.replace(/[a-zA-Z0-9-]*?=\\[\"\'].*?[\"\']/g, ''), { + whiteList: [], + stripIgnoreTag: true, + // stripIgnoreTagBody: ['script'] + }) + if(testXSS !== newUserStr){ + return { + success:0, + message: 'invalid characters' + } + } + return { + success:1 + } } \ No newline at end of file diff --git a/src/cli/extend/plugins.js b/src/cli/extend/plugins.js index 88b05ed8..91980ed4 100755 --- a/src/cli/extend/plugins.js +++ b/src/cli/extend/plugins.js @@ -3,8 +3,6 @@ import {Promise} from 'bluebird' import path from 'path' import fse from 'fs-extra' import clc from 'cli-color' -import mkdirp from 'mkdirp' -import git from 'git-exec' import which from 'which' const npm = which.sync('npm') @@ -20,121 +18,29 @@ class Plugins { constructor(enforcer) { if(enforcer != singletonEnforcer) throw 'Cannot construct Plugins singleton' + this.pluginsDir = path.join(config.root, 'node_modules') + path.sep + this.scriptsDir = path.join(config.root, 'scripts') + path.sep this._plugins = [] this.fn = [] - var pluginsDir = path.join(config.root, config.plugins.url) - try { - var directoryPlugins = fse.lstatSync(pluginsDir) - if (directoryPlugins.isDirectory()) { - - this._plugins = coreUtils.file.getFoldersSync(pluginsDir, false) - Array.prototype.forEach.call(this._plugins, (plugin) => { - var name = plugin.path.replace(pluginsDir + '/', '') - // has hooks - var plugHooks = path.join(plugin.path, config.hooks.url) - try { - var directoryHook = fse.lstatSync(plugHooks) - if (directoryHook.isDirectory()) { - var plugHooksFile = path.join(plugHooks, 'hooks.js') - var h = require(plugHooksFile) - plugin.hooks = h.default - }else { - plugin.hooks = null - } - }catch(e) { - plugin.hooks = null - } - - // has partials - var plugPartials = path.join(plugin.path, config.pluginsPartials) - try { - var directoryPartials = fse.lstatSync(plugPartials) - if (directoryPartials.isDirectory()) { - plugin.partials = plugPartials - }else { - plugin.partials = null - } - }catch(e) { - plugin.partials = null - } - - // has templates - var plugTemplates = path.join(plugin.path, config.templates.url) - try { - var directoryTemplates = fse.lstatSync(plugTemplates) - if (directoryTemplates.isDirectory()) { - plugin.templates = plugTemplates - }else { - plugin.templates = null - } - }catch(e) { - plugin.templates = null - } - - // has process - var plugProcess = path.join(plugin.path, 'process') - try { - var directoryProcess = fse.lstatSync(plugProcess) - if (directoryProcess.isDirectory()) { - plugin.process = {} - let processFiles = coreUtils.file.getFilesSync(plugProcess, false) - Array.prototype.forEach.call(processFiles, (processFile) => { - plugin.process[path.basename(processFile, '.js')] = processFile - }) - }else { - plugin.process = null - } - }catch(e) { - plugin.process = null - } + + // Plugins + if(config.plugins && Array.isArray(config.plugins)){ + Array.prototype.forEach.call(config.plugins, (pluginEntry) => { + const plugin = this.getPluginConfig(this.pluginsDir, pluginEntry) + this._plugins.push(plugin) + }) + } - // has routes - var plugRoutes = path.join(plugin.path, 'routes') - try { - var directoryRoute = fse.lstatSync(plugRoutes) - if (directoryRoute.isDirectory()) { - plugin.routes = {} - - var gets = path.join(plugRoutes, 'get') - try { - var directoryGets = fse.lstatSync(gets) - if (directoryGets.isDirectory()) { - let routesGet = [] - let routePaths = coreUtils.file.getFilesSync(gets, false) - Array.prototype.forEach.call(routePaths, (route) => { - let pathUrl = `/abe/plugin/${name}/${path.basename(route, '.js')}*` - let routeObject = {'path':route, 'routePath':pathUrl} - routesGet.push(routeObject) - }) - plugin.routes.get = routesGet - } - }catch(e) { - plugin.routes.get = null - } - try { - let posts = path.join(plugRoutes, 'post') - let directoryPosts = fse.lstatSync(gets) - if (directoryPosts.isDirectory()) { - let routesPost = [] - let routePaths = coreUtils.file.getFilesSync(posts, false) - Array.prototype.forEach.call(routePaths, (route) => { - let pathUrl = `/abe/plugin/${name}/${path.basename(route, '.js')}*` - let routeObject = {'path':route, 'routePath' : pathUrl} - routesPost.push(routeObject) - }) - plugin.routes.post = routesPost - } - }catch(e) { - plugin.routes.post = null - } - }else { - plugin.routes = null - } - }catch(e) { - plugin.routes = null - } + // Scripts + try { + var directoryScripts = fse.lstatSync(this.scriptsDir) + if (directoryScripts.isDirectory()) { + this._scripts = coreUtils.file.getFoldersSync(this.scriptsDir, false) + Array.prototype.forEach.call(this._scripts, (scriptEntry) => { + const name = scriptEntry.path.replace(this.scriptsDir, '') + const script = this.getPluginConfig(this.scriptsDir, name) + this._plugins.push(script) }) - } } catch (e) { @@ -148,6 +54,123 @@ class Plugins { return this[singleton] } + getPluginConfig(dir, entry){ + // remove npm version if any + let pluginId = entry.split('@')[0] + + // remove github version if any + pluginId = pluginId.split('#')[0] + + // remove github path if any + pluginId = path.basename(pluginId) + + let plugHook = path.join(dir, pluginId, config.hooks.url, 'hooks.js') + let plugPartials = path.join(dir, pluginId, config.pluginsPartials) + let plugTemplates = path.join(dir, pluginId, config.templates.url) + let plugProcess = path.join(dir, pluginId, 'process') + let plugRoutes = path.join(dir, pluginId, 'routes') + let plugin = { + hooks : null, + partials : null, + templates : null, + process : null, + routes : null + } + + try { + var fileHook = fse.lstatSync(plugHook) + if (fileHook.isFile()) { + try { + var h = require(plugHook) + } catch(e){ + console.log(e.stack) + console.log( + clc.green('[ Hint ]'), + 'It seems that you don\'t have the npm module babel-preset-es2015 installed on your project' + ) + } + plugin.hooks = h.default + } + }catch(e) { + plugin.hooks = null + } + + try { + var directoryPartials = fse.lstatSync(plugPartials) + if (directoryPartials.isDirectory()) { + plugin.partials = plugPartials + } + }catch(e) { + plugin.partials = null + } + + try { + var directoryTemplates = fse.lstatSync(plugTemplates) + if (directoryTemplates.isDirectory()) { + plugin.templates = plugTemplates + } + }catch(e) { + plugin.templates = null + } + + try { + var directoryProcess = fse.lstatSync(plugProcess) + if (directoryProcess.isDirectory()) { + plugin.process = {} + let processFiles = coreUtils.file.getFilesSync(plugProcess, false) + Array.prototype.forEach.call(processFiles, (processFile) => { + plugin.process[path.basename(processFile, '.js')] = processFile + }) + } + }catch(e) { + plugin.process = null + } + + try { + var directoryRoute = fse.lstatSync(plugRoutes) + if (directoryRoute.isDirectory()) { + plugin.routes = {} + + var gets = path.join(plugRoutes, 'get') + try { + var directoryGets = fse.lstatSync(gets) + if (directoryGets.isDirectory()) { + let routesGet = [] + let routePaths = coreUtils.file.getFilesSync(gets, false) + Array.prototype.forEach.call(routePaths, (route) => { + let pathUrl = `/abe/plugin/${pluginId}/${path.basename(route, '.js')}*` + let routeObject = {'path':route, 'routePath':pathUrl} + routesGet.push(routeObject) + }) + plugin.routes.get = routesGet + } + }catch(e) { + plugin.routes.get = null + } + try { + let posts = path.join(plugRoutes, 'post') + let directoryPosts = fse.lstatSync(gets) + if (directoryPosts.isDirectory()) { + let routesPost = [] + let routePaths = coreUtils.file.getFilesSync(posts, false) + Array.prototype.forEach.call(routePaths, (route) => { + let pathUrl = `/abe/plugin/${pluginId}/${path.basename(route, '.js')}*` + let routeObject = {'path':route, 'routePath' : pathUrl} + routesPost.push(routeObject) + }) + plugin.routes.post = routesPost + } + }catch(e) { + plugin.routes.post = null + } + } + }catch(e) { + plugin.routes = null + } + + return plugin + } + getProcess(fn) { var proc = null if(typeof this._plugins !== 'undefined' && this._plugins !== null) { @@ -169,7 +192,7 @@ class Plugins { if(this._plugins != null) { Array.prototype.forEach.call(this._plugins, (plugin) => { - if(plugin.hooks != null&& plugin.hooks[fn] != null) { + if(plugin.hooks != null && plugin.hooks[fn] != null) { args[0] = plugin.hooks[fn].apply(this, args) } }) @@ -181,10 +204,6 @@ class Plugins { return args[0] } - getHooks() { - return this._plugins - } - getPartials() { var partials = [] Array.prototype.forEach.call(this._plugins, (plugin) => { @@ -207,95 +226,173 @@ class Plugins { return routes } - add(dir, plugin) { - var p = new Promise((resolve) => { + removePlugin(plugin){ + let pluginName = plugin.split('@')[0] + pluginName = pluginName.split('#')[0] + if(config.localConfigExist()){ + let json = config.getLocalConfig() + if(typeof json.plugins !== 'undefined' && json.plugins !== null) { + Array.prototype.forEach.call(json.plugins, (plugged, index) => { + if (pluginName === path.basename(plugged.split('@')[0].split('#')[0])) { + json.plugins.splice(index, 1) + config.save(json) + } + }) + } + } + } + + updatePlugin(plugin){ + let json = {} + let createLocalConfig = true + let pluginName = plugin.split('@')[0] + pluginName = pluginName.split('#')[0] + + if(config.localConfigExist()){ + json = config.getLocalConfig() + createLocalConfig = false + } + + if(typeof json.plugins === 'undefined' || json.plugins === null) { + json.plugins = [plugin] + } else { + var found = false + Array.prototype.forEach.call(json.plugins, (plugged, index) => { + if (pluginName === plugged.split('@')[0].split('#')[0]) { + json.plugins[index] = plugin + found = true + } + }) + if (!found) { + json.plugins.push(plugin) + } + } + + if(createLocalConfig){ + console.log( + clc.green('[ Hint ]'), + 'creating a local config abe.json with your plugin definition', + clc.cyan.underline('https://github.com/AdFabConnect/abejs/blob/master/docs/abe-config.md') + ) + } + + config.save(json) + } + + uninstall(dir, plugin) { + if(plugin !== null) { + this.remove(dir, plugin) + .then(function() { + + return 0 + }) + } else { + console.log(clc.cyan('no plugin with this name found')) + + return 0 + } + } + + install(dir, plugin = null) { + if(plugin !== null) { + this.add(dir, plugin) + .then(function() { + + return 0 + }) + } else { + if(config.plugins && Array.isArray(config.plugins)){ + var ps = [] + Array.prototype.forEach.call(config.plugins, (plugin) => { + ps.push(this.add(dir, plugin)) + }) - var pluginName = plugin.split('/') - pluginName = pluginName[pluginName.length - 1].split('.')[0] - var pluginDir = path.join(dir, 'plugins', pluginName) - - try{ - fse.statSync(pluginDir) - console.log(clc.green('remove plugin'), pluginName) - fse.removeSync(pluginDir) + Promise.all(ps) + .then(function() { + + return 0 + }) + } else { + console.log(clc.cyan('no plugin found')) + + return 0 } - catch(e){ + } + } + + remove(dir, plugin) { + var p = new Promise((resolve) => { + try { + console.log(clc.green('spawn'), clc.cyan('npm uninstall ' + plugin)) + // const npmUninstall = spawn('npm', ['uninstall', pluginDir]); + const npmUninstall = spawn(npm, ['uninstall', '--save', plugin], { cwd: dir }) + + npmUninstall.stdout.on('data', (data) => { + console.log(''+data) + }) + + npmUninstall.stderr.on('data', (data) => { + console.log(''+data) + }) + + npmUninstall.on('close', (code) => { + console.log(clc.cyan('child process exited with code'), code) + + if(code == 0){ + this.removePlugin(plugin) + } + + resolve() + }) + + npmUninstall.on('error', (err) => { + console.log(clc.red('cannot uninstall npm dependencies for'), dir) + console.log(err) + resolve(err) + }) + } catch (err) { + console.log(clc.cyan('uninstall'), err) + resolve(err) } - console.log(clc.green('mkdir'), clc.green(pluginDir)) - mkdirp(pluginDir) - - git.clone(plugin, pluginDir, function(repo) { - if (repo !== null) { - try { - console.log(clc.green('cd'), clc.green(pluginDir)) - process.chdir(pluginDir) - - console.log(clc.green('spawn'), clc.cyan('npm install')) - // const npmInstall = spawn('npm', ['install', pluginDir]); - const npmInstall = spawn(npm, ['install']) - - npmInstall.stdout.on('data', (data) => { - var str = data.toString(), lines = str.split(/(\r?\n)/g) - for (var i=0; i { - var str = data.toString(), lines = str.split(/(\r?\n)/g) - for (var i=0; i { - console.log(clc.cyan('child process exited with code'), code) - - var json = {} - var abeJson = dir + '/abe.json' - - try { - var stat = fse.statSync(abeJson) - if (stat) { - json = fse.readJsonSync(abeJson) - } - }catch(e) { - console.log(e) - console.log(clc.cyan('no abe.json creating'), abeJson) - } - - if(typeof json.dependencies === 'undefined' || json.dependencies === null) { - json.dependencies = [plugin] - }else { - var found = false - Array.prototype.forEach.call(json.dependencies, (plugged) => { - if (plugin === plugged) { - found = true - } - }) - if (!found) { - json.dependencies.push(plugin) - } - } - - fse.writeJsonSync(abeJson, json, { space: 2, encoding: 'utf-8' }) - resolve() - }) + add(dir, plugin) { + var p = new Promise((resolve) => { + try { + console.log(clc.green('spawn'), clc.cyan('npm install ' + plugin)) + // const npmInstall = spawn('npm', ['install', pluginDir]); + const npmInstall = spawn(npm, ['install', '--save', plugin], { cwd: dir }) - npmInstall.on('error', (err) => { - console.log(clc.red('cannot install npm dependencies for'), pluginDir) - console.log(err) - resolve(err) - }) - } catch (err) { - console.log(clc.cyan('chdir'), err) - resolve(err) + npmInstall.stdout.on('data', (data) => { + console.log(''+data) + }) + + npmInstall.stderr.on('data', (data) => { + console.log(''+data) + }) + + npmInstall.on('close', (code) => { + console.log(clc.cyan('child process exited with code'), code) + + if(code == 0){ + this.updatePlugin(plugin) } - } else { - console.log(clc.red('clone error')) + + resolve() + }) + + npmInstall.on('error', (err) => { + console.log(clc.red('cannot install npm dependencies for'), dir) + console.log(err) resolve(err) - } - }) + }) + } catch (err) { + console.log(clc.cyan('install'), err) + resolve(err) + } }) return p diff --git a/src/cli/index.js b/src/cli/index.js index 0911f7c1..4609af8b 100755 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -46,8 +46,10 @@ import * as cmsOperations from './cms/operations' import * as cmsTemplates from './cms/templates' import * as cmsReference from './cms/reference' import * as cmsStructure from './cms/structure' +import * as cmsMedia from './cms/media' import * as coreUtils from './core/utils' import * as abeExtend from './extend' +import * as User from './users' export { cmsData, @@ -55,6 +57,7 @@ export { cmsTemplates, cmsReference, cmsStructure, + cmsMedia, coreUtils, cmsEditor, abeExtend, @@ -83,7 +86,8 @@ export { ifCond, config, Manager, - Page + Page, + User } export {compileAbe as compileAbe} diff --git a/src/cli/users/index.js b/src/cli/users/index.js new file mode 100644 index 00000000..e6e9df27 --- /dev/null +++ b/src/cli/users/index.js @@ -0,0 +1,9 @@ +import manager from './manager' +import * as operations from './operations' +import * as utils from './utils' + +export { + manager + ,operations + ,utils +} \ No newline at end of file diff --git a/src/cli/users/manager.js b/src/cli/users/manager.js new file mode 100644 index 00000000..e5d1fd37 --- /dev/null +++ b/src/cli/users/manager.js @@ -0,0 +1,70 @@ +import fs from 'fs-extra' +import mkdirp from 'mkdirp' +import path from 'path' + +import { + config + ,coreUtils + ,User +} from '../../cli' + +let singleton = Symbol() +let singletonEnforcer = Symbol() + +class Manager { + + constructor(enforcer) { + + if(enforcer != singletonEnforcer) throw 'Cannot construct Json singleton' + + this._isEnable = config.users.enable + this._file = path.join(config.root, 'users', 'bdd.json') + } + + static get instance() { + if(!this[singleton]) { + this[singleton] = new Manager(singletonEnforcer) + } + return this[singleton] + } + + read() { + if (this._isEnable) { + if (coreUtils.file.exist(this._file)) { + return JSON.parse(fs.readFileSync(this._file, 'utf8')) + }else { + this._users = [] + var admin = User.operations.add(config.users.default) + this.save() + User.operations.activate(admin.user.id) + return JSON.parse(fs.readFileSync(this._file, 'utf8')) + } + } + return [] + } + + save() { + if (this._isEnable) { + mkdirp(path.dirname(this._file)) + fs.writeJsonSync(this._file, this._users, { space: 2, encoding: 'utf-8' }) + } + } + + get() { + if (this._users == null) { + this._users = this.read() + } + return this._users + } + + update(json) { + if (this._isEnable) { + this._users = json + this.save() + return true + } + return false + } +} + +export default Manager \ No newline at end of file diff --git a/src/cli/users/operations.js b/src/cli/users/operations.js new file mode 100644 index 00000000..2144ee22 --- /dev/null +++ b/src/cli/users/operations.js @@ -0,0 +1,132 @@ +import { + coreUtils + ,User +} from '../../cli' + +export function add(newUser) { + var xss = coreUtils.text.checkXss(newUser) + if(xss.success === 0) { + return xss + } + var sameEmail = User.utils.checkSameEmail(newUser) + if(sameEmail.success === 0) { + return sameEmail + } + + User.utils.getRole(newUser) + var bdd = User.manager.instance.get() + var lastId = 0 + for (var i = 0, len = bdd.length; i < len; i++) { + lastId = parseInt(bdd[i].id) + } + newUser.id = lastId+1 + newUser.actif = 0 + var cPassword = User.utils.commonPassword(newUser) + if(cPassword.success === 0) { + return cPassword + } + + newUser.password = User.utils.encryptPassword(10, newUser.password) + bdd.push(newUser) + + User.manager.instance.update(bdd) + + return { + success:1, + user: newUser + } +} + +export function deactivate(id) { + var bdd = User.manager.instance.get() + id = parseInt(id) + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (parseInt(user.id) === id) { + bdd[i].actif = 0 + } + } + User.manager.instance.update(bdd) + return bdd +} + +export function activate(id) { + var bdd = User.manager.instance.get() + id = parseInt(id) + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (parseInt(user.id) === id) { + bdd[i].actif = 1 + } + } + User.manager.instance.update(bdd) + return bdd +} + +export function remove(id) { + var bdd = User.manager.instance.get() + id = parseInt(id) + var newBdd = [] + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (parseInt(user.id) !== id) { + newBdd.push(user) + } + } + bdd = newBdd + User.manager.instance.update(bdd) + return bdd +} + +export function update(data) { + var xss = coreUtils.text.checkXss(data) + if(xss.success === 0) { + return xss + } + var sameEmail = User.utils.checkSameEmail(data) + if(sameEmail.success === 0) { + return sameEmail + } + + User.utils.getRole(data) + + var bdd = User.manager.instance.get() + var id = parseInt(data.id) + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (parseInt(user.id) === id) { + Array.prototype.forEach.call(Object.keys(data), function(key) { + user[key] = data[key] + }) + } + } + bdd = User.manager.instance.update(bdd) + + return { + success:1, + user: data + } +} + +export function updatePassword(data, password) { + var cPassword = User.utils.commonPassword(data) + if(cPassword.success === 0) { + return cPassword + } + + var bdd = User.manager.instance.get() + var id = parseInt(data.id) + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (parseInt(user.id) === id) { + user.password = User.utils.encryptPassword(10, password) + } + } + + bdd = User.manager.instance.update(bdd) + + return { + success:1, + user: data + } +} \ No newline at end of file diff --git a/src/cli/users/utils.js b/src/cli/users/utils.js new file mode 100644 index 00000000..804fbbbc --- /dev/null +++ b/src/cli/users/utils.js @@ -0,0 +1,316 @@ +import redis from 'redis' +import Limiter from 'ratelimiter' +import owasp from 'owasp-password-strength-test' +import bcrypt from 'bcrypt-nodejs' +import Cookies from 'cookies' +import jwt from 'jwt-simple' + +import { + User + ,config + ,coreUtils +} from '../../cli' + +export function checkSameEmail(data) { + var emailAlreadyUsed = false + var bdd = User.manager.instance.get() + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (user.email === data.email && parseInt(user.id) !== parseInt(data.id)) { + emailAlreadyUsed = true + } + } + + if (emailAlreadyUsed === true) { + return { + success:0, + message: 'Email adress already exist' + } + }else { + return { + success:1 + } + } +} + +export function getRole(data) { + var roles = config.users.roles + Array.prototype.forEach.call(roles, (role) => { + if(role.name === data.role) { + data.role = role + } + }) + + return data +} + +export function commonPassword(data) { + var owaspConfig = config.users.owasp + owasp.config(owaspConfig) + var sameAsUser = (typeof owaspConfig.sameAsUser !== 'undefined' && owaspConfig.sameAsUser !== null) ? owaspConfig.sameAsUser : true + var mostCommon = (typeof owaspConfig.mostCommon !== 'undefined' && owaspConfig.mostCommon !== null) ? owaspConfig.mostCommon : true + var mostCommonPassword = config.users.mostCommonPassword + owasp.tests.required.push(function(password) { + if (mostCommon && coreUtils.array.contains(mostCommonPassword, password.toLowerCase())) { + return 'the password used is too common.' + } + }) + + var currentUserName = data.username + owasp.tests.required.push(function(password) { + var username = currentUserName + var shouldTest = sameAsUser + + if(shouldTest) { + if (password.toLowerCase() === username.toLowerCase()) { + return 'username and password must be different.' + } + if (password.toLowerCase() === username.toLowerCase().split('').reverse().join('')) { + return 'username and password must be different, not just inverted.' + } + } + }) + + var res = owasp.test(data.password) + + if(typeof res.errors !== 'undefined' && res.errors !== null + && res.errors.length > 0) { + var message = '' + Array.prototype.forEach.call(res.errors, (error) => { + message += error + '
' + }) + return { + success:0, + message: message + } + }else { + return { + success:1 + } + } +} + +export function encryptPassword(numb, password) { + var salt = bcrypt.genSaltSync(numb) + return bcrypt.hashSync(password, salt) +} + +export function getUserRoutes(workflow) { + var routes = config.users.routes + var userRoles = [] + Array.prototype.forEach.call(Object.keys(routes), (role) => { + if(role === workflow) { + userRoles = routes[role] + } + }) + + return userRoles +} + + +export function findSync(id) { + var bdd = User.manager.instance.get() + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (parseInt(user.id) === parseInt(id)) { + return user + } + } + return null +} + +export function find(id, done) { + var bdd = User.manager.instance.get() + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (parseInt(user.id) === parseInt(id)) { + return done(null, user) + } + } + return done(null, null) +} + +export function findByUsername(username, done) { + var bdd = User.manager.instance.get() + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (user.username === username) { + return done(null, user) + } + } + return done(null, null) +} + +export function findByEmail(email, done) { + var bdd = User.manager.instance.get() + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (user.email === email) { + return done(null, user) + } + } + return done(null, null) +} + +export function findByResetPasswordToken(resetPasswordToken, done) { + var bdd = User.manager.instance.get() + for (var i = 0, len = bdd.length; i < len; i++) { + var user = bdd[i] + if (user.resetPasswordToken === resetPasswordToken) { + return done(null, user) + } + } + return done(null, null) +} + +export function isValid(user, password) { + if(user.actif === 1) { + if(bcrypt.compareSync(password, user.password)) { + return true + } + } + return false +} + +export function decodeUser(req, res) { + var decoded = {} + var token = User.utils.getTokenFromCookies(req, res) + if(typeof token !== 'undefined' && token !== null && token !== '') { + try { + var secret = config.users.secret + decoded = jwt.decode(token, secret) + } catch (err) {} + } + + return decoded +} + +export function getTokenFromCookies(req, res) { + var cookies = new Cookies(req, res, { + secure: config.cookie.secure + }) + return cookies.get('x-access-token') +} + +export function isAbeRestrictedUrl(currentRoute) { + if( currentRoute.indexOf('/abe/users/forgot') > -1 + || currentRoute.indexOf('/abe/users/login') > -1 + || currentRoute.indexOf('/abe/users/reset') > -1 + || !/^\/abe/.test(currentRoute)) { + return false + } + + return true +} + +export function isUserAllowedOnRoute(workflow, currentRoute) { + var isAllowed = false + + if (config.users.enable) { + if( currentRoute.indexOf('/abe/users/forgot') > -1 || currentRoute.indexOf('/abe/users/login') > -1 || !/^\/abe/.test(currentRoute)) { + return true + } + + if (currentRoute.indexOf('abe/') === -1) { + isAllowed = true + } + + if (workflow != null) { + var routes = config.users.routes + if(typeof routes[workflow] !== 'undefined' && routes[workflow] !== null) { + Array.prototype.forEach.call(routes[workflow], (route) => { + var reg = new RegExp(route) + if(reg.test(currentRoute)) { + isAllowed = true + } + }) + } + } + }else { + isAllowed = true + } + + return isAllowed +} + +export function getAll() { + return User.manager.instance.get() +} + +export function getUserWorkflow(status, role) { + var flows = [] + + function addFlow (flow, type, action) { + type = (type != null) ? type : flow + return { + status: flow, + url: `/abe/operations/${action}/${type}` + } + } + + if (config.users.enable) { + var before = null + var found = null + Array.prototype.forEach.call(config.users.workflow, (flow) => { + + if (found != null) { + flows.push(addFlow(flow, flow, 'submit')) + found = null + } + + if (status == flow) { + found = flow + if (flow != 'draft' && flow != 'publish') { + flows.push(addFlow('reject', flow, 'reject')) + } + if (flow == 'publish') { + flows.push(addFlow('edit', 'draft', 'edit')) + }else { + flows.push(addFlow('save', flow, 'edit')) + } + } + }) + if (found != null) { + flows.push(addFlow('save', 'publish', 'submit')) + } + }else { + flows = [addFlow('draft', 'draft', 'submit'), addFlow('publish', 'publish', 'submit')] + } + return flows +} + +export function loginLimitTry(username) { + var p = new Promise((resolve) => { + var isNexted = false + try { + var limiterConfig = config.users.limiter + + var client = redis.createClient() + client.on('error', function() { + if (!isNexted) { + isNexted = true + resolve() + } + }) + + var limit = new Limiter({ + id: username, + db: client, + duration: limiterConfig.duration, + max: limiterConfig.max + }) + + limit.get(function(err, limit) { + if (err) { + resolve() + }else { + resolve(limit) + } + }) + }catch(e) { + resolve() + } + }) + + return p +} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 183a2776..92516cf1 100755 --- a/src/index.js +++ b/src/index.js @@ -16,205 +16,158 @@ import clc from 'cli-color' program .version(pkg.version) .option('-v, --version', 'version') - .option('-p, --port ', 'Port on which to listen to (defaults to 8000)', parseInt) - .option('-i, --interactive', 'open in browser') - .option('-N, --pname ', 'pm2 server name') - .option('-f, --folder ', '--folder draft|sites') - .option('-t, --type ', '--type draft|other') - .option('-d, --destination ', '--destination folder') - .option('generate-posts, --path= --destination= --status=', 'save only posts into from folder') - .parse(process.argv) + // .parse(process.argv) -var userArgs = process.argv.slice(2) -var create = new Create() -var port = program.port -var interactive = program.interactive +program + .command('generate-posts') + .alias('gp') + .description('save post to file with type from folder') + .option('-t, --type [type]', 'posts status draft|other') + .option('-p, --path [path]', 'path /relative/path') + .option('-d, --destination [destination]', 'folder to save result') + .action(function(options){ + var dir = process.cwd() + if(process.env.ROOT) { + dir = process.env.ROOT.replace(/\/$/, '') + } + process.env.DEBUG = 'generate-posts:*' + var generateArgs = ['--harmony', __dirname + '/cli/process/generate-posts.js', 'ABE_WEBSITE=' + dir] + if(options.destination != null) { + generateArgs.push('ABE_DESTINATION=' + options.destination) + } + if(options.path != null) { + generateArgs.push('ABE_PATH=' + options.path) + } + if(options.type != null) { + generateArgs.push('ABE_STATUS=' + options.type) + } -var vPos = process.argv.indexOf('-v') -if (vPos > -1) { - process.argv[vPos] = '-V' -} + var generate + if (__dirname.indexOf('dist') > -1) { + generate = spawn('node', generateArgs, { shell: true, stdio: 'inherit' }) + }else { + generate = spawn(path.join(__dirname, '..', 'node_modules', '.bin', 'babel-node'), generateArgs, { shell: true, stdio: 'inherit' }) + } -if(typeof userArgs[0] !== 'undefined' && userArgs[0] !== null){ - var dir - var command - var cp - var plugin + generate.on('close', (code) => { + console.log(clc.cyan('child process exited with code') + ' ' + code) + process.exit(0) + }) + }).on('--help', function() { + console.log(' Examples:') + console.log() + console.log(' $ abe generate-posts --path /test --destination result --status publish') + console.log() + }) - switch(userArgs[0]){ - case 'build': - dir = process.cwd() - process.chdir(__dirname + '/../') - command = 'ROOT=' + dir + - ' FOLDER=' + (program.folder ? program.folder : 'draft') + - ' DEST=' + (program.destination ? program.destination : 'tmp') + - ' FLOW=' + (program.type ? program.type : 'draft') + - ' npm run build:folder' - console.log('command : ' + command) - execPromise.exec(command) - .then(function (result) { - var stdout = result.stdout - var stderr = result.stderr - if(stdout) {console.log('stdout: ', stdout)} - if(stderr) {console.log('stderr: ', stderr)} -}) - .fail(function (err) { - console.error('ERROR: ', err) - }) - .progress(function () { - - }) - break - case 'create': - dir = userArgs[1] +program + .command('create [path]') + .alias('c') + .description('create new abe project') + .action(function(dest, options){ + dest = (dest != null) ? dest : '' + var dir = path.join(process.cwd(), dest) if(process.env.ROOT) { - dir = process.env.ROOT + userArgs[1] + dir = path.join(process.env.ROOT, dest) } + var create = new Create() if(typeof dir !== 'undefined' && dir !== null) { create.init(dir) }else { console.error('Error: no project path specified') } - break - case 'serve': - dir = process.cwd() + }).on('--help', function() { + console.log(' Examples:') + console.log() + console.log(' $ abe create') + console.log(' $ abe create [destination]') + console.log() + }) + +program + .command('serve') + .alias('s') + .description('create http server for abe') + .option('-p, --port [number]', 'change port of the web server') + .option('-i, --interactive', 'open browser on web server startup') + .action(function(options){ + var dir = process.cwd() if(process.env.ROOT) { dir = process.env.ROOT } var environment = process.env environment.ROOT = dir - if (typeof port !== 'undefined' && port !== null) { - environment.PORT = port + if(options.port != null) { + environment.PORT = options.port + } + var command + if (__dirname.indexOf('dist') > -1) { + command = 'node --harmony ./dist/server/index.js' + }else { + command = path.join(__dirname, '..', 'node_modules', '.bin', 'babel-node') + ' --harmony ./src/server/index.js' + } + if(options.interactive != null) { + command = 'OPENURL=1 ' + command } - command = 'node --harmony ./dist/server/index.js' - // if (interactive) command = 'OPENURL=1 ' + command process.chdir(__dirname + '/../') - console.log('website started : ' + dir + (port ? ' on port :' + port : '')) - cp = exec(command, - { - env: environment - }, - function (err, out, code) { - if (err instanceof Error) throw err - process.stderr.write(err) - process.stdout.write(out) - process.exit(code) -}) - cp.stderr.pipe(process.stderr) - cp.stdout.pipe(process.stdout) - break - case 'list': - dir = process.cwd() - dir = dir.replace(/\/$/, '') - pm2.connect((err) => { + console.log('website started : ' + dir) + var cp = exec(command,{env: environment}, function (err, out, code) { if (err instanceof Error) throw err - - pm2.list(function(err, list) { - if (err instanceof Error) throw err - Array.prototype.forEach.call(list, (item) => { - console.log('[ pm2 ]', '{', '"pid":', item.pid + ',', '"process":', '"' + item.name + '"', '}') - }) - process.exit(0) - }) - }) - break - case 'servenodemon': - dir = process.cwd() - command = 'ROOT=' + dir + ' npm run startdev --node-args="--debug"' - if (interactive) command = 'OPENURL=1 ' + command - if(port) command = 'PORT=' + port + ' ' + command - process.chdir(__dirname + '/../') - console.log('website started : ' + dir + (port ? ' on port :' + port : '')) - cp = exec(command, function (err, out, code) { - if (err instanceof Error) {throw err} + process.stderr.write(err) + process.stdout.write(out) process.exit(code) }) cp.stderr.pipe(process.stderr) cp.stdout.pipe(process.stdout) - break - case 'generate-posts': - dir = process.cwd() - if(process.env.ROOT) { - dir = process.env.ROOT.replace(/\/$/, '') - } - process.env.DEBUG = 'generate-posts:*' - var generateArgs = ['--harmony', __dirname + '/cli/process/generate-posts.js', 'ABE_WEBSITE=' + dir] - var isHelp = false - Array.prototype.forEach.call(userArgs, (arg) => { - if (arg.indexOf('--path=') > -1) { - generateArgs.push('ABE_PATH=' + arg.split('=')[1]) - }else if (arg.indexOf('--destination=') > -1) { - generateArgs.push('ABE_DESTINATION=' + arg.split('=')[1]) - }else if (arg.indexOf('--status=') > -1) { - generateArgs.push('ABE_STATUS=' + arg.split('=')[1]) - } - }) - - const generate = spawn('node', generateArgs, { shell: true, stdio: 'inherit' }) + }).on('--help', function() { + console.log(' Examples:') + console.log() + console.log(' $ abe serve') + console.log() + }) - generate.on('close', (code) => { - console.log(clc.cyan('child process exited with code') + ' ' + code) - process.exit(0) - }) - - break - case 'install': - dir = process.cwd() - plugin = userArgs[1] +program + .command('install [plugin]') + .alias('i') + .description('install abe plugin(s)') + .action(function(plugin){ + var dir = process.cwd() if(process.env.ROOT) { dir = process.env.ROOT.replace(/\/$/, '') } - var json = {} - var abeJson = dir + '/abe.json' - - try { - var stat = fse.statSync(abeJson) - if (stat) { - json = fse.readJsonSync(abeJson) - } - }catch(e) { - console.log(clc.cyan('no config'), abeJson) + if(typeof plugin !== 'undefined' && plugin !== null) { + plugins.instance.install(dir, plugin) + } else { + plugins.instance.install(dir) } + }).on('--help', function() { + console.log(' Examples:') + console.log() + console.log(' $ abe install') + console.log(' $ abe install [plugin]') + console.log() + }) - var ps = [] - if(typeof json.dependencies !== 'undefined' || json.dependencies !== null) { - Array.prototype.forEach.call(json.dependencies, (plugged) => { - ps.push(plugins.instance.add(dir, plugged)) - }) - } - - Promise.all(ps) - .then(function() { - process.exit(0) -}) - break - case 'add': - dir = process.cwd() - plugin = userArgs[1] +program + .command('uninstall ') + .alias('un') + .description('uninstall abe plugin(s)') + .action(function(plugin){ + var dir = process.env.ROOT.replace(/\/$/, '') if(process.env.ROOT) { dir = process.env.ROOT.replace(/\/$/, '') } - if(typeof dir !== 'undefined' && dir !== null) { - if(typeof plugin !== 'undefined' && plugin !== null) { - plugins.instance.add(dir, plugin) - .then(function() { - process.exit(0) -}) - }else { - console.log(clc.red('Error: no project path specified')) - } - }else { - console.log(clc.red('Error: no project path specified')) + if(typeof plugin !== 'undefined' && plugin !== null) { + plugins.instance.uninstall(dir, plugin) } - break - default: - console.log('Help: use `create` or `serve` command') - break - } + }).on('--help', function() { + console.log(' Examples:') + console.log() + console.log(' $ abe uninstall') + console.log(' $ abe uninstall [plugin]') + console.log() + }) -} -else{ - console.log('Help: use `create` or `serve` command') -} \ No newline at end of file +program.parse(process.argv) \ No newline at end of file diff --git a/src/server/app.js b/src/server/app.js index 4def44c0..40398db3 100755 --- a/src/server/app.js +++ b/src/server/app.js @@ -9,7 +9,11 @@ import path from 'path' import busboy from 'connect-busboy' import clc from 'cli-color' import openurl from 'openurl' -import uuid from 'node-uuid' +import uuid from 'uuid' +import flash from 'connect-flash' +import cookieParser from 'cookie-parser' +import csrf from 'csurf' +import passport from 'passport' import { config, @@ -36,11 +40,13 @@ import { import { middleWebsite, + middleLogin, + middleCheckCsrf, + middleIsAuthorized } from './middlewares' var abePort = null -if(process.env.ROOT) config.set({root: process.env.ROOT.replace(/\/$/, '') + '/'}) if(config.port) abePort = config.port if(process.env.PORT) abePort = process.env.PORT @@ -83,25 +89,23 @@ var app = express(opts) Manager.instance.init() app.set('config', config.getConfigByWebsite()) +app.use(flash()) +app.use(cookieParser()) +app.use(passport.initialize()) +app.use(passport.session()) +app.use(csrf({ + cookie: { + secure: config.cookie.secure + } +})) + app.use(bodyParser.json({limit: '1gb'})) app.use(bodyParser.urlencoded({limit: '1gb', extended: true, parameterLimit: 10000 })) - app.use(function (req, res, next) { res.locals.nonce = uuid.v4() next() }) -app.use(function (req, res, next) { - if(typeof req.query.logs !== 'undefined' && req.query.logs !== null - && req.query.logs === 'true') { - config.logs = true - }else if(typeof req.query.logs !== 'undefined' && req.query.logs !== null - && req.query.logs === 'false') { - config.logs = false - } - next() -}) - if(config.security === true){ app.use(helmet()) app.use(helmet.csp({ @@ -125,7 +129,6 @@ if(config.security === true){ disableAndroid: false, // Set to true if you want to disable CSP on Android where it can be buggy. browserSniff: true // Set to false if you want to completely disable any user-agent sniffing. This may make the headers less compatible but it will be much faster. This defaults to `true`. })) - } var port = (abePort !== null) ? abePort : 3000 @@ -137,6 +140,9 @@ app.set('view engine', '.html') app.locals.layout = false +app.use(middleCheckCsrf) +app.use(middleIsAuthorized) +app.use(middleLogin) app.use(middleWebsite) app.use(express.static(__dirname + '/public')) @@ -202,4 +208,4 @@ var controllers = require('./controllers') app.use(controllers.default) // This static path is mandatory for relative path to statics in templates -app.use('/abe', express.static(publish)) \ No newline at end of file +app.use('/abe', express.static(publish)) diff --git a/src/server/controllers/editor.js b/src/server/controllers/editor.js index 8ae90447..7cd3ac3b 100755 --- a/src/server/controllers/editor.js +++ b/src/server/controllers/editor.js @@ -4,7 +4,6 @@ import path from 'path' import { cmsData, cmsEditor, - coreUtils, abeEngine, cmsTemplates, abeExtend @@ -21,7 +20,7 @@ function add(obj, json, text, util) { if(typeof json[key] !== 'undefined' && json[key] !== null && typeof json[key][index] !== 'undefined' && json[key][index] !== null && typeof json[key][index][prop] !== 'undefined' && json[key][index][prop] !== null) { - obj.value = json[key][index][prop] + obj.value = json[getDataIdWithNoSlash(key)][index][prop] }else if(typeof value !== 'undefined' && value !== null && value !== '') { if(typeof json[key] === 'undefined' || json[key] === null){ json[key] = [] @@ -33,11 +32,25 @@ function add(obj, json, text, util) { } } + obj.key = getDataIdWithNoSlash(obj.key) + if (json != null && json.abe_meta != null) { + obj.status = json.abe_meta.status + } + util.add(obj) return value } +function getDataIdWithNoSlash(key) { + var trueKey = key + if (trueKey.indexOf('/') > -1) { + trueKey = trueKey.split('/') + trueKey = trueKey[trueKey.length - 1] + } + return trueKey +} + function addToForm(match, text, json, util, arrayBlock, keyArray = null, i = 0) { var v = `{{${match}}}`, obj = cmsData.attributes.getAll(v, json) @@ -54,14 +67,14 @@ function addToForm(match, text, json, util, arrayBlock, keyArray = null, i = 0) insertAbeEach(obj, text, json, util, arrayBlock) }else if(util.dontHaveKey(obj.key)) { - obj.value = json[obj.key] - json[obj.key] = add(obj, json, text, util) + obj.value = json[getDataIdWithNoSlash(obj.key)] + json[getDataIdWithNoSlash(obj.key)] = add(obj, json, text, util) } }else if(util.dontHaveKey(obj.key) && cmsData.regex.isSingleAbe(v, text)) { realKey = obj.key.replace(/\./g, '-') - obj.value = json[realKey] - json[obj.key] = add(obj, json, text, util) + obj.value = json[getDataIdWithNoSlash(realKey)] + json[getDataIdWithNoSlash(obj.key)] = add(obj, json, text, util) } } @@ -142,10 +155,10 @@ function addSource(text, json, util) { var obj = cmsData.attributes.getAll(match[0], json) if(obj.editable) { - obj.value = json[obj.key] + obj.value = json[getDataIdWithNoSlash(obj.key)] add(obj, json, text, util) }else { - json[obj.key] = obj.source + json[getDataIdWithNoSlash(obj.key)] = obj.source } } } @@ -211,17 +224,15 @@ function orderBlock(util) { }) Array.prototype.forEach.call(arKeysTabs, (arKeysTab) => { - if (arKeysTab !== 'Precontribution') { - formTabsOrdered[arKeysTab] = formBlock[arKeysTab] - } + if(arKeysTab !== 'slug') formTabsOrdered[arKeysTab] = formBlock[arKeysTab] }) - formTabsOrdered['Precontribution'] = formBlock['Precontribution'] + formTabsOrdered['slug'] = formBlock['slug'] return formTabsOrdered } -export function editor(text, json, documentLink) { +export function editor(text, json, documentLink, precontrib = false) { let p = new Promise((resolve) => { var util = new cmsEditor.form() var arrayBlock = [] @@ -232,9 +243,9 @@ export function editor(text, json, documentLink) { text = cmsData.source.removeDataList(text) - var matches = cmsData.regex.getTagAbePrecontribution(text) - if (matches.length === 0) { - text = `${text}\n{{abe type='text' key='abe_filename' desc='Name' required="true" precontrib="true" slug="true" slugType="name" visible="false"}}` + if (!precontrib) { + text = cmsTemplates.template.setAbeSlugDefaultValueIfDoesntExist(text) + text = cmsTemplates.template.setAbePrecontribDefaultValueIfDoesntExist(text) } matchAttrAbe(text, json, util, arrayBlock) @@ -248,13 +259,18 @@ export function editor(text, json, documentLink) { json.abe_meta.cleanFilename = links.join('/').replace(/\..+$/, '') } - // HOOKS beforeEditorFormBlocks - json = abeExtend.hooks.instance.trigger('beforeEditorFormBlocks', json, text) + if (!precontrib) { + // HOOKS beforeEditorFormBlocks + json = abeExtend.hooks.instance.trigger('beforeEditorFormBlocks', json, text) + } var blocks = orderBlock(util) - // HOOKS afterEditorFormBlocks - blocks = abeExtend.hooks.instance.trigger('afterEditorFormBlocks', blocks, json, text) + + if (!precontrib) { + // HOOKS afterEditorFormBlocks + blocks = abeExtend.hooks.instance.trigger('afterEditorFormBlocks', blocks, json, text) + } abeEngine.instance.content = json diff --git a/src/server/controllers/index.js b/src/server/controllers/index.js index b22540af..b2d40bfe 100755 --- a/src/server/controllers/index.js +++ b/src/server/controllers/index.js @@ -5,55 +5,89 @@ import { ,postDuplicate ,postUpdate ,getListUrl + ,getListWorkflow + ,postListUrlSave ,getListHooks ,getMain ,getPage ,postPage - ,postPublish ,getGeneratePost - ,postReject - ,postDraft + ,operations ,getSaveConfig - ,getUnpublish - ,getDelete ,postUpload ,postSqlRequest ,postReference ,getReference ,postStructure + ,getPaginate + ,getThumbs + ,getImage + ,users } from '../routes' import { abeExtend, Handlebars, + config } from '../../cli' var router = express.Router() abeExtend.hooks.instance.trigger('afterHandlebarsHelpers', Handlebars) abeExtend.hooks.instance.trigger('beforeAddRoute', router) +router.get('/abe/users/forgot', users.getForgot) +router.get('/abe/users/list', users.getList) +router.get('/abe/users/login', users.getLogin) +router.get('/abe/users/logout', users.getLogout) +router.get('/abe/users/reset', users.getReset) +router.post('/abe/users/activate', users.postActivate) +router.post('/abe/users/add', users.postAdd) +router.post('/abe/users/deactivate', users.postDeactivate) +router.post('/abe/users/login', users.postLogin) +router.post('/abe/users/remove', users.postRemove) +router.post('/abe/users/reset', users.postReset) +router.post('/abe/users/update', users.postUpdate) + +router.get('/abe/paginate', getPaginate) router.post('/abe/create*', postCreate) router.post('/abe/duplicate*', postDuplicate) router.post('/abe/update*', postUpdate) router.post('/abe/sql-request*', postSqlRequest) router.post('/abe/page/*', postPage) router.get('/abe/page/*', getPage) -router.post('/abe/publish*', postPublish) router.get('/abe/generate-posts', getGeneratePost) -router.post('/abe/reject*', postReject) -router.post('/abe/draft*', postDraft) router.get('/abe/save-config', getSaveConfig) -router.get('/abe/unpublish*', getUnpublish) -router.get('/abe/delete*', getDelete) router.get('/abe/reference/*', getReference) +router.get('/abe/thumbs/*', getThumbs) +router.get('/abe/image/*', getImage) router.post('/abe/upload/*', postUpload) router.post('/abe/reference/*', postReference) router.post('/abe/structure/*', postStructure) +router.get('/abe/editor*', getMain) +router.post('/abe/list-url/save*', postListUrlSave) + +router.get('/abe/list-workflow*', function (req, res, next) { + getListWorkflow(router, req, res, next) +}) router.get('/abe/list-url*', function (req, res, next) { getListUrl(router, req, res, next) }) router.get('/abe/list-hooks*', getListHooks) +var workflows = config.users.workflow +Array.prototype.forEach.call(workflows, (workflow) => { + router.get(`/abe/operations/delete/${workflow}*`, operations.getDelete) + + if (workflow != 'draft' && workflow != 'publish') { + router.post(`/abe/operations/reject/${workflow}*`, operations.postReject) + }else if (workflow == 'publish') { + router.get('/abe/operations/unpublish*', operations.getUnpublish) + } + + router.post(`/abe/operations/submit/${workflow}*`, operations.postSubmit) + router.post(`/abe/operations/edit/${workflow}*`, operations.postEdit) +}) + var routes = abeExtend.plugins.instance.getRoutes() Array.prototype.forEach.call(routes, (route) => { if(typeof route.get !== 'undefined' && route.get !== null) { @@ -91,7 +125,6 @@ Array.prototype.forEach.call(routes, (route) => { }) } }) -router.get('/abe*', getMain) // router.get('/abe*', getMain) abeExtend.hooks.instance.trigger('afterAddRoute', router) diff --git a/src/server/helpers/abe-locale.js b/src/server/helpers/abe-locale.js index 7ee4807e..0c6878f3 100644 --- a/src/server/helpers/abe-locale.js +++ b/src/server/helpers/abe-locale.js @@ -16,4 +16,13 @@ Array.prototype.forEach.call(files, (file) => { result = extend(true, result, json) }) +if(config.siteLocaleFolder != null){ + var pathToSiteLocale = path.join(config.root, config.siteLocaleFolder, config.intlData.locales) + var files = fse.readdirSync(pathToSiteLocale) + Array.prototype.forEach.call(files, (file) => { + var json = fse.readJsonSync(pathToSiteLocale + '/' + file) + result = extend(true, result, json) + }) +} + export default result \ No newline at end of file diff --git a/src/server/helpers/page.js b/src/server/helpers/page.js index 5ad172ee..217b886d 100644 --- a/src/server/helpers/page.js +++ b/src/server/helpers/page.js @@ -7,7 +7,7 @@ import { coreUtils } from '../../cli' -var page = function (req, res, next) { +var page = function (req, res) { var html = (req.query.html) ? true : false var json = null var editor = false @@ -49,7 +49,7 @@ var page = function (req, res, next) { }else { templateId = req.params[0] } - var text = cmsTemplates.template.getTemplate(templateId) + var text = cmsTemplates.template.getTemplate(templateId, json) if (!editor) { diff --git a/src/server/middlewares/checkCsrf.js b/src/server/middlewares/checkCsrf.js new file mode 100644 index 00000000..7d7ed79c --- /dev/null +++ b/src/server/middlewares/checkCsrf.js @@ -0,0 +1,23 @@ +var middleware = function(err, req, res, next) { + if (err.code !== 'EBADCSRFTOKEN') { + return next(err) + }else { + if( req.url.indexOf('/abe/users/forgot') > -1 || req.url.indexOf('/abe/users/login') > -1 || !/^\/abe/.test(req.url)) { + return next() + } + } + + var isHtml = /text\/html/.test(req.get('accept')) ? true : false + if(isHtml) { + res.redirect('/abe/users/login') + }else { + var notAuthorized = { + success: 0, + message: 'form tampered with !' + } + res.set('Content-Type', 'application/json') + res.send(JSON.stringify(notAuthorized)) + } +} + +export default middleware \ No newline at end of file diff --git a/src/server/middlewares/index.js b/src/server/middlewares/index.js index 7f943cb4..d048cdde 100644 --- a/src/server/middlewares/index.js +++ b/src/server/middlewares/index.js @@ -1,5 +1,11 @@ import middleWebsite from './website' +import middleLogin from './login' +import middleCheckCsrf from './checkCsrf' +import middleIsAuthorized from './isAuthorized' export { - middleWebsite + middleWebsite, + middleLogin, + middleCheckCsrf, + middleIsAuthorized } \ No newline at end of file diff --git a/src/server/middlewares/isAuthorized.js b/src/server/middlewares/isAuthorized.js new file mode 100644 index 00000000..12a94059 --- /dev/null +++ b/src/server/middlewares/isAuthorized.js @@ -0,0 +1,49 @@ +import { + config, + User +} from '../../cli' + +var middleware = function(req, res, next) { + if (!config.users.enable) { + if (req.url.indexOf('/abe/users/login') > -1) { + res.redirect('/abe/editor') + return + }else { + next() + return + } + } + + var decoded = User.utils.decodeUser(req, res) + var user = User.utils.findSync(decoded.iss) + res.user = user + + if(!User.utils.isAbeRestrictedUrl(req.url)) { + if (user != null && req.url.indexOf('/abe/users/login') > -1 && req.method === 'GET' ) { + res.redirect('/abe/editor') + return + }else { + next() + return + } + } + + var isHtml = /text\/html/.test(req.get('accept')) ? true : false + + if (user != null && User.utils.isUserAllowedOnRoute(user.role.workflow, req.url)) { + next() + }else { + if(isHtml) { + res.redirect('/abe/users/login') + }else { + var notAuthorized = { + success: 0, + message: 'Not authorized !' + } + res.set('Content-Type', 'application/json') + res.send(JSON.stringify(notAuthorized)) + } + } +} + +export default middleware \ No newline at end of file diff --git a/src/server/middlewares/login.js b/src/server/middlewares/login.js new file mode 100644 index 00000000..ab33bfdd --- /dev/null +++ b/src/server/middlewares/login.js @@ -0,0 +1,19 @@ +var middleware = function(req, res, next) { + if( req.url.indexOf('/abe/') > -1) { + var send = res.send + var token = req.csrfToken() + res.send = function (string) { + var body = string instanceof Buffer ? string.toString() : string + body = body.replace(/<\/body>/g, function (w) { + return '' + w + }) + send.call(this, body) + } + res.locals.csrfToken = token + next() + }else { + next() + } +} + +export default middleware \ No newline at end of file diff --git a/src/server/middlewares/website.js b/src/server/middlewares/website.js index 211adee3..2eb2fc71 100644 --- a/src/server/middlewares/website.js +++ b/src/server/middlewares/website.js @@ -3,13 +3,12 @@ import fse from 'fs-extra' import { coreUtils, - cmsData, config, abeExtend } from '../../cli' var middleware = function(req, res, next) { - if (req.originalUrl.indexOf('/abe/') > -1 || req.originalUrl.indexOf('/plugin/') > -1) { + if (req.originalUrl.indexOf('/abe/') > -1) { return next() } @@ -26,7 +25,7 @@ var middleware = function(req, res, next) { var files = coreUtils.file.getFilesSync(pathWebsite, false) var folders = coreUtils.file.getFoldersSync(pathWebsite, false) var html = ' {{/if}} @@ -33,4 +40,8 @@

{{@root.text.file}}

{{/if}} +{{/if}} + +{{#if @root.config.users.enable}} + logout {{/if}} \ No newline at end of file diff --git a/src/server/views/partials/right-file-list.html b/src/server/views/partials/right-file-list.html index 99df3990..3412b506 100644 --- a/src/server/views/partials/right-file-list.html +++ b/src/server/views/partials/right-file-list.html @@ -22,9 +22,9 @@ File path Template date - draft - {{abeImport 'right-list-head' manager.config this}} - published + {{#each @root.config.users.workflow}} + {{this}} + {{/each}} actions diff --git a/src/server/views/partials/right-revisions.html b/src/server/views/partials/right-revisions.html index abbdb4d9..3d40da6d 100755 --- a/src/server/views/partials/right-revisions.html +++ b/src/server/views/partials/right-revisions.html @@ -17,7 +17,7 @@
    {{#each manager.file.revision}}
  • - + {{@root.text.version}} {{this.version}} {{this.duration}} diff --git a/src/server/views/partials/toolbar.html b/src/server/views/partials/toolbar.html index fdfe25ed..eadc701a 100755 --- a/src/server/views/partials/toolbar.html +++ b/src/server/views/partials/toolbar.html @@ -1,23 +1,16 @@ - - - + {{else}} + {{/isAuthorized}} +{{/each}} \ No newline at end of file diff --git a/src/server/views/template-engine.html b/src/server/views/template-engine.html index 635748ec..b0ce9a54 100755 --- a/src/server/views/template-engine.html +++ b/src/server/views/template-engine.html @@ -1,5 +1,6 @@ - diff --git a/src/server/views/users/engine-more.html b/src/server/views/users/engine-more.html new file mode 100755 index 00000000..6983c498 --- /dev/null +++ b/src/server/views/users/engine-more.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/server/views/users/forgot.html b/src/server/views/users/forgot.html new file mode 100755 index 00000000..68f44957 --- /dev/null +++ b/src/server/views/users/forgot.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/server/views/users/login.html b/src/server/views/users/login.html new file mode 100755 index 00000000..66fc7f89 --- /dev/null +++ b/src/server/views/users/login.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/server/views/users/reset.html b/src/server/views/users/reset.html new file mode 100755 index 00000000..aabdce04 --- /dev/null +++ b/src/server/views/users/reset.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/server/views/users/users-list.html b/src/server/views/users/users-list.html new file mode 100755 index 00000000..9a15d93d --- /dev/null +++ b/src/server/views/users/users-list.html @@ -0,0 +1,219 @@ + + + + + + + + + + + +
    + + +
    + + + +
    + +
    + + + +
    + + + + + + + + + {{#isAuthorized '/abe/users/activate' @root.user.role.workflow}}{{/isAuthorized}} + + + + + {{#each users}} + + + + + + {{#isAuthorized '/abe/users/activate' @root.user.role.workflow}} + + {{/isAuthorized}} + + + {{/each}} + +
    usernamenameemailroleactive/inactiveactions
    +
    + +
    + {{this.username}} +
    +
    + +
    + {{this.name}} +
    +
    + +
    + {{this.email}} +
    +
    + +
    + {{this.role.name}} +
    + {{#ifCond this.actif 1}} + + + + + {{/ifCond}} + {{#ifCond this.actif 0}} + + + + + {{/ifCond}} + + {{#isAuthorized '/abe/users/update' @root.user.role.workflow}} + + + + + {{/isAuthorized}} + {{#isAuthorized '/abe/users/remove' @root.user.role.workflow}} + + {{/isAuthorized}} +
    +
    + + + {{#isAuthorized '/abe/users/add' @root.user.role.workflow}} + + + + + + + + + {{/isAuthorized}} + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + + + + + + + + {{#isAuthorized '/abe/users/activate' @root.user.role.workflow}} + + {{/isAuthorized}} + {{#isAuthorized '/abe/users/remove' @root.user.role.workflow}} + + {{/isAuthorized}} + + +
    + + + + + \ No newline at end of file diff --git a/src/tasks/nodemon.js b/src/tasks/nodemon.js index 43de67c7..0b336cc6 100755 --- a/src/tasks/nodemon.js +++ b/src/tasks/nodemon.js @@ -30,7 +30,7 @@ nodemon({ 'src/server/controllers/*', 'src/server/app.js', 'src/server/index.js', - process.env.ROOT + '/plugins/**/**/*.js', + process.env.ROOT + '/scripts/**/**/*.js', process.env.ROOT + '/abe.json', process.env.ROOT + '/locales/*', process.env.ROOT + '/hooks/**/*.js', diff --git a/test/cms/data/attr.js b/test/cms/data/attr.js new file mode 100644 index 00000000..fabdf398 --- /dev/null +++ b/test/cms/data/attr.js @@ -0,0 +1,65 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var cmsData = require('../../../src/cli').cmsData; +var Manager = require('../../../src/cli').Manager; + +describe('Attr', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + this.fixture = {} + done() + + }.bind(this)) + }); + + /** + * + * + */ + it('new attr', function() { + var attr = new cmsData.attr("article-abe-d20160920T125255138Z.shtml") + chai.expect(attr.str).to.not.be.undefined; + chai.expect(attr.val.s).to.not.be.undefined; + chai.expect(attr.val.s).to.be.equal('d'); + }); + + /** + * + * + */ + it('attr.remove', function() { + var attr = new cmsData.attr("article-abe-d20160920T125255138Z.html") + var filename = attr.remove() + chai.expect(filename).to.be.equal('article.html'); + }); + + /** + * + * + */ + it('attr.getExtension', function() { + var attr = new cmsData.attr("article-abe-d20160920T125255138Z.html") + var extension = attr.getExtension() + chai.expect(extension).to.be.equal('html'); + }); + + /** + * + * + */ + it('attr.insert', function() { + var attr = new cmsData.attr("article-abe-d20160920T125255138Z.html") + var extension = attr.insert('test') + chai.expect(extension).to.be.equal('article-abe-test.html'); + }); +}); diff --git a/test/regex.js b/test/cms/data/regex.js similarity index 76% rename from test/regex.js rename to test/cms/data/regex.js index 0102f15b..17ad1731 100644 --- a/test/regex.js +++ b/test/cms/data/regex.js @@ -1,22 +1,22 @@ var chai = require('chai'); var path = require('path'); -var config = require('../src/cli').config -config.set({root: path.join(__dirname,'fixtures')}) +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) -var cmsData = require('../src/cli').cmsData -var Manager = require('../src/cli').Manager; +var cmsData = require('../../../src/cli').cmsData +var Manager = require('../../../src/cli').Manager; var fse = require('fs-extra'); -describe('Request', function() { +describe('regex', function() { before( function(done) { Manager.instance.init() .then(function () { this.fixture = { - articleSingle: fse.readFileSync(__dirname + '/fixtures/templates/article-single-abe.html', 'utf8'), - articleEach: fse.readFileSync(__dirname + '/fixtures/templates/article-each-abe.html', 'utf8'), - articleRequest: fse.readFileSync(__dirname + '/fixtures/templates/article-request.html', 'utf8') + articleSingle: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-single-abe.html'), 'utf8'), + articleEach: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-each-abe.html'), 'utf8'), + articleRequest: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-request.html'), 'utf8') } done() diff --git a/test/cms/editor/form.js b/test/cms/editor/form.js new file mode 100644 index 00000000..5d58ff03 --- /dev/null +++ b/test/cms/editor/form.js @@ -0,0 +1,40 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var cmsEditor = require('../../../src/cli').cmsEditor; +var Manager = require('../../../src/cli').Manager; + +describe('Form', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + this.fixture = {} + done() + + }.bind(this)) + }); + + /** + * getTemplatesTexts + * + */ + it('new Form', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + // sinonInstance.stub(fse, 'readFileSync'); + + var form = new cmsEditor.form() + form.add({key: 'test'}) + chai.expect(form._form.default.item[0].key).to.be.equal('test'); + chai.expect(form.dontHaveKey('test')).to.be.equal(false); + chai.expect(form.form.default.item.length).to.be.above(0); + }); +}); diff --git a/test/cms/editor/handlebars/sourceAttr.js b/test/cms/editor/handlebars/sourceAttr.js new file mode 100644 index 00000000..01403f06 --- /dev/null +++ b/test/cms/editor/handlebars/sourceAttr.js @@ -0,0 +1,101 @@ +var chai = require('chai'); +var path = require('path'); +var fse = require('fs-extra'); + +var sourceAttr = require('../../../../src/cli/cms/editor/handlebars/sourceAttr') + +describe('cmsEditor.handlebars.sourceAttr', function() { + before( function() { + this.fixture = { + gmapsElement: fse.readJsonSync(path.join(__dirname, '../../../fixtures/editor/gmaps-element.json'), 'utf8'), + colors: fse.readJsonSync(path.join(__dirname, '../../../fixtures/editor/colors.json'), 'utf8') + } + }); + + it('sourceAttr test', function() { + var obj = this.fixture.gmapsElement + var params = { + display:'{{formatted_address}}', + value: [{formatted_address: 'State of Pará, Brazil'}] + } + var json = sourceAttr.default(obj, params) + chai.expect(json.selected).to.equal('selected') + chai.expect(json.val).to.equal('State of Pará, Brazil') + }); + + it('sourceAttr string', function() { + var obj = this.fixture.colors + var params = { + display: null, + value: ["red"], + source: this.fixture.colors + } + var json = sourceAttr.default("red", params) + chai.expect(json.selected).to.equal('selected') + chai.expect(json.val).to.equal('red') + }); + + it('get path', function() { + var obj = this.fixture.gmapsElement + var path = 'geometry.location.lat' + var str = sourceAttr.get(obj, path) + chai.expect(str).to.equal(-1.9981271) + }); + + it('get unknown path', function() { + var obj = this.fixture.gmapsElement + var path = 'errored.path' + var str = sourceAttr.get(obj, path) + chai.expect(str).to.be.undefined; + }); + + it('prepareDisplay value', function() { + var obj = this.fixture.gmapsElement + var str = 'formatted_address' + str = sourceAttr.prepareDisplay(obj, str) + chai.expect(str).to.equal('State of Pará, Brazil') + }); + + it('prepareDisplay variable', function() { + var obj = this.fixture.gmapsElement + var str = '{{formatted_address}}' + str = sourceAttr.prepareDisplay(obj, str) + chai.expect(str).to.equal('State of Pará, Brazil') + }); + + it('prepareDisplay 2 variables', function() { + var obj = this.fixture.gmapsElement + var str = '{{formatted_address}} - {{geometry.location.lat}}' + str = sourceAttr.prepareDisplay(obj, str) + chai.expect(str).to.equal('State of Pará, Brazil - -1.9981271') + }); + + it('prepareDisplay unknown', function() { + var obj = this.fixture.gmapsElement + var str = 'unknownkey' + str = sourceAttr.prepareDisplay(obj, str) + chai.expect(str).to.equal(str) + }); + + it('prepareDisplay null', function() { + var obj = this.fixture.colors + var str = null + str = sourceAttr.prepareDisplay(obj, str) + chai.expect(str).to.equal(this.fixture.colors) + }); + + it('getKeys key', function() { + var ar = sourceAttr.getKeys('key') + chai.expect(ar.length).to.equal(1) + }); + + it('getKeys {{key}}', function() { + var ar = sourceAttr.getKeys('{{key}}') + chai.expect(ar.length).to.equal(1) + }); + + it('getKeys {{key}}-nokey-{{key2}}', function() { + var ar = sourceAttr.getKeys('{{key}}-nokey-{{key2}}') + chai.expect(ar.length).to.equal(2) + }); +}); \ No newline at end of file diff --git a/test/cms/operations/create.js b/test/cms/operations/create.js new file mode 100644 index 00000000..8dc9e0b6 --- /dev/null +++ b/test/cms/operations/create.js @@ -0,0 +1,74 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test','fixtures')}) + +var abeExtend = require('../../../src/cli').abeExtend +var cmsData = require('../../../src/cli').cmsData +var Manager = require('../../../src/cli').Manager +var coreUtils = require('../../../src/cli').coreUtils +var cmsOperations = require('../../../src/cli').cmsOperations +var cmsTemplates = require('../../../src/cli').cmsTemplates +var Manager = require('../../../src/cli').Manager; +var Page = require('../../../src/cli').Page; + +describe('cmsOperations', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + Manager.instance._whereKeys = ['title', 'priority', 'abe_meta', 'articles'] + Manager.instance.updateList() + + this.fixture = { + htmlArticle: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'files', 'article-2.json')), + jsonHomepage: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'data', 'homepage-1.json')) + } + done() + + }.bind(this)) + }); + + it('cmsOperations.create()', function(done) { + // stub + var s = sinon.sandbox.create(); + s.stub(abeExtend.hooks.instance, 'trigger', function (str, obj, body, json) { + if (str == 'beforeFirstSave') { + return { + postUrl: obj, + json: json + } + } + return str, obj; + }.bind(this)); + s.stub(coreUtils.slug, 'clean', function (p) { return p; }.bind(this)); + s.stub(Manager.instance, 'postExist', function (p) { return false; }.bind(this)); + s.stub(cmsData.metas, 'create', function (json, template, postUrl) { return json; }.bind(this)); + s.stub(cmsTemplates.template, 'getTemplate', function () { return this.fixture.htmlArticle; }.bind(this)); + s.stub(cmsData.values, 'removeDuplicate', function (templateText, json) { return json; }.bind(this)); + s.stub(cmsOperations.post, 'draft', function () { + return Promise.resolve({json: JSON.parse(JSON.stringify(this.fixture.jsonArticle))}) + }.bind(this)); + + cmsOperations.create('article', '', 'article-2.html', {query: ''}, JSON.parse(JSON.stringify(this.fixture.jsonArticle)), false) + .then(function(resSave) { + var json = path.join(config.root, config.data.url, resSave.abe_meta.latest.abeUrl.replace('.html', '.json')) + + abeExtend.hooks.instance.trigger.restore() + coreUtils.slug.clean.restore() + Manager.instance.postExist.restore() + cmsData.metas.create.restore() + cmsTemplates.template.getTemplate.restore() + cmsData.values.removeDuplicate.restore() + cmsOperations.post.draft.restore() + + done() + }.bind(this)); + }); +}); diff --git a/test/cms/operations/duplicate.js b/test/cms/operations/duplicate.js new file mode 100644 index 00000000..3bfbe174 --- /dev/null +++ b/test/cms/operations/duplicate.js @@ -0,0 +1,78 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test','fixtures')}) + +var abeExtend = require('../../../src/cli').abeExtend +var cmsData = require('../../../src/cli').cmsData +var Manager = require('../../../src/cli').Manager +var coreUtils = require('../../../src/cli').coreUtils +var cmsOperations = require('../../../src/cli').cmsOperations +var cmsTemplates = require('../../../src/cli').cmsTemplates +var Manager = require('../../../src/cli').Manager; +var Page = require('../../../src/cli').Page; + +describe('cmsOperations', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + Manager.instance._whereKeys = ['title', 'priority', 'abe_meta', 'articles'] + Manager.instance.updateList() + + this.fixture = { + htmlArticle: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'files', 'article-2.json')), + jsonHomepage: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'data', 'homepage-1.json')) + } + done() + + }.bind(this)) + }); + + it('cmsOperations.duplicate()', function(done) { + // stub + var s = sinon.sandbox.create(); + s.stub(abeExtend.hooks.instance, 'trigger', function (str, obj) { return str, obj; }.bind(this)); + s.stub(Manager.instance, 'getList', function (str, obj) { return [this.fixture.jsonArticle]; }.bind(this)); + s.stub(coreUtils.slug, 'clean', function (p) { return p; }.bind(this)); + s.stub(coreUtils.array, 'filter', function () { return [this.fixture.jsonArticle]; }.bind(this)); + s.stub(cmsData.file, 'get', function () { return this.fixture.jsonArticle; }.bind(this)); + s.stub(cmsOperations, 'create', function () { return Promise.resolve(this.fixture.jsonArticle); }.bind(this)); + s.stub(cmsOperations.remove, 'remove', function () { return null; }.bind(this)); + + // test + var newPostUrl = 'article-2.html' + cmsOperations.duplicate('article-1.html', 'article', '', newPostUrl, {}, false) + .then(function(resSave) { + chai.expect(resSave.abe_meta).to.not.be.undefined; + chai.expect(resSave.abe_meta.link).to.be.equal('/article-2.html'); + + cmsOperations.duplicate('article-1.html', 'article', '', newPostUrl, {}, true) + .then(function(resSave2) { + chai.expect(resSave2.abe_meta).to.not.be.undefined; + chai.expect(resSave2.abe_meta.link).to.be.equal('/article-2.html'); + + // unstub + abeExtend.hooks.instance.trigger.restore() + sinon.assert.calledTwice(Manager.instance.getList) + Manager.instance.getList.restore() + sinon.assert.calledTwice(coreUtils.slug.clean) + coreUtils.slug.clean.restore() + sinon.assert.calledTwice(coreUtils.array.filter) + coreUtils.array.filter.restore() + cmsData.file.get.restore() + sinon.assert.calledTwice(cmsOperations.create) + cmsOperations.create.restore() + sinon.assert.calledOnce(cmsOperations.remove.remove) + cmsOperations.remove.remove.restore() + done() + }.bind(this)) + }.bind(this)) + }); +}); diff --git a/test/cms/operations/post.js b/test/cms/operations/post.js new file mode 100644 index 00000000..41a1746b --- /dev/null +++ b/test/cms/operations/post.js @@ -0,0 +1,200 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test','fixtures')}) + +var abeExtend = require('../../../src/cli').abeExtend +var cmsData = require('../../../src/cli').cmsData +var Manager = require('../../../src/cli').Manager +var coreUtils = require('../../../src/cli').coreUtils +var cmsOperations = require('../../../src/cli').cmsOperations +var cmsTemplates = require('../../../src/cli').cmsTemplates +var Manager = require('../../../src/cli').Manager; +var Page = require('../../../src/cli').Page; + +describe('cmsOperations', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + Manager.instance._whereKeys = ['title', 'priority', 'abe_meta', 'articles'] + Manager.instance.updateList() + + this.fixture = { + htmlArticle: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'files', 'article-2.json')), + jsonHomepage: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'data', 'homepage-1.json')) + } + done() + + }.bind(this)) + }); + + /** + * cmsOperations.post.publish + * + */ + it('cmsOperations.post.publish()', function(done) { + // stub + var s = sinon.sandbox.create(); + s.stub(abeExtend.hooks.instance, 'trigger', function (str, obj) { return str, obj; }.bind(this)); + s.stub(cmsTemplates.template, 'getTemplate', function () { return this.fixture.htmlArticle; }.bind(this)); + s.stub(cmsData.source, 'getDataList', function () { + return Promise.resolve(JSON.parse(JSON.stringify(this.fixture.jsonArticle))) + }.bind(this)); + s.stub(cmsData.utils, 'getPercentOfRequiredTagsFilled', function () { return 100; }.bind(this)); + // s.stub(Page, 'getPercentOfRequiredTagsFilled', function () { return 100; }.bind(this)); + s.stub(cmsOperations.save, 'saveHtml', function () { return 100; }.bind(this)); + s.stub(cmsOperations.save, 'saveJson', function () { return 100; }.bind(this)); + s.stub(Manager.instance, 'updatePostInList', function () { return null; }.bind(this)); + + // test + cmsOperations.post.publish('article-2.html', JSON.parse(JSON.stringify(this.fixture.jsonArticle))) + .then(function(resSave) { + // unstub + abeExtend.hooks.instance.trigger.restore() + cmsTemplates.template.getTemplate.restore() + cmsData.source.getDataList.restore() + cmsData.utils.getPercentOfRequiredTagsFilled.restore() + cmsOperations.save.saveHtml.restore() + cmsOperations.save.saveJson.restore() + Manager.instance.updatePostInList.restore() + done() + }.bind(this)); + }); + + /** + * cmsOperations.post.unpublish + * + */ + it('cmsOperations.post.unpublish()', function(done) { + // stub + var s = sinon.sandbox.create(); + s.stub(abeExtend.hooks.instance, 'trigger', function (str, obj) { return str, obj; }.bind(this)); + s.stub(coreUtils.file, 'exist', function (revisionPath) { return true; }.bind(this)); + s.stub(cmsData.file, 'get', function () { return JSON.parse(JSON.stringify(this.fixture.jsonArticle)); }.bind(this)); + s.stub(cmsOperations.post, 'draft', function () { + return Promise.resolve({json: JSON.parse(JSON.stringify(this.fixture.jsonArticle))}) + }.bind(this)); + s.stub(cmsOperations.remove, 'removeFile', function () { return null; }.bind(this)); + s.stub(Manager.instance, 'updatePostInList', function () { return null; }.bind(this)); + + // test + cmsOperations.post.unpublish('article-2.html') + .then(function(resSave) { + + // unstub + abeExtend.hooks.instance.trigger.restore() + coreUtils.file.exist.restore() + cmsData.file.get.restore() + cmsOperations.post.draft.restore() + cmsOperations.remove.removeFile.restore() + Manager.instance.updatePostInList.restore() + done() + }.bind(this)); + }); + + /** + * cmsOperations.post.draft + * + */ + it('cmsOperations.post.draft()', function(done) { + var json = JSON.parse(JSON.stringify(this.fixture.jsonArticle)) + var meta = json.abe_meta + delete json.abe_meta + + // stub + var s = sinon.sandbox.create(); + s.stub(abeExtend.hooks.instance, 'trigger', function (str, obj) { return str, obj; }.bind(this)); + s.stub(coreUtils.file, 'addDateIsoToRevisionPath', function (revisionPath) { return revisionPath; }.bind(this)); + s.stub(cmsData.metas, 'add', function (json) { + json.abe_meta = meta + return json; + }.bind(this)); + s.stub(cmsTemplates.template, 'getTemplate', function () { return this.fixture.htmlArticle; }.bind(this)); + s.stub(cmsData.source, 'getDataList', function () { + return Promise.resolve(JSON.parse(JSON.stringify(this.fixture.jsonArticle))) + }.bind(this)); + s.stub(cmsOperations.save, 'saveJson', function () { return true; }.bind(this)); + s.stub(Manager.instance, 'updatePostInList', function () { return null; }.bind(this)); + s.stub(cmsData.utils, 'getPercentOfRequiredTagsFilled', function () { return 100; }.bind(this)); + + // test + cmsOperations.post.draft('article-2.html', JSON.parse(JSON.stringify(this.fixture.jsonArticle))) + .then(function(resSave) { + chai.expect(resSave.success).to.be.equal(1); + chai.expect(resSave.json.abe_meta).to.not.be.undefined; + + // unstub + abeExtend.hooks.instance.trigger.restore() + coreUtils.file.addDateIsoToRevisionPath.restore() + cmsData.utils.getPercentOfRequiredTagsFilled.restore() + cmsData.metas.add.restore() + cmsTemplates.template.getTemplate.restore() + cmsData.source.getDataList.restore() + cmsOperations.save.saveJson.restore() + Manager.instance.updatePostInList.restore() + + done() + }.bind(this)); + }); + + /** + * cmsOperations.post.submit + * + */ + it('cmsOperations.post.submit()', function(done) { + // stub + var s = sinon.sandbox.create(); + s.stub(cmsOperations.post, 'draft', function (filePath, json, rejectToWorkflow) { + return Promise.resolve({ + success: 1, + json: this.fixture.jsonArticle + }); + }.bind(this)); + + // test + var json = JSON.parse(JSON.stringify(this.fixture.jsonArticle)) + json.abe_meta.status = 'publish' + cmsOperations.post.submit('article-2.html', json) + .then(function(resSave) { + chai.expect(resSave.json.abe_meta).to.not.be.undefined; + + // unstub + cmsOperations.post.draft.restore() + done() + }.bind(this)); + }); + + /** + * cmsOperations.post.reject + * + */ + it('cmsOperations.post.reject()', function(done) { + // stub + var s = sinon.sandbox.create(); + s.stub(abeExtend.hooks.instance, 'trigger', function (str, obj) { return str, obj; }.bind(this)); + s.stub(cmsOperations.post, 'draft', function (filePath, json, rejectToWorkflow) { + chai.expect(rejectToWorkflow).to.be.equal("draft"); + return Promise.resolve(this.fixture.jsonArticle); + }.bind(this)); + + // test + var json = JSON.parse(JSON.stringify(this.fixture.jsonArticle)) + json.abe_meta.status = 'publish' + cmsOperations.post.reject('article-2.html', json) + .then(function(resSave) { + chai.expect(resSave.abe_meta).to.not.be.undefined; + + // unstub + abeExtend.hooks.instance.trigger.restore() + cmsOperations.post.draft.restore() + done() + }.bind(this)); + }); +}); diff --git a/test/cms/operations/remove.js b/test/cms/operations/remove.js new file mode 100644 index 00000000..9f3613b8 --- /dev/null +++ b/test/cms/operations/remove.js @@ -0,0 +1,75 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test','fixtures')}) + +var abeExtend = require('../../../src/cli').abeExtend +var cmsData = require('../../../src/cli').cmsData +var Manager = require('../../../src/cli').Manager +var coreUtils = require('../../../src/cli').coreUtils +var cmsOperations = require('../../../src/cli').cmsOperations +var cmsTemplates = require('../../../src/cli').cmsTemplates +var Manager = require('../../../src/cli').Manager; +var Page = require('../../../src/cli').Page; + +describe('cmsOperations', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + Manager.instance._whereKeys = ['title', 'priority', 'abe_meta', 'articles'] + Manager.instance.updateList() + + this.fixture = { + htmlArticle: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'files', 'article-2.json')), + jsonHomepage: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'data', 'homepage-1.json')) + } + done() + + }.bind(this)) + }); + + /** + * cmsOperations.remove.remove + * + */ + it('cmsOperations.remove.removeFile()', function() { + // stub + var s = sinon.sandbox.create(); + s.stub(fse, 'removeSync', function () { return null; }.bind(this)); + s.stub(coreUtils.file, 'exist', function () { return null; }.bind(this)); + + var res = cmsOperations.remove.removeFile('test.html') + chai.expect(res).to.be.equal(undefined); + + fse.removeSync.restore() + coreUtils.file.exist.restore() + }); + + /** + * cmsOperations.remove.remove + * + */ + it('cmsOperations.remove.remove()', function() { + // stub + var s = sinon.sandbox.create(); + s.stub(abeExtend.hooks.instance, 'trigger', function (str, obj) { return str, obj; }.bind(this)); + s.stub(cmsOperations.remove, 'removeFile', function () { return null; }.bind(this)); + s.stub(cmsData.revision, 'getVersions', function () { return []; }.bind(this)); + s.stub(Manager.instance, 'removePostFromList', function () { return null; }.bind(this)); + + var res = cmsOperations.remove.remove('test.html') + chai.expect(res).to.be.equal(undefined); + + abeExtend.hooks.instance.trigger.restore() + cmsOperations.remove.removeFile.restore() + cmsData.revision.getVersions.restore() + Manager.instance.removePostFromList.restore() + }); +}); diff --git a/test/cms/operations/save.js b/test/cms/operations/save.js new file mode 100644 index 00000000..1ef282bf --- /dev/null +++ b/test/cms/operations/save.js @@ -0,0 +1,71 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var mkdirp = require('mkdirp'); +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test','fixtures')}) + +var abeExtend = require('../../../src/cli').abeExtend +var cmsData = require('../../../src/cli').cmsData +var Manager = require('../../../src/cli').Manager +var coreUtils = require('../../../src/cli').coreUtils +var cmsOperations = require('../../../src/cli').cmsOperations +var cmsTemplates = require('../../../src/cli').cmsTemplates +var Manager = require('../../../src/cli').Manager; +var Page = require('../../../src/cli').Page; + +describe('cmsOperations', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + Manager.instance._whereKeys = ['title', 'priority', 'abe_meta', 'articles'] + Manager.instance.updateList() + + this.fixture = { + htmlArticle: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'files', 'article-2.json')), + jsonHomepage: fse.readJsonSync(path.join(process.cwd(), 'test', 'fixtures', 'data', 'homepage-1.json')) + } + done() + + }.bind(this)) + }); + + /** + * cmsOperations.save.saveJson + * + */ + it('cmsOperations.save.saveJson()', function() { + // stub + var s = sinon.sandbox.create(); + s.stub(fse, 'writeJsonSync', function () { return null; }.bind(this)); + // s.stub(xss, 'exist', function () { return null; }.bind(this)); + + var res = cmsOperations.save.saveJson('test.json', {}) + chai.expect(res).to.be.equal(true); + + fse.writeJsonSync.restore() + }); + + /** + * cmsOperations.save.saveHtml + * + */ + it('cmsOperations.save.saveHtml()', function() { + // stub + var s = sinon.sandbox.create(); + s.stub(fse, 'writeFileSync', function () { return null; }.bind(this)); + s.stub(mkdirp, 'sync', function () { return null; }.bind(this)); + + var res = cmsOperations.save.saveHtml('test.json', {}) + chai.expect(res).to.be.equal(true); + + fse.writeFileSync.restore() + mkdirp.sync.restore() + }); +}); diff --git a/test/cms/templates/encodeAbeTagAsComment.js b/test/cms/templates/encodeAbeTagAsComment.js new file mode 100644 index 00000000..774a3c5a --- /dev/null +++ b/test/cms/templates/encodeAbeTagAsComment.js @@ -0,0 +1,46 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var cmsTemplates = require('../../../src/cli').cmsTemplates; +var cmsData = require('../../../src/cli').cmsData; +var Manager = require('../../../src/cli').Manager; + +describe('cmsTemplates', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + this.fixture = { + articleEach: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-each-abe.html'), 'utf-8') + } + done() + + }.bind(this)) + }); + + /** + * cmsTemplates.encodeAbeTagAsComment + * + */ + it('cmsTemplates.encodeAbeTagAsComment()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var validDataAbe = sinonInstance.stub(cmsData.regex, 'validDataAbe'); + validDataAbe.returns('') + + // test + var txt = cmsTemplates.encodeAbeTagAsComment(this.fixture.articleEach); + chai.expect(txt.indexOf('{')).to.equal(-1); + + // unstub + sinon.assert.calledOnce(cmsData.regex.validDataAbe) + cmsData.regex.validDataAbe.restore() + }); +}); diff --git a/test/cms/templates/handlebars/isAuthorized.js b/test/cms/templates/handlebars/isAuthorized.js new file mode 100644 index 00000000..734b054f --- /dev/null +++ b/test/cms/templates/handlebars/isAuthorized.js @@ -0,0 +1,38 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var fs = require('fs-extra'); +var mkdirp = require('mkdirp'); +var path = require('path'); +var bcrypt = require('bcrypt-nodejs'); +var Cookies = require('cookies'); +var jwt = require('jwt-simple'); +var Handlebars =require('../../../../src/cli').Handlebars + +var coreUtils = require('../../../../src/cli').coreUtils +var config = require('../../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var User = require('../../../../src/cli').User; +describe('Handlebars.helpers.isAuthorized', function() { + before( function() { + config.users.enable = true + this.fixture = { + htmlIsAuthorized: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorized.html'), 'utf8'), + htmlIsAuthorizedTrue: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorizedTrue.html'), 'utf8'), + users: JSON.parse(fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'users', 'users.json'), 'utf8')) + } + }); + + it('Handlebars.helpers.isAuthorized', function() { + var template = Handlebars.compile(this.fixture.htmlIsAuthorized) + var resHtml = template({}) + chai.expect(resHtml).to.be.equal(""); + + template = Handlebars.compile(this.fixture.htmlIsAuthorizedTrue) + resHtml = template({}) + chai.expect(resHtml).to.not.be.equal(""); + }); +}); \ No newline at end of file diff --git a/test/cms/templates/insertDebugtoolUtilities.js b/test/cms/templates/insertDebugtoolUtilities.js new file mode 100644 index 00000000..14e7b098 --- /dev/null +++ b/test/cms/templates/insertDebugtoolUtilities.js @@ -0,0 +1,22 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var cmsTemplates = require('../../../src/cli').cmsTemplates; + +describe('cmsTemplates', function() { + /** + * cmsTemplates.insertDebugtoolUtilities + * + */ + it('cmsTemplates.insertDebugtoolUtilities()', function() { + var txt = cmsTemplates.insertDebugtoolUtilities('', false); + chai.expect(txt.length).to.above(10); + }); +}); diff --git a/test/cms/templates/templates.js b/test/cms/templates/templates.js new file mode 100644 index 00000000..03e18534 --- /dev/null +++ b/test/cms/templates/templates.js @@ -0,0 +1,430 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var path = require('path'); +var fse = require('fs-extra'); + +var config = require('../../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var abeExtend = require('../../../src/cli').abeExtend; +var cmsData = require('../../../src/cli').cmsData; +var cmsTemplates = require('../../../src/cli').cmsTemplates; +var coreUtils = require('../../../src/cli').coreUtils; +var Manager = require('../../../src/cli').Manager; + +describe('cmsTemplates', function() { + before( function(done) { + Manager.instance.init() + .then(function () { + this.fixture = { + slug: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'slug.html'), 'utf-8'), + article: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article.html'), 'utf-8'), + local: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'local.html'), 'utf-8'), + articleSingleAbe: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-single-abe.html'), 'utf-8'), + articleRequest: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-request.html'), 'utf-8'), + template: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'import.html'), 'utf-8'), + articleEach: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-each-abe.html'), 'utf-8'), + articlePrecontrib: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-precontribution.html'), 'utf-8'), + templateKeys: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'article-keys.html'), 'utf-8'), + templatePaths: path.join(process.cwd(), 'test', 'fixtures', 'templates', 'templates/article.html'), + structurePaths: path.join(process.cwd(), 'test', 'fixtures', 'templates', 'templates/structure/0-1'), + import: fse.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'import.html'), 'utf-8'), + count: 0 + } + done() + + }.bind(this)) + }); + + /** + * cmsTemplates.template.getTemplatesAndPartials + * + */ + it('cmsTemplates.template.getTemplatesAndPartials()', function(done) { + // stub + var sinonInstance = sinon.sandbox.create(); + var getFilesAsync = sinonInstance.stub(coreUtils.file, 'getFilesAsync'); + getFilesAsync.returns(Promise.resolve([this.fixture.article])) + + // test + cmsTemplates.template.getTemplatesAndPartials(this._pathTemplate) + .then((templatesList) => { + chai.expect(templatesList.length).to.be.equal(1); + done() + + // unstub + sinon.assert.calledOnce(coreUtils.file.getFilesAsync) + coreUtils.file.getFilesAsync.restore() + }) + }); + + /** + * + * + */ + it('cmsTemplates.template.addOrder()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var getAttr = sinonInstance.stub(cmsData.regex, 'getAttr'); + getAttr.returns(null) + + // test + var html = cmsTemplates.template.addOrder(this.fixture.articleSingleAbe) + chai.expect(html).to.not.be.equal(this.fixture.articleSingleAbe); + chai.expect(html.indexOf('order')).to.above(-1); + + // unstub + sinon.assert.calledOnce(cmsData.regex.getAttr) + cmsData.regex.getAttr.restore() + }); + + /** + * cmsTemplates.template.getStructureAndTemplates + * + */ + it('cmsTemplates.template.getStructureAndTemplates()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGetFoldersSync = sinonInstance.stub(coreUtils.file, 'getFoldersSync'); + stubGetFoldersSync.returns({path: this.fixture.structurePaths, folders: []}) + var stubGetFilesSync = sinonInstance.stub(coreUtils.file, 'getFilesSync'); + stubGetFilesSync.returns([this.fixture.templatePaths]) + + // test + var res = cmsTemplates.template.getStructureAndTemplates() + chai.expect(res.templates.length).to.be.equal(1); + + // unstub + sinon.assert.calledOnce(coreUtils.file.getFoldersSync) + coreUtils.file.getFoldersSync.restore() + sinon.assert.calledOnce(coreUtils.file.getFilesSync) + coreUtils.file.getFilesSync.restore() + }); + + /** + * getAbeImport + * + */ + it('cmsTemplates.template.getAbeImport()', function() { + var res = cmsTemplates.template.getAbeImport(this.fixture.template) + chai.expect(res).to.have.length(1); + }); + + /** + * translate + * + */ + it('cmsTemplates.template.translate()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var getAttr = sinonInstance.stub(cmsData.regex, 'getAttr', function (math, type) { + if (type === 'locale') { + return 'gb' + } + if (type === 'source') { + return 'test' + } + }); + var escapeTextToRegex = sinonInstance.stub(cmsData.regex, 'escapeTextToRegex'); + escapeTextToRegex.returns(new RegExp(this.fixture.local, 'g')) + + // test + var res = cmsTemplates.template.translate(this.fixture.local) + chai.expect(res.indexOf('i18nAbe')).to.above(-1); + + // unstub + cmsData.regex.getAttr.restore() + sinon.assert.calledOnce(cmsData.regex.escapeTextToRegex) + cmsData.regex.escapeTextToRegex.restore() + }); + + /** + * getVariablesInWhere + * + */ + it('cmsTemplates.template.getVariablesInWhere()', function() { + // stub + + // test + var res = cmsTemplates.template.getVariablesInWhere({left: {column: 'title'}, right: {value: "test"}, operator: 'AND'}) + chai.expect(res.length).to.above(-1); + + // unstub + }); + + /** + * recurseWhereVariables + * + */ + it('cmsTemplates.template.recurseWhereVariables()', function() { + // stub + + // test + var res = cmsTemplates.template.recurseWhereVariables({left: {column: 'title'}, right: {value: "test"}}) + chai.expect(res.length).to.above(-1); + + // unstub + }); + + /** + * getTemplatesTexts + * + */ + it('cmsTemplates.template.getTemplatesTexts()', function(done) { + // stub + var sinonInstance = sinon.sandbox.create(); + var readFileSync = sinonInstance.stub(fse, 'readFileSync'); + readFileSync.returns("test") + + // test + cmsTemplates.template.getTemplatesTexts(['test']) + .then(function (res) { + chai.expect(res[0].name).to.be.equal('test'); + + // unstub + sinon.assert.calledOnce(fse.readFileSync) + fse.readFileSync.restore() + done() + }) + }); + + /** + * includePartials + * + */ + it('cmsTemplates.template.includePartials()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var stubReadFileSync = sinonInstance.stub(fse, 'readFileSync'); + stubReadFileSync.returns("test") + var stubGetAbeImport = sinonInstance.stub(cmsTemplates.template, 'getAbeImport', function () { + if (this.fixture.count === 0) { + this.fixture.count++ + return [this.fixture.import] + } + return [] + }.bind(this)); + var stubGetAll = sinonInstance.stub(cmsData.attributes, 'getAll'); + stubGetAll.returns({file: 'import.html'}) + var stubEscapeTextToRegex = sinonInstance.stub(cmsData.regex, 'escapeTextToRegex'); + stubEscapeTextToRegex.returns(new RegExp(this.fixture.import, 'g')) + var stubFile = sinonInstance.stub(coreUtils.file, 'exist', function () { + return true + }.bind(this)); + + // test + var template = cmsTemplates.template.includePartials(this.fixture.template) + chai.expect(template).to.be.equal("test"); + + // unstub + sinon.assert.calledOnce(fse.readFileSync) + fse.readFileSync.restore() + sinon.assert.calledTwice(cmsTemplates.template.getAbeImport) + cmsTemplates.template.getAbeImport.restore() + sinon.assert.calledOnce(cmsData.attributes.getAll) + cmsData.attributes.getAll.restore() + sinon.assert.calledOnce(coreUtils.file.exist) + coreUtils.file.exist.restore() + sinon.assert.calledOnce(cmsData.regex.escapeTextToRegex) + cmsData.regex.escapeTextToRegex.restore() + }); + + /** + * cmsTemplates.template.getTemplate + * + */ + it('cmsTemplates.template.getTemplate()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var stubReadFileSync = sinonInstance.stub(fse, 'readFileSync'); + stubReadFileSync.returns(this.fixture.article) + var stubTrigger = sinonInstance.stub(abeExtend.hooks.instance, 'trigger', function (p1, p2) { + return p2 + }) + var stubExist = sinonInstance.stub(coreUtils.file, 'exist'); + stubExist.returns(true) + var stubIncludePartials = sinonInstance.stub(cmsTemplates.template, 'includePartials'); + stubIncludePartials.returns(this.fixture.article) + var stubTranslate = sinonInstance.stub(cmsTemplates.template, 'translate'); + stubTranslate.returns(this.fixture.article) + var stubAddOrder = sinonInstance.stub(cmsTemplates.template, 'addOrder'); + stubAddOrder.returns(this.fixture.article) + + var template = cmsTemplates.template.getTemplate('article') + chai.expect(template).to.be.equal(this.fixture.article); + + sinon.assert.calledOnce(fse.readFileSync) + fse.readFileSync.restore() + sinon.assert.calledTwice(abeExtend.hooks.instance.trigger) + abeExtend.hooks.instance.trigger.restore() + sinon.assert.calledOnce(coreUtils.file.exist) + coreUtils.file.exist.restore() + sinon.assert.calledOnce(cmsTemplates.template.includePartials) + cmsTemplates.template.includePartials.restore() + sinon.assert.calledOnce(cmsTemplates.template.translate) + cmsTemplates.template.translate.restore() + sinon.assert.calledOnce(cmsTemplates.template.addOrder) + cmsTemplates.template.addOrder.restore() + }); + + /** + * cmsTemplates.template.setAbeSlugDefaultValueIfDoesntExist + * + */ + it('cmsTemplates.template.setAbeSlugDefaultValueIfDoesntExist()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGetTagAbeWithType = sinonInstance.stub(cmsData.regex, 'getTagAbeWithType'); + stubGetTagAbeWithType.returns(null) + + // test + var text = cmsTemplates.template.setAbeSlugDefaultValueIfDoesntExist(this.fixture.slug) + chai.expect(text).to.not.be.equal(this.fixture.slug); + + // unstub + sinon.assert.calledOnce(cmsData.regex.getTagAbeWithType) + cmsData.regex.getTagAbeWithType.restore() + }); + + /** + * cmsTemplates.template.setAbePrecontribDefaultValueIfDoesntExist + * + */ + it('cmsTemplates.template.setAbePrecontribDefaultValueIfDoesntExist()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGetTagAbeWithTab = sinonInstance.stub(cmsData.regex, 'getTagAbeWithTab'); + stubGetTagAbeWithTab.returns(null) + + // test + var text = cmsTemplates.template.setAbePrecontribDefaultValueIfDoesntExist(this.fixture.slug) + chai.expect(text).to.not.be.equal(this.fixture.slug); + + // unstub + sinon.assert.calledOnce(cmsData.regex.getTagAbeWithTab) + cmsData.regex.getTagAbeWithTab.restore() + }); + + /** + * cmsTemplates.template.getAbePrecontribFromTemplates + * + */ + it('cmsTemplates.template.getAbePrecontribFromTemplates()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGetTagAbeWithTab = sinonInstance.stub(cmsData.regex, 'getTagAbeWithTab'); + stubGetTagAbeWithTab.returns(['{{abe type="slug" source="{{name}}"}}']) + + var stubGetAll = sinonInstance.stub(cmsData.attributes, 'getAll'); + stubGetAll.returns({name: 'test.html'}) + + var stubAddOrder = sinonInstance.stub(cmsTemplates.template, 'addOrder', function (text) { + return text + }); + + // test + var precontrib = cmsTemplates.template.getAbePrecontribFromTemplates([{name: 'slug', template: this.fixture.slug}]) + chai.expect(precontrib.fields[0]).to.not.be.undefined; + + // unstub + sinon.assert.calledOnce(cmsData.regex.getTagAbeWithTab) + cmsData.regex.getTagAbeWithTab.restore() + sinon.assert.calledOnce(cmsData.attributes.getAll) + cmsData.attributes.getAll.restore() + sinon.assert.calledOnce(cmsTemplates.template.addOrder) + cmsTemplates.template.addOrder.restore() + }); + + /** + * cmsTemplates.template.getAbeSlugFromTemplates + * + */ + it('cmsTemplates.template.getAbeSlugFromTemplates()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var setAbeSlugDefaultValueIfDoesntExist = sinonInstance.stub(cmsTemplates.template, 'setAbeSlugDefaultValueIfDoesntExist'); + setAbeSlugDefaultValueIfDoesntExist.returns(this.fixture.slug) + var getTagAbeWithType = sinonInstance.stub(cmsData.regex, 'getTagAbeWithType'); + getTagAbeWithType.returns(['{{abe type="slug" source="{{name}}"}}']) + var getAll = sinonInstance.stub(cmsData.attributes, 'getAll'); + getAll.returns({sourceString: 'test.html', name: 'test'}) + + var slug = cmsTemplates.template.getAbeSlugFromTemplates([{name: 'slug', template: this.fixture.slug}]) + chai.expect(slug.slug).to.not.be.undefined; + + // unstub + sinon.assert.calledOnce(cmsTemplates.template.setAbeSlugDefaultValueIfDoesntExist) + cmsTemplates.template.setAbeSlugDefaultValueIfDoesntExist.restore() + sinon.assert.calledOnce(cmsData.regex.getTagAbeWithType) + cmsData.regex.getTagAbeWithType.restore() + sinon.assert.calledOnce(cmsData.attributes.getAll) + cmsData.attributes.getAll.restore() + }); + + /** + * getTemplate + * + */ + it('cmsTemplates.template.execRequestColumns()', function() { + // stub + var sinonInstance = sinon.sandbox.create(); + var getTagAbeTypeRequest = sinonInstance.stub(cmsData.regex, 'getTagAbeTypeRequest'); + getTagAbeTypeRequest.returns([this.fixture.articleRequest]) + var getSourceType = sinonInstance.stub(cmsData.sql, 'getSourceType'); + getSourceType.returns('request') + var handleSqlRequest = sinonInstance.stub(cmsData.sql, 'handleSqlRequest'); + handleSqlRequest.returns({columns: ['title'], where: {left: 'title'}}) + var recurseWhereVariables = sinonInstance.stub(cmsTemplates.template, 'recurseWhereVariables'); + recurseWhereVariables.returns('title2') + + // test + const pathTemplate = path.join(config.root, config.templates.url) + var ar = cmsTemplates.template.execRequestColumns(this.fixture.templateKeys) + chai.expect(ar.indexOf('title')).to.be.above(-1); + + // unstub + sinon.assert.calledOnce(cmsData.regex.getTagAbeTypeRequest) + cmsData.regex.getTagAbeTypeRequest.restore() + sinon.assert.calledOnce(cmsData.sql.getSourceType) + cmsData.sql.getSourceType.restore() + sinon.assert.calledOnce(cmsData.sql.handleSqlRequest) + cmsData.sql.handleSqlRequest.restore() + sinon.assert.calledOnce(cmsTemplates.template.recurseWhereVariables) + cmsTemplates.template.recurseWhereVariables.restore() + }); + + /** + * getTemplate + * + */ + it('cmsTemplates.template.getAbeRequestWhereKeysFromTemplates()', function(done) { + // stub + var sinonInstance = sinon.sandbox.create(); + var execRequestColumns = sinonInstance.stub(cmsTemplates.template, 'execRequestColumns'); + execRequestColumns.returns(['title']) + + // test + const pathTemplate = path.join(config.root, config.templates.url) + cmsTemplates.template.getAbeRequestWhereKeysFromTemplates([this.fixture.articleRequest]) + .then(function (ar) { + chai.expect(ar.indexOf('title')).to.be.above(-1); + + // unstub + sinon.assert.calledOnce(cmsTemplates.template.execRequestColumns) + cmsTemplates.template.execRequestColumns.restore() + done() + }) + }); + + /** + * cmsTemplates.encodeAbeTagAsComment + * + */ + it('cmsTemplates.encodeAbeTagAsComment()', function() { + var txt = cmsTemplates.encodeAbeTagAsComment(this.fixture.articleEach); + chai.expect(txt.indexOf('{')).to.equal(-1); + }); +}); diff --git a/test/editor.js b/test/editor.js new file mode 100644 index 00000000..65cc39ba --- /dev/null +++ b/test/editor.js @@ -0,0 +1,62 @@ +import chai from 'chai' +import path from 'path' +import sinonChai from'sinon-chai' +chai.use(sinonChai) +import sinon from 'sinon' +import {config} from '../src/cli' +config.set({root: path.join(__dirname,'fixtures')}) + +import { + cmsEditor, + abeExtend +} from '../src/cli' + +import data from './fixtures/editor/index' + +describe('Editor', function() { + + /** + * cmsEditor.printInput + * + */ + it('cmsEditor.printInput()', function() { + var val = data.text; + this.sinon = sinon.sandbox.create(); + this.sinon.stub(abeExtend.hooks.instance, 'trigger', function(param, html){ + return (param === 'beforeEditorInput') ? val : html; + }) + + var result = cmsEditor.printInput(val, {}) + chai.expect(result).to.be.a('string') + var value = result.match(/value="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(value).to.equal('value="val2"') + var reload = result.match(/reload="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(reload).to.equal('reload="val3"') + var tabIndex = result.match(/tabIndex="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(tabIndex).to.equal('tabIndex="val4"') + var dataRequired = result.match(/data-required="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(dataRequired).to.equal('data-required="val5"') + var dataDisplay = result.match(/data-display="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(dataDisplay).to.equal('data-display="val6"') + var dataVisible = result.match(/data-visible="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(dataVisible).to.equal('data-visible="val7"') + var dataAutocomplete = result.match(/data-autocomplete="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(dataAutocomplete).to.equal('data-autocomplete="val8"') + var placeholder = result.match(/placeholder="[a-zA-Z0-9-]*"/ig)[0] + chai.expect(placeholder).to.equal('placeholder="val9"') + + this.sinon.restore() + }); + + /** + * cmsEditor.folders + * + */ + it('cmsEditor.folders()', function() { + var result = cmsEditor.folders([{path: ''}], 1, null, {'level-1': 'my wording'}) + var wordingExist = result.indexOf('my wording') + chai.expect(result).to.be.a('string') + chai.expect(wordingExist).to.equal(110) + }); + +}); diff --git a/test/fixtures/abe.json b/test/fixtures/abe.json index 9e412799..80384211 100644 --- a/test/fixtures/abe.json +++ b/test/fixtures/abe.json @@ -1,5 +1,24 @@ { + "plugins": [ + "test@1.0.0", + "testnew" + ], "upload": { "image": "unitimage" + }, + "siteLocaleFolder": "locales", + "users": { + "enable": false, + "commonPassword": [ + "test" + ], + "routes": { + "admin": [ + "/abe.*" + ], + "review": [ + "/abe/test.*" + ] + } } -} \ No newline at end of file +} diff --git a/test/fixtures/editor/colors.json b/test/fixtures/editor/colors.json new file mode 100644 index 00000000..19929474 --- /dev/null +++ b/test/fixtures/editor/colors.json @@ -0,0 +1,5 @@ +[ + "red", + "green", + "blue" +] \ No newline at end of file diff --git a/test/fixtures/editor/gmaps-element.json b/test/fixtures/editor/gmaps-element.json new file mode 100644 index 00000000..c25dca49 --- /dev/null +++ b/test/fixtures/editor/gmaps-element.json @@ -0,0 +1,53 @@ +{ + "address_components": [ + { + "long_name": "State of Pará", + "short_name": "PA", + "types": [ + "administrative_area_level_1", + "political" + ] + }, + { + "long_name": "Brazil", + "short_name": "BR", + "types": [ + "country", + "political" + ] + } + ], + "formatted_address": "State of Pará, Brazil", + "geometry": { + "bounds": { + "northeast": { + "lat": 2.5910246, + "lng": -46.0643195 + }, + "southwest": { + "lat": -9.8411565, + "lng": -58.89827700000001 + } + }, + "location": { + "lat": -1.9981271, + "lng": -54.9306152 + }, + "location_type": "APPROXIMATE", + "viewport": { + "northeast": { + "lat": 2.5910246, + "lng": -46.0643195 + }, + "southwest": { + "lat": -9.8411565, + "lng": -58.89827700000001 + } + } + }, + "place_id": "ChIJlwksrJn5iJIRCvNV5z7IXjE", + "types": [ + "administrative_area_level_1", + "political" + ] +} \ No newline at end of file diff --git a/test/fixtures/editor/index.json b/test/fixtures/editor/index.json new file mode 100644 index 00000000..0af2682b --- /dev/null +++ b/test/fixtures/editor/index.json @@ -0,0 +1,17 @@ +{ + "text": { + "type": "text", + "key": "val1", + "value": "val2", + "reload": "val3", + "order": "val4", + "required": "val5", + "display": "val6", + "visible": "val7", + "autocomplete": "val8", + "placeholder": "val9" + }, + "image": {}, + "file": {}, + "rich": {} +} \ No newline at end of file diff --git a/test/fixtures/files/article-2.json b/test/fixtures/files/article-2.json index f1c44f51..45009d21 100644 --- a/test/fixtures/files/article-2.json +++ b/test/fixtures/files/article-2.json @@ -4,7 +4,10 @@ "link": "/article-2.html", "status": "publish", "date": "2016-11-11T16:40:41.974Z", - "latest": {"date": "2016-11-11T16:40:41.974Z"} + "latest": { + "date": "2016-11-11T16:40:41.974Z", + "abeUrl": "/article-2.html" + } }, "priority":2, "title":"article 2" diff --git a/test/fixtures/locales/en-US/some-locales.json b/test/fixtures/locales/en-US/some-locales.json new file mode 100755 index 00000000..1504432c --- /dev/null +++ b/test/fixtures/locales/en-US/some-locales.json @@ -0,0 +1,3 @@ +{ + "word": "a word" +} \ No newline at end of file diff --git a/test/fixtures/media/site/unitimage/chat-1.jpg b/test/fixtures/media/site/unitimage/chat-1.jpg new file mode 100644 index 00000000..21e03f61 Binary files /dev/null and b/test/fixtures/media/site/unitimage/chat-1.jpg differ diff --git a/test/fixtures/plugins/test/hooks/hooks.js b/test/fixtures/node_modules/test/hooks/hooks.js similarity index 100% rename from test/fixtures/plugins/test/hooks/hooks.js rename to test/fixtures/node_modules/test/hooks/hooks.js diff --git a/test/fixtures/node_modules/test/process/test.js b/test/fixtures/node_modules/test/process/test.js new file mode 100644 index 00000000..68ab636f --- /dev/null +++ b/test/fixtures/node_modules/test/process/test.js @@ -0,0 +1,2 @@ +//console.log('test') +var i = 0 \ No newline at end of file diff --git a/test/fixtures/plugins/test/routes/get/test.js b/test/fixtures/node_modules/test/routes/get/test.js similarity index 100% rename from test/fixtures/plugins/test/routes/get/test.js rename to test/fixtures/node_modules/test/routes/get/test.js diff --git a/test/fixtures/node_modules/testnew/readme b/test/fixtures/node_modules/testnew/readme new file mode 100644 index 00000000..e69de29b diff --git a/test/fixtures/templates/partials/test.html b/test/fixtures/partials/test.html similarity index 100% rename from test/fixtures/templates/partials/test.html rename to test/fixtures/partials/test.html diff --git a/test/fixtures/templates/partials/title.html b/test/fixtures/partials/title.html similarity index 100% rename from test/fixtures/templates/partials/title.html rename to test/fixtures/partials/title.html diff --git a/test/fixtures/plugins/test/process/test.js b/test/fixtures/plugins/test/process/test.js deleted file mode 100644 index a243684d..00000000 --- a/test/fixtures/plugins/test/process/test.js +++ /dev/null @@ -1 +0,0 @@ -console.log('test') \ No newline at end of file diff --git a/test/fixtures/scripts/test-script/hooks/hooks.js b/test/fixtures/scripts/test-script/hooks/hooks.js new file mode 100644 index 00000000..6c4d097b --- /dev/null +++ b/test/fixtures/scripts/test-script/hooks/hooks.js @@ -0,0 +1,9 @@ +'use strict'; + +var hooks = { + afterEditorInput: function() { + return 'test'; + } +}; + +exports.default = hooks; \ No newline at end of file diff --git a/test/fixtures/scripts/test-script/partials/head.html b/test/fixtures/scripts/test-script/partials/head.html new file mode 100644 index 00000000..0d2db82f --- /dev/null +++ b/test/fixtures/scripts/test-script/partials/head.html @@ -0,0 +1,3 @@ + + title + \ No newline at end of file diff --git a/test/fixtures/scripts/test-script/process/test.js b/test/fixtures/scripts/test-script/process/test.js new file mode 100644 index 00000000..68ab636f --- /dev/null +++ b/test/fixtures/scripts/test-script/process/test.js @@ -0,0 +1,2 @@ +//console.log('test') +var i = 0 \ No newline at end of file diff --git a/test/fixtures/scripts/test-script/routes/get/test.js b/test/fixtures/scripts/test-script/routes/get/test.js new file mode 100644 index 00000000..4f425062 --- /dev/null +++ b/test/fixtures/scripts/test-script/routes/get/test.js @@ -0,0 +1,8 @@ +'use strict'; + +var route = function route(req, res, next, abe) { + res.set('Content-Type', 'text/html'); + return res.send('test'); +} + +exports.default = route \ No newline at end of file diff --git a/test/fixtures/templates/import.html b/test/fixtures/templates/import.html new file mode 100644 index 00000000..1800b680 --- /dev/null +++ b/test/fixtures/templates/import.html @@ -0,0 +1 @@ +{{abe type='import' file='title.html'}} \ No newline at end of file diff --git a/test/fixtures/templates/isAuthorized.html b/test/fixtures/templates/isAuthorized.html new file mode 100644 index 00000000..ec48b66f --- /dev/null +++ b/test/fixtures/templates/isAuthorized.html @@ -0,0 +1,3 @@ +{{#isAuthorized '/abe/truc' 'review'}} +test +{{/isAuthorized}} \ No newline at end of file diff --git a/test/fixtures/templates/isAuthorizedTrue.html b/test/fixtures/templates/isAuthorizedTrue.html new file mode 100644 index 00000000..d6139d83 --- /dev/null +++ b/test/fixtures/templates/isAuthorizedTrue.html @@ -0,0 +1,3 @@ +{{#isAuthorized '/abe' 'admin'}} +test +{{/isAuthorized}} \ No newline at end of file diff --git a/test/fixtures/templates/local.html b/test/fixtures/templates/local.html new file mode 100644 index 00000000..bd2d9b48 --- /dev/null +++ b/test/fixtures/templates/local.html @@ -0,0 +1 @@ +{{abe type="translate" source="bla bla bla" locale="fr"}} \ No newline at end of file diff --git a/test/fixtures/templates/slug.html b/test/fixtures/templates/slug.html new file mode 100644 index 00000000..7932ebac --- /dev/null +++ b/test/fixtures/templates/slug.html @@ -0,0 +1,2 @@ +{{abe type="slug" source="{{name}}"}} +{{abe type='text' key='name' desc='Name' required="true" tab="slug" visible="false"}} \ No newline at end of file diff --git a/test/fixtures/users/users.json b/test/fixtures/users/users.json new file mode 100644 index 00000000..c46d3617 --- /dev/null +++ b/test/fixtures/users/users.json @@ -0,0 +1,15 @@ +[ + { + "id": 1, + "username": "test", + "name": "admin", + "email": "admin@test.com", + "resetPasswordToken": "token", + "password": "$2a$10$Vb.dH21.uIVCj2yEArmU4OcsHlLTNldGBg/NdhSnD/Q.SWRgIA7Xm", + "role": { + "workflow": "admin", + "name": "Admin" + }, + "actif": 1 + } +] \ No newline at end of file diff --git a/test/hbs-helpers.js b/test/hbs-helpers.js index 72d23c71..6fc50614 100644 --- a/test/hbs-helpers.js +++ b/test/hbs-helpers.js @@ -2,6 +2,14 @@ var chai = require('chai'); var Handlebars =require('../src/cli').Handlebars describe("Helpers", function () { + describe("className", function () { + it('properly lowercase string', function() { + var value = 'ThiS IS mY String', + rendered = Handlebars.helpers.className(value), + expected = 'ThiS_IS_mY_String'; + chai.expect(rendered).to.eql(expected); + }); + }); describe("lowercase", function () { it('properly lowercase string', function() { var value = 'ThiS IS mY String', @@ -143,4 +151,13 @@ describe("Helpers", function () { chai.expect(rendered).to.eql(expected); }); }); + describe("setVariable", function () { + it('setVariable', function() { + var variableName = "variableName", + variableValue = 'variableValue', + obj = {data: {root: {}}}, + rendered = Handlebars.helpers.setVariable(variableName, variableValue, obj); + chai.expect(obj.data.root.variableName).to.be.equal(variableValue); + }); + }); }); \ No newline at end of file diff --git a/test/image.js b/test/image.js new file mode 100644 index 00000000..fa98481a --- /dev/null +++ b/test/image.js @@ -0,0 +1,176 @@ +import chai from'chai' +import sinonChai from'sinon-chai' +var expect = chai.expect +chai.use(sinonChai) +import sinon from 'sinon' +import path from 'path' +import {Promise} from 'bluebird' +import fse from 'fs-extra' +import events from 'events' +import mkdirp from 'mkdirp' +import { + config, + cmsMedia, + coreUtils, + abeExtend +} from '../src/cli' +config.set({root: path.join(__dirname,'fixtures')}) + +describe('image', function() { + + var pathToImage = path.join(config.root, config.publish.url, config.upload.image, 'chat-1.jpg'); + var imagesListInFolder = [ + path.join(config.root, config.publish.url, config.upload.image, 'img.jpg'), + path.join(config.root, config.publish.url, config.upload.image, 'img_100x100.jpg'), + path.join(config.root, config.publish.url, config.upload.image, 'img_10x10.jpg'), + path.join(config.root, config.publish.url, config.upload.image, 'img_thumb.jpg') + ]; + + before(function(done) { + fse.copySync(path.join(config.root, 'media'), config.root) + done() + }); + + /** + * cmsMedia.image.generateThumbnail + * @todo : UNIT TEST this method + * + */ + it('cmsMedia.image.generateThumbnail()', function(done) { + // this.sinon = sinon.sandbox.create(); + // var stub = sinon.stub(cmsMedia.image, 'smartCropAndSaveFile') + // stub.returns(Promise.resolve(0)) + // var thumb = cmsMedia.image.generateThumbnail(pathToImage) + // thumb.then(function (result) { + // done() + // chai.expect(result).to.not.be.undefined + // chai.expect(result.thumb).to.not.be.undefined + // chai.expect(result.thumb).to.equal('/unitimage/chat-1_thumb.jpg') + // sinon.assert.calledOnce(cmsMedia.image.smartCropAndSaveFile) + // cmsMedia.image.smartCropAndSaveFile.restore() + // }) + done() + }); + + /** + * cmsMedia.image.cropAndSaveFiles + * @todo : UNIT TEST this method + * + */ + it('cmsMedia.image.cropAndSaveFiles()', function(done) { + // this.sinon = sinon.sandbox.create(); + // var stub = sinon.stub(cmsMedia.image, 'smartCropAndSaveFile') + // stub.returns(Promise.resolve({ + // 'stdout': false, + // 'stderr': false + // })) + // var thumbs = cmsMedia.image.cropAndSaveFiles(['10x10'], pathToImage, {}) + + // thumbs.then(function (result) { + // console.log("result", result) + // chai.expect(result).to.not.be.undefined + // chai.expect(result.thumbs).to.have.length(1) + // chai.expect(result.thumbs[0]).to.have.property('name').to.equal('/unitimage/chat-1_10x10.jpg') + // chai.expect(result.thumbs[0]).to.have.property('size').to.equal('10x10') + // sinon.assert.calledOnce(cmsMedia.image.smartCropAndSaveFile) + // cmsMedia.image.smartCropAndSaveFile.restore() + + // done() + // }) + // .catch(function (err) { + // console.log("catch", err) + // done() + // }) + done() + }); + + /** + * cmsMedia.image.getThumbsList + * + */ + it('cmsMedia.image.getThumbsList()', function() { + this.sinon = sinon.sandbox.create(); + var stub = sinon.stub(coreUtils.file, 'getFilesSync') + stub.returns(imagesListInFolder) + var result = cmsMedia.image.getThumbsList() + chai.expect(result).to.not.be.undefined + chai.expect(result).to.have.length(1) + chai.expect(result[0]).to.have.property('originalFile').to.equal(path.join(path.sep, 'unitimage', 'img.jpg')) + chai.expect(result[0]).to.have.property('thumbFile').to.equal(path.join(path.sep, 'unitimage', 'img_thumb.jpg')) + sinon.assert.calledOnce(coreUtils.file.getFilesSync) + coreUtils.file.getFilesSync.restore() + }); + + /** + * cmsMedia.image.createMediaFolder + * + */ + it('cmsMedia.image.createMediaFolder()', function() { + this.sinon = sinon.sandbox.create(); + var stub = sinon.stub(abeExtend.hooks.instance, 'trigger') + stub.returns('/myImageFolder') + var stubDir = sinon.stub(mkdirp, 'sync') + stubDir.returns({}) + var result = cmsMedia.image.createMediaFolder({}) + chai.expect(result).to.not.be.undefined + chai.expect(result).to.be.a('string') + chai.expect(result).to.equal(path.join(config.root, config.publish.url, '/myImageFolder')) + sinon.assert.calledOnce(abeExtend.hooks.instance.trigger) + abeExtend.hooks.instance.trigger.restore() + sinon.assert.calledOnce(mkdirp.sync) + mkdirp.sync.restore() + }); + + /** + * cmsMedia.image.getAssociatedImageFileFromThumb + * + */ + it('cmsMedia.image.getAssociatedImageFileFromThumb()', function() { + this.sinon = sinon.sandbox.create(); + var stub = sinon.stub(coreUtils.file, 'getFilesSync') + stub.returns(imagesListInFolder) + var result = cmsMedia.image.getAssociatedImageFileFromThumb(path.join(path.sep, 'unitimage', 'img_thumb.jpg')) + console.log(result) + chai.expect(result).to.not.be.undefined + chai.expect(result).to.have.property('originalFile').to.equal(path.join(path.sep, 'unitimage', 'img.jpg')) + chai.expect(result).to.have.property('thumbFile').to.equal(path.join(path.sep, 'unitimage', 'img_thumb.jpg')) + chai.expect(result.thumbs).to.have.length(2) + chai.expect(result.thumbs[0]).to.equal(path.join(path.sep, 'unitimage', 'img_100x100.jpg')) + sinon.assert.calledOnce(coreUtils.file.getFilesSync) + coreUtils.file.getFilesSync.restore() + }); + + /** + * cmsMedia.image.isValidMedia + * + */ + it('cmsMedia.image.isValidMedia()', function() { + var result = cmsMedia.image.isValidMedia('image/jpeg', '.jpg') + var result2 = cmsMedia.image.isValidMedia('wrong/mimetype', '.exe') + chai.expect(result.error).to.equal(false) + chai.expect(result2.error).to.be.a('string') + chai.expect(result2.error).to.equal('unauthorized file') + }); + + /** + * cmsMedia.image.createMediaSlug + * + */ + it('cmsMedia.image.createMediaSlug()', function() { + this.sinon = sinon.sandbox.create(); + var stub = sinon.stub(coreUtils.random, 'generateUniqueIdentifier') + stub.returns(12345) + var result = cmsMedia.image.createMediaSlug('teSt f1le s l û g', '.jpg') + chai.expect(result).to.not.be.undefined + chai.expect(result).to.be.a('string') + chai.expect(result).to.equal('test-f1le-s-l-u-g-12345.jpg') + sinon.assert.calledOnce(coreUtils.random.generateUniqueIdentifier) + coreUtils.random.generateUniqueIdentifier.restore() + }); + + after(function(done) { + fse.remove(path.join(config.root, config.publish.url)) + done() + }); + +}); \ No newline at end of file diff --git a/test/locale.js b/test/locale.js new file mode 100644 index 00000000..bd2b197c --- /dev/null +++ b/test/locale.js @@ -0,0 +1,21 @@ +var chai = require('chai'); +var path = require('path'); + +var config = require('../src/cli').config +config.set({root: path.join(__dirname, 'fixtures')}) + +import locale from '../src/server/helpers/abe-locale' + +describe('locale', function() { + + /** + * locale + * + */ + it('locale', function() { + chai.expect(locale).to.have.property('word') + chai.expect(locale.word).to.be.a('string') + chai.expect(locale.word).to.equal('a word') + }); + +}); diff --git a/test/manager.js b/test/manager.js index ece9c365..c8efdeb8 100644 --- a/test/manager.js +++ b/test/manager.js @@ -16,9 +16,9 @@ describe('Manager', function() { .then(function () { this.fixture = { - tag: fse.readFileSync(__dirname + '/fixtures/templates/article.html', 'utf8'), - jsonArticle: fse.readJsonSync(__dirname + '/fixtures/files/article-4.json'), - jsonArticle1: fse.readJsonSync(__dirname + '/fixtures/data/article-1.json') + tag: fse.readFileSync(path.join(__dirname, 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(__dirname, 'fixtures', 'files', 'article-4.json')), + jsonArticle1: fse.readJsonSync(path.join(__dirname, 'fixtures', 'data', 'article-1.json')) } done() @@ -28,14 +28,14 @@ describe('Manager', function() { it('getStructureAndTemplates()', function() { const data = Manager.instance.getStructureAndTemplates() chai.assert.equal(data['templates'][0].name, 'article-each-abe', 'failed !') - chai.assert.equal(data['templates'].length, 9, 'failed !') + chai.assert.equal(data['templates'].length, 12, 'failed !') }); it('updateStructureAndTemplates()', function() { Manager.instance.updateStructureAndTemplates() const data = Manager.instance.getStructureAndTemplates() chai.assert.equal(data['templates'][0].name, 'article-each-abe', 'failed !') - chai.assert.equal(data['templates'].length, 9, 'failed !') + chai.assert.equal(data['templates'].length, 12, 'failed !') }); it('getList()', function() { diff --git a/test/meta.js b/test/meta.js index 58101eac..9db6ea15 100644 --- a/test/meta.js +++ b/test/meta.js @@ -12,10 +12,13 @@ describe('Meta', function() { before( function(done) { Manager.instance.init() .then(function () { - +try{ this.fixture = { - tag: fse.readFileSync(__dirname + '/fixtures/templates/article.html', 'utf8') + tag: fse.readFileSync(path.join(__dirname, 'fixtures', 'templates', 'article.html'), 'utf8') } +}catch(e){ + console.log("err", e) +} done() }.bind(this)) diff --git a/test/operations.js b/test/operations.js deleted file mode 100644 index c7c63427..00000000 --- a/test/operations.js +++ /dev/null @@ -1,156 +0,0 @@ -var chai = require('chai'); -var path = require('path'); - -var config = require('../src/cli').config -config.set({root: path.join(__dirname,'fixtures')}) - -var cmsOperations = require('../src/cli').cmsOperations -var Manager = require('../src/cli').Manager; -var fse = require('fs-extra'); - -describe('cmsOperations', function() { - before( function(done) { - Manager.instance.init() - .then(function () { - Manager.instance._whereKeys = ['title', 'priority', 'abe_meta', 'articles'] - Manager.instance.updateList() - - this.fixture = { - jsonArticle: fse.readJsonSync(path.join(__dirname, '/fixtures/files/article-2.json')), - jsonHomepage: fse.readJsonSync(path.join(__dirname, '/fixtures/data/homepage-1.json')) - } - done() - - }.bind(this)) - }); - - it('cmsOperations.create()', function(done) { - cmsOperations.create('article', '', 'article-2.html', {query: ''}, JSON.parse(JSON.stringify(this.fixture.jsonArticle)), false) - .then(function(resSave) { - var json = path.join(config.root, config.data.url, resSave.abe_meta.latest.abeUrl.replace('.html', '.json')) - var stat = fse.statSync(json) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(json) - done() - }.bind(this)); - }); - - /** - * cmsOperations.post.publish - * - */ - it('cmsOperations.post.publish()', function(done) { - cmsOperations.post.publish('article-2.html', JSON.parse(JSON.stringify(this.fixture.jsonArticle))) - .then(function(resSave) { - var json = path.join(config.root, config.data.url, resSave.json.abe_meta.latest.abeUrl.replace('.html', '.json')) - var stat = fse.statSync(json) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(json) - - var html = path.join(config.root, config.publish.url, resSave.json.abe_meta.link) - var stat = fse.statSync(html) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(html) - done() - }.bind(this)); - }); - - /** - * cmsOperations.post.unpublish - * - */ - it('cmsOperations.post.unpublish()', function(done) { - cmsOperations.post.publish('article-2.html', JSON.parse(JSON.stringify(this.fixture.jsonArticle))) - .then(function(resSave) { - var json = path.join(config.root, config.data.url, resSave.json.abe_meta.latest.abeUrl.replace('.html', '.json')) - var html = path.join(config.root, config.publish.url, resSave.json.abe_meta.link) - cmsOperations.post.unpublish('article-2.html') - .then(function(resSave2) { - var stat - try { - var stat = fse.statSync(json) - }catch(e) { - chai.expect(stat).to.be.undefined; - } - try { - var stat = fse.statSync(html) - }catch(e) { - chai.expect(stat).to.be.undefined; - } - json = path.join(config.root, config.data.url, resSave2.json.abe_meta.latest.abeUrl.replace('.html', '.json')) - var stat = fse.statSync(json) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(json) - done() - }.bind(this)); - }.bind(this)); - }); - - /** - * cmsOperations.post.draft - * - */ - it('cmsOperations.post.draft()', function(done) { - cmsOperations.post.draft('article-2.html', JSON.parse(JSON.stringify(this.fixture.jsonArticle))) - .then(function(resSave) { - var json = path.join(config.root, config.data.url, resSave.json.abe_meta.latest.abeUrl.replace('.html', '.json')) - var stat = fse.statSync(json) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(json) - done() - }.bind(this)); - }); - - /** - * cmsOperations.post.reject - * - */ - it('cmsOperations.post.reject()', function(done) { - cmsOperations.post.reject('article-2.html', JSON.parse(JSON.stringify(this.fixture.jsonArticle))) - .then(function(resSave) { - var json = path.join(config.root, config.data.url, resSave.json.abe_meta.latest.abeUrl.replace('.html', '.json')) - var stat = fse.statSync(json) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(json) - done() - }.bind(this)); - }); - - it('cmsOperations.duplicate()', function(done) { - cmsOperations.duplicate('article-1.html', 'article', '', 'article-2.html', {}, false) - .then(function(resSave) { - var json = path.join(config.root, config.data.url, resSave.abe_meta.latest.abeUrl.replace('.html', '.json')) - var stat = fse.statSync(json) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(json) - done() - }.bind(this)) - }); - - it('cmsOperations.duplicate() update', function(done) { - cmsOperations.duplicate('article-1.html', 'article', '', 'article-1.html', {}, true) - .then(function(resSave) { - var json = path.join(config.root, config.data.url, resSave.abe_meta.latest.abeUrl.replace('.html', '.json')) - var stat = fse.statSync(json) - if (stat) { - chai.expect(stat).to.not.be.undefined; - } - fse.removeSync(json) - done() - }.bind(this)) - }); -}); diff --git a/test/plugin.js b/test/plugin.js index e1136599..d743ef0d 100644 --- a/test/plugin.js +++ b/test/plugin.js @@ -1,5 +1,14 @@ var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); var path = require('path'); +var child_process = require('child_process') +import {Promise} from 'bluebird' +var events = require('events') +import which from 'which' +const npm = which.sync('npm') var config = require('../src/cli').config config.set({root: path.join(__dirname,'fixtures')}) @@ -10,30 +19,150 @@ var Manager = require('../src/cli').Manager; var fse = require('fs-extra'); describe('Plugin', function() { + before( function(done) { Manager.instance.init() .then(function () { - this.fixture = {} + this.fixture = { + testPlugin: 'test', + testNewPlugin: 'testnew', + testScript: 'test-script', + testProcess: 'test' + } done() - }.bind(this)) }); - /** - * abeExtend.plugins.instance - * - */ + it('abeExtend.hooks.instance.getPluginConfig find plugin', function(){ + const plugin = abeExtend.plugins.instance.getPluginConfig( + abeExtend.plugins.instance.pluginsDir, + this.fixture.testPlugin + ) + chai.expect(plugin.hooks).to.have.afterEditorInput; + chai.expect(plugin.routes.get[0]).to.have.path; + }) + + it('abeExtend.hooks.instance.getPluginConfig find script', function(){ + const plugin = abeExtend.plugins.instance.getPluginConfig( + abeExtend.plugins.instance.scriptsDir, + this.fixture.testScript + ) + chai.expect(plugin.hooks).to.have.afterEditorInput; + }) + + it('abeExtend.hooks.instance.getProcess', function(){ + const proc = abeExtend.plugins.instance.getProcess( + this.fixture.testProcess + ) + chai.assert.equal(path.basename(proc), 'test.js', 'getProcess test failed !') + }) + + it('abeExtend.hooks.instance.getPartials', function(){ + const partialsArray = abeExtend.plugins.instance.getPartials() + chai.assert.equal(partialsArray.length, 1, 'getPartials test failed !') + }) + it('abeExtend.plugins.instance.getRoutes()', function() { var routes = abeExtend.plugins.instance.getRoutes() chai.expect(routes[0].get).to.have.length(1); }); - /** - * abeExtend.hooks.instance.trigger - * - */ it('abeExtend.hooks.instance.trigger', function() { var res = abeExtend.hooks.instance.trigger('afterEditorInput') chai.assert.equal(res, 'test', 'Hook test failed !') }); + + it('abeExtend.plugins.instance.add', function(done) { + var dir = './node_modules/' + this.sinon = sinon.sandbox.create(); + var fakeChild = this.fakeChild = { + 'stdout': new events.EventEmitter(), + 'stderr': new events.EventEmitter() + }; + + this.sinon.stub(child_process, 'spawn', function(){ + return fakeChild; + }); + + abeExtend.plugins.instance.add(dir, this.fixture.testPlugin) + .then(function() { + chai.expect(child_process.spawn).to.have.been.calledWith(npm, ["install", "--save", this.fixture.testPlugin], { cwd: "./node_modules/" }) + done() + this.sinon.restore(); + }.bind(this)) + }); + + it('abeExtend.plugins.instance.remove', function(done) { + var dir = './node_modules/' + this.sinon = sinon.sandbox.create(); + var fakeChild = this.fakeChild = { + 'stdout': new events.EventEmitter(), + 'stderr': new events.EventEmitter() + }; + + this.sinon.stub(child_process, 'spawn', function(){ + return fakeChild; + }); + this.sinon.stub(abeExtend.plugins.instance, 'removePlugin') + + abeExtend.plugins.instance.remove(dir, this.fixture.testNewPlugin) + .then(function() { + chai.expect(child_process.spawn).to.have.been.calledWith(npm, ["uninstall", "--save", this.fixture.testNewPlugin], { cwd: "./node_modules/" }) + done() + abeExtend.plugins.instance.removePlugin.restore() + this.sinon.restore(); + }.bind(this)) + }); + + it('abeExtend.plugins.instance.removePlugin(plugin)', function() { + abeExtend.plugins.instance.removePlugin(this.fixture.testNewPlugin) + chai.assert.equal(config.getLocalConfig().plugins.length, 1, 'updatePlugin test failed !') + }); + + it('abeExtend.plugins.instance.updatePlugin NoVersionNewPlugin', function() { + abeExtend.plugins.instance.updatePlugin(this.fixture.testNewPlugin) + chai.assert.equal(config.plugins[1], this.fixture.testNewPlugin, 'updatePlugin test failed !') + }); + + it('abeExtend.plugins.instance.updatePlugin VersionExistingPlugin', function() { + abeExtend.plugins.instance.updatePlugin("test@1.0.0") + chai.assert.equal(config.plugins[0], 'test@1.0.0', 'updatePlugin test failed !') + }); + + it('abeExtend.plugins.instance.install(dir, plugin)', function(done){ + var dir = './node_modules/' + this.sinon = sinon.sandbox.create(); + var stub = sinon.stub(abeExtend.plugins.instance, 'add') + stub.returns(Promise.resolve(0)); + + abeExtend.plugins.instance.install(dir, this.fixture.testPlugin) + sinon.assert.calledOnce(abeExtend.plugins.instance.add) + abeExtend.plugins.instance.add.restore() + done() + }); + + it('abeExtend.plugins.instance.install(dir)', function(done){ + var dir = './node_modules/' + this.sinon = sinon.sandbox.create(); + var stub = sinon.stub(abeExtend.plugins.instance, 'add') + stub.returns(Promise.resolve(0)); + + abeExtend.plugins.instance.install(dir) + sinon.assert.calledTwice(abeExtend.plugins.instance.add) + abeExtend.plugins.instance.add.restore() + + done() + }); + + it('abeExtend.plugins.instance.uninstall(dir, plugin)', function(done){ + var dir = './node_modules/' + this.sinon = sinon.sandbox.create(); + var stub = sinon.stub(abeExtend.plugins.instance, 'remove') + stub.returns(Promise.resolve(0)); + + abeExtend.plugins.instance.uninstall(dir, this.fixture.testNewPlugin) + sinon.assert.calledOnce(abeExtend.plugins.instance.remove) + abeExtend.plugins.instance.remove.restore() + done() + }); }); diff --git a/test/process.js b/test/process.js index 6c828f29..b6b4cb99 100644 --- a/test/process.js +++ b/test/process.js @@ -17,20 +17,11 @@ describe('Process', function() { }.bind(this)) }); - /** - * abeExtend.plugins.instance.getProcess - * - */ it('abeExtend.plugins.instance.getProcess()', function() { var file = abeExtend.plugins.instance.getProcess('test') chai.expect(file).to.not.be.null; }); - - /** - * abeExtend.process - * - */ it('abeExtend.process', function() { var res = abeExtend.process('test', []) // chai.assert.equal(res, 'test', 'Hook test failed !') diff --git a/test/request.js b/test/request.js index ec836111..1f5f3463 100644 --- a/test/request.js +++ b/test/request.js @@ -16,9 +16,9 @@ describe('Request', function() { Manager.instance.updateList() this.fixture = { - tag: fse.readFileSync(__dirname + '/fixtures/templates/article.html', 'utf8'), - jsonArticle: fse.readJsonSync(__dirname + '/fixtures/data/article-1.json'), - jsonHomepage: fse.readJsonSync(__dirname + '/fixtures/data/homepage-1.json') + tag: fse.readFileSync(path.join(__dirname, 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(__dirname, 'fixtures', 'data', 'article-1.json')), + jsonHomepage: fse.readJsonSync(path.join(__dirname, 'fixtures', 'data', 'homepage-1.json')) } done() @@ -42,101 +42,204 @@ describe('Request', function() { } }); + /** + * cmsData.sql.keepOnlyPublishedPost + * + */ + it('cmsData.sql.keepOnlyPublishedPost()', function() { + var res = cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()) + chai.expect(res).to.have.length(2); + }); + /** * cmsData.sql.executeFromClause * */ it('cmsData.sql.executeFromClause()', function() { - var res = cmsData.sql.executeFromClause(['/'], ['/']) + var res = cmsData.sql.executeFromClause(cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), ['/'], ['/']) chai.expect(res).to.have.length(2); }); it('cmsData.sql.executeWhereClause() =', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template`=`article`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, {} + ) chai.expect(res, '`abe_meta.template`=`article`').to.have.length(1); chai.assert.equal(res[0].title, 'article', 'expected select to find article but found ' + res[0].title); request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template`=`{{abe_meta.template}}`', this.fixture.jsonHomepage) - res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, this.fixture.jsonHomepage) + res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + this.fixture.jsonHomepage + ) chai.expect(res, '`abe_meta.template`=`{{abe_meta.template}}`').to.have.length(1); chai.assert.equal(res[0].title, 'homepage', 'expected select to find homepage but found ' + res[0].title); request = cmsData.sql.handleSqlRequest('select title from ./ where `{{abe_meta.template}}`=`{{abe_meta.template}}`', this.fixture.jsonHomepage) - res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, this.fixture.jsonHomepage) + res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + this.fixture.jsonHomepage + ) chai.expect(res, '`{{abe_meta.template}}`=`{{abe_meta.template}}`').to.have.length(1); chai.assert.equal(res[0].title, 'homepage', 'expected select to find homepage but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() !=', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template`!=`homepage`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, {} + ) chai.expect(res, '`abe_meta.template`!=`homepage`').to.have.length(1); chai.assert.equal(res[0].title, 'article', 'expected select to find article but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() >', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `priority`>`1`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`priority`>`1`').to.have.length(1); chai.assert.equal(res[0].title, 'article', 'expected select to find article but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() >=', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `priority`>=`1`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`priority`>=`1`').to.have.length(2); }); it('cmsData.sql.executeWhereClause() <', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `priority`<`1`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`priority`<`1`').to.have.length(0); }); it('cmsData.sql.executeWhereClause() <=', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `priority`<=`1`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, ' `priority`<=`1`').to.have.length(1); chai.assert.equal(res[0].title, 'homepage', 'expected select to find homepage but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() LIKE', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template` LIKE `home`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`abe_meta.template` LIKE `home`').to.have.length(1); chai.assert.equal(res[0].title, 'homepage', 'expected select to find homepage but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() NOT LIKE', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template` NOT LIKE `home`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`abe_meta.template` NOT LIKE `home`').to.have.length(1); chai.assert.equal(res[0].title, 'article', 'expected select to find article but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() AND', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template`=`homepage` AND title=`homepage`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`abe_meta.template`=`homepage` AND title=`homepage`').to.have.length(1); chai.assert.equal(res[0].title, 'homepage', 'expected select to find homepage but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() OR', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template`=`homepage` OR `abe_meta.template`=`article`', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`abe_meta.template`=`homepage` OR `abe_meta.template`=`article`').to.have.length(2); }); it('cmsData.sql.executeWhereClause() IN', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template` IN (`homepage`,`test`)', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`abe_meta.template` IN (`homepage`,`test`)').to.have.length(1); chai.assert.equal(res[0].title, 'homepage', 'expected select to find homepage but found ' + res[0].title); request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template` IN (`{{articles}}`)', this.fixture.jsonHomepage) - res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, this.fixture.jsonHomepage) + res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + this.fixture.jsonHomepage + ) chai.expect(res, '`abe_meta.template` IN (`{{articles}}`').to.have.length(1); chai.assert.equal(res[0].title, 'article', 'expected select to find article but found ' + res[0].title); }); it('cmsData.sql.executeWhereClause() NOT IN', function() { var request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template` NOT IN (`homepage`,`test`)', {}) - var res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, {}) + var res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + {} + ) chai.expect(res, '`abe_meta.template` NOT IN (`homepage`,`test`)').to.have.length(1); chai.assert.equal(res[0].title, 'article', 'expected select to find article but found ' + res[0].title); request = cmsData.sql.handleSqlRequest('select title from ./ where `abe_meta.template` NOT IN (`{{articles}}`)', this.fixture.jsonHomepage) - res = cmsData.sql.executeWhereClause(Manager.instance.getList(), request.where, request.limit, request.columns, this.fixture.jsonHomepage) + res = cmsData.sql.executeWhereClause( + cmsData.sql.keepOnlyPublishedPost(Manager.instance.getList()), + request.where, + request.limit, + request.columns, + this.fixture.jsonHomepage + ) chai.expect(res, '`abe_meta.template` NOT IN (`{{articles}}`)').to.have.length(1); chai.assert.equal(res[0].title, 'homepage', 'expected select to find homepage but found ' + res[0].title); }); diff --git a/test/revision.js b/test/revision.js index 10aac9e5..bc7fa7be 100644 --- a/test/revision.js +++ b/test/revision.js @@ -7,6 +7,7 @@ config.set({root: path.join(__dirname,'fixtures')}) var cmsData = require('../src/cli').cmsData var Manager = require('../src/cli').Manager; var fse = require('fs-extra'); +require('events').EventEmitter.defaultMaxListeners = Infinity; describe('Revision', function() { before( function(done) { @@ -14,9 +15,9 @@ describe('Revision', function() { .then(function () { this.fixture = { - tag: fse.readFileSync(__dirname + '/fixtures/templates/article.html', 'utf8'), - jsonArticle: fse.readJsonSync(__dirname + '/fixtures/data/article-1.json'), - jsonHomepage: fse.readJsonSync(__dirname + '/fixtures/data/homepage-1.json') + tag: fse.readFileSync(path.join(__dirname, 'fixtures', 'templates', 'article.html'), 'utf8'), + jsonArticle: fse.readJsonSync(path.join(__dirname, 'fixtures', 'data', 'article-1.json')), + jsonHomepage: fse.readJsonSync(path.join(__dirname, 'fixtures', 'data', 'homepage-1.json')) } done() diff --git a/test/templates.js b/test/templates.js index a7b685b5..e69de29b 100644 --- a/test/templates.js +++ b/test/templates.js @@ -1,109 +0,0 @@ -var chai = require('chai'); -var path = require('path'); - -var config = require('../src/cli').config -config.set({root: path.join(__dirname,'fixtures')}) - -var cmsTemplates = require('../src/cli').cmsTemplates; -var Manager = require('../src/cli').Manager; -var fse = require('fs-extra'); - -describe('Template', function() { - before( function(done) { - Manager.instance.init() - .then(function () { - this.fixture = { - template: fse.readFileSync(__dirname + '/fixtures/templates/article.html', 'utf-8'), - articleEach: fse.readFileSync(__dirname + '/fixtures/templates/article-each-abe.html', 'utf-8'), - articlePrecontrib: fse.readFileSync(__dirname + '/fixtures/templates/article-precontribution.html', 'utf-8'), - templateKeys: fse.readFileSync(__dirname + '/fixtures/templates/article-keys.html', 'utf-8') - } - done() - - }.bind(this)) - }); - - /** - * getAbeImport - * - */ - it('cmsTemplates.template.getStructureAndTemplates()', function() { - var res = cmsTemplates.template.getStructureAndTemplates() - chai.expect(res.templates.length).to.be.above(1); - }); - - /** - * getAbeImport - * - */ - it('cmsTemplates.template.getAbeImport()', function() { - var res = cmsTemplates.template.getAbeImport(this.fixture.template) - chai.expect(res).to.have.length(4); - }); - - /** - * includePartials - * - */ - it('cmsTemplates.template.includePartials()', function() { - var template = cmsTemplates.template.includePartials(this.fixture.template) - chai.expect(template).to.contain("{{abe type='text' key='title' desc='titre' tab='default'}}"); - }); - - /** - * cmsTemplates.template.getTemplate - * - */ - it('cmsTemplates.template.getTemplate()', function() { - var template = cmsTemplates.template.getTemplate('article') - chai.expect(template).to.contain("{{abe type='text' key='title' desc='titre' tab='default' order='1'}}"); - }); - - /** - * cmsTemplates.template.getAbeRequestWhereKeysFromTemplates - * - */ - it('cmsTemplates.template.getAbeRequestWhereKeysFromTemplates()', function() { - cmsTemplates.template.getAbeRequestWhereKeysFromTemplates([{template: this.fixture.template}]) - .then((whereKeys) => { - chai.expect(whereKeys.length).to.equal(2); - }) - }); - - /** - * cmsTemplates.template.getAbePrecontributionAttributesFromTemplates - * - */ - it('cmsTemplates.template.getAbePrecontributionAttributesFromTemplates()', function() { - var precontrib = cmsTemplates.template.getAbePrecontributionAttributesFromTemplates([{template: this.fixture.articlePrecontrib}]) - chai.expect(precontrib.fields.length).to.equal(1); - }); - - /** - * getTemplate - * - */ - it('cmsTemplates.template.execRequestColumns()', function() { // templateKeys - const pathTemplate = path.join(config.root, config.templates.url) - var ar = cmsTemplates.template.execRequestColumns(this.fixture.templateKeys) - chai.expect(ar.indexOf('abe_meta.date')).to.be.above(-1); - }); - - /** - * cmsTemplates.insertDebugtoolUtilities - * - */ - it('cmsTemplates.insertDebugtoolUtilities()', function() { - var txt = cmsTemplates.insertDebugtoolUtilities(''); - chai.expect(txt.length).to.above(10); - }); - - /** - * cmsTemplates.encodeAbeTagAsComment - * - */ - it('cmsTemplates.encodeAbeTagAsComment()', function() { - var txt = cmsTemplates.encodeAbeTagAsComment(this.fixture.articleEach); - chai.expect(txt.indexOf('{')).to.equal(-1); - }); -}); diff --git a/test/url.js b/test/url.js index 274cf135..40e79d8d 100644 --- a/test/url.js +++ b/test/url.js @@ -8,7 +8,7 @@ config.set({root: path.join(__dirname,'fixtures')}) describe('Url', function() { - var urls = fse.readJsonSync(__dirname + '/fixtures/string/urls.json', 'utf8') + var urls = fse.readJsonSync(path.join(__dirname, 'fixtures', 'string', 'urls.json'), 'utf8') /** * getAbeImport diff --git a/test/users/manager.js b/test/users/manager.js new file mode 100644 index 00000000..7d637365 --- /dev/null +++ b/test/users/manager.js @@ -0,0 +1,86 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var fs = require('fs-extra'); +var path = require('path'); + +var coreUtils = require('../../src/cli').coreUtils +var config = require('../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var User = require('../../src/cli').User; + +describe('User.manager', function() { + before( function() { + config.users.enable = true + this.fixture = { + htmlIsAuthorized: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorized.html'), 'utf8'), + htmlIsAuthorizedTrue: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorizedTrue.html'), 'utf8'), + users: JSON.parse(fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'users', 'users.json'), 'utf8')) + } + }); + + it('User.manager.instance.get', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubRead = sinonInstance.stub(User.manager.instance, 'read'); + stubRead.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + var res = User.manager.instance.get() + chai.expect(res.length).to.be.above(0) + + // unstub + User.manager.instance.read.restore() + }) + + it('User.manager.instance.save', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubFs = sinonInstance.stub(fs, 'writeJsonSync'); + stubFs.returns(null) + + // test + var res = User.manager.instance.save() + + // unstub + sinon.assert.calledOnce(fs.writeJsonSync) + fs.writeJsonSync.restore() + }) + + it('User.manager.instance.read', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubFs = sinonInstance.stub(fs, 'readFileSync'); + stubFs.returns(JSON.stringify(this.fixture.users)) + var stubExist = sinonInstance.stub(coreUtils.file, 'exist'); + stubExist.returns(true) + + // test + var res = User.manager.instance.read() + chai.expect(res).to.not.be.null + + // unstub + sinon.assert.calledOnce(fs.readFileSync) + fs.readFileSync.restore() + sinon.assert.calledOnce(coreUtils.file.exist) + coreUtils.file.exist.restore() + }) + + it('User.manager.instance.update', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubSave = sinonInstance.stub(User.manager.instance, 'save'); + stubSave.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + var res = User.manager.instance.update() + chai.expect(res).to.be.equal(true) + + // unstub + sinon.assert.calledOnce(User.manager.instance.save) + User.manager.instance.save.restore() + }) +}); \ No newline at end of file diff --git a/test/users/operations.js b/test/users/operations.js new file mode 100644 index 00000000..9e3ca033 --- /dev/null +++ b/test/users/operations.js @@ -0,0 +1,184 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var fs = require('fs-extra'); +var mkdirp = require('mkdirp'); +var path = require('path'); +var bcrypt = require('bcrypt-nodejs'); +var Cookies = require('cookies'); +var jwt = require('jwt-simple'); +var Handlebars =require('../../src/cli').Handlebars + +var coreUtils = require('../../src/cli').coreUtils +var config = require('../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var User = require('../../src/cli').User; + +describe('User.operations', function() { + before( function() { + config.users.enable = true + this.fixture = { + htmlIsAuthorized: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorized.html'), 'utf8'), + htmlIsAuthorizedTrue: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorizedTrue.html'), 'utf8'), + users: JSON.parse(fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'users', 'users.json'), 'utf8')) + } + }); + + it('User.operations.deactivate', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stub = sinonInstance.stub(User.manager.instance, 'get'); + stub.returns(JSON.parse(JSON.stringify(this.fixture.users))) + var stubSave = sinonInstance.stub(User.manager.instance, 'save'); + stubSave.returns(null) + + // test + var bdd = User.operations.deactivate(1) + chai.expect(bdd[0].actif).to.equal(0) + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + sinon.assert.calledOnce(User.manager.instance.save) + User.manager.instance.save.restore() + }) + + it('User.operations.activate', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stub = sinonInstance.stub(User.manager.instance, 'get'); + stub.returns(JSON.parse(JSON.stringify(this.fixture.users))) + var stubSave = sinonInstance.stub(User.manager.instance, 'save'); + stubSave.returns(null) + + // test + var bdd = User.operations.activate(1) + chai.expect(bdd[0].actif).to.equal(1) + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + sinon.assert.calledOnce(User.manager.instance.save) + User.manager.instance.save.restore() + }) + + it('User.operations.remove', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stub = sinonInstance.stub(User.manager.instance, 'get'); + stub.returns(JSON.parse(JSON.stringify(this.fixture.users))) + var stubSave = sinonInstance.stub(User.manager.instance, 'save'); + stubSave.returns(null) + + // test + var bdd = User.operations.remove(1) + chai.expect(bdd.length).to.equal(0) + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + sinon.assert.calledOnce(User.manager.instance.save) + User.manager.instance.save.restore() + }) + + it('User.operations.update', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubTextXss = sinonInstance.stub(coreUtils.text, 'checkXss'); + stubTextXss.returns({ success:1 }); + var stubCheckSameEmail = sinonInstance.stub(User.utils, 'checkSameEmail'); + stubCheckSameEmail.returns({ success:1 }); + var stubGetRole = sinonInstance.stub(User.utils, 'getRole'); + stubGetRole.returns(JSON.parse(JSON.stringify(this.fixture.users))[0].role); + var stubGet = sinonInstance.stub(User.manager.instance, 'get'); + stubGet.returns(JSON.parse(JSON.stringify(this.fixture.users))) + var stubSave = sinonInstance.stub(User.manager.instance, 'save'); + stubSave.returns(null) + + // test + var bdd = User.operations.update({id: 2}) + chai.expect(bdd.user.id).to.be.equal(2) + + // unstub + sinon.assert.calledOnce(coreUtils.text.checkXss) + coreUtils.text.checkXss.restore() + sinon.assert.calledOnce(User.utils.checkSameEmail) + User.utils.checkSameEmail.restore() + sinon.assert.calledOnce(User.utils.getRole) + User.utils.getRole.restore() + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + sinon.assert.calledOnce(User.manager.instance.save) + User.manager.instance.save.restore() + }) + + it('User.operations.updatePassword', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubCommonPassword = sinonInstance.stub(User.utils, 'commonPassword'); + stubCommonPassword.returns({ success:1 }); + var stubEncryptPassword = sinonInstance.stub(User.utils, 'encryptPassword'); + stubEncryptPassword.returns("newPassword2"); + var stubGet = sinonInstance.stub(User.manager.instance, 'get'); + stubGet.returns(JSON.parse(JSON.stringify(this.fixture.users))) + var stubSave = sinonInstance.stub(User.manager.instance, 'save'); + stubSave.returns(null) + + // test + var oldPassword = JSON.parse(JSON.stringify(this.fixture.users)).password + var bdd = User.operations.updatePassword(JSON.parse(JSON.stringify(this.fixture.users))[0], "newPassword") + chai.expect(bdd.user.password).to.not.be.equal(oldPassword) + + // unstub + sinon.assert.calledOnce(User.utils.commonPassword) + User.utils.commonPassword.restore() + sinon.assert.calledOnce(User.utils.encryptPassword) + User.utils.encryptPassword.restore() + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + sinon.assert.calledOnce(User.manager.instance.save) + User.manager.instance.save.restore() + }) + + it('User.operations.add', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubTextXss = sinonInstance.stub(coreUtils.text, 'checkXss'); + stubTextXss.returns({ success:1 }); + var stubCheckSameEmail = sinonInstance.stub(User.utils, 'checkSameEmail'); + stubCheckSameEmail.returns({ success:1 }); + var stubCommonPassword = sinonInstance.stub(User.utils, 'commonPassword'); + stubCommonPassword.returns({ success:1 }); + var stubEncryptPassword = sinonInstance.stub(User.utils, 'encryptPassword'); + stubEncryptPassword.returns("newPassword2"); + var stubGetRole = sinonInstance.stub(User.utils, 'getRole'); + stubGetRole.returns(JSON.parse(JSON.stringify(this.fixture.users))[0].role); + var stubGet = sinonInstance.stub(User.manager.instance, 'get'); + stubGet.returns(JSON.parse(JSON.stringify(this.fixture.users))) + var stubSave = sinonInstance.stub(User.manager.instance, 'save'); + stubSave.returns(null) + + // test + var res = User.operations.add(JSON.parse(JSON.stringify(this.fixture.users))[0]) + chai.expect(res.success).to.be.equal(1) + + // unstub + sinon.assert.calledOnce(coreUtils.text.checkXss) + coreUtils.text.checkXss.restore() + sinon.assert.calledOnce(User.utils.checkSameEmail) + User.utils.checkSameEmail.restore() + sinon.assert.calledOnce(User.utils.commonPassword) + User.utils.commonPassword.restore() + sinon.assert.calledOnce(User.utils.encryptPassword) + User.utils.encryptPassword.restore() + sinon.assert.calledOnce(User.utils.getRole) + User.utils.getRole.restore() + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + sinon.assert.calledOnce(User.manager.instance.save) + User.manager.instance.save.restore() + }) +}); \ No newline at end of file diff --git a/test/users/utils.js b/test/users/utils.js new file mode 100644 index 00000000..5c447986 --- /dev/null +++ b/test/users/utils.js @@ -0,0 +1,274 @@ +var chai = require('chai'); +var sinonChai = require('sinon-chai') +var expect = chai.expect +chai.use(sinonChai) +var sinon = require('sinon'); +var fs = require('fs-extra'); +var mkdirp = require('mkdirp'); +var path = require('path'); +var bcrypt = require('bcrypt-nodejs'); +var Cookies = require('cookies'); +var jwt = require('jwt-simple'); +var Handlebars =require('../../src/cli').Handlebars + +var coreUtils = require('../../src/cli').coreUtils +var config = require('../../src/cli').config +config.set({root: path.join(process.cwd(), 'test', 'fixtures')}) + +var User = require('../../src/cli').User; + +describe('User.utils', function() { + before( function() { + config.users.enable = true + this.fixture = { + htmlIsAuthorized: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorized.html'), 'utf8'), + htmlIsAuthorizedTrue: fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'templates', 'isAuthorizedTrue.html'), 'utf8'), + users: JSON.parse(fs.readFileSync(path.join(process.cwd(), 'test', 'fixtures', 'users', 'users.json'), 'utf8')) + } + }); + + it('User.utils.getUserRoutes', function(){ + var sinonInstance = sinon.sandbox.create(); + var role = User.utils.getUserRoutes("review") + chai.expect(role).to.not.be.undefined + chai.expect(role.length).to.above(0) + }) + + it('User.utils.findByUsername', function(done){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stub = sinonInstance.stub(User.manager.instance, 'get'); + stub.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + User.utils.findByUsername("test", function (err, user) { + chai.expect(err).to.be.null + chai.expect(user).to.not.be.undefined + chai.expect(user.username).to.equal('test') + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + done() + }) + }) + + it('User.utils.findByEmail', function(done){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stub = sinonInstance.stub(User.manager.instance, 'get'); + stub.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + User.utils.findByEmail("admin@test.com", function (err, user) { + chai.expect(err).to.be.null + chai.expect(user).to.not.be.undefined + chai.expect(user.username).to.equal('test') + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + done() + }) + }) + + it('User.utils.findByResetPasswordToken', function(done){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stub = sinonInstance.stub(User.manager.instance, 'get'); + stub.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + User.utils.findByResetPasswordToken("token", function (err, user) { + chai.expect(err).to.be.null + chai.expect(user).to.not.be.undefined + chai.expect(user.username).to.equal('test') + + //unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + done() + }) + }) + + it('User.utils.decodeUser', function(){ + // sub + var sinonInstance = sinon.sandbox.create(); + var stubGetTokenFromCookies = sinonInstance.stub(User.utils, 'getTokenFromCookies'); + stubGetTokenFromCookies.returns("test") + var stubJwt = sinonInstance.stub(jwt, 'decode'); + stubJwt.returns(JSON.parse(JSON.stringify(this.fixture.users))[0]) + + var user = User.utils.decodeUser(1) + chai.expect(user.id).to.not.be.null + + sinon.assert.calledOnce(User.utils.getTokenFromCookies) + User.utils.getTokenFromCookies.restore() + sinon.assert.calledOnce(jwt.decode) + jwt.decode.restore() + }) + + it('User.utils.getAll', function(){ + var sinonInstance = sinon.sandbox.create(); + var stubGet = sinonInstance.stub(User.manager.instance, 'get'); + stubGet.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + var bdd = User.utils.getAll() + chai.expect(bdd).to.not.be.undefined + chai.expect(bdd[0].username).to.equal('test') + + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + }) + + it('User.utils.isValid', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubHashSync = sinonInstance.stub(bcrypt, 'compareSync'); + stubHashSync.returns(true); + + // test + var res = User.utils.isValid(JSON.parse(JSON.stringify(this.fixture.users))[0]) + chai.expect(res).to.be.equal(true) + + // unstub + sinon.assert.calledOnce(bcrypt.compareSync) + bcrypt.compareSync.restore() + }) + + it('User.utils.findSync', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGet = sinonInstance.stub(User.manager.instance, 'get'); + stubGet.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + var user = User.utils.findSync(1) + chai.expect(user).to.not.be.undefined + chai.expect(user.username).to.equal('test') + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + }) + + it('User.utils.find', function(done){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGet = sinonInstance.stub(User.manager.instance, 'get'); + stubGet.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + var user = User.utils.find(1, function (err, user) { + chai.expect(user).to.not.be.undefined + chai.expect(user.username).to.equal('test') + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + done() + }) + }) + + it('User.utils.checkSameEmail', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGet = sinonInstance.stub(User.manager.instance, 'get'); + stubGet.returns(JSON.parse(JSON.stringify(this.fixture.users))) + + // test + var user = JSON.parse(JSON.stringify(this.fixture.users))[0] + user.id = 2 + var res = User.utils.checkSameEmail(user) + chai.expect(res.success).to.equal(0) + + // unstub + sinon.assert.calledOnce(User.manager.instance.get) + User.manager.instance.get.restore() + }) + + it('User.utils.getRole', function(){ + // stub + + // test + var user = JSON.parse(JSON.stringify(this.fixture.users))[0] + user.role = "admin" + var res = User.utils.getRole(JSON.parse(JSON.stringify(this.fixture.users))[0]) + chai.expect(res.role).to.not.be.equal("admin") + + // unstub + }) + + it('User.utils.commonPassword', function(){ + // stub + + // test + var user = JSON.parse(JSON.stringify(this.fixture.users))[0] + user.password = "password" + var res = User.utils.commonPassword(user) + chai.expect(res.success).to.be.equal(0) + + // unstub + }) + + it('User.utils.encryptPassword', function(){ + // stub + var sinonInstance = sinon.sandbox.create(); + var stubGenSaltSync = sinonInstance.stub(bcrypt, 'genSaltSync'); + stubGenSaltSync.returns(10) + var stubHashSync = sinonInstance.stub(bcrypt, 'hashSync'); + stubHashSync.returns("test2") + + // test + var user = JSON.parse(JSON.stringify(this.fixture.users))[0] + user.password = "password" + var res = User.utils.encryptPassword(10, "test") + chai.expect(res).to.not.be.equal("test") + + // unstub + sinon.assert.calledOnce(bcrypt.genSaltSync) + bcrypt.genSaltSync.restore() + sinon.assert.calledOnce(bcrypt.hashSync) + bcrypt.hashSync.restore() + }) + + it('User.utils.isUserAllowedOnRoute', function(){ + // stub + + // test + var user = JSON.parse(JSON.stringify(this.fixture.users))[0] + var res = User.utils.isUserAllowedOnRoute("admin", "/abe/test") + chai.expect(res).to.be.equal(true) + + var res = User.utils.isUserAllowedOnRoute("review", "/abe/truc") + chai.expect(res).to.be.equal(false) + + // unstub + }) + + it('User.utils.getUserWorkflow', function(){ + // stub + + // test + config.users.enable = false + var res = User.utils.getUserWorkflow() + chai.expect(res.length).to.be.equal(2) + + config.users.enable = true + var res = User.utils.getUserWorkflow("draft", "admin") + chai.expect(res.length).to.be.equal(2) + // unstub + }) + + it('User.utils.loginLimitTry', function(done){ + // stub + + // test + var res = User.utils.loginLimitTry() + .then(function () { + done() + }) + + // unstub + }) +}); \ No newline at end of file diff --git a/tests/demo/data/articles/article-1-abe-d20161105T165746211Z.json b/tests/demo/data/articles/article-1-abe-d20161105T165746211Z.json new file mode 100644 index 00000000..da9c7fd3 --- /dev/null +++ b/tests/demo/data/articles/article-1-abe-d20161105T165746211Z.json @@ -0,0 +1,22 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-1.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T16:57:46.211Z", + "latest": { + "date": "2016-11-05T16:57:46.211Z", + "abeUrl": "/articles/article-1-abe-d20161105T165746211Z.html" + }, + "status": "draft", + "draft": { + "date": "2016-11-05T16:57:46.211Z", + "abeUrl": "/articles/article-1-abe-d20161105T165746211Z.html", + "latest": { + "date": "2016-11-05T16:57:46.211Z", + "abeUrl": "/articles/article-1-abe-d20161105T165746211Z.html" + } + } + } +} diff --git a/tests/demo/data/articles/article-1-abe-d20161105T165911285Z.json b/tests/demo/data/articles/article-1-abe-d20161105T165911285Z.json new file mode 100644 index 00000000..13c9a6d0 --- /dev/null +++ b/tests/demo/data/articles/article-1-abe-d20161105T165911285Z.json @@ -0,0 +1,34 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-1.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T16:57:46.211Z", + "latest": { + "date": "2016-11-05T16:59:11.285Z", + "abeUrl": "/articles/article-1-abe-d20161105T165911285Z.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T16:57:46.211Z", + "abeUrl": "/articles/article-1-abe-d20161105T165746211Z.html", + "latest": { + "date": "2016-11-05T16:59:11.285Z", + "abeUrl": "/articles/article-1-abe-d20161105T165911285Z.html" + } + }, + "cleanName": "article-1", + "cleanFilename": "/articles" + }, + "article_main_image": "/image/header_australian_winter-aaaa_321x427-af09.jpg", + "article_title": "This is a title", + "article_date": "March 20 2016", + "article_highlight": "You can also provide a highlight", + "category_json": [ + { + "category": "Innovation" + } + ], + "article_content": "This is the content " +} diff --git a/tests/demo/data/articles/article-1.json b/tests/demo/data/articles/article-1.json new file mode 100644 index 00000000..8501a03c --- /dev/null +++ b/tests/demo/data/articles/article-1.json @@ -0,0 +1,42 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-1.html", + "complete": "100", + "type": "publish", + "date": "2016-11-05T16:57:46.211Z", + "latest": { + "date": "2016-11-05T16:59:11.412Z", + "abeUrl": "/articles/article-1.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T16:57:46.211Z", + "abeUrl": "/articles/article-1-abe-d20161105T165746211Z.html", + "latest": { + "date": "2016-11-05T16:59:11.285Z", + "abeUrl": "/articles/article-1-abe-d20161105T165911285Z.html" + } + }, + "cleanName": "article-1", + "cleanFilename": "/articles", + "publish": { + "date": "2016-11-05T16:59:11.412Z", + "abeUrl": "/articles/article-1.html", + "latest": { + "date": "2016-11-05T16:59:11.412Z", + "abeUrl": "/articles/article-1.html" + } + } + }, + "article_main_image": "/image/header_australian_winter-aaaa_321x427-af09.jpg", + "article_title": "This is a title", + "article_date": "March 20 2016", + "article_highlight": "You can also provide a highlight", + "category_json": [ + { + "category": "Innovation" + } + ], + "article_content": "This is the content " +} diff --git a/tests/demo/data/articles/article-2-abe-d20161105T165944784Z.json b/tests/demo/data/articles/article-2-abe-d20161105T165944784Z.json new file mode 100644 index 00000000..31a323c1 --- /dev/null +++ b/tests/demo/data/articles/article-2-abe-d20161105T165944784Z.json @@ -0,0 +1,22 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-2.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T16:59:44.784Z", + "latest": { + "date": "2016-11-05T16:59:44.784Z", + "abeUrl": "/articles/article-2-abe-d20161105T165944784Z.html" + }, + "status": "draft", + "draft": { + "date": "2016-11-05T16:59:44.784Z", + "abeUrl": "/articles/article-2-abe-d20161105T165944784Z.html", + "latest": { + "date": "2016-11-05T16:59:44.784Z", + "abeUrl": "/articles/article-2-abe-d20161105T165944784Z.html" + } + } + } +} diff --git a/tests/demo/data/articles/article-2-abe-d20161105T170317693Z.json b/tests/demo/data/articles/article-2-abe-d20161105T170317693Z.json new file mode 100644 index 00000000..300ac6c0 --- /dev/null +++ b/tests/demo/data/articles/article-2-abe-d20161105T170317693Z.json @@ -0,0 +1,34 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-2.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T16:59:44.784Z", + "latest": { + "date": "2016-11-05T17:03:17.693Z", + "abeUrl": "/articles/article-2-abe-d20161105T170317693Z.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T16:59:44.784Z", + "abeUrl": "/articles/article-2-abe-d20161105T165944784Z.html", + "latest": { + "date": "2016-11-05T17:03:17.693Z", + "abeUrl": "/articles/article-2-abe-d20161105T170317693Z.html" + } + }, + "cleanName": "article-2", + "cleanFilename": "/articles" + }, + "article_main_image": "/image/5237956755_14ba1d3880_b-8d68.jpg", + "article_title": "This is a second title", + "article_date": "4 April 2016", + "article_highlight": "This is another highlight", + "category_json": [ + { + "category": "Abe" + } + ], + "article_content": "This is another article.
    Enjoy this photograph from Moyan Brenn
    " +} diff --git a/tests/demo/data/articles/article-2.json b/tests/demo/data/articles/article-2.json new file mode 100644 index 00000000..b64fe0c5 --- /dev/null +++ b/tests/demo/data/articles/article-2.json @@ -0,0 +1,42 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-2.html", + "complete": "100", + "type": "publish", + "date": "2016-11-05T16:59:44.784Z", + "latest": { + "date": "2016-11-05T17:03:17.725Z", + "abeUrl": "/articles/article-2.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T16:59:44.784Z", + "abeUrl": "/articles/article-2-abe-d20161105T165944784Z.html", + "latest": { + "date": "2016-11-05T17:03:17.693Z", + "abeUrl": "/articles/article-2-abe-d20161105T170317693Z.html" + } + }, + "cleanName": "article-2", + "cleanFilename": "/articles", + "publish": { + "date": "2016-11-05T17:03:17.725Z", + "abeUrl": "/articles/article-2.html", + "latest": { + "date": "2016-11-05T17:03:17.725Z", + "abeUrl": "/articles/article-2.html" + } + } + }, + "article_main_image": "/image/5237956755_14ba1d3880_b-8d68.jpg", + "article_title": "This is a second title", + "article_date": "4 April 2016", + "article_highlight": "This is another highlight", + "category_json": [ + { + "category": "Abe" + } + ], + "article_content": "This is another article.
    Enjoy this photograph from Moyan Brenn
    " +} diff --git a/tests/demo/data/articles/article-3-abe-d20161105T170538370Z.json b/tests/demo/data/articles/article-3-abe-d20161105T170538370Z.json new file mode 100644 index 00000000..45a81d3b --- /dev/null +++ b/tests/demo/data/articles/article-3-abe-d20161105T170538370Z.json @@ -0,0 +1,22 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-3.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T17:05:38.370Z", + "latest": { + "date": "2016-11-05T17:05:38.370Z", + "abeUrl": "/articles/article-3-abe-d20161105T170538370Z.html" + }, + "status": "draft", + "draft": { + "date": "2016-11-05T17:05:38.370Z", + "abeUrl": "/articles/article-3-abe-d20161105T170538370Z.html", + "latest": { + "date": "2016-11-05T17:05:38.370Z", + "abeUrl": "/articles/article-3-abe-d20161105T170538370Z.html" + } + } + } +} diff --git a/tests/demo/data/articles/article-3-abe-d20161105T170633627Z.json b/tests/demo/data/articles/article-3-abe-d20161105T170633627Z.json new file mode 100644 index 00000000..bf38f736 --- /dev/null +++ b/tests/demo/data/articles/article-3-abe-d20161105T170633627Z.json @@ -0,0 +1,34 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-3.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T17:05:38.370Z", + "latest": { + "date": "2016-11-05T17:06:33.627Z", + "abeUrl": "/articles/article-3-abe-d20161105T170633627Z.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T17:05:38.370Z", + "abeUrl": "/articles/article-3-abe-d20161105T170538370Z.html", + "latest": { + "date": "2016-11-05T17:06:33.627Z", + "abeUrl": "/articles/article-3-abe-d20161105T170633627Z.html" + } + }, + "cleanName": "article-3", + "cleanFilename": "/articles" + }, + "article_main_image": "/image/5238561864_86a3ccb678_b-7c9e.jpg", + "article_title": "Article 3", + "article_date": "20 March 2016", + "article_highlight": "another highlight", + "category_json": [ + { + "category": "Photography" + } + ], + "article_content": "This is the content of article 3" +} diff --git a/tests/demo/data/articles/article-3.json b/tests/demo/data/articles/article-3.json new file mode 100644 index 00000000..d02d4f72 --- /dev/null +++ b/tests/demo/data/articles/article-3.json @@ -0,0 +1,42 @@ +{ + "abe_meta": { + "template": "single", + "link": "/articles/article-3.html", + "complete": "100", + "type": "publish", + "date": "2016-11-05T17:05:38.370Z", + "latest": { + "date": "2016-11-05T17:06:33.645Z", + "abeUrl": "/articles/article-3.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T17:05:38.370Z", + "abeUrl": "/articles/article-3-abe-d20161105T170538370Z.html", + "latest": { + "date": "2016-11-05T17:06:33.627Z", + "abeUrl": "/articles/article-3-abe-d20161105T170633627Z.html" + } + }, + "cleanName": "article-3", + "cleanFilename": "/articles", + "publish": { + "date": "2016-11-05T17:06:33.645Z", + "abeUrl": "/articles/article-3.html", + "latest": { + "date": "2016-11-05T17:06:33.645Z", + "abeUrl": "/articles/article-3.html" + } + } + }, + "article_main_image": "/image/5238561864_86a3ccb678_b-7c9e.jpg", + "article_title": "Article 3", + "article_date": "20 March 2016", + "article_highlight": "another highlight", + "category_json": [ + { + "category": "Photography" + } + ], + "article_content": "This is the content of article 3" +} diff --git a/tests/demo/data/index-abe-d20161105T163209098Z.json b/tests/demo/data/index-abe-d20161105T163209098Z.json new file mode 100644 index 00000000..3703e7b6 --- /dev/null +++ b/tests/demo/data/index-abe-d20161105T163209098Z.json @@ -0,0 +1,22 @@ +{ + "abe_meta": { + "template": "index", + "link": "/index.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T16:32:09.098Z", + "latest": { + "date": "2016-11-05T16:32:09.098Z", + "abeUrl": "/index-abe-d20161105T163209098Z.html" + }, + "status": "draft", + "draft": { + "date": "2016-11-05T16:32:09.098Z", + "abeUrl": "/index-abe-d20161105T163209098Z.html", + "latest": { + "date": "2016-11-05T16:32:09.098Z", + "abeUrl": "/index-abe-d20161105T163209098Z.html" + } + } + } +} diff --git a/tests/demo/data/index.json b/tests/demo/data/index.json new file mode 100644 index 00000000..4faf63d5 --- /dev/null +++ b/tests/demo/data/index.json @@ -0,0 +1,159 @@ +{ + "abe_meta": { + "template": "index", + "link": "/index.html", + "complete": "100", + "type": "draft", + "date": "2016-11-05T16:32:09.098Z", + "latest": { + "date": "2016-11-22T11:34:20.666Z", + "abeUrl": "/index.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T16:32:09.098Z", + "abeUrl": "/index-abe-d20161105T163209098Z.html", + "latest": { + "date": "2016-11-05T16:32:09.098Z", + "abeUrl": "/index-abe-d20161105T163209098Z.html" + } + }, + "cleanName": "index", + "cleanFilename": "", + "publish": { + "latest": { + "date": "2016-11-22T11:34:20.666Z", + "abeUrl": "/index.html" + }, + "date": "2016-11-22T11:34:20.666Z", + "abeUrl": "/index.html" + } + }, + "articles": [ + { + "article_title": "Article 3", + "article_main_image": "/image/5238561864_86a3ccb678_b-7c9e.jpg", + "article_date": "20 March 2016", + "category_json": [ + { + "category": "Photography" + } + ], + "abe_meta": { + "template": "single", + "link": "/articles/article-3.html", + "complete": "100", + "type": "publish", + "date": "2016-11-05T17:05:38.370Z", + "latest": { + "date": "2016-11-05T17:06:33.645Z", + "abeUrl": "/articles/article-3.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T17:05:38.370Z", + "abeUrl": "/articles/article-3-abe-d20161105T170538370Z.html", + "latest": { + "date": "2016-11-05T17:06:33.627Z", + "abeUrl": "/articles/article-3-abe-d20161105T170633627Z.html" + } + }, + "cleanName": "article-3", + "cleanFilename": "/articles", + "publish": { + "date": "2016-11-05T17:06:33.645Z", + "abeUrl": "/articles/article-3.html", + "latest": { + "date": "2016-11-05T17:06:33.645Z", + "abeUrl": "/articles/article-3.html" + } + } + } + }, + { + "article_title": "This is a second title", + "article_main_image": "/image/5237956755_14ba1d3880_b-8d68.jpg", + "article_date": "4 April 2016", + "category_json": [ + { + "category": "Abe" + } + ], + "abe_meta": { + "template": "single", + "link": "/articles/article-2.html", + "complete": "100", + "type": "publish", + "date": "2016-11-05T16:59:44.784Z", + "latest": { + "date": "2016-11-05T17:03:17.725Z", + "abeUrl": "/articles/article-2.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T16:59:44.784Z", + "abeUrl": "/articles/article-2-abe-d20161105T165944784Z.html", + "latest": { + "date": "2016-11-05T17:03:17.693Z", + "abeUrl": "/articles/article-2-abe-d20161105T170317693Z.html" + } + }, + "cleanName": "article-2", + "cleanFilename": "/articles", + "publish": { + "date": "2016-11-05T17:03:17.725Z", + "abeUrl": "/articles/article-2.html", + "latest": { + "date": "2016-11-05T17:03:17.725Z", + "abeUrl": "/articles/article-2.html" + } + } + } + }, + { + "article_title": "This is a title", + "article_main_image": "/image/header_australian_winter-aaaa_321x427-af09.jpg", + "article_date": "March 20 2016", + "category_json": [ + { + "category": "Innovation" + } + ], + "abe_meta": { + "template": "single", + "link": "/articles/article-1.html", + "complete": "100", + "type": "publish", + "date": "2016-11-05T16:57:46.211Z", + "latest": { + "date": "2016-11-05T16:59:11.412Z", + "abeUrl": "/articles/article-1.html" + }, + "status": "publish", + "draft": { + "date": "2016-11-05T16:57:46.211Z", + "abeUrl": "/articles/article-1-abe-d20161105T165746211Z.html", + "latest": { + "date": "2016-11-05T16:59:11.285Z", + "abeUrl": "/articles/article-1-abe-d20161105T165911285Z.html" + } + }, + "cleanName": "article-1", + "cleanFilename": "/articles", + "publish": { + "date": "2016-11-05T16:59:11.412Z", + "abeUrl": "/articles/article-1.html", + "latest": { + "date": "2016-11-05T16:59:11.412Z", + "abeUrl": "/articles/article-1.html" + } + } + } + } + ], + "name": "", + "oldFilePath": "/index.html", + "selectTemplate": [ + "index" + ] +} diff --git a/tests/demo/reference/category.json b/tests/demo/reference/category.json new file mode 100644 index 00000000..474c19a3 --- /dev/null +++ b/tests/demo/reference/category.json @@ -0,0 +1,20 @@ +[ + { + "category": "Industrialization" + }, + { + "category": "Abe" + }, + { + "category": "Photography" + }, + { + "category": "Innovation" + }, + { + "category": "Coding" + }, + { + "category": "My bookmarks" + } +] \ No newline at end of file diff --git a/tests/demo/site/articles/article-1.html b/tests/demo/site/articles/article-1.html new file mode 100644 index 00000000..3e7d664f --- /dev/null +++ b/tests/demo/site/articles/article-1.html @@ -0,0 +1,178 @@ + + + + + + + + + + Industrialize.it — Gregory Besson's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Close +
    +
    + Abejs CMS +
    +

    About Abejs

    +

    ABEJS

    +

    The lightning fast CMS

    +
      +
    • +
    • +
    • +
    +
    +
    + + +
    + +
    + +
    + +
    + +
      +
    • +
    • +
    • +
    +
    +

    Abe demo

    +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + Image +
    + +

    This is a title

    + March 20 2016 + +
    +
    +
    +

    This is the content 

    +
    +
    +
    +

    Highlight

    +

    You can also provide a highlight

    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    © 2016. abejs. All Rights Reserverd.
    + This blog is powered by ABE, the lightning fast open source CMS
    + Template designed by FREEHTML5.co

    +
    + + + + + + + + + + + + + + + + + + + diff --git a/tests/demo/site/articles/article-2.html b/tests/demo/site/articles/article-2.html new file mode 100644 index 00000000..6f2831a3 --- /dev/null +++ b/tests/demo/site/articles/article-2.html @@ -0,0 +1,178 @@ + + + + + + + + + + Industrialize.it — Gregory Besson's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Close +
    +
    + Abejs CMS +
    +

    About Abejs

    +

    ABEJS

    +

    The lightning fast CMS

    +
      +
    • +
    • +
    • +
    +
    +
    + + +
    + +
    + +
    + +
    + +
      +
    • +
    • +
    • +
    +
    +

    Abe demo

    +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + Image +
    + +

    This is a second title

    + 4 April 2016 + +
    +
    +
    +

    This is another article.

    Enjoy this photograph from Moyan Brenn

    +
    +
    +
    +

    Highlight

    +

    This is another highlight

    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    © 2016. abejs. All Rights Reserverd.
    + This blog is powered by ABE, the lightning fast open source CMS
    + Template designed by FREEHTML5.co

    +
    + + + + + + + + + + + + + + + + + + + diff --git a/tests/demo/site/articles/article-3.html b/tests/demo/site/articles/article-3.html new file mode 100644 index 00000000..4da1ea6c --- /dev/null +++ b/tests/demo/site/articles/article-3.html @@ -0,0 +1,178 @@ + + + + + + + + + + Industrialize.it — Gregory Besson's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Close +
    +
    + Abejs CMS +
    +

    About Abejs

    +

    ABEJS

    +

    The lightning fast CMS

    +
      +
    • +
    • +
    • +
    +
    +
    + + +
    + +
    + +
    + +
    + +
      +
    • +
    • +
    • +
    +
    +

    Abe demo

    +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + Image +
    + +

    Article 3

    + 20 March 2016 + +
    +
    +
    +

    This is the content of article 3

    +
    +
    +
    +

    Highlight

    +

    another highlight

    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    © 2016. abejs. All Rights Reserverd.
    + This blog is powered by ABE, the lightning fast open source CMS
    + Template designed by FREEHTML5.co

    +
    + + + + + + + + + + + + + + + + + + + diff --git a/tests/demo/site/assets/css/font-awesome.min.css b/tests/demo/site/assets/css/font-awesome.min.css new file mode 100644 index 00000000..9b27f8ea --- /dev/null +++ b/tests/demo/site/assets/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/tests/demo/site/assets/css/ie8.css b/tests/demo/site/assets/css/ie8.css new file mode 100644 index 00000000..1d895ac8 --- /dev/null +++ b/tests/demo/site/assets/css/ie8.css @@ -0,0 +1,36 @@ +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +/* List */ + + ul.icons li a { + -ms-behavior: url("assets/js/PIE.htc"); + } + + ul.icons li a:before { + text-align: center; + font-size: 26px; + } + +/* Main */ + + #main { + -ms-behavior: url("assets/js/PIE.htc"); + } + + #main .avatar img { + -ms-behavior: url("assets/js/PIE.htc"); + } + +/* Footer */ + + #footer { + color: #fff; + } + + #footer .copyright li { + border-left: solid 1px #fff; + } \ No newline at end of file diff --git a/tests/demo/site/assets/css/ie9.css b/tests/demo/site/assets/css/ie9.css new file mode 100644 index 00000000..8b1a1fd0 --- /dev/null +++ b/tests/demo/site/assets/css/ie9.css @@ -0,0 +1,41 @@ +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +/* Basic */ + + body { + background-image: url("../../images/bg.jpg"); + background-repeat: no-repeat; + background-size: cover; + background-position: bottom center; + background-attachment: fixed; + } + + body:after { + display: none; + } + +/* List */ + + ul.icons li a:before { + color: #c8cccf; + } + + ul.icons li a:hover:before { + color: #ff7496; + } + +/* Wrapper */ + + #wrapper { + text-align: center; + } + +/* Main */ + + #main { + display: inline-block; + } \ No newline at end of file diff --git a/tests/demo/site/assets/css/images/overlay.png b/tests/demo/site/assets/css/images/overlay.png new file mode 100644 index 00000000..0f8cdc88 Binary files /dev/null and b/tests/demo/site/assets/css/images/overlay.png differ diff --git a/tests/demo/site/assets/css/main.css b/tests/demo/site/assets/css/main.css new file mode 100644 index 00000000..74e20ea5 --- /dev/null +++ b/tests/demo/site/assets/css/main.css @@ -0,0 +1,856 @@ +@charset "UTF-8"; +@import url(font-awesome.min.css); +@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300"); + +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +/* Reset */ + + html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; + } + + body { + line-height: 1; + } + + ol, ul { + list-style: none; + } + + blockquote, q { + quotes: none; + } + + blockquote:before, blockquote:after, q:before, q:after { + content: ''; + content: none; + } + + table { + border-collapse: collapse; + border-spacing: 0; + } + + body { + -webkit-text-size-adjust: none; + } + +/* Box Model */ + + *, *:before, *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + } + +/* Basic */ + + @media screen and (max-width: 480px) { + + html, body { + min-width: 320px; + } + + } + + body.is-loading *, body.is-loading *:before, body.is-loading *:after { + -moz-animation: none !important; + -webkit-animation: none !important; + -ms-animation: none !important; + animation: none !important; + -moz-transition: none !important; + -webkit-transition: none !important; + -ms-transition: none !important; + transition: none !important; + } + + html { + height: 100%; + } + + body { + height: 100%; + background-color: #ffffff; + background-image: url("images/overlay.png"), -moz-linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)), url("../../images/bg.jpg"); + background-image: url("images/overlay.png"), -webkit-linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)), url("../../images/bg.jpg"); + background-image: url("images/overlay.png"), -ms-linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)), url("../../images/bg.jpg"); + background-image: url("images/overlay.png"), linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)), url("../../images/bg.jpg"); + background-repeat: repeat, no-repeat, no-repeat; + background-size: 100px 100px, cover, cover; + background-position: top left, center center, bottom center; + background-attachment: fixed, fixed, fixed; + } + + body:after { + content: ''; + display: block; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: inherit; + opacity: 0; + z-index: 1; + background-color: #ffffff; + background-image: url("images/overlay.png"), -moz-linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)); + background-image: url("images/overlay.png"), -webkit-linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)); + background-image: url("images/overlay.png"), -ms-linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)); + background-image: url("images/overlay.png"), linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35)); + background-repeat: repeat, no-repeat; + background-size: 100px 100px, cover; + background-position: top left, center center; + -moz-transition: opacity 1.75s ease-out; + -webkit-transition: opacity 1.75s ease-out; + -ms-transition: opacity 1.75s ease-out; + transition: opacity 1.75s ease-out; + } + + body.is-loading:after { + opacity: 1; + } + +/* Type */ + + body, input, select, textarea { + color: #414f57; + font-family: "Source Sans Pro", Helvetica, sans-serif; + font-size: 14pt; + font-weight: 300; + line-height: 2; + letter-spacing: 0.2em; + text-transform: uppercase; + } + + @media screen and (max-width: 1680px) { + + body, input, select, textarea { + font-size: 11pt; + } + + } + + @media screen and (max-width: 480px) { + + body, input, select, textarea { + font-size: 10pt; + line-height: 1.75; + } + + } + + a { + -moz-transition: color 0.2s ease, border-color 0.2s ease; + -webkit-transition: color 0.2s ease, border-color 0.2s ease; + -ms-transition: color 0.2s ease, border-color 0.2s ease; + transition: color 0.2s ease, border-color 0.2s ease; + color: inherit; + text-decoration: none; + } + + a:before { + -moz-transition: color 0.2s ease, text-shadow 0.2s ease; + -webkit-transition: color 0.2s ease, text-shadow 0.2s ease; + -ms-transition: color 0.2s ease, text-shadow 0.2s ease; + transition: color 0.2s ease, text-shadow 0.2s ease; + } + + a:hover { + color: #ff7496; + } + + strong, b { + color: #313f47; + } + + em, i { + font-style: italic; + } + + p { + margin: 0 0 1.5em 0; + } + + h1, h2, h3, h4, h5, h6 { + color: #313f47; + line-height: 1.5; + margin: 0 0 0.75em 0; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + } + + h1 { + font-size: 1.85em; + letter-spacing: 0.22em; + margin: 0 0 0.525em 0; + } + + h2 { + font-size: 1.25em; + } + + h3 { + font-size: 1em; + } + + h4 { + font-size: 1em; + } + + h5 { + font-size: 1em; + } + + h6 { + font-size: 1em; + } + + @media screen and (max-width: 480px) { + + h1 { + font-size: 1.65em; + } + + } + + sub { + font-size: 0.8em; + position: relative; + top: 0.5em; + } + + sup { + font-size: 0.8em; + position: relative; + top: -0.5em; + } + + hr { + border: 0; + border-bottom: solid 1px #c8cccf; + margin: 3em 0; + } + +/* Form */ + + form { + margin: 0 0 1.5em 0; + } + + form > .field { + margin: 0 0 1.5em 0; + } + + form > .field > :last-child { + margin-bottom: 0; + } + + label { + color: #313f47; + display: block; + font-size: 0.9em; + margin: 0 0 0.75em 0; + } + + input[type="text"], + input[type="password"], + input[type="email"], + input[type="tel"], + select, + textarea { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + border-radius: 4px; + border: solid 1px #c8cccf; + color: inherit; + display: block; + outline: 0; + padding: 0 1em; + text-decoration: none; + width: 100%; + } + + input[type="text"]:invalid, + input[type="password"]:invalid, + input[type="email"]:invalid, + input[type="tel"]:invalid, + select:invalid, + textarea:invalid { + box-shadow: none; + } + + input[type="text"]:focus, + input[type="password"]:focus, + input[type="email"]:focus, + input[type="tel"]:focus, + select:focus, + textarea:focus { + border-color: #ff7496; + } + + .select-wrapper { + text-decoration: none; + display: block; + position: relative; + } + + .select-wrapper:before { + content: ""; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + text-transform: none !important; + } + + .select-wrapper:before { + color: #c8cccf; + display: block; + height: 2.75em; + line-height: 2.75em; + pointer-events: none; + position: absolute; + right: 0; + text-align: center; + top: 0; + width: 2.75em; + } + + .select-wrapper select::-ms-expand { + display: none; + } + + input[type="text"], + input[type="password"], + input[type="email"], + select { + height: 2.75em; + } + + textarea { + padding: 0.75em 1em; + } + + input[type="checkbox"], + input[type="radio"] { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + display: block; + float: left; + margin-right: -2em; + opacity: 0; + width: 1em; + z-index: -1; + } + + input[type="checkbox"] + label, + input[type="radio"] + label { + text-decoration: none; + color: #414f57; + cursor: pointer; + display: inline-block; + font-size: 1em; + font-weight: 300; + padding-left: 2.4em; + padding-right: 0.75em; + position: relative; + } + + input[type="checkbox"] + label:before, + input[type="radio"] + label:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + text-transform: none !important; + } + + input[type="checkbox"] + label:before, + input[type="radio"] + label:before { + border-radius: 4px; + border: solid 1px #c8cccf; + content: ''; + display: inline-block; + height: 1.65em; + left: 0; + line-height: 1.58125em; + position: absolute; + text-align: center; + top: 0.15em; + width: 1.65em; + } + + input[type="checkbox"]:checked + label:before, + input[type="radio"]:checked + label:before { + color: #ff7496; + content: '\f00c'; + } + + input[type="checkbox"]:focus + label:before, + input[type="radio"]:focus + label:before { + border-color: #ff7496; + } + + input[type="checkbox"] + label:before { + border-radius: 4px; + } + + input[type="radio"] + label:before { + border-radius: 100%; + } + + ::-webkit-input-placeholder { + color: #616f77 !important; + opacity: 1.0; + } + + :-moz-placeholder { + color: #616f77 !important; + opacity: 1.0; + } + + ::-moz-placeholder { + color: #616f77 !important; + opacity: 1.0; + } + + :-ms-input-placeholder { + color: #616f77 !important; + opacity: 1.0; + } + + .formerize-placeholder { + color: #616f77 !important; + opacity: 1.0; + } + +/* Icon */ + + .icon { + text-decoration: none; + position: relative; + border-bottom: none; + } + + .icon:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + text-transform: none !important; + } + + .icon > .label { + display: none; + } + +/* List */ + + ol { + list-style: decimal; + margin: 0 0 1.5em 0; + padding-left: 1.25em; + } + + ol li { + padding-left: 0.25em; + } + + ul { + list-style: disc; + margin: 0 0 1.5em 0; + padding-left: 1em; + } + + ul li { + padding-left: 0.5em; + } + + ul.alt { + list-style: none; + padding-left: 0; + } + + ul.alt li { + border-top: solid 1px #c8cccf; + padding: 0.5em 0; + } + + ul.alt li:first-child { + border-top: 0; + padding-top: 0; + } + + ul.icons { + cursor: default; + list-style: none; + padding-left: 0; + margin-top: -0.675em; + } + + ul.icons li { + display: inline-block; + padding: 0.675em 0.5em; + } + + ul.icons li a { + text-decoration: none; + position: relative; + display: block; + width: 3.75em; + height: 3.75em; + border-radius: 100%; + border: solid 1px #c8cccf; + line-height: 3.75em; + overflow: hidden; + text-align: center; + text-indent: 3.75em; + white-space: nowrap; + } + + ul.icons li a:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + text-transform: none !important; + } + + ul.icons li a:before { + color: #ffffff; + text-shadow: 1.25px 0px 0px #c8cccf, -1.25px 0px 0px #c8cccf, 0px 1.25px 0px #c8cccf, 0px -1.25px 0px #c8cccf; + } + + ul.icons li a:hover:before { + text-shadow: 1.25px 0px 0px #ff7496, -1.25px 0px 0px #ff7496, 0px 1.25px 0px #ff7496, 0px -1.25px 0px #ff7496; + } + + ul.icons li a:before { + position: absolute; + top: 0; + left: 0; + width: inherit; + height: inherit; + font-size: 1.85rem; + line-height: inherit; + text-align: center; + text-indent: 0; + } + + ul.icons li a:hover { + border-color: #ff7496; + } + + @media screen and (max-width: 480px) { + + ul.icons li a:before { + font-size: 1.5rem; + } + + } + + ul.actions { + cursor: default; + list-style: none; + padding-left: 0; + } + + ul.actions li { + display: inline-block; + padding: 0 0.75em 0 0; + vertical-align: middle; + } + + ul.actions li:last-child { + padding-right: 0; + } + + dl { + margin: 0 0 1.5em 0; + } + + dl dt { + display: block; + margin: 0 0 0.75em 0; + } + + dl dd { + margin-left: 1.5em; + } + +/* Button */ + + input[type="submit"], + input[type="reset"], + input[type="button"], + button, + .button { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + -moz-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.2s ease-in-out; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.2s ease-in-out; + -ms-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.2s ease-in-out; + display: inline-block; + height: 2.75em; + line-height: 2.75em; + padding: 0 1.5em; + background-color: transparent; + border-radius: 4px; + border: solid 1px #c8cccf; + color: #414f57 !important; + cursor: pointer; + text-align: center; + text-decoration: none; + white-space: nowrap; + } + + input[type="submit"]:hover, + input[type="reset"]:hover, + input[type="button"]:hover, + button:hover, + .button:hover { + border-color: #ff7496; + color: #ff7496 !important; + } + + input[type="submit"].icon, + input[type="reset"].icon, + input[type="button"].icon, + button.icon, + .button.icon { + padding-left: 1.35em; + } + + input[type="submit"].icon:before, + input[type="reset"].icon:before, + input[type="button"].icon:before, + button.icon:before, + .button.icon:before { + margin-right: 0.5em; + } + + input[type="submit"].fit, + input[type="reset"].fit, + input[type="button"].fit, + button.fit, + .button.fit { + display: block; + width: 100%; + margin: 0 0 0.75em 0; + } + + input[type="submit"].small, + input[type="reset"].small, + input[type="button"].small, + button.small, + .button.small { + font-size: 0.8em; + } + + input[type="submit"].big, + input[type="reset"].big, + input[type="button"].big, + button.big, + .button.big { + font-size: 1.35em; + } + + input[type="submit"].disabled, input[type="submit"]:disabled, + input[type="reset"].disabled, + input[type="reset"]:disabled, + input[type="button"].disabled, + input[type="button"]:disabled, + button.disabled, + button:disabled, + .button.disabled, + .button:disabled { + -moz-pointer-events: none; + -webkit-pointer-events: none; + -ms-pointer-events: none; + pointer-events: none; + opacity: 0.5; + } + +/* Main */ + + #main { + position: relative; + max-width: 100%; + min-width: 27em; + padding: 4.5em 3em 3em 3em ; + background: #ffffff; + border-radius: 4px; + cursor: default; + opacity: 0.95; + text-align: center; + -moz-transform-origin: 50% 50%; + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -moz-transform: rotateX(0deg); + -webkit-transform: rotateX(0deg); + -ms-transform: rotateX(0deg); + transform: rotateX(0deg); + -moz-transition: opacity 1s ease, -moz-transform 1s ease; + -webkit-transition: opacity 1s ease, -webkit-transform 1s ease; + -ms-transition: opacity 1s ease, -ms-transform 1s ease; + transition: opacity 1s ease, transform 1s ease; + } + + #main .avatar { + position: relative; + display: block; + margin-bottom: 1.5em; + } + + #main .avatar img { + display: block; + margin: 0 auto; + border-radius: 100%; + box-shadow: 0 0 0 1.5em #ffffff; + } + + #main .avatar:before { + content: ''; + display: block; + position: absolute; + top: 50%; + left: -3em; + width: calc(100% + 6em); + height: 1px; + z-index: -1; + background: #c8cccf; + } + + @media screen and (max-width: 480px) { + + #main { + min-width: 0; + width: 100%; + padding: 4em 2em 2.5em 2em ; + } + + #main .avatar:before { + left: -2em; + width: calc(100% + 4em); + } + + } + + body.is-loading #main { + opacity: 0; + -moz-transform: rotateX(15deg); + -webkit-transform: rotateX(15deg); + -ms-transform: rotateX(15deg); + transform: rotateX(15deg); + } + +/* Footer */ + + #footer { + -moz-align-self: -moz-flex-end; + -webkit-align-self: -webkit-flex-end; + -ms-align-self: -ms-flex-end; + align-self: flex-end; + width: 100%; + padding: 1.5em 0 0 0; + color: rgba(255, 255, 255, 0.75); + cursor: default; + text-align: center; + } + + #footer .copyright { + margin: 0; + padding: 0; + font-size: 0.9em; + list-style: none; + } + + #footer .copyright li { + display: inline-block; + margin: 0 0 0 0.45em; + padding: 0 0 0 0.85em; + border-left: solid 1px rgba(255, 255, 255, 0.5); + line-height: 1; + } + + #footer .copyright li:first-child { + border-left: 0; + } + +/* Wrapper */ + + #wrapper { + display: -moz-flex; + display: -webkit-flex; + display: -ms-flex; + display: flex; + -moz-align-items: center; + -webkit-align-items: center; + -ms-align-items: center; + align-items: center; + -moz-justify-content: space-between; + -webkit-justify-content: space-between; + -ms-justify-content: space-between; + justify-content: space-between; + -moz-flex-direction: column; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -moz-perspective: 1000px; + -webkit-perspective: 1000px; + -ms-perspective: 1000px; + perspective: 1000px; + position: relative; + min-height: 100%; + padding: 1.5em; + z-index: 2; + } + + #wrapper > * { + z-index: 1; + } + + #wrapper:before { + content: ''; + display: block; + } + + @media screen and (max-width: 360px) { + + #wrapper { + padding: 0.75em; + } + + } + + body.is-ie #wrapper { + height: 100%; + } \ No newline at end of file diff --git a/tests/demo/site/assets/css/noscript.css b/tests/demo/site/assets/css/noscript.css new file mode 100644 index 00000000..9002e730 --- /dev/null +++ b/tests/demo/site/assets/css/noscript.css @@ -0,0 +1,21 @@ +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +/* Basic */ + + body:after { + display: none; + } + +/* Main */ + + #main { + -moz-transform: none !important; + -webkit-transform: none !important; + -ms-transform: none !important; + transform: none !important; + opacity: 1 !important; + } \ No newline at end of file diff --git a/tests/demo/site/assets/fonts/FontAwesome.otf b/tests/demo/site/assets/fonts/FontAwesome.otf new file mode 100644 index 00000000..d4de13e8 Binary files /dev/null and b/tests/demo/site/assets/fonts/FontAwesome.otf differ diff --git a/tests/demo/site/assets/fonts/fontawesome-webfont.eot b/tests/demo/site/assets/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..c7b00d2b Binary files /dev/null and b/tests/demo/site/assets/fonts/fontawesome-webfont.eot differ diff --git a/tests/demo/site/assets/fonts/fontawesome-webfont.svg b/tests/demo/site/assets/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..8b66187f --- /dev/null +++ b/tests/demo/site/assets/fonts/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/demo/site/assets/fonts/fontawesome-webfont.ttf b/tests/demo/site/assets/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..f221e50a Binary files /dev/null and b/tests/demo/site/assets/fonts/fontawesome-webfont.ttf differ diff --git a/tests/demo/site/assets/fonts/fontawesome-webfont.woff b/tests/demo/site/assets/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..6e7483cf Binary files /dev/null and b/tests/demo/site/assets/fonts/fontawesome-webfont.woff differ diff --git a/tests/demo/site/assets/fonts/fontawesome-webfont.woff2 b/tests/demo/site/assets/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..7eb74fd1 Binary files /dev/null and b/tests/demo/site/assets/fonts/fontawesome-webfont.woff2 differ diff --git a/tests/demo/site/assets/js/PIE.htc b/tests/demo/site/assets/js/PIE.htc new file mode 100644 index 00000000..ca3b5470 --- /dev/null +++ b/tests/demo/site/assets/js/PIE.htc @@ -0,0 +1,96 @@ + + + + + + + + + diff --git a/tests/demo/site/assets/js/html5shiv.js b/tests/demo/site/assets/js/html5shiv.js new file mode 100644 index 00000000..dcf351c8 --- /dev/null +++ b/tests/demo/site/assets/js/html5shiv.js @@ -0,0 +1,8 @@ +/* + HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); +a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; +c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?: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,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| +"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); +for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d #mq-test-1 { width: 42px; }',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b=320px. + @include breakpoint(xsmall) { + html, body { + min-width: 320px; + } + } + + body { + + // Prevents animation/transition "flicker" on page load. + // Automatically added/removed by js/main.js. + &.is-loading { + *, *:before, *:after { + @include vendor('animation', 'none !important'); + @include vendor('transition', 'none !important'); + } + } + + } + + html { + height: 100%; + } + + body { + height: 100%; + background-color: _palette(bg); + @include vendor('background-image', ( + 'url("images/overlay.png")', + 'linear-gradient(60deg, #{transparentize(_palette(accent1), 0.5)} 5%, #{transparentize(_palette(accent2), 0.65)})', + 'url("../../images/bg.jpg")' + )); + background-repeat: repeat, no-repeat, no-repeat; + background-size: 100px 100px, cover, cover; + background-position: top left, center center, bottom center; + background-attachment: fixed, fixed, fixed; + + &:after { + content: ''; + display: block; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: inherit; + opacity: 0; + z-index: 1; + + background-color: _palette(bg); + @include vendor('background-image', ( + 'url("images/overlay.png")', + 'linear-gradient(60deg, #{transparentize(_palette(accent1), 0.5)} 5%, #{transparentize(_palette(accent2), 0.65)})' + )); + background-repeat: repeat, no-repeat; + background-size: 100px 100px, cover; + background-position: top left, center center; + + @include vendor('transition', 'opacity #{_duration(bg)} ease-out'); + } + + &.is-loading { + &:after { + opacity: 1; + } + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/base/_typography.scss b/tests/demo/site/assets/sass/base/_typography.scss new file mode 100644 index 00000000..a9061bc1 --- /dev/null +++ b/tests/demo/site/assets/sass/base/_typography.scss @@ -0,0 +1,123 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* Type */ + + body, input, select, textarea { + color: _palette(fg); + font-family: _font(family); + font-size: 14pt; + font-weight: _font(weight); + line-height: 2; + letter-spacing: _size(letter-spacing); + text-transform: uppercase; + + @include breakpoint(xlarge) { + font-size: 11pt; + } + + @include breakpoint(xsmall) { + font-size: 10pt; + line-height: 1.75; + } + } + + a { + @include vendor('transition', ( + 'color #{_duration(transition)} ease', + 'border-color #{_duration(transition)} ease' + )); + color: inherit; + text-decoration: none; + + &:before { + @include vendor('transition', ( + 'color #{_duration(transition)} ease', + 'text-shadow #{_duration(transition)} ease' + )); + } + + &:hover { + color: _palette(highlight); + } + } + + strong, b { + color: _palette(fg-bold); + } + + em, i { + font-style: italic; + } + + p { + margin: 0 0 _size(element-margin) 0; + } + + h1, h2, h3, h4, h5, h6 { + color: _palette(fg-bold); + line-height: 1.5; + margin: 0 0 (_size(element-margin) * 0.5) 0; + + a { + color: inherit; + text-decoration: none; + } + } + + h1 { + font-size: 1.85em; + letter-spacing: (_size(letter-spacing) * 1.1); + margin: 0 0 (_size(element-margin) * 0.35) 0; + } + + h2 { + font-size: 1.25em; + } + + h3 { + font-size: 1em; + } + + h4 { + font-size: 1em; + } + + h5 { + font-size: 1em; + } + + h6 { + font-size: 1em; + } + + @include breakpoint(xsmall) { + h1 { + font-size: 1.65em; + } + } + + sub { + font-size: 0.8em; + position: relative; + top: 0.5em; + } + + sup { + font-size: 0.8em; + position: relative; + top: -0.5em; + } + + hr { + border: 0; + border-bottom: solid _size(border-width) _palette(border); + margin: (_size(element-margin) * 2) 0; + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/components/_button.scss b/tests/demo/site/assets/sass/components/_button.scss new file mode 100644 index 00000000..aee0a553 --- /dev/null +++ b/tests/demo/site/assets/sass/components/_button.scss @@ -0,0 +1,69 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* Button */ + + input[type="submit"], + input[type="reset"], + input[type="button"], + button, + .button { + @include vendor('appearance', 'none'); + @include vendor('transition', ( + 'background-color #{_duration(transition)} ease-in-out', + 'border-color #{_duration(transition)} ease-in-out', + 'color #{_duration(transition)} ease-in-out' + )); + display: inline-block; + height: _size(element-height); + line-height: _size(element-height); + padding: 0 1.5em; + background-color: transparent; + border-radius: _size(border-radius); + border: solid 1px _palette(border); + color: _palette(fg) !important; + cursor: pointer; + text-align: center; + text-decoration: none; + white-space: nowrap; + + &:hover { + border-color: _palette(highlight); + color: _palette(highlight) !important; + } + + &.icon { + padding-left: 1.35em; + + &:before { + margin-right: 0.5em; + } + } + + &.fit { + display: block; + width: 100%; + margin: 0 0 (_size(element-margin) * 0.5) 0; + } + + &.small { + font-size: 0.8em; + } + + &.big { + font-size: 1.35em; + } + + &.disabled, + &:disabled { + @include vendor('pointer-events', 'none'); + opacity: 0.5; + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/components/_form.scss b/tests/demo/site/assets/sass/components/_form.scss new file mode 100644 index 00000000..0f29801a --- /dev/null +++ b/tests/demo/site/assets/sass/components/_form.scss @@ -0,0 +1,181 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* Form */ + + form { + margin: 0 0 _size(element-margin) 0; + + > .field { + margin: 0 0 _size(element-margin) 0; + + > :last-child { + margin-bottom: 0; + } + } + } + + label { + color: _palette(fg-bold); + display: block; + font-size: 0.9em; + margin: 0 0 (_size(element-margin) * 0.5) 0; + } + + input[type="text"], + input[type="password"], + input[type="email"], + input[type="tel"], + select, + textarea { + @include vendor('appearance', 'none'); + border-radius: _size(border-radius); + border: solid 1px _palette(border); + color: inherit; + display: block; + outline: 0; + padding: 0 1em; + text-decoration: none; + width: 100%; + + &:invalid { + box-shadow: none; + } + + &:focus { + border-color: _palette(highlight); + } + } + + .select-wrapper { + @include icon('\f078'); + display: block; + position: relative; + + &:before { + color: _palette(border); + display: block; + height: _size(element-height); + line-height: _size(element-height); + pointer-events: none; + position: absolute; + right: 0; + text-align: center; + top: 0; + width: _size(element-height); + } + + select::-ms-expand { + display: none; + } + } + + input[type="text"], + input[type="password"], + input[type="email"], + select { + height: _size(element-height); + } + + textarea { + padding: 0.75em 1em; + } + + input[type="checkbox"], + input[type="radio"], { + @include vendor('appearance', 'none'); + display: block; + float: left; + margin-right: -2em; + opacity: 0; + width: 1em; + z-index: -1; + + & + label { + @include icon; + color: _palette(fg); + cursor: pointer; + display: inline-block; + font-size: 1em; + font-weight: _font(weight); + padding-left: (_size(element-height) * 0.6) + 0.75em; + padding-right: 0.75em; + position: relative; + + &:before { + background: _palette(border-bg); + border-radius: _size(border-radius); + border: solid 1px _palette(border); + content: ''; + display: inline-block; + height: (_size(element-height) * 0.6); + left: 0; + line-height: (_size(element-height) * 0.575); + position: absolute; + text-align: center; + top: 0.15em; + width: (_size(element-height) * 0.6); + } + } + + &:checked + label { + &:before { + color: _palette(highlight); + content: '\f00c'; + } + } + + &:focus + label { + &:before { + border-color: _palette(highlight); + } + } + } + + input[type="checkbox"] { + & + label { + &:before { + border-radius: _size(border-radius); + } + } + } + + input[type="radio"] { + & + label { + &:before { + border-radius: 100%; + } + } + } + + ::-webkit-input-placeholder { + color: _palette(fg-light) !important; + opacity: 1.0; + } + + :-moz-placeholder { + color: _palette(fg-light) !important; + opacity: 1.0; + } + + ::-moz-placeholder { + color: _palette(fg-light) !important; + opacity: 1.0; + } + + :-ms-input-placeholder { + color: _palette(fg-light) !important; + opacity: 1.0; + } + + .formerize-placeholder { + color: _palette(fg-light) !important; + opacity: 1.0; + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/components/_icon.scss b/tests/demo/site/assets/sass/components/_icon.scss new file mode 100644 index 00000000..3186bc88 --- /dev/null +++ b/tests/demo/site/assets/sass/components/_icon.scss @@ -0,0 +1,21 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* Icon */ + + .icon { + @include icon; + position: relative; + border-bottom: none; + + > .label { + display: none; + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/components/_list.scss b/tests/demo/site/assets/sass/components/_list.scss new file mode 100644 index 00000000..63e2198d --- /dev/null +++ b/tests/demo/site/assets/sass/components/_list.scss @@ -0,0 +1,129 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* List */ + + ol { + list-style: decimal; + margin: 0 0 _size(element-margin) 0; + padding-left: 1.25em; + + li { + padding-left: 0.25em; + } + } + + ul { + list-style: disc; + margin: 0 0 _size(element-margin) 0; + padding-left: 1em; + + li { + padding-left: 0.5em; + } + + &.alt { + list-style: none; + padding-left: 0; + + li { + border-top: solid 1px _palette(border); + padding: 0.5em 0; + + &:first-child { + border-top: 0; + padding-top: 0; + } + } + } + + &.icons { + cursor: default; + list-style: none; + padding-left: 0; + margin-top: -0.675em; + + li { + display: inline-block; + padding: 0.675em 0.5em; + + a { + @include icon-alt(false, true); + position: relative; + display: block; + width: 3.75em; + height: 3.75em; + border-radius: 100%; + border: solid _size(border-width) _palette(border); + line-height: 3.75em; + overflow: hidden; + text-align: center; + text-indent: 3.75em; + white-space: nowrap; + + &:before { + position: absolute; + top: 0; + left: 0; + width: inherit; + height: inherit; + font-size: 1.85rem; + line-height: inherit; + text-align: center; + text-indent: 0; + } + + &:hover { + border-color: _palette(highlight); + } + } + } + + @include breakpoint(xsmall) { + li { + a { + &:before { + font-size: 1.5rem; + } + } + } + } + } + + &.actions { + cursor: default; + list-style: none; + padding-left: 0; + + li { + display: inline-block; + padding: 0 (_size(element-margin) * 0.5) 0 0; + vertical-align: middle; + + &:last-child { + padding-right: 0; + } + } + } + } + + dl { + margin: 0 0 _size(element-margin) 0; + + dt { + display: block; + font-weight: _font(weight-bold); + margin: 0 0 (_size(element-margin) * 0.5) 0; + } + + dd { + margin-left: _size(element-margin); + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/ie8.scss b/tests/demo/site/assets/sass/ie8.scss new file mode 100644 index 00000000..d02aca1d --- /dev/null +++ b/tests/demo/site/assets/sass/ie8.scss @@ -0,0 +1,51 @@ +@import 'libs/vars'; +@import 'libs/functions'; +@import 'libs/mixins'; +@import 'libs/skel'; + +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +/* List */ + + ul { + &.icons { + li { + a { + -ms-behavior: url('assets/js/PIE.htc'); + + &:before { + text-align: center; + font-size: 26px; + } + } + } + } + } + +/* Main */ + + #main { + -ms-behavior: url('assets/js/PIE.htc'); + + .avatar { + img { + -ms-behavior: url('assets/js/PIE.htc'); + } + } + } + +/* Footer */ + + #footer { + color: #fff; + + .copyright { + li { + border-left: solid 1px #fff; + } + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/ie9.scss b/tests/demo/site/assets/sass/ie9.scss new file mode 100644 index 00000000..990520fa --- /dev/null +++ b/tests/demo/site/assets/sass/ie9.scss @@ -0,0 +1,56 @@ +@import 'libs/vars'; +@import 'libs/functions'; +@import 'libs/mixins'; +@import 'libs/skel'; + +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +/* Basic */ + + body { + background-image: url('../../images/bg.jpg'); + background-repeat: no-repeat; + background-size: cover; + background-position: bottom center; + background-attachment: fixed; + + &:after { + display: none; + } + } + +/* List */ + + ul { + &.icons { + li { + a { + &:before { + color: _palette(border); + } + + &:hover { + &:before { + color: _palette(highlight); + } + } + } + } + } + } + +/* Wrapper */ + + #wrapper { + text-align: center; + } + +/* Main */ + + #main { + display: inline-block; + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/layout/_footer.scss b/tests/demo/site/assets/sass/layout/_footer.scss new file mode 100644 index 00000000..4f776662 --- /dev/null +++ b/tests/demo/site/assets/sass/layout/_footer.scss @@ -0,0 +1,39 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* Footer */ + + #footer { + @include vendor('align-self', 'flex-end'); + width: 100%; + padding: _size(element-margin) 0 0 0; + color: rgba(255,255,255,0.75); + cursor: default; + text-align: center; + + .copyright { + margin: 0; + padding: 0; + font-size: 0.9em; + list-style: none; + + li { + display: inline-block; + margin: 0 0 0 (0.85em - (_size(letter-spacing) * 2)); + padding: 0 0 0 0.85em; + border-left: solid _size(border-width) rgba(255,255,255,0.5); + line-height: 1; + + &:first-child { + border-left: 0; + } + } + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/layout/_main.scss b/tests/demo/site/assets/sass/layout/_main.scss new file mode 100644 index 00000000..523d6197 --- /dev/null +++ b/tests/demo/site/assets/sass/layout/_main.scss @@ -0,0 +1,74 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* Main */ + + #main { + position: relative; + max-width: 100%; + min-width: 27em; + @include padding(4.5em, 3em); + + background: _palette(bg); + border-radius: _size(border-radius); + cursor: default; + opacity: 0.95; + text-align: center; + + @include vendor('transform-origin', '50% 50%'); + @include vendor('transform', 'rotateX(0deg)'); + @include vendor('transition', ( + 'opacity #{_duration(main)} ease', + 'transform #{_duration(main)} ease' + )); + + .avatar { + position: relative; + display: block; + margin-bottom: _size(element-margin); + + img { + display: block; + margin: 0 auto; + border-radius: 100%; + box-shadow: 0 0 0 1.5em _palette(bg); + } + + &:before { + content: ''; + display: block; + position: absolute; + top: 50%; + left: -3em; + width: calc(100% + 6em); + height: _size(border-width); + z-index: -1; + background: _palette(border); + } + } + + @include breakpoint(xsmall) { + min-width: 0; + width: 100%; + @include padding(4em, 2em); + + .avatar { + &:before { + left: -2em; + width: calc(100% + 4em); + } + } + } + + body.is-loading & { + opacity: 0; + @include vendor('transform', 'rotateX(15deg)'); + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/layout/_wrapper.scss b/tests/demo/site/assets/sass/layout/_wrapper.scss new file mode 100644 index 00000000..5e5eb6ec --- /dev/null +++ b/tests/demo/site/assets/sass/layout/_wrapper.scss @@ -0,0 +1,40 @@ +@import '../libs/vars'; +@import '../libs/functions'; +@import '../libs/mixins'; + +/// +/// Identity by HTML5 UP +/// html5up.net | @ajlkn +/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +/// + +/* Wrapper */ + + #wrapper { + @include vendor('display', 'flex'); + @include vendor('align-items', 'center'); + @include vendor('justify-content', 'space-between'); + @include vendor('flex-direction', 'column'); + @include vendor('perspective', '1000px'); + position: relative; + min-height: 100%; + padding: _size(element-margin); + z-index: 2; + + > * { + z-index: 1; + } + + &:before { + content: ''; + display: block; + } + + @include breakpoint(xxsmall) { + padding: (_size(element-margin) * 0.5); + } + + body.is-ie & { + height: 100%; + } + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/libs/_functions.scss b/tests/demo/site/assets/sass/libs/_functions.scss new file mode 100644 index 00000000..0e08c1a6 --- /dev/null +++ b/tests/demo/site/assets/sass/libs/_functions.scss @@ -0,0 +1,34 @@ +/// Gets a duration value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _duration($keys...) { + @return val($duration, $keys...); +} + +/// Gets a font value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _font($keys...) { + @return val($font, $keys...); +} + +/// Gets a misc value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _misc($keys...) { + @return val($misc, $keys...); +} + +/// Gets a palette value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _palette($keys...) { + @return val($palette, $keys...); +} + +/// Gets a size value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _size($keys...) { + @return val($size, $keys...); +} \ No newline at end of file diff --git a/tests/demo/site/assets/sass/libs/_mixins.scss b/tests/demo/site/assets/sass/libs/_mixins.scss new file mode 100644 index 00000000..3325df0b --- /dev/null +++ b/tests/demo/site/assets/sass/libs/_mixins.scss @@ -0,0 +1,56 @@ +/// Makes an element's :before pseudoelement a FontAwesome icon. +/// @param {string} $content Optional content value to use. +/// @param {string} $where Optional pseudoelement to target (before or after). +@mixin icon($content: false, $where: before) { + + text-decoration: none; + + &:#{$where} { + + @if $content { + content: $content; + } + + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + text-transform: none !important; + + } + +} + +/// Applies padding to an element, taking the current element-margin value into account. +/// @param {mixed} $tb Top/bottom padding. +/// @param {mixed} $lr Left/right padding. +/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) +/// @param {bool} $important If true, adds !important. +@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { + + @if $important { + $important: '!important'; + } + + padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max(0.1em, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; + +} + +/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). +/// @param {string} $svg SVG data URL. +/// @return {string} Encoded SVG data URL. +@function svg-url($svg) { + + $svg: str-replace($svg, '"', '\''); + $svg: str-replace($svg, '<', '%3C'); + $svg: str-replace($svg, '>', '%3E'); + $svg: str-replace($svg, '&', '%26'); + $svg: str-replace($svg, '#', '%23'); + $svg: str-replace($svg, '{', '%7B'); + $svg: str-replace($svg, '}', '%7D'); + $svg: str-replace($svg, ';', '%3B'); + + @return url("data:image/svg+xml;charset=utf8,#{$svg}"); + +} \ No newline at end of file diff --git a/tests/demo/site/assets/sass/libs/_skel.scss b/tests/demo/site/assets/sass/libs/_skel.scss new file mode 100644 index 00000000..438b1479 --- /dev/null +++ b/tests/demo/site/assets/sass/libs/_skel.scss @@ -0,0 +1,585 @@ +// skel.scss v3.0.1 | (c) skel.io | MIT licensed */ + +// Vars. + + /// Breakpoints. + /// @var {list} + $breakpoints: () !global; + + /// Vendor prefixes. + /// @var {list} + $vendor-prefixes: ( + '-moz-', + '-webkit-', + '-ms-', + '' + ); + + /// Properties that should be vendorized. + /// @var {list} + $vendor-properties: ( + 'align-content', + 'align-items', + 'align-self', + 'animation', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-timing-function', + 'appearance', + 'backface-visibility', + 'box-sizing', + 'filter', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'justify-content', + 'order', + 'perspective', + 'pointer-events', + 'transform', + 'transform-origin', + 'transform-style', + 'transition', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'user-select' + ); + + /// Values that should be vendorized. + /// @var {list} + $vendor-values: ( + 'filter', + 'flex', + 'linear-gradient', + 'radial-gradient', + 'transform' + ); + +// Functions. + + /// Removes a specific item from a list. + /// @author Hugo Giraudel + /// @param {list} $list List. + /// @param {integer} $index Index. + /// @return {list} Updated list. + @function remove-nth($list, $index) { + + $result: null; + + @if type-of($index) != number { + @warn "$index: #{quote($index)} is not a number for `remove-nth`."; + } + @else if $index == 0 { + @warn "List index 0 must be a non-zero integer for `remove-nth`."; + } + @else if abs($index) > length($list) { + @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; + } + @else { + + $result: (); + $index: if($index < 0, length($list) + $index + 1, $index); + + @for $i from 1 through length($list) { + + @if $i != $index { + $result: append($result, nth($list, $i)); + } + + } + + } + + @return $result; + + } + + /// Replaces a substring within another string. + /// @author Hugo Giraudel + /// @param {string} $string String. + /// @param {string} $search Substring. + /// @param {string} $replace Replacement. + /// @return {string} Updated string. + @function str-replace($string, $search, $replace: '') { + + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); + } + + @return $string; + + } + + /// Replaces a substring within each string in a list. + /// @param {list} $strings List of strings. + /// @param {string} $search Substring. + /// @param {string} $replace Replacement. + /// @return {list} Updated list of strings. + @function str-replace-all($strings, $search, $replace: '') { + + @each $string in $strings { + $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); + } + + @return $strings; + + } + + /// Gets a value from a map. + /// @author Hugo Giraudel + /// @param {map} $map Map. + /// @param {string} $keys Key(s). + /// @return {string} Value. + @function val($map, $keys...) { + + @if nth($keys, 1) == null { + $keys: remove-nth($keys, 1); + } + + @each $key in $keys { + $map: map-get($map, $key); + } + + @return $map; + + } + +// Mixins. + + /// Sets the global box model. + /// @param {string} $model Model (default is content). + @mixin boxModel($model: 'content') { + + $x: $model + '-box'; + + *, *:before, *:after { + -moz-box-sizing: #{$x}; + -webkit-box-sizing: #{$x}; + box-sizing: #{$x}; + } + + } + + /// Wraps @content in a @media block using a given breakpoint. + /// @param {string} $breakpoint Breakpoint. + /// @param {map} $queries Additional queries. + @mixin breakpoint($breakpoint: null, $queries: null) { + + $query: 'screen'; + + // Breakpoint. + @if $breakpoint and map-has-key($breakpoints, $breakpoint) { + $query: $query + ' and ' + map-get($breakpoints, $breakpoint); + } + + // Queries. + @if $queries { + @each $k, $v in $queries { + $query: $query + ' and (' + $k + ':' + $v + ')'; + } + } + + @media #{$query} { + @content; + } + + } + + /// Wraps @content in a @media block targeting a specific orientation. + /// @param {string} $orientation Orientation. + @mixin orientation($orientation) { + @media screen and (orientation: #{$orientation}) { + @content; + } + } + + /// Utility mixin for containers. + /// @param {mixed} $width Width. + @mixin containers($width) { + + // Locked? + $lock: false; + + @if length($width) == 2 { + $width: nth($width, 1); + $lock: true; + } + + // Modifiers. + .container.\31 25\25 { width: 100%; max-width: $width * 1.25; min-width: $width; } + .container.\37 5\25 { width: $width * 0.75; } + .container.\35 0\25 { width: $width * 0.5; } + .container.\32 5\25 { width: $width * 0.25; } + + // Main class. + .container { + @if $lock { + width: $width !important; + } + @else { + width: $width; + } + } + + } + + /// Utility mixin for grid. + /// @param {list} $gutters Column and row gutters (default is 40px). + /// @param {string} $breakpointName Optional breakpoint name. + @mixin grid($gutters: 40px, $breakpointName: null) { + + // Gutters. + @include grid-gutters($gutters); + @include grid-gutters($gutters, \32 00\25, 2); + @include grid-gutters($gutters, \31 50\25, 1.5); + @include grid-gutters($gutters, \35 0\25, 0.5); + @include grid-gutters($gutters, \32 5\25, 0.25); + + // Cells. + $x: ''; + + @if $breakpointName { + $x: '\\28' + $breakpointName + '\\29'; + } + + .\31 2u#{$x}, .\31 2u\24#{$x} { width: 100%; clear: none; margin-left: 0; } + .\31 1u#{$x}, .\31 1u\24#{$x} { width: 91.6666666667%; clear: none; margin-left: 0; } + .\31 0u#{$x}, .\31 0u\24#{$x} { width: 83.3333333333%; clear: none; margin-left: 0; } + .\39 u#{$x}, .\39 u\24#{$x} { width: 75%; clear: none; margin-left: 0; } + .\38 u#{$x}, .\38 u\24#{$x} { width: 66.6666666667%; clear: none; margin-left: 0; } + .\37 u#{$x}, .\37 u\24#{$x} { width: 58.3333333333%; clear: none; margin-left: 0; } + .\36 u#{$x}, .\36 u\24#{$x} { width: 50%; clear: none; margin-left: 0; } + .\35 u#{$x}, .\35 u\24#{$x} { width: 41.6666666667%; clear: none; margin-left: 0; } + .\34 u#{$x}, .\34 u\24#{$x} { width: 33.3333333333%; clear: none; margin-left: 0; } + .\33 u#{$x}, .\33 u\24#{$x} { width: 25%; clear: none; margin-left: 0; } + .\32 u#{$x}, .\32 u\24#{$x} { width: 16.6666666667%; clear: none; margin-left: 0; } + .\31 u#{$x}, .\31 u\24#{$x} { width: 8.3333333333%; clear: none; margin-left: 0; } + + .\31 2u\24#{$x} + *, + .\31 1u\24#{$x} + *, + .\31 0u\24#{$x} + *, + .\39 u\24#{$x} + *, + .\38 u\24#{$x} + *, + .\37 u\24#{$x} + *, + .\36 u\24#{$x} + *, + .\35 u\24#{$x} + *, + .\34 u\24#{$x} + *, + .\33 u\24#{$x} + *, + .\32 u\24#{$x} + *, + .\31 u\24#{$x} + * { + clear: left; + } + + .\-11u#{$x} { margin-left: 91.6666666667% } + .\-10u#{$x} { margin-left: 83.3333333333% } + .\-9u#{$x} { margin-left: 75% } + .\-8u#{$x} { margin-left: 66.6666666667% } + .\-7u#{$x} { margin-left: 58.3333333333% } + .\-6u#{$x} { margin-left: 50% } + .\-5u#{$x} { margin-left: 41.6666666667% } + .\-4u#{$x} { margin-left: 33.3333333333% } + .\-3u#{$x} { margin-left: 25% } + .\-2u#{$x} { margin-left: 16.6666666667% } + .\-1u#{$x} { margin-left: 8.3333333333% } + + } + + /// Utility mixin for grid. + /// @param {list} $gutters Gutters. + /// @param {string} $class Optional class name. + /// @param {integer} $multiplier Multiplier (default is 1). + @mixin grid-gutters($gutters, $class: null, $multiplier: 1) { + + // Expand gutters if it's not a list. + @if length($gutters) == 1 { + $gutters: ($gutters, 0); + } + + // Get column and row gutter values. + $c: nth($gutters, 1); + $r: nth($gutters, 2); + + // Get class (if provided). + $x: ''; + + @if $class { + $x: '.' + $class; + } + + // Default. + .row#{$x} > * { padding: ($r * $multiplier) 0 0 ($c * $multiplier); } + .row#{$x} { margin: ($r * $multiplier * -1) 0 -1px ($c * $multiplier * -1); } + + // Uniform. + .row.uniform#{$x} > * { padding: ($c * $multiplier) 0 0 ($c * $multiplier); } + .row.uniform#{$x} { margin: ($c * $multiplier * -1) 0 -1px ($c * $multiplier * -1); } + + } + + /// Wraps @content in vendorized keyframe blocks. + /// @param {string} $name Name. + @mixin keyframes($name) { + + @-moz-keyframes #{$name} { @content; } + @-webkit-keyframes #{$name} { @content; } + @-ms-keyframes #{$name} { @content; } + @keyframes #{$name} { @content; } + + } + + /// + /// Sets breakpoints. + /// @param {map} $x Breakpoints. + /// + @mixin skel-breakpoints($x: ()) { + $breakpoints: $x !global; + } + + /// + /// Initializes layout module. + /// @param {map} config Config. + /// + @mixin skel-layout($config: ()) { + + // Config. + $configPerBreakpoint: (); + + $z: map-get($config, 'breakpoints'); + + @if $z { + $configPerBreakpoint: $z; + } + + // Reset. + $x: map-get($config, 'reset'); + + @if $x { + + /* Reset */ + + @include reset($x); + + } + + // Box model. + $x: map-get($config, 'boxModel'); + + @if $x { + + /* Box Model */ + + @include boxModel($x); + + } + + // Containers. + $containers: map-get($config, 'containers'); + + @if $containers { + + /* Containers */ + + .container { + margin-left: auto; + margin-right: auto; + } + + // Use default is $containers is just "true". + @if $containers == true { + $containers: 960px; + } + + // Apply base. + @include containers($containers); + + // Apply per-breakpoint. + @each $name in map-keys($breakpoints) { + + // Get/use breakpoint setting if it exists. + $x: map-get($configPerBreakpoint, $name); + + // Per-breakpoint config exists? + @if $x { + $y: map-get($x, 'containers'); + + // Setting exists? Use it. + @if $y { + $containers: $y; + } + + } + + // Create @media block. + @media screen and #{map-get($breakpoints, $name)} { + @include containers($containers); + } + + } + + } + + // Grid. + $grid: map-get($config, 'grid'); + + @if $grid { + + /* Grid */ + + // Use defaults if $grid is just "true". + @if $grid == true { + $grid: (); + } + + // Sub-setting: Gutters. + $grid-gutters: 40px; + $x: map-get($grid, 'gutters'); + + @if $x { + $grid-gutters: $x; + } + + // Rows. + .row { + border-bottom: solid 1px transparent; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + } + + .row > * { + float: left; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + } + + .row:after, .row:before { + content: ''; + display: block; + clear: both; + height: 0; + } + + .row.uniform > * > :first-child { + margin-top: 0; + } + + .row.uniform > * > :last-child { + margin-bottom: 0; + } + + // Gutters (0%). + @include grid-gutters($grid-gutters, \30 \25, 0); + + // Apply base. + @include grid($grid-gutters); + + // Apply per-breakpoint. + @each $name in map-keys($breakpoints) { + + // Get/use breakpoint setting if it exists. + $x: map-get($configPerBreakpoint, $name); + + // Per-breakpoint config exists? + @if $x { + $y: map-get($x, 'grid'); + + // Setting exists? + @if $y { + + // Sub-setting: Gutters. + $x: map-get($y, 'gutters'); + + @if $x { + $grid-gutters: $x; + } + + } + + } + + // Create @media block. + @media screen and #{map-get($breakpoints, $name)} { + @include grid($grid-gutters, $name); + } + + } + + } + + } + + /// Resets browser styles. + /// @param {string} $mode Mode (default is 'normalize'). + @mixin reset($mode: 'normalize') { + + @if $mode == 'normalize' { + + // normalize.css v3.0.2 | MIT License | git.io/normalize + html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} + + } + @else if $mode == 'full' { + + // meyerweb.com/eric/tools/css/reset v2.0 | 20110126 | License: none (public domain) + html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-collapse:collapse;border-spacing:0;}body{-webkit-text-size-adjust:none} + + } + + } + + /// Vendorizes a declaration's property and/or value(s). + /// @param {string} $property Property. + /// @param {mixed} $value String/list of value(s). + @mixin vendor($property, $value) { + + // Determine if property should expand. + $expandProperty: index($vendor-properties, $property); + + // Determine if value should expand (and if so, add '-prefix-' placeholder). + $expandValue: false; + + @each $x in $value { + @each $y in $vendor-values { + @if $y == str-slice($x, 1, str-length($y)) { + + $value: set-nth($value, index($value, $x), '-prefix-' + $x); + $expandValue: true; + + } + } + } + + // Expand property? + @if $expandProperty { + @each $vendor in $vendor-prefixes { + #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; + } + } + + // Expand just the value? + @elseif $expandValue { + @each $vendor in $vendor-prefixes { + #{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; + } + } + + // Neither? Treat them as a normal declaration. + @else { + #{$property}: #{$value}; + } + + } \ No newline at end of file diff --git a/tests/demo/site/assets/sass/libs/_vars.scss b/tests/demo/site/assets/sass/libs/_vars.scss new file mode 100644 index 00000000..2c454003 --- /dev/null +++ b/tests/demo/site/assets/sass/libs/_vars.scss @@ -0,0 +1,40 @@ +// Misc. + $misc: ( + z-index-base: 10000 + ); + +// Duration. + $duration: ( + transition: 0.2s, + bg: 1.75s, + main: 1s + ); + +// Size. + $size: ( + border-radius: 4px, + border-width: 1px, + element-height: 2.75em, + element-margin: 1.5em, + letter-spacing: 0.2em + ); + +// Font. + $font: ( + family: ('Source Sans Pro', Helvetica, sans-serif), + family-fixed: ('Courier New', monospace), + weight: 300 + ); + +// Palette. + $palette: ( + bg: #ffffff, + bg-alt: #e1dfe8, + fg: #414f57, + fg-bold: #313f47, + fg-light: #616f77, + border: #c8cccf, + accent1: #ffa596, + accent2: #00e4ff, + highlight: #ff7496 + ); \ No newline at end of file diff --git a/tests/demo/site/assets/sass/main.scss b/tests/demo/site/assets/sass/main.scss new file mode 100644 index 00000000..c399fcff --- /dev/null +++ b/tests/demo/site/assets/sass/main.scss @@ -0,0 +1,69 @@ +@import 'libs/vars'; +@import 'libs/functions'; +@import 'libs/mixins'; +@import 'libs/skel'; +@import 'font-awesome.min.css'; +@import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300'); + +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + + @include skel-breakpoints(( + xlarge: '(max-width: 1680px)', + large: '(max-width: 1280px)', + medium: '(max-width: 960px)', + small: '(max-width: 736px)', + xsmall: '(max-width: 480px)', + xxsmall: '(max-width: 360px)' + )); + + @include skel-layout(( + reset: 'full', + boxModel: 'border' + )); + + @mixin icon-alt($content: false, $link: false) { + @include icon($content); + $size: _size(border-width) * 1.25; + + &:before { + color: _palette(bg); + text-shadow: $size 0px 0px _palette(border), + ($size * -1) 0px 0px _palette(border), + 0px $size 0px _palette(border), + 0px ($size * -1) 0px _palette(border); + + } + + @if $link { + &:hover { + &:before { + text-shadow: $size 0px 0px _palette(highlight), + ($size * -1) 0px 0px _palette(highlight), + 0px $size 0px _palette(highlight), + 0px ($size * -1) 0px _palette(highlight); + } + } + } + } + +// Base. + + @import 'base/page'; + @import 'base/typography'; + +// Component. + + @import 'components/form'; + @import 'components/icon'; + @import 'components/list'; + @import 'components/button'; + +// Layout. + + @import 'layout/main'; + @import 'layout/footer'; + @import 'layout/wrapper'; diff --git a/tests/demo/site/assets/sass/noscript.scss b/tests/demo/site/assets/sass/noscript.scss new file mode 100644 index 00000000..af1d3986 --- /dev/null +++ b/tests/demo/site/assets/sass/noscript.scss @@ -0,0 +1,25 @@ +@import 'libs/vars'; +@import 'libs/functions'; +@import 'libs/mixins'; +@import 'libs/skel'; + +/* + Identity by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +/* Basic */ + + body { + &:after { + display: none; + } + } + +/* Main */ + + #main { + @include vendor('transform', 'none !important'); + opacity: 1 !important; + } \ No newline at end of file diff --git a/tests/demo/site/css/animate.css b/tests/demo/site/css/animate.css new file mode 100644 index 00000000..7b2b0399 --- /dev/null +++ b/tests/demo/site/css/animate.css @@ -0,0 +1,3293 @@ +@charset "UTF-8"; + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2015 Daniel Eden +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.bounceIn, +.animated.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +.animated.flipOutX, +.animated.flipOutY { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +@keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} + +@-webkit-keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + /*-webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0);*/ + -webkit-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + /*-webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0);*/ + -webkit-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + /*-webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0);*/ + -webkit-transform: translate3d(-50px, 0, 0); + transform: translate3d(-50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + /*-webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0);*/ + -webkit-transform: translate3d(-50px, 0, 0); + transform: translate3d(-50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + /*-webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0);*/ + -webkit-transform: translate3d(50px, 0, 0); + transform: translate3d(50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + /*-webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0);*/ + -webkit-transform: translate3d(50px, 0, 0); + transform: translate3d(50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + /*-webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0);*/ + -webkit-transform: translate3d(0, 50px, 0); + transform: translate3d(0, 50px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + /*-webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0);*/ + -webkit-transform: translate3d(0, 50px, 0); + transform: translate3d(0, 50px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-50px, 0, 0); + transform: translate3d(-50px, 0, 0); + + /*-webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0);*/ + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-50px, 0, 0); + transform: translate3d(-50px, 0, 0); + /*-webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0);*/ + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} \ No newline at end of file diff --git a/tests/demo/site/css/bootstrap.css b/tests/demo/site/css/bootstrap.css new file mode 100644 index 00000000..514c24e5 --- /dev/null +++ b/tests/demo/site/css/bootstrap.css @@ -0,0 +1,7323 @@ +@charset "UTF-8"; +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +a { + background-color: transparent; +} + +a:active, +a:hover { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +button { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input { + line-height: normal; +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + .navbar { + display: none; + } + + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot"); + src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.glyphicon-asterisk:before { + content: "\2a"; +} + +.glyphicon-plus:before { + content: "\2b"; +} + +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} + +.glyphicon-minus:before { + content: "\2212"; +} + +.glyphicon-cloud:before { + content: "\2601"; +} + +.glyphicon-envelope:before { + content: "\2709"; +} + +.glyphicon-pencil:before { + content: "\270f"; +} + +.glyphicon-glass:before { + content: "\e001"; +} + +.glyphicon-music:before { + content: "\e002"; +} + +.glyphicon-search:before { + content: "\e003"; +} + +.glyphicon-heart:before { + content: "\e005"; +} + +.glyphicon-star:before { + content: "\e006"; +} + +.glyphicon-star-empty:before { + content: "\e007"; +} + +.glyphicon-user:before { + content: "\e008"; +} + +.glyphicon-film:before { + content: "\e009"; +} + +.glyphicon-th-large:before { + content: "\e010"; +} + +.glyphicon-th:before { + content: "\e011"; +} + +.glyphicon-th-list:before { + content: "\e012"; +} + +.glyphicon-ok:before { + content: "\e013"; +} + +.glyphicon-remove:before { + content: "\e014"; +} + +.glyphicon-zoom-in:before { + content: "\e015"; +} + +.glyphicon-zoom-out:before { + content: "\e016"; +} + +.glyphicon-off:before { + content: "\e017"; +} + +.glyphicon-signal:before { + content: "\e018"; +} + +.glyphicon-cog:before { + content: "\e019"; +} + +.glyphicon-trash:before { + content: "\e020"; +} + +.glyphicon-home:before { + content: "\e021"; +} + +.glyphicon-file:before { + content: "\e022"; +} + +.glyphicon-time:before { + content: "\e023"; +} + +.glyphicon-road:before { + content: "\e024"; +} + +.glyphicon-download-alt:before { + content: "\e025"; +} + +.glyphicon-download:before { + content: "\e026"; +} + +.glyphicon-upload:before { + content: "\e027"; +} + +.glyphicon-inbox:before { + content: "\e028"; +} + +.glyphicon-play-circle:before { + content: "\e029"; +} + +.glyphicon-repeat:before { + content: "\e030"; +} + +.glyphicon-refresh:before { + content: "\e031"; +} + +.glyphicon-list-alt:before { + content: "\e032"; +} + +.glyphicon-lock:before { + content: "\e033"; +} + +.glyphicon-flag:before { + content: "\e034"; +} + +.glyphicon-headphones:before { + content: "\e035"; +} + +.glyphicon-volume-off:before { + content: "\e036"; +} + +.glyphicon-volume-down:before { + content: "\e037"; +} + +.glyphicon-volume-up:before { + content: "\e038"; +} + +.glyphicon-qrcode:before { + content: "\e039"; +} + +.glyphicon-barcode:before { + content: "\e040"; +} + +.glyphicon-tag:before { + content: "\e041"; +} + +.glyphicon-tags:before { + content: "\e042"; +} + +.glyphicon-book:before { + content: "\e043"; +} + +.glyphicon-bookmark:before { + content: "\e044"; +} + +.glyphicon-print:before { + content: "\e045"; +} + +.glyphicon-camera:before { + content: "\e046"; +} + +.glyphicon-font:before { + content: "\e047"; +} + +.glyphicon-bold:before { + content: "\e048"; +} + +.glyphicon-italic:before { + content: "\e049"; +} + +.glyphicon-text-height:before { + content: "\e050"; +} + +.glyphicon-text-width:before { + content: "\e051"; +} + +.glyphicon-align-left:before { + content: "\e052"; +} + +.glyphicon-align-center:before { + content: "\e053"; +} + +.glyphicon-align-right:before { + content: "\e054"; +} + +.glyphicon-align-justify:before { + content: "\e055"; +} + +.glyphicon-list:before { + content: "\e056"; +} + +.glyphicon-indent-left:before { + content: "\e057"; +} + +.glyphicon-indent-right:before { + content: "\e058"; +} + +.glyphicon-facetime-video:before { + content: "\e059"; +} + +.glyphicon-picture:before { + content: "\e060"; +} + +.glyphicon-map-marker:before { + content: "\e062"; +} + +.glyphicon-adjust:before { + content: "\e063"; +} + +.glyphicon-tint:before { + content: "\e064"; +} + +.glyphicon-edit:before { + content: "\e065"; +} + +.glyphicon-share:before { + content: "\e066"; +} + +.glyphicon-check:before { + content: "\e067"; +} + +.glyphicon-move:before { + content: "\e068"; +} + +.glyphicon-step-backward:before { + content: "\e069"; +} + +.glyphicon-fast-backward:before { + content: "\e070"; +} + +.glyphicon-backward:before { + content: "\e071"; +} + +.glyphicon-play:before { + content: "\e072"; +} + +.glyphicon-pause:before { + content: "\e073"; +} + +.glyphicon-stop:before { + content: "\e074"; +} + +.glyphicon-forward:before { + content: "\e075"; +} + +.glyphicon-fast-forward:before { + content: "\e076"; +} + +.glyphicon-step-forward:before { + content: "\e077"; +} + +.glyphicon-eject:before { + content: "\e078"; +} + +.glyphicon-chevron-left:before { + content: "\e079"; +} + +.glyphicon-chevron-right:before { + content: "\e080"; +} + +.glyphicon-plus-sign:before { + content: "\e081"; +} + +.glyphicon-minus-sign:before { + content: "\e082"; +} + +.glyphicon-remove-sign:before { + content: "\e083"; +} + +.glyphicon-ok-sign:before { + content: "\e084"; +} + +.glyphicon-question-sign:before { + content: "\e085"; +} + +.glyphicon-info-sign:before { + content: "\e086"; +} + +.glyphicon-screenshot:before { + content: "\e087"; +} + +.glyphicon-remove-circle:before { + content: "\e088"; +} + +.glyphicon-ok-circle:before { + content: "\e089"; +} + +.glyphicon-ban-circle:before { + content: "\e090"; +} + +.glyphicon-arrow-left:before { + content: "\e091"; +} + +.glyphicon-arrow-right:before { + content: "\e092"; +} + +.glyphicon-arrow-up:before { + content: "\e093"; +} + +.glyphicon-arrow-down:before { + content: "\e094"; +} + +.glyphicon-share-alt:before { + content: "\e095"; +} + +.glyphicon-resize-full:before { + content: "\e096"; +} + +.glyphicon-resize-small:before { + content: "\e097"; +} + +.glyphicon-exclamation-sign:before { + content: "\e101"; +} + +.glyphicon-gift:before { + content: "\e102"; +} + +.glyphicon-leaf:before { + content: "\e103"; +} + +.glyphicon-fire:before { + content: "\e104"; +} + +.glyphicon-eye-open:before { + content: "\e105"; +} + +.glyphicon-eye-close:before { + content: "\e106"; +} + +.glyphicon-warning-sign:before { + content: "\e107"; +} + +.glyphicon-plane:before { + content: "\e108"; +} + +.glyphicon-calendar:before { + content: "\e109"; +} + +.glyphicon-random:before { + content: "\e110"; +} + +.glyphicon-comment:before { + content: "\e111"; +} + +.glyphicon-magnet:before { + content: "\e112"; +} + +.glyphicon-chevron-up:before { + content: "\e113"; +} + +.glyphicon-chevron-down:before { + content: "\e114"; +} + +.glyphicon-retweet:before { + content: "\e115"; +} + +.glyphicon-shopping-cart:before { + content: "\e116"; +} + +.glyphicon-folder-close:before { + content: "\e117"; +} + +.glyphicon-folder-open:before { + content: "\e118"; +} + +.glyphicon-resize-vertical:before { + content: "\e119"; +} + +.glyphicon-resize-horizontal:before { + content: "\e120"; +} + +.glyphicon-hdd:before { + content: "\e121"; +} + +.glyphicon-bullhorn:before { + content: "\e122"; +} + +.glyphicon-bell:before { + content: "\e123"; +} + +.glyphicon-certificate:before { + content: "\e124"; +} + +.glyphicon-thumbs-up:before { + content: "\e125"; +} + +.glyphicon-thumbs-down:before { + content: "\e126"; +} + +.glyphicon-hand-right:before { + content: "\e127"; +} + +.glyphicon-hand-left:before { + content: "\e128"; +} + +.glyphicon-hand-up:before { + content: "\e129"; +} + +.glyphicon-hand-down:before { + content: "\e130"; +} + +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} + +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} + +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} + +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} + +.glyphicon-globe:before { + content: "\e135"; +} + +.glyphicon-wrench:before { + content: "\e136"; +} + +.glyphicon-tasks:before { + content: "\e137"; +} + +.glyphicon-filter:before { + content: "\e138"; +} + +.glyphicon-briefcase:before { + content: "\e139"; +} + +.glyphicon-fullscreen:before { + content: "\e140"; +} + +.glyphicon-dashboard:before { + content: "\e141"; +} + +.glyphicon-paperclip:before { + content: "\e142"; +} + +.glyphicon-heart-empty:before { + content: "\e143"; +} + +.glyphicon-link:before { + content: "\e144"; +} + +.glyphicon-phone:before { + content: "\e145"; +} + +.glyphicon-pushpin:before { + content: "\e146"; +} + +.glyphicon-usd:before { + content: "\e148"; +} + +.glyphicon-gbp:before { + content: "\e149"; +} + +.glyphicon-sort:before { + content: "\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} + +.glyphicon-sort-by-order:before { + content: "\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} + +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} + +.glyphicon-unchecked:before { + content: "\e157"; +} + +.glyphicon-expand:before { + content: "\e158"; +} + +.glyphicon-collapse-down:before { + content: "\e159"; +} + +.glyphicon-collapse-up:before { + content: "\e160"; +} + +.glyphicon-log-in:before { + content: "\e161"; +} + +.glyphicon-flash:before { + content: "\e162"; +} + +.glyphicon-log-out:before { + content: "\e163"; +} + +.glyphicon-new-window:before { + content: "\e164"; +} + +.glyphicon-record:before { + content: "\e165"; +} + +.glyphicon-save:before { + content: "\e166"; +} + +.glyphicon-open:before { + content: "\e167"; +} + +.glyphicon-saved:before { + content: "\e168"; +} + +.glyphicon-import:before { + content: "\e169"; +} + +.glyphicon-export:before { + content: "\e170"; +} + +.glyphicon-send:before { + content: "\e171"; +} + +.glyphicon-floppy-disk:before { + content: "\e172"; +} + +.glyphicon-floppy-saved:before { + content: "\e173"; +} + +.glyphicon-floppy-remove:before { + content: "\e174"; +} + +.glyphicon-floppy-save:before { + content: "\e175"; +} + +.glyphicon-floppy-open:before { + content: "\e176"; +} + +.glyphicon-credit-card:before { + content: "\e177"; +} + +.glyphicon-transfer:before { + content: "\e178"; +} + +.glyphicon-cutlery:before { + content: "\e179"; +} + +.glyphicon-header:before { + content: "\e180"; +} + +.glyphicon-compressed:before { + content: "\e181"; +} + +.glyphicon-earphone:before { + content: "\e182"; +} + +.glyphicon-phone-alt:before { + content: "\e183"; +} + +.glyphicon-tower:before { + content: "\e184"; +} + +.glyphicon-stats:before { + content: "\e185"; +} + +.glyphicon-sd-video:before { + content: "\e186"; +} + +.glyphicon-hd-video:before { + content: "\e187"; +} + +.glyphicon-subtitles:before { + content: "\e188"; +} + +.glyphicon-sound-stereo:before { + content: "\e189"; +} + +.glyphicon-sound-dolby:before { + content: "\e190"; +} + +.glyphicon-sound-5-1:before { + content: "\e191"; +} + +.glyphicon-sound-6-1:before { + content: "\e192"; +} + +.glyphicon-sound-7-1:before { + content: "\e193"; +} + +.glyphicon-copyright-mark:before { + content: "\e194"; +} + +.glyphicon-registration-mark:before { + content: "\e195"; +} + +.glyphicon-cloud-download:before { + content: "\e197"; +} + +.glyphicon-cloud-upload:before { + content: "\e198"; +} + +.glyphicon-tree-conifer:before { + content: "\e199"; +} + +.glyphicon-tree-deciduous:before { + content: "\e200"; +} + +.glyphicon-cd:before { + content: "\e201"; +} + +.glyphicon-save-file:before { + content: "\e202"; +} + +.glyphicon-open-file:before { + content: "\e203"; +} + +.glyphicon-level-up:before { + content: "\e204"; +} + +.glyphicon-copy:before { + content: "\e205"; +} + +.glyphicon-paste:before { + content: "\e206"; +} + +.glyphicon-alert:before { + content: "\e209"; +} + +.glyphicon-equalizer:before { + content: "\e210"; +} + +.glyphicon-king:before { + content: "\e211"; +} + +.glyphicon-queen:before { + content: "\e212"; +} + +.glyphicon-pawn:before { + content: "\e213"; +} + +.glyphicon-bishop:before { + content: "\e214"; +} + +.glyphicon-knight:before { + content: "\e215"; +} + +.glyphicon-baby-formula:before { + content: "\e216"; +} + +.glyphicon-tent:before { + content: "\26fa"; +} + +.glyphicon-blackboard:before { + content: "\e218"; +} + +.glyphicon-bed:before { + content: "\e219"; +} + +.glyphicon-apple:before { + content: "\f8ff"; +} + +.glyphicon-erase:before { + content: "\e221"; +} + +.glyphicon-hourglass:before { + content: "\231b"; +} + +.glyphicon-lamp:before { + content: "\e223"; +} + +.glyphicon-duplicate:before { + content: "\e224"; +} + +.glyphicon-piggy-bank:before { + content: "\e225"; +} + +.glyphicon-scissors:before { + content: "\e226"; +} + +.glyphicon-bitcoin:before { + content: "\e227"; +} + +.glyphicon-btc:before { + content: "\e227"; +} + +.glyphicon-xbt:before { + content: "\e227"; +} + +.glyphicon-yen:before { + content: "\00a5"; +} + +.glyphicon-jpy:before { + content: "\00a5"; +} + +.glyphicon-ruble:before { + content: "\20bd"; +} + +.glyphicon-rub:before { + content: "\20bd"; +} + +.glyphicon-scale:before { + content: "\e230"; +} + +.glyphicon-ice-lolly:before { + content: "\e231"; +} + +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} + +.glyphicon-education:before { + content: "\e233"; +} + +.glyphicon-option-horizontal:before { + content: "\e234"; +} + +.glyphicon-option-vertical:before { + content: "\e235"; +} + +.glyphicon-menu-hamburger:before { + content: "\e236"; +} + +.glyphicon-modal-window:before { + content: "\e237"; +} + +.glyphicon-oil:before { + content: "\e238"; +} + +.glyphicon-grain:before { + content: "\e239"; +} + +.glyphicon-sunglasses:before { + content: "\e240"; +} + +.glyphicon-text-size:before { + content: "\e241"; +} + +.glyphicon-text-color:before { + content: "\e242"; +} + +.glyphicon-text-background:before { + content: "\e243"; +} + +.glyphicon-object-align-top:before { + content: "\e244"; +} + +.glyphicon-object-align-bottom:before { + content: "\e245"; +} + +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} + +.glyphicon-object-align-left:before { + content: "\e247"; +} + +.glyphicon-object-align-vertical:before { + content: "\e248"; +} + +.glyphicon-object-align-right:before { + content: "\e249"; +} + +.glyphicon-triangle-right:before { + content: "\e250"; +} + +.glyphicon-triangle-left:before { + content: "\e251"; +} + +.glyphicon-triangle-bottom:before { + content: "\e252"; +} + +.glyphicon-triangle-top:before { + content: "\e253"; +} + +.glyphicon-console:before { + content: "\e254"; +} + +.glyphicon-superscript:before { + content: "\e255"; +} + +.glyphicon-subscript:before { + content: "\e256"; +} + +.glyphicon-menu-left:before { + content: "\e257"; +} + +.glyphicon-menu-right:before { + content: "\e258"; +} + +.glyphicon-menu-down:before { + content: "\e259"; +} + +.glyphicon-menu-up:before { + content: "\e260"; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 10px; + -webkit-tap-highlight-color: transparent; +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857; + color: #333333; + background-color: #fff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #337ab7; + text-decoration: none; +} +a:hover, a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +figure { + margin: 0; +} + +img { + vertical-align: middle; +} + +.img-responsive { + /*display: block;*/ + max-width: 100%; + height: auto; +} + +.img-rounded { + border-radius: 6px; +} + +.img-thumbnail { + padding: 4px; + line-height: 1.42857; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +[role="button"] { + cursor: pointer; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h1 .small, h2 small, +h2 .small, h3 small, +h3 .small, h4 small, +h4 .small, h5 small, +h5 .small, h6 small, +h6 .small, +.h1 small, +.h1 .small, .h2 small, +.h2 .small, .h3 small, +.h3 .small, .h4 small, +.h4 .small, .h5 small, +.h5 .small, .h6 small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; +} + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +h1 .small, .h1 small, +.h1 .small, +h2 small, +h2 .small, .h2 small, +.h2 .small, +h3 small, +h3 .small, .h3 small, +.h3 .small { + font-size: 65%; +} + +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +h4 .small, .h4 small, +.h4 .small, +h5 small, +h5 .small, .h5 small, +.h5 .small, +h6 small, +h6 .small, .h6 small, +.h6 .small { + font-size: 75%; +} + +h1, .h1 { + font-size: 36px; +} + +h2, .h2 { + font-size: 30px; +} + +h3, .h3 { + font-size: 24px; +} + +h4, .h4 { + font-size: 18px; +} + +h5, .h5 { + font-size: 14px; +} + +h6, .h6 { + font-size: 12px; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} + +small, +.small { + font-size: 85%; +} + +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.text-justify { + text-align: justify; +} + +.text-nowrap { + white-space: nowrap; +} + +.text-lowercase { + text-transform: lowercase; +} + +.text-uppercase, .initialism { + text-transform: uppercase; +} + +.text-capitalize { + text-transform: capitalize; +} + +.text-muted { + color: #777777; +} + +.text-primary { + color: #337ab7; +} + +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} + +.text-success { + color: #3c763d; +} + +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} + +.text-info { + color: #31708f; +} + +a.text-info:hover, +a.text-info:focus { + color: #245269; +} + +.text-warning { + color: #8a6d3b; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} + +.text-danger { + color: #a94442; +} + +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} + +.bg-primary { + color: #fff; +} + +.bg-primary { + background-color: #337ab7; +} + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} + +.bg-success { + background-color: #dff0d8; +} + +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} + +.bg-info { + background-color: #d9edf7; +} + +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} + +.bg-warning { + background-color: #fcf8e3; +} + +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} + +.bg-danger { + background-color: #f2dede; +} + +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ul ol, +ol ul, +ol ol { + margin-bottom: 0; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} + +dl { + margin-top: 0; + margin-bottom: 20px; +} + +dt, +dd { + line-height: 1.42857; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +.dl-horizontal dd:before, .dl-horizontal dd:after { + content: " "; + display: table; +} +.dl-horizontal dd:after { + clear: both; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; +} + +.initialism { + font-size: 90%; +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +.blockquote-reverse small:before, +.blockquote-reverse .small:before, +blockquote.pull-right footer:before, +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +.blockquote-reverse small:after, +.blockquote-reverse .small:after, +blockquote.pull-right footer:after, +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857; +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container:before, .container:after { + content: " "; + display: table; +} +.container:after { + clear: both; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container-fluid:before, .container-fluid:after { + content: " "; + display: table; +} +.container-fluid:after { + clear: both; +} + +.row { + margin-left: -15px; + margin-right: -15px; +} +.row:before, .row:after { + content: " "; + display: table; +} +.row:after { + clear: both; +} + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} + +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} + +.col-xs-1 { + width: 8.33333%; +} + +.col-xs-2 { + width: 16.66667%; +} + +.col-xs-3 { + width: 25%; +} + +.col-xs-4 { + width: 33.33333%; +} + +.col-xs-5 { + width: 41.66667%; +} + +.col-xs-6 { + width: 50%; +} + +.col-xs-7 { + width: 58.33333%; +} + +.col-xs-8 { + width: 66.66667%; +} + +.col-xs-9 { + width: 75%; +} + +.col-xs-10 { + width: 83.33333%; +} + +.col-xs-11 { + width: 91.66667%; +} + +.col-xs-12 { + width: 100%; +} + +.col-xs-pull-0 { + right: auto; +} + +.col-xs-pull-1 { + right: 8.33333%; +} + +.col-xs-pull-2 { + right: 16.66667%; +} + +.col-xs-pull-3 { + right: 25%; +} + +.col-xs-pull-4 { + right: 33.33333%; +} + +.col-xs-pull-5 { + right: 41.66667%; +} + +.col-xs-pull-6 { + right: 50%; +} + +.col-xs-pull-7 { + right: 58.33333%; +} + +.col-xs-pull-8 { + right: 66.66667%; +} + +.col-xs-pull-9 { + right: 75%; +} + +.col-xs-pull-10 { + right: 83.33333%; +} + +.col-xs-pull-11 { + right: 91.66667%; +} + +.col-xs-pull-12 { + right: 100%; +} + +.col-xs-push-0 { + left: auto; +} + +.col-xs-push-1 { + left: 8.33333%; +} + +.col-xs-push-2 { + left: 16.66667%; +} + +.col-xs-push-3 { + left: 25%; +} + +.col-xs-push-4 { + left: 33.33333%; +} + +.col-xs-push-5 { + left: 41.66667%; +} + +.col-xs-push-6 { + left: 50%; +} + +.col-xs-push-7 { + left: 58.33333%; +} + +.col-xs-push-8 { + left: 66.66667%; +} + +.col-xs-push-9 { + left: 75%; +} + +.col-xs-push-10 { + left: 83.33333%; +} + +.col-xs-push-11 { + left: 91.66667%; +} + +.col-xs-push-12 { + left: 100%; +} + +.col-xs-offset-0 { + margin-left: 0%; +} + +.col-xs-offset-1 { + margin-left: 8.33333%; +} + +.col-xs-offset-2 { + margin-left: 16.66667%; +} + +.col-xs-offset-3 { + margin-left: 25%; +} + +.col-xs-offset-4 { + margin-left: 33.33333%; +} + +.col-xs-offset-5 { + margin-left: 41.66667%; +} + +.col-xs-offset-6 { + margin-left: 50%; +} + +.col-xs-offset-7 { + margin-left: 58.33333%; +} + +.col-xs-offset-8 { + margin-left: 66.66667%; +} + +.col-xs-offset-9 { + margin-left: 75%; +} + +.col-xs-offset-10 { + margin-left: 83.33333%; +} + +.col-xs-offset-11 { + margin-left: 91.66667%; +} + +.col-xs-offset-12 { + margin-left: 100%; +} + +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + + .col-sm-1 { + width: 8.33333%; + } + + .col-sm-2 { + width: 16.66667%; + } + + .col-sm-3 { + width: 25%; + } + + .col-sm-4 { + width: 33.33333%; + } + + .col-sm-5 { + width: 41.66667%; + } + + .col-sm-6 { + width: 50%; + } + + .col-sm-7 { + width: 58.33333%; + } + + .col-sm-8 { + width: 66.66667%; + } + + .col-sm-9 { + width: 75%; + } + + .col-sm-10 { + width: 83.33333%; + } + + .col-sm-11 { + width: 91.66667%; + } + + .col-sm-12 { + width: 100%; + } + + .col-sm-pull-0 { + right: auto; + } + + .col-sm-pull-1 { + right: 8.33333%; + } + + .col-sm-pull-2 { + right: 16.66667%; + } + + .col-sm-pull-3 { + right: 25%; + } + + .col-sm-pull-4 { + right: 33.33333%; + } + + .col-sm-pull-5 { + right: 41.66667%; + } + + .col-sm-pull-6 { + right: 50%; + } + + .col-sm-pull-7 { + right: 58.33333%; + } + + .col-sm-pull-8 { + right: 66.66667%; + } + + .col-sm-pull-9 { + right: 75%; + } + + .col-sm-pull-10 { + right: 83.33333%; + } + + .col-sm-pull-11 { + right: 91.66667%; + } + + .col-sm-pull-12 { + right: 100%; + } + + .col-sm-push-0 { + left: auto; + } + + .col-sm-push-1 { + left: 8.33333%; + } + + .col-sm-push-2 { + left: 16.66667%; + } + + .col-sm-push-3 { + left: 25%; + } + + .col-sm-push-4 { + left: 33.33333%; + } + + .col-sm-push-5 { + left: 41.66667%; + } + + .col-sm-push-6 { + left: 50%; + } + + .col-sm-push-7 { + left: 58.33333%; + } + + .col-sm-push-8 { + left: 66.66667%; + } + + .col-sm-push-9 { + left: 75%; + } + + .col-sm-push-10 { + left: 83.33333%; + } + + .col-sm-push-11 { + left: 91.66667%; + } + + .col-sm-push-12 { + left: 100%; + } + + .col-sm-offset-0 { + margin-left: 0%; + } + + .col-sm-offset-1 { + margin-left: 8.33333%; + } + + .col-sm-offset-2 { + margin-left: 16.66667%; + } + + .col-sm-offset-3 { + margin-left: 25%; + } + + .col-sm-offset-4 { + margin-left: 33.33333%; + } + + .col-sm-offset-5 { + margin-left: 41.66667%; + } + + .col-sm-offset-6 { + margin-left: 50%; + } + + .col-sm-offset-7 { + margin-left: 58.33333%; + } + + .col-sm-offset-8 { + margin-left: 66.66667%; + } + + .col-sm-offset-9 { + margin-left: 75%; + } + + .col-sm-offset-10 { + margin-left: 83.33333%; + } + + .col-sm-offset-11 { + margin-left: 91.66667%; + } + + .col-sm-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + + .col-md-1 { + width: 8.33333%; + } + + .col-md-2 { + width: 16.66667%; + } + + .col-md-3 { + width: 25%; + } + + .col-md-4 { + width: 33.33333%; + } + + .col-md-5 { + width: 41.66667%; + } + + .col-md-6 { + width: 50%; + } + + .col-md-7 { + width: 58.33333%; + } + + .col-md-8 { + width: 66.66667%; + } + + .col-md-9 { + width: 75%; + } + + .col-md-10 { + width: 83.33333%; + } + + .col-md-11 { + width: 91.66667%; + } + + .col-md-12 { + width: 100%; + } + + .col-md-pull-0 { + right: auto; + } + + .col-md-pull-1 { + right: 8.33333%; + } + + .col-md-pull-2 { + right: 16.66667%; + } + + .col-md-pull-3 { + right: 25%; + } + + .col-md-pull-4 { + right: 33.33333%; + } + + .col-md-pull-5 { + right: 41.66667%; + } + + .col-md-pull-6 { + right: 50%; + } + + .col-md-pull-7 { + right: 58.33333%; + } + + .col-md-pull-8 { + right: 66.66667%; + } + + .col-md-pull-9 { + right: 75%; + } + + .col-md-pull-10 { + right: 83.33333%; + } + + .col-md-pull-11 { + right: 91.66667%; + } + + .col-md-pull-12 { + right: 100%; + } + + .col-md-push-0 { + left: auto; + } + + .col-md-push-1 { + left: 8.33333%; + } + + .col-md-push-2 { + left: 16.66667%; + } + + .col-md-push-3 { + left: 25%; + } + + .col-md-push-4 { + left: 33.33333%; + } + + .col-md-push-5 { + left: 41.66667%; + } + + .col-md-push-6 { + left: 50%; + } + + .col-md-push-7 { + left: 58.33333%; + } + + .col-md-push-8 { + left: 66.66667%; + } + + .col-md-push-9 { + left: 75%; + } + + .col-md-push-10 { + left: 83.33333%; + } + + .col-md-push-11 { + left: 91.66667%; + } + + .col-md-push-12 { + left: 100%; + } + + .col-md-offset-0 { + margin-left: 0%; + } + + .col-md-offset-1 { + margin-left: 8.33333%; + } + + .col-md-offset-2 { + margin-left: 16.66667%; + } + + .col-md-offset-3 { + margin-left: 25%; + } + + .col-md-offset-4 { + margin-left: 33.33333%; + } + + .col-md-offset-5 { + margin-left: 41.66667%; + } + + .col-md-offset-6 { + margin-left: 50%; + } + + .col-md-offset-7 { + margin-left: 58.33333%; + } + + .col-md-offset-8 { + margin-left: 66.66667%; + } + + .col-md-offset-9 { + margin-left: 75%; + } + + .col-md-offset-10 { + margin-left: 83.33333%; + } + + .col-md-offset-11 { + margin-left: 91.66667%; + } + + .col-md-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + + .col-lg-1 { + width: 8.33333%; + } + + .col-lg-2 { + width: 16.66667%; + } + + .col-lg-3 { + width: 25%; + } + + .col-lg-4 { + width: 33.33333%; + } + + .col-lg-5 { + width: 41.66667%; + } + + .col-lg-6 { + width: 50%; + } + + .col-lg-7 { + width: 58.33333%; + } + + .col-lg-8 { + width: 66.66667%; + } + + .col-lg-9 { + width: 75%; + } + + .col-lg-10 { + width: 83.33333%; + } + + .col-lg-11 { + width: 91.66667%; + } + + .col-lg-12 { + width: 100%; + } + + .col-lg-pull-0 { + right: auto; + } + + .col-lg-pull-1 { + right: 8.33333%; + } + + .col-lg-pull-2 { + right: 16.66667%; + } + + .col-lg-pull-3 { + right: 25%; + } + + .col-lg-pull-4 { + right: 33.33333%; + } + + .col-lg-pull-5 { + right: 41.66667%; + } + + .col-lg-pull-6 { + right: 50%; + } + + .col-lg-pull-7 { + right: 58.33333%; + } + + .col-lg-pull-8 { + right: 66.66667%; + } + + .col-lg-pull-9 { + right: 75%; + } + + .col-lg-pull-10 { + right: 83.33333%; + } + + .col-lg-pull-11 { + right: 91.66667%; + } + + .col-lg-pull-12 { + right: 100%; + } + + .col-lg-push-0 { + left: auto; + } + + .col-lg-push-1 { + left: 8.33333%; + } + + .col-lg-push-2 { + left: 16.66667%; + } + + .col-lg-push-3 { + left: 25%; + } + + .col-lg-push-4 { + left: 33.33333%; + } + + .col-lg-push-5 { + left: 41.66667%; + } + + .col-lg-push-6 { + left: 50%; + } + + .col-lg-push-7 { + left: 58.33333%; + } + + .col-lg-push-8 { + left: 66.66667%; + } + + .col-lg-push-9 { + left: 75%; + } + + .col-lg-push-10 { + left: 83.33333%; + } + + .col-lg-push-11 { + left: 91.66667%; + } + + .col-lg-push-12 { + left: 100%; + } + + .col-lg-offset-0 { + margin-left: 0%; + } + + .col-lg-offset-1 { + margin-left: 8.33333%; + } + + .col-lg-offset-2 { + margin-left: 16.66667%; + } + + .col-lg-offset-3 { + margin-left: 25%; + } + + .col-lg-offset-4 { + margin-left: 33.33333%; + } + + .col-lg-offset-5 { + margin-left: 41.66667%; + } + + .col-lg-offset-6 { + margin-left: 50%; + } + + .col-lg-offset-7 { + margin-left: 58.33333%; + } + + .col-lg-offset-8 { + margin-left: 66.66667%; + } + + .col-lg-offset-9 { + margin-left: 75%; + } + + .col-lg-offset-10 { + margin-left: 83.33333%; + } + + .col-lg-offset-11 { + margin-left: 91.66667%; + } + + .col-lg-offset-12 { + margin-left: 100%; + } +} +table { + background-color: transparent; +} + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} + +th { + text-align: left; +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > thead > tr > td, +.table > tbody > tr > th, +.table > tbody > tr > td, +.table > tfoot > tr > th, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > th, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} + +.table-condensed > thead > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > th, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, +.table-condensed > tfoot > tr > td { + padding: 5px; +} + +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > th, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > th, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} + +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} + +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} + +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} + +.table > thead > tr > td.active, +.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, +.table > tbody > tr > td.active, +.table > tbody > tr > th.active, +.table > tbody > tr.active > td, +.table > tbody > tr.active > th, +.table > tfoot > tr > td.active, +.table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} + +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} + +.table > thead > tr > td.success, +.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, +.table > tbody > tr > td.success, +.table > tbody > tr > th.success, +.table > tbody > tr.success > td, +.table > tbody > tr.success > th, +.table > tfoot > tr > td.success, +.table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} + +.table > thead > tr > td.info, +.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, +.table > tbody > tr > td.info, +.table > tbody > tr > th.info, +.table > tbody > tr.info > td, +.table > tbody > tr.info > th, +.table > tfoot > tr > td.info, +.table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} + +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} + +.table > thead > tr > td.warning, +.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, +.table > tbody > tr > td.warning, +.table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, +.table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, +.table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} + +.table > thead > tr > td.danger, +.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, +.table > tbody > tr > td.danger, +.table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, +.table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, +.table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} + +input[type="file"] { + display: block; +} + +input[type="range"] { + display: block; + width: 100%; +} + +select[multiple], +select[size] { + height: auto; +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +output { + display: block; + padding-top: 11px; + font-size: 14px; + line-height: 1.42857; + color: #555555; +} + +.form-control { + display: block; + width: 100%; + height: 42px; + padding: 10px 20px; + font-size: 14px; + line-height: 1.42857; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], fieldset[disabled] .form-control { + cursor: not-allowed; +} + +textarea.form-control { + height: auto; +} + +input[type="search"] { + -webkit-appearance: none; +} + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 42px; + } + input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control, + .input-group-sm > input[type="date"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="date"].btn, .input-group-sm input[type="date"], + input[type="time"].input-sm, + .input-group-sm > input[type="time"].form-control, + .input-group-sm > input[type="time"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="time"].btn, .input-group-sm + input[type="time"], + input[type="datetime-local"].input-sm, + .input-group-sm > input[type="datetime-local"].form-control, + .input-group-sm > input[type="datetime-local"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, .input-group-sm + input[type="datetime-local"], + input[type="month"].input-sm, + .input-group-sm > input[type="month"].form-control, + .input-group-sm > input[type="month"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="month"].btn, .input-group-sm + input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control, + .input-group-lg > input[type="date"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="date"].btn, .input-group-lg input[type="date"], + input[type="time"].input-lg, + .input-group-lg > input[type="time"].form-control, + .input-group-lg > input[type="time"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="time"].btn, .input-group-lg + input[type="time"], + input[type="datetime-local"].input-lg, + .input-group-lg > input[type="datetime-local"].form-control, + .input-group-lg > input[type="datetime-local"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, .input-group-lg + input[type="datetime-local"], + input[type="month"].input-lg, + .input-group-lg > input[type="month"].form-control, + .input-group-lg > input[type="month"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="month"].btn, .input-group-lg + input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} + +input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], +input[type="checkbox"][disabled], +input[type="checkbox"].disabled, fieldset[disabled] +input[type="checkbox"] { + cursor: not-allowed; +} + +.radio-inline.disabled, fieldset[disabled] .radio-inline, +.checkbox-inline.disabled, fieldset[disabled] +.checkbox-inline { + cursor: not-allowed; +} + +.radio.disabled label, fieldset[disabled] .radio label, +.checkbox.disabled label, fieldset[disabled] +.checkbox label { + cursor: not-allowed; +} + +.form-control-static { + padding-top: 11px; + padding-bottom: 11px; + margin-bottom: 0; + min-height: 34px; +} +.form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, +.input-group-lg > .form-control-static.input-group-addon, +.input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, +.input-group-sm > .form-control-static.input-group-addon, +.input-group-sm > .input-group-btn > .form-control-static.btn { + padding-left: 0; + padding-right: 0; +} + +.input-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-sm, .input-group-sm > select.form-control, +.input-group-sm > select.input-group-addon, +.input-group-sm > .input-group-btn > select.btn { + height: 30px; + line-height: 30px; +} + +textarea.input-sm, .input-group-sm > textarea.form-control, +.input-group-sm > textarea.input-group-addon, +.input-group-sm > .input-group-btn > textarea.btn, +select[multiple].input-sm, +.input-group-sm > select[multiple].form-control, +.input-group-sm > select[multiple].input-group-addon, +.input-group-sm > .input-group-btn > select[multiple].btn { + height: auto; +} + +.form-group-sm .form-control { + height: 30px; + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 20px; + font-size: 12px; + line-height: 1.5; +} + +.input-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; + border-radius: 6px; +} + +select.input-lg, .input-group-lg > select.form-control, +.input-group-lg > select.input-group-addon, +.input-group-lg > .input-group-btn > select.btn { + height: 46px; + line-height: 46px; +} + +textarea.input-lg, .input-group-lg > textarea.form-control, +.input-group-lg > textarea.input-group-addon, +.input-group-lg > .input-group-btn > textarea.btn, +select[multiple].input-lg, +.input-group-lg > select[multiple].form-control, +.input-group-lg > select[multiple].input-group-addon, +.input-group-lg > .input-group-btn > select[multiple].btn { + height: auto; +} + +.form-group-lg .form-control { + height: 46px; + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 20px; + font-size: 18px; + line-height: 1.33333; +} + +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 52.5px; +} + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 42px; + height: 42px; + line-height: 42px; + text-align: center; + pointer-events: none; +} + +.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, +.input-group-lg > .input-group-addon + .form-control-feedback, +.input-group-lg > .input-group-btn > .btn + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} + +.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, +.input-group-sm > .input-group-addon + .form-control-feedback, +.input-group-sm > .input-group-btn > .btn + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #3c763d; +} + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #a94442; +} + +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} + +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 11px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 31px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + content: " "; + display: table; +} +.form-horizontal .form-group:after { + clear: both; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 11px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.33333px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 10px 20px; + font-size: 14px; + line-height: 1.42857; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, .btn:focus, .btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, .btn[disabled], fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} + +a.btn.disabled, fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, .btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + background-image: none; +} +.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default.focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} + +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, .open > .btn-primary.dropdown-toggle:hover, .open > .btn-primary.dropdown-toggle:focus, .open > .btn-primary.dropdown-toggle.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + background-image: none; +} +.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, .btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, .open > .btn-success.dropdown-toggle:hover, .open > .btn-success.dropdown-toggle:focus, .open > .btn-success.dropdown-toggle.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + background-image: none; +} +.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, .btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, .open > .btn-info.dropdown-toggle:hover, .open > .btn-info.dropdown-toggle:focus, .open > .btn-info.dropdown-toggle.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + background-image: none; +} +.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, .btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, .open > .btn-warning.dropdown-toggle:hover, .open > .btn-warning.dropdown-toggle:focus, .open > .btn-warning.dropdown-toggle.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + background-image: none; +} +.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, .btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, .open > .btn-danger.dropdown-toggle:hover, .open > .btn-danger.dropdown-toggle:focus, .open > .btn-danger.dropdown-toggle.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + background-image: none; +} +.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} + +.btn-link { + color: #337ab7; + font-weight: normal; + border-radius: 0; +} +.btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { + border-color: transparent; +} +.btn-link:hover, .btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; + border-radius: 6px; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-xs, .btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} + +.collapse { + display: none; +} +.collapse.in { + display: block; +} + +tr.collapse.in { + display: table-row; +} + +tbody.collapse.in { + display: table-row-group; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; +} + +.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + outline: 0; + background-color: #337ab7; +} + +.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} + +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} + +.dropdown-menu-right { + left: auto; + right: 0; +} + +.dropdown-menu-left { + left: 0; + right: auto; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857; + color: #777777; + white-space: nowrap; +} + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar:before, .btn-toolbar:after { + content: " "; + display: table; +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn .caret { + margin-left: 0; +} + +.btn-lg .caret, .btn-group-lg > .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} + +.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { + border-width: 0 5px 5px; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { + content: " "; + display: table; +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} + +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 10px 20px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 5px 20px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .input-group-addon.btn { + padding: 10px 20px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.input-group-addon:first-child { + border-right: 0; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.input-group-addon:last-child { + border-left: 0; +} + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} + +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav:before, .nav:after { + content: " "; + display: table; +} +.nav:after { + clear: both; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #777777; +} +.nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eeeeee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #ddd; +} +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #555555; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} + +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} + +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} + +.nav-justified, .nav-tabs.nav-justified { + width: 100%; +} +.nav-justified > li, .nav-tabs.nav-justified > li { + float: none; +} +.nav-justified > li > a, .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 55px; + margin-bottom: 20px; + border: 1px solid transparent; +} +.navbar:before, .navbar:after { + content: " "; + display: table; +} +.navbar:after { + clear: both; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} + +.navbar-header:before, .navbar-header:after { + content: " "; + display: table; +} +.navbar-header:after { + clear: both; +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse:before, .navbar-collapse:after { + content: " "; + display: table; +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} + +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} + +.container > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-header, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} + +.navbar-brand { + float: left; + padding: 17.5px 15px; + font-size: 18px; + line-height: 20px; + height: 55px; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} + +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 10.5px; + margin-bottom: 10.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 8.75px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 17.5px; + padding-bottom: 17.5px; + } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 6.5px; + margin-bottom: 6.5px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-btn { + margin-top: 6.5px; + margin-bottom: 6.5px; +} +.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { + margin-top: 12.5px; + margin-bottom: 12.5px; +} +.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { + margin-top: 16.5px; + margin-bottom: 16.5px; +} + +.navbar-text { + margin-top: 17.5px; + margin-bottom: 17.5px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} + +.navbar-inverse { + background-color: #222; + border-color: #090909; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #090909; +} +.navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #090909; + color: #fff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/ "; + padding: 0 5px; + color: #ccc; +} +.breadcrumb > .active { + color: #777777; +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 10px 20px; + line-height: 1.42857; + text-decoration: none; + color: #337ab7; + background-color: #fff; + border: 1px solid #ddd; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, .pagination > li > a:focus, +.pagination > li > span:hover, +.pagination > li > span:focus { + z-index: 3; + color: #23527c; + background-color: #eeeeee; + border-color: #ddd; +} +.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, +.pagination > .active > span, +.pagination > .active > span:hover, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777777; + background-color: #fff; + border-color: #ddd; + cursor: not-allowed; +} + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager:before, .pager:after { + content: " "; + display: table; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + background-color: #fff; + cursor: not-allowed; +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} + +a.label:hover, a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} + +.label-default { + background-color: #777777; +} +.label-default[href]:hover, .label-default[href]:focus { + background-color: #5e5e5e; +} + +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, .label-primary[href]:focus { + background-color: #286090; +} + +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, .label-success[href]:focus { + background-color: #449d44; +} + +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; +} + +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, .label-warning[href]:focus { + background-color: #ec971f; +} + +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, .label-danger[href]:focus { + background-color: #c9302c; +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #fff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #777777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, .btn-group-xs > .btn .badge, .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +.list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} + +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, .container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + display: block; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} + +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} + +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} + +.alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} + +.alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} + +.media, +.media-body { + zoom: 1; + overflow: hidden; +} + +.media-body { + width: 10000px; +} + +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} + +.media-right, +.media > .pull-right { + padding-left: 10px; +} + +.media-left, +.media > .pull-left { + padding-right: 10px; +} + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} + +.media-middle { + vertical-align: middle; +} + +.media-bottom { + vertical-align: bottom; +} + +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.media-list { + padding-left: 0; + list-style: none; +} + +.list-group { + margin-bottom: 20px; + padding-left: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, a.list-group-item:focus, +button.list-group-item:hover, +button.list-group-item:focus { + text-decoration: none; + color: #555; + background-color: #f5f5f5; +} + +button.list-group-item { + width: 100%; + text-align: left; +} + +.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { + background-color: #eeeeee; + color: #777777; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { + color: #777777; +} +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} + +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, a.list-group-item-success:focus, +button.list-group-item-success:hover, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus, +button.list-group-item-success.active, +button.list-group-item-success.active:hover, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} + +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, a.list-group-item-info:focus, +button.list-group-item-info:hover, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus, +button.list-group-item-info.active, +button.list-group-item-info.active:hover, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} + +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, a.list-group-item-warning:focus, +button.list-group-item-warning:hover, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, +button.list-group-item-warning.active, +button.list-group-item-warning.active:hover, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} + +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, a.list-group-item-danger:focus, +button.list-group-item-danger:hover, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, +button.list-group-item-danger.active, +button.list-group-item-danger.active:hover, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} +.panel-body:before, .panel-body:after { + content: " "; + display: table; +} +.panel-body:after { + clear: both; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} + +.list-group + .panel-footer { + border-top-width: 0; +} + +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} + +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} + +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} + +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} + +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} + +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} + +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} + +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} + +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} + +.embed-responsive-4by3 { + padding-bottom: 75%; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-lg { + padding: 24px; + border-radius: 6px; +} + +.well-sm { + padding: 9px; + border-radius: 3px; +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, .close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +.modal-content { + position: relative; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.42857px; +} + +.modal-header .close { + margin-top: -2px; +} + +.modal-title { + margin: 0; + line-height: 1.42857; +} + +.modal-body { + position: relative; + padding: 15px; +} + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer:before, .modal-footer:after { + content: " "; + display: table; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover > .arrow, .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover > .arrow { + border-width: 11px; +} + +.popover > .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #fff; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #fff; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #fff; + bottom: -10px; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #fff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #fff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: transparent; +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #fff; +} + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} + +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, .clearfix:after { + content: " "; + display: table; +} +.clearfix:after { + clear: both; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.pull-right { + float: right !important; +} + +.pull-left { + float: left !important; +} + +.hide { + display: none !important; +} + +.show { + display: block !important; +} + +.invisible { + visibility: hidden; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.hidden { + display: none !important; +} + +.affix { + position: fixed; +} + +@-ms-viewport { + width: device-width; +} +.visible-xs { + display: none !important; +} + +.visible-sm { + display: none !important; +} + +.visible-md { + display: none !important; +} + +.visible-lg { + display: none !important; +} + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + + table.visible-xs { + display: table !important; + } + + tr.visible-xs { + display: table-row !important; + } + + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + + table.visible-sm { + display: table !important; + } + + tr.visible-sm { + display: table-row !important; + } + + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + + table.visible-md { + display: table !important; + } + + tr.visible-md { + display: table-row !important; + } + + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + + table.visible-lg { + display: table !important; + } + + tr.visible-lg { + display: table-row !important; + } + + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} + +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: block !important; + } + + table.visible-print { + display: table !important; + } + + tr.visible-print { + display: table-row !important; + } + + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} + +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} + +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} + +@media print { + .hidden-print { + display: none !important; + } +} + +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/tests/demo/site/css/bootstrap.css.map b/tests/demo/site/css/bootstrap.css.map new file mode 100644 index 00000000..c9153dc6 --- /dev/null +++ b/tests/demo/site/css/bootstrap.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../sass/bootstrap/_normalize.scss","../sass/bootstrap/_print.scss","../sass/bootstrap/_glyphicons.scss","../sass/bootstrap/_scaffolding.scss","../sass/bootstrap/mixins/_vendor-prefixes.scss","../sass/bootstrap/_variables.scss","../sass/bootstrap/mixins/_tab-focus.scss","../sass/bootstrap/mixins/_image.scss","../sass/bootstrap/_type.scss","../sass/bootstrap/mixins/_text-emphasis.scss","../sass/bootstrap/mixins/_background-variant.scss","../sass/bootstrap/mixins/_clearfix.scss","../sass/bootstrap/mixins/_text-overflow.scss","../sass/bootstrap/_code.scss","../sass/bootstrap/_grid.scss","../sass/bootstrap/mixins/_grid.scss","../sass/bootstrap/mixins/_grid-framework.scss","../sass/bootstrap/_tables.scss","../sass/bootstrap/mixins/_table-row.scss","../sass/bootstrap/_forms.scss","../sass/bootstrap/mixins/_forms.scss","../sass/bootstrap/_buttons.scss","../sass/bootstrap/mixins/_buttons.scss","../sass/bootstrap/mixins/_opacity.scss","../sass/bootstrap/_component-animations.scss","../sass/bootstrap/_dropdowns.scss","../sass/bootstrap/mixins/_nav-divider.scss","../sass/bootstrap/mixins/_reset-filter.scss","../sass/bootstrap/_button-groups.scss","../sass/bootstrap/mixins/_border-radius.scss","../sass/bootstrap/_input-groups.scss","../sass/bootstrap/_navs.scss","../sass/bootstrap/_navbar.scss","../sass/bootstrap/mixins/_nav-vertical-align.scss","../sass/bootstrap/_breadcrumbs.scss","../sass/bootstrap/_pagination.scss","../sass/bootstrap/mixins/_pagination.scss","../sass/bootstrap/_pager.scss","../sass/bootstrap/_labels.scss","../sass/bootstrap/mixins/_labels.scss","../sass/bootstrap/_badges.scss","../sass/bootstrap/_jumbotron.scss","../sass/bootstrap/_thumbnails.scss","../sass/bootstrap/_alerts.scss","../sass/bootstrap/mixins/_alerts.scss","../sass/bootstrap/_progress-bars.scss","../sass/bootstrap/mixins/_gradients.scss","../sass/bootstrap/mixins/_progress-bar.scss","../sass/bootstrap/_media.scss","../sass/bootstrap/_list-group.scss","../sass/bootstrap/mixins/_list-group.scss","../sass/bootstrap/_panels.scss","../sass/bootstrap/mixins/_panels.scss","../sass/bootstrap/_responsive-embed.scss","../sass/bootstrap/_wells.scss","../sass/bootstrap/_close.scss","../sass/bootstrap/_modals.scss","../sass/bootstrap/_tooltip.scss","../sass/bootstrap/mixins/_reset-text.scss","../sass/bootstrap/_popovers.scss","../sass/bootstrap/_carousel.scss","../sass/bootstrap/_utilities.scss","../sass/bootstrap/mixins/_center-block.scss","../sass/bootstrap/mixins/_hide-text.scss","../sass/bootstrap/_responsive-utilities.scss","../sass/bootstrap/mixins/_responsive-visibility.scss"], +"names": [], +"file": "bootstrap.css" +} \ No newline at end of file diff --git a/tests/demo/site/css/flexslider.css b/tests/demo/site/css/flexslider.css new file mode 100755 index 00000000..c459ef44 --- /dev/null +++ b/tests/demo/site/css/flexslider.css @@ -0,0 +1,275 @@ +/* + * jQuery FlexSlider v2.6.0 + * http://www.woothemes.com/flexslider/ + * + * Copyright 2012 WooThemes + * Free to use under the GPLv2 and later license. + * http://www.gnu.org/licenses/gpl-2.0.html + * + * Contributing author: Tyler Smith (@mbmufffin) + * + */ +/* ==================================================================================================================== + * FONT-FACE + * ====================================================================================================================*/ +@font-face { + font-family: 'flexslider-icon'; + src: url('fonts/flexslider-icon.eot'); + src: url('fonts/flexslider-icon.eot?#iefix') format('embedded-opentype'), url('fonts/flexslider-icon.woff') format('woff'), url('fonts/flexslider-icon.ttf') format('truetype'), url('fonts/flexslider-icon.svg#flexslider-icon') format('svg'); + font-weight: normal; + font-style: normal; +} +/* ==================================================================================================================== + * RESETS + * ====================================================================================================================*/ +.flex-container a:hover, +.flex-slider a:hover { + outline: none; +} +.slides, +.slides > li, +.flex-control-nav, +.flex-direction-nav { + margin: 0; + padding: 0; + list-style: none; +} +.flex-pauseplay span { + text-transform: capitalize; +} +/* ==================================================================================================================== + * BASE STYLES + * ====================================================================================================================*/ +.flexslider { + margin: 0; + padding: 0; +} +.flexslider .slides > li { + display: none; + -webkit-backface-visibility: hidden; +} +.flexslider .slides img { + width: 100%; + display: block; +} +.flexslider .slides:after { + content: "\0020"; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} +html[xmlns] .flexslider .slides { + display: block; +} +* html .flexslider .slides { + height: 1%; +} +.no-js .flexslider .slides > li:first-child { + display: block; +} +/* ==================================================================================================================== + * DEFAULT THEME + * ====================================================================================================================*/ +.flexslider { + margin: 0 0 60px; + background: #ffffff; + border: 4px solid #ffffff; + position: relative; + zoom: 1; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + -o-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); +} +.flexslider .slides { + zoom: 1; +} +.flexslider .slides img { + height: auto; + -moz-user-select: none; +} +.flex-viewport { + max-height: 2000px; + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -ms-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} +.loading .flex-viewport { + max-height: 300px; +} +.carousel li { + margin-right: 5px; +} +.flex-direction-nav { + *height: 0; +} +.flex-direction-nav a { + text-decoration: none; + display: block; + width: 40px; + height: 40px; + margin: -20px 0 0; + position: absolute; + top: 50%; + z-index: 10; + overflow: hidden; + opacity: 0; + cursor: pointer; + color: rgba(0, 0, 0, 0.8); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.flex-direction-nav a:before { + font-family: "flexslider-icon"; + font-size: 40px; + display: inline-block; + content: '\f001'; + color: rgba(0, 0, 0, 0.8); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); +} +.flex-direction-nav a.flex-next:before { + content: '\f002'; +} +.flex-direction-nav .flex-prev { + left: -50px; +} +.flex-direction-nav .flex-next { + right: -50px; + text-align: right; +} +.flexslider:hover .flex-direction-nav .flex-prev { + opacity: 0.7; + left: 10px; +} +.flexslider:hover .flex-direction-nav .flex-prev:hover { + opacity: 1; +} +.flexslider:hover .flex-direction-nav .flex-next { + opacity: 0.7; + right: 10px; +} +.flexslider:hover .flex-direction-nav .flex-next:hover { + opacity: 1; +} +.flex-direction-nav .flex-disabled { + opacity: 0!important; + filter: alpha(opacity=0); + cursor: default; + z-index: -1; +} +.flex-pauseplay a { + display: block; + width: 20px; + height: 20px; + position: absolute; + bottom: 5px; + left: 10px; + opacity: 0.8; + z-index: 10; + overflow: hidden; + cursor: pointer; + color: #000; +} +.flex-pauseplay a:before { + font-family: "flexslider-icon"; + font-size: 20px; + display: inline-block; + content: '\f004'; +} +.flex-pauseplay a:hover { + opacity: 1; +} +.flex-pauseplay a.flex-play:before { + content: '\f003'; +} +.flex-control-nav { + width: 100%; + position: absolute; + bottom: -40px; + text-align: center; +} +.flex-control-nav li { + margin: 0 6px; + display: inline-block; + zoom: 1; + *display: inline; +} +.flex-control-paging li a { + width: 11px; + height: 11px; + display: block; + background: #666; + background: rgba(0, 0, 0, 0.5); + cursor: pointer; + text-indent: -9999px; + -webkit-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -o-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; +} +.flex-control-paging li a:hover { + background: #333; + background: rgba(0, 0, 0, 0.7); +} +.flex-control-paging li a.flex-active { + background: #000; + background: rgba(0, 0, 0, 0.9); + cursor: default; +} +.flex-control-thumbs { + margin: 5px 0 0; + position: static; + overflow: hidden; +} +.flex-control-thumbs li { + width: 25%; + float: left; + margin: 0; +} +.flex-control-thumbs img { + width: 100%; + height: auto; + display: block; + opacity: .7; + cursor: pointer; + -moz-user-select: none; + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -ms-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} +.flex-control-thumbs img:hover { + opacity: 1; +} +.flex-control-thumbs .flex-active { + opacity: 1; + cursor: default; +} +/* ==================================================================================================================== + * RESPONSIVE + * ====================================================================================================================*/ +@media screen and (max-width: 860px) { + .flex-direction-nav .flex-prev { + opacity: 1; + left: 10px; + } + .flex-direction-nav .flex-next { + opacity: 1; + right: 10px; + } +} diff --git a/tests/demo/site/css/icomoon.css b/tests/demo/site/css/icomoon.css new file mode 100755 index 00000000..c807529d --- /dev/null +++ b/tests/demo/site/css/icomoon.css @@ -0,0 +1,1572 @@ +@font-face { + font-family: 'icomoon'; + src: url('../fonts/icomoon/icomoon.eot?85cwyn'); + src: url('../fonts/icomoon/icomoon.eot?85cwyn#iefix') format('embedded-opentype'), + url('../fonts/icomoon/icomoon.ttf?85cwyn') format('truetype'), + url('../fonts/icomoon/icomoon.woff?85cwyn') format('woff'), + url('../fonts/icomoon/icomoon.svg?85cwyn#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-add-to-list:before { + content: "\e900"; +} +.icon-classic-computer:before { + content: "\e901"; +} +.icon-controller-fast-backward:before { + content: "\e902"; +} +.icon-creative-commons-attribution:before { + content: "\e903"; +} +.icon-creative-commons-noderivs:before { + content: "\e904"; +} +.icon-creative-commons-noncommercial-eu:before { + content: "\e905"; +} +.icon-creative-commons-noncommercial-us:before { + content: "\e906"; +} +.icon-creative-commons-public-domain:before { + content: "\e907"; +} +.icon-creative-commons-remix:before { + content: "\e908"; +} +.icon-creative-commons-share:before { + content: "\e909"; +} +.icon-creative-commons-sharealike:before { + content: "\e90a"; +} +.icon-creative-commons:before { + content: "\e90b"; +} +.icon-document-landscape:before { + content: "\e90c"; +} +.icon-remove-user:before { + content: "\e90d"; +} +.icon-warning:before { + content: "\e90e"; +} +.icon-arrow-bold-down:before { + content: "\e90f"; +} +.icon-arrow-bold-left:before { + content: "\e910"; +} +.icon-arrow-bold-right:before { + content: "\e911"; +} +.icon-arrow-bold-up:before { + content: "\e912"; +} +.icon-arrow-down:before { + content: "\e913"; +} +.icon-arrow-left:before { + content: "\e914"; +} +.icon-arrow-long-down:before { + content: "\e915"; +} +.icon-arrow-long-left:before { + content: "\e916"; +} +.icon-arrow-long-right:before { + content: "\e917"; +} +.icon-arrow-long-up:before { + content: "\e918"; +} +.icon-arrow-right:before { + content: "\e919"; +} +.icon-arrow-up:before { + content: "\e91a"; +} +.icon-arrow-with-circle-down:before { + content: "\e91b"; +} +.icon-arrow-with-circle-left:before { + content: "\e91c"; +} +.icon-arrow-with-circle-right:before { + content: "\e91d"; +} +.icon-arrow-with-circle-up:before { + content: "\e91e"; +} +.icon-bookmark:before { + content: "\e91f"; +} +.icon-bookmarks:before { + content: "\e920"; +} +.icon-chevron-down:before { + content: "\e921"; +} +.icon-chevron-left:before { + content: "\e922"; +} +.icon-chevron-right:before { + content: "\e923"; +} +.icon-chevron-small-down:before { + content: "\e924"; +} +.icon-chevron-small-left:before { + content: "\e925"; +} +.icon-chevron-small-right:before { + content: "\e926"; +} +.icon-chevron-small-up:before { + content: "\e927"; +} +.icon-chevron-thin-down:before { + content: "\e928"; +} +.icon-chevron-thin-left:before { + content: "\e929"; +} +.icon-chevron-thin-right:before { + content: "\e92a"; +} +.icon-chevron-thin-up:before { + content: "\e92b"; +} +.icon-chevron-up:before { + content: "\e92c"; +} +.icon-chevron-with-circle-down:before { + content: "\e92d"; +} +.icon-chevron-with-circle-left:before { + content: "\e92e"; +} +.icon-chevron-with-circle-right:before { + content: "\e92f"; +} +.icon-chevron-with-circle-up:before { + content: "\e930"; +} +.icon-cloud:before { + content: "\e931"; +} +.icon-controller-fast-forward:before { + content: "\e932"; +} +.icon-controller-jump-to-start:before { + content: "\e933"; +} +.icon-controller-next:before { + content: "\e934"; +} +.icon-controller-paus:before { + content: "\e935"; +} +.icon-controller-play:before { + content: "\e936"; +} +.icon-controller-record:before { + content: "\e937"; +} +.icon-controller-stop:before { + content: "\e938"; +} +.icon-controller-volume:before { + content: "\e939"; +} +.icon-dot-single:before { + content: "\e93a"; +} +.icon-dots-three-horizontal:before { + content: "\e93b"; +} +.icon-dots-three-vertical:before { + content: "\e93c"; +} +.icon-dots-two-horizontal:before { + content: "\e93d"; +} +.icon-dots-two-vertical:before { + content: "\e93e"; +} +.icon-download:before { + content: "\e93f"; +} +.icon-emoji-flirt:before { + content: "\e940"; +} +.icon-flow-branch:before { + content: "\e941"; +} +.icon-flow-cascade:before { + content: "\e942"; +} +.icon-flow-line:before { + content: "\e943"; +} +.icon-flow-parallel:before { + content: "\e944"; +} +.icon-flow-tree:before { + content: "\e945"; +} +.icon-install:before { + content: "\e946"; +} +.icon-layers:before { + content: "\e947"; +} +.icon-open-book:before { + content: "\e948"; +} +.icon-resize-100:before { + content: "\e949"; +} +.icon-resize-full-screen:before { + content: "\e94a"; +} +.icon-save:before { + content: "\e94b"; +} +.icon-select-arrows:before { + content: "\e94c"; +} +.icon-sound-mute:before { + content: "\e94d"; +} +.icon-sound:before { + content: "\e94e"; +} +.icon-trash:before { + content: "\e94f"; +} +.icon-triangle-down:before { + content: "\e950"; +} +.icon-triangle-left:before { + content: "\e951"; +} +.icon-triangle-right:before { + content: "\e952"; +} +.icon-triangle-up:before { + content: "\e953"; +} +.icon-uninstall:before { + content: "\e954"; +} +.icon-upload-to-cloud:before { + content: "\e955"; +} +.icon-upload:before { + content: "\e956"; +} +.icon-add-user:before { + content: "\e957"; +} +.icon-address:before { + content: "\e958"; +} +.icon-adjust:before { + content: "\e959"; +} +.icon-air:before { + content: "\e95a"; +} +.icon-aircraft-landing:before { + content: "\e95b"; +} +.icon-aircraft-take-off:before { + content: "\e95c"; +} +.icon-aircraft:before { + content: "\e95d"; +} +.icon-align-bottom:before { + content: "\e95e"; +} +.icon-align-horizontal-middle:before { + content: "\e95f"; +} +.icon-align-left:before { + content: "\e960"; +} +.icon-align-right:before { + content: "\e961"; +} +.icon-align-top:before { + content: "\e962"; +} +.icon-align-vertical-middle:before { + content: "\e963"; +} +.icon-archive:before { + content: "\e964"; +} +.icon-area-graph:before { + content: "\e965"; +} +.icon-attachment:before { + content: "\e966"; +} +.icon-awareness-ribbon:before { + content: "\e967"; +} +.icon-back-in-time:before { + content: "\e968"; +} +.icon-back:before { + content: "\e969"; +} +.icon-bar-graph:before { + content: "\e96a"; +} +.icon-battery:before { + content: "\e96b"; +} +.icon-beamed-note:before { + content: "\e96c"; +} +.icon-bell:before { + content: "\e96d"; +} +.icon-blackboard:before { + content: "\e96e"; +} +.icon-block:before { + content: "\e96f"; +} +.icon-book:before { + content: "\e970"; +} +.icon-bowl:before { + content: "\e971"; +} +.icon-box:before { + content: "\e972"; +} +.icon-briefcase:before { + content: "\e973"; +} +.icon-browser:before { + content: "\e974"; +} +.icon-brush:before { + content: "\e975"; +} +.icon-bucket:before { + content: "\e976"; +} +.icon-cake:before { + content: "\e977"; +} +.icon-calculator:before { + content: "\e978"; +} +.icon-calendar:before { + content: "\e979"; +} +.icon-camera:before { + content: "\e97a"; +} +.icon-ccw:before { + content: "\e97b"; +} +.icon-chat:before { + content: "\e97c"; +} +.icon-check:before { + content: "\e97d"; +} +.icon-circle-with-cross:before { + content: "\e97e"; +} +.icon-circle-with-minus:before { + content: "\e97f"; +} +.icon-circle-with-plus:before { + content: "\e980"; +} +.icon-circle:before { + content: "\e981"; +} +.icon-circular-graph:before { + content: "\e982"; +} +.icon-clapperboard:before { + content: "\e983"; +} +.icon-clipboard:before { + content: "\e984"; +} +.icon-clock:before { + content: "\e985"; +} +.icon-code:before { + content: "\e986"; +} +.icon-cog:before { + content: "\e987"; +} +.icon-colours:before { + content: "\e988"; +} +.icon-compass:before { + content: "\e989"; +} +.icon-copy:before { + content: "\e98a"; +} +.icon-credit-card:before { + content: "\e98b"; +} +.icon-credit:before { + content: "\e98c"; +} +.icon-cross:before { + content: "\e98d"; +} +.icon-cup:before { + content: "\e98e"; +} +.icon-cw:before { + content: "\e98f"; +} +.icon-cycle:before { + content: "\e990"; +} +.icon-database:before { + content: "\e991"; +} +.icon-dial-pad:before { + content: "\e992"; +} +.icon-direction:before { + content: "\e993"; +} +.icon-document:before { + content: "\e994"; +} +.icon-documents:before { + content: "\e995"; +} +.icon-drink:before { + content: "\e996"; +} +.icon-drive:before { + content: "\e997"; +} +.icon-drop:before { + content: "\e998"; +} +.icon-edit:before { + content: "\e999"; +} +.icon-email:before { + content: "\e99a"; +} +.icon-emoji-happy:before { + content: "\e99b"; +} +.icon-emoji-neutral:before { + content: "\e99c"; +} +.icon-emoji-sad:before { + content: "\e99d"; +} +.icon-erase:before { + content: "\e99e"; +} +.icon-eraser:before { + content: "\e99f"; +} +.icon-export:before { + content: "\e9a0"; +} +.icon-eye:before { + content: "\e9a1"; +} +.icon-feather:before { + content: "\e9a2"; +} +.icon-flag:before { + content: "\e9a3"; +} +.icon-flash:before { + content: "\e9a4"; +} +.icon-flashlight:before { + content: "\e9a5"; +} +.icon-flat-brush:before { + content: "\e9a6"; +} +.icon-folder-images:before { + content: "\e9a7"; +} +.icon-folder-music:before { + content: "\e9a8"; +} +.icon-folder-video:before { + content: "\e9a9"; +} +.icon-folder:before { + content: "\e9aa"; +} +.icon-forward:before { + content: "\e9ab"; +} +.icon-funnel:before { + content: "\e9ac"; +} +.icon-game-controller:before { + content: "\e9ad"; +} +.icon-gauge:before { + content: "\e9ae"; +} +.icon-globe:before { + content: "\e9af"; +} +.icon-graduation-cap:before { + content: "\e9b0"; +} +.icon-grid:before { + content: "\e9b1"; +} +.icon-hair-cross:before { + content: "\e9b2"; +} +.icon-hand:before { + content: "\e9b3"; +} +.icon-heart-outlined:before { + content: "\e9b4"; +} +.icon-heart:before { + content: "\e9b5"; +} +.icon-help-with-circle:before { + content: "\e9b6"; +} +.icon-help:before { + content: "\e9b7"; +} +.icon-home:before { + content: "\e9b8"; +} +.icon-hour-glass:before { + content: "\e9b9"; +} +.icon-image-inverted:before { + content: "\e9ba"; +} +.icon-image:before { + content: "\e9bb"; +} +.icon-images:before { + content: "\e9bc"; +} +.icon-inbox:before { + content: "\e9bd"; +} +.icon-infinity:before { + content: "\e9be"; +} +.icon-info-with-circle:before { + content: "\e9bf"; +} +.icon-info:before { + content: "\e9c0"; +} +.icon-key:before { + content: "\e9c1"; +} +.icon-keyboard:before { + content: "\e9c2"; +} +.icon-lab-flask:before { + content: "\e9c3"; +} +.icon-landline:before { + content: "\e9c4"; +} +.icon-language:before { + content: "\e9c5"; +} +.icon-laptop:before { + content: "\e9c6"; +} +.icon-leaf:before { + content: "\e9c7"; +} +.icon-level-down:before { + content: "\e9c8"; +} +.icon-level-up:before { + content: "\e9c9"; +} +.icon-lifebuoy:before { + content: "\e9ca"; +} +.icon-light-bulb:before { + content: "\e9cb"; +} +.icon-light-down:before { + content: "\e9cc"; +} +.icon-light-up:before { + content: "\e9cd"; +} +.icon-line-graph:before { + content: "\e9ce"; +} +.icon-link:before { + content: "\e9cf"; +} +.icon-list:before { + content: "\e9d0"; +} +.icon-location-pin:before { + content: "\e9d1"; +} +.icon-location:before { + content: "\e9d2"; +} +.icon-lock-open:before { + content: "\e9d3"; +} +.icon-lock:before { + content: "\e9d4"; +} +.icon-log-out:before { + content: "\e9d5"; +} +.icon-login:before { + content: "\e9d6"; +} +.icon-loop:before { + content: "\e9d7"; +} +.icon-magnet:before { + content: "\e9d8"; +} +.icon-magnifying-glass:before { + content: "\e9d9"; +} +.icon-mail:before { + content: "\e9da"; +} +.icon-man:before { + content: "\e9db"; +} +.icon-map:before { + content: "\e9dc"; +} +.icon-mask:before { + content: "\e9dd"; +} +.icon-medal:before { + content: "\e9de"; +} +.icon-megaphone:before { + content: "\e9df"; +} +.icon-menu:before { + content: "\e9e0"; +} +.icon-message:before { + content: "\e9e1"; +} +.icon-mic:before { + content: "\e9e2"; +} +.icon-minus:before { + content: "\e9e3"; +} +.icon-mobile:before { + content: "\e9e4"; +} +.icon-modern-mic:before { + content: "\e9e5"; +} +.icon-moon:before { + content: "\e9e6"; +} +.icon-mouse:before { + content: "\e9e7"; +} +.icon-music:before { + content: "\e9e8"; +} +.icon-network:before { + content: "\e9e9"; +} +.icon-new-message:before { + content: "\e9ea"; +} +.icon-new:before { + content: "\e9eb"; +} +.icon-news:before { + content: "\e9ec"; +} +.icon-note:before { + content: "\e9ed"; +} +.icon-notification:before { + content: "\e9ee"; +} +.icon-old-mobile:before { + content: "\e9ef"; +} +.icon-old-phone:before { + content: "\e9f0"; +} +.icon-palette:before { + content: "\e9f1"; +} +.icon-paper-plane:before { + content: "\e9f2"; +} +.icon-pencil:before { + content: "\e9f3"; +} +.icon-phone:before { + content: "\e9f4"; +} +.icon-pie-chart:before { + content: "\e9f5"; +} +.icon-pin:before { + content: "\e9f6"; +} +.icon-plus:before { + content: "\e9f7"; +} +.icon-popup:before { + content: "\e9f8"; +} +.icon-power-plug:before { + content: "\e9f9"; +} +.icon-price-ribbon:before { + content: "\e9fa"; +} +.icon-price-tag:before { + content: "\e9fb"; +} +.icon-print:before { + content: "\e9fc"; +} +.icon-progress-empty:before { + content: "\e9fd"; +} +.icon-progress-full:before { + content: "\e9fe"; +} +.icon-progress-one:before { + content: "\e9ff"; +} +.icon-progress-two:before { + content: "\ea00"; +} +.icon-publish:before { + content: "\ea01"; +} +.icon-quote:before { + content: "\ea02"; +} +.icon-radio:before { + content: "\ea03"; +} +.icon-reply-all:before { + content: "\ea04"; +} +.icon-reply:before { + content: "\ea05"; +} +.icon-retweet:before { + content: "\ea06"; +} +.icon-rocket:before { + content: "\ea07"; +} +.icon-round-brush:before { + content: "\ea08"; +} +.icon-rss:before { + content: "\ea09"; +} +.icon-ruler:before { + content: "\ea0a"; +} +.icon-scissors:before { + content: "\ea0b"; +} +.icon-share-alternitive:before { + content: "\ea0c"; +} +.icon-share:before { + content: "\ea0d"; +} +.icon-shareable:before { + content: "\ea0e"; +} +.icon-shield:before { + content: "\ea0f"; +} +.icon-shop:before { + content: "\ea10"; +} +.icon-shopping-bag:before { + content: "\ea11"; +} +.icon-shopping-basket:before { + content: "\ea12"; +} +.icon-shopping-cart:before { + content: "\ea13"; +} +.icon-shuffle:before { + content: "\ea14"; +} +.icon-signal:before { + content: "\ea15"; +} +.icon-sound-mix:before { + content: "\ea16"; +} +.icon-sports-club:before { + content: "\ea17"; +} +.icon-spreadsheet:before { + content: "\ea18"; +} +.icon-squared-cross:before { + content: "\ea19"; +} +.icon-squared-minus:before { + content: "\ea1a"; +} +.icon-squared-plus:before { + content: "\ea1b"; +} +.icon-star-outlined:before { + content: "\ea1c"; +} +.icon-star:before { + content: "\ea1d"; +} +.icon-stopwatch:before { + content: "\ea1e"; +} +.icon-suitcase:before { + content: "\ea1f"; +} +.icon-swap:before { + content: "\ea20"; +} +.icon-sweden:before { + content: "\ea21"; +} +.icon-switch:before { + content: "\ea22"; +} +.icon-tablet:before { + content: "\ea23"; +} +.icon-tag:before { + content: "\ea24"; +} +.icon-text-document-inverted:before { + content: "\ea25"; +} +.icon-text-document:before { + content: "\ea26"; +} +.icon-text:before { + content: "\ea27"; +} +.icon-thermometer:before { + content: "\ea28"; +} +.icon-thumbs-down:before { + content: "\ea29"; +} +.icon-thumbs-up:before { + content: "\ea2a"; +} +.icon-thunder-cloud:before { + content: "\ea2b"; +} +.icon-ticket:before { + content: "\ea2c"; +} +.icon-time-slot:before { + content: "\ea2d"; +} +.icon-tools:before { + content: "\ea2e"; +} +.icon-traffic-cone:before { + content: "\ea2f"; +} +.icon-tree:before { + content: "\ea30"; +} +.icon-trophy:before { + content: "\ea31"; +} +.icon-tv:before { + content: "\ea32"; +} +.icon-typing:before { + content: "\ea33"; +} +.icon-unread:before { + content: "\ea34"; +} +.icon-untag:before { + content: "\ea35"; +} +.icon-user:before { + content: "\ea36"; +} +.icon-users:before { + content: "\ea37"; +} +.icon-v-card:before { + content: "\ea38"; +} +.icon-video:before { + content: "\ea39"; +} +.icon-vinyl:before { + content: "\ea3a"; +} +.icon-voicemail:before { + content: "\ea3b"; +} +.icon-wallet:before { + content: "\ea3c"; +} +.icon-water:before { + content: "\ea3d"; +} +.icon-px-with-circle:before { + content: "\ea3e"; +} +.icon-px:before { + content: "\ea3f"; +} +.icon-basecamp:before { + content: "\ea40"; +} +.icon-behance:before { + content: "\ea41"; +} +.icon-creative-cloud:before { + content: "\ea42"; +} +.icon-dropbox:before { + content: "\ea43"; +} +.icon-evernote:before { + content: "\ea44"; +} +.icon-flattr:before { + content: "\ea45"; +} +.icon-foursquare:before { + content: "\ea46"; +} +.icon-google-drive:before { + content: "\ea47"; +} +.icon-google-hangouts:before { + content: "\ea48"; +} +.icon-grooveshark:before { + content: "\ea49"; +} +.icon-icloud:before { + content: "\ea4a"; +} +.icon-mixi:before { + content: "\ea4b"; +} +.icon-onedrive:before { + content: "\ea4c"; +} +.icon-paypal:before { + content: "\ea4d"; +} +.icon-picasa:before { + content: "\ea4e"; +} +.icon-qq:before { + content: "\ea4f"; +} +.icon-rdio-with-circle:before { + content: "\ea50"; +} +.icon-renren:before { + content: "\ea51"; +} +.icon-scribd:before { + content: "\ea52"; +} +.icon-sina-weibo:before { + content: "\ea53"; +} +.icon-skype-with-circle:before { + content: "\ea54"; +} +.icon-skype:before { + content: "\ea55"; +} +.icon-slideshare:before { + content: "\ea56"; +} +.icon-smashing:before { + content: "\ea57"; +} +.icon-soundcloud:before { + content: "\ea58"; +} +.icon-spotify-with-circle:before { + content: "\ea59"; +} +.icon-spotify:before { + content: "\ea5a"; +} +.icon-swarm:before { + content: "\ea5b"; +} +.icon-vine-with-circle:before { + content: "\ea5c"; +} +.icon-vine:before { + content: "\ea5d"; +} +.icon-vk-alternitive:before { + content: "\ea5e"; +} +.icon-vk-with-circle:before { + content: "\ea5f"; +} +.icon-vk:before { + content: "\ea60"; +} +.icon-xing-with-circle:before { + content: "\ea61"; +} +.icon-xing:before { + content: "\ea62"; +} +.icon-yelp:before { + content: "\ea63"; +} +.icon-dribbble-with-circle:before { + content: "\ea64"; +} +.icon-dribbble:before { + content: "\ea65"; +} +.icon-facebook-with-circle:before { + content: "\ea66"; +} +.icon-facebook:before { + content: "\ea67"; +} +.icon-flickr-with-circle:before { + content: "\ea68"; +} +.icon-flickr:before { + content: "\ea69"; +} +.icon-github-with-circle:before { + content: "\ea6a"; +} +.icon-github:before { + content: "\ea6b"; +} +.icon-google-with-circle:before { + content: "\ea6c"; +} +.icon-google:before { + content: "\ea6d"; +} +.icon-instagram-with-circle:before { + content: "\ea6e"; +} +.icon-instagram:before { + content: "\ea6f"; +} +.icon-lastfm-with-circle:before { + content: "\ea70"; +} +.icon-lastfm:before { + content: "\ea71"; +} +.icon-linkedin-with-circle:before { + content: "\ea72"; +} +.icon-linkedin:before { + content: "\ea73"; +} +.icon-pinterest-with-circle:before { + content: "\ea74"; +} +.icon-pinterest:before { + content: "\ea75"; +} +.icon-rdio:before { + content: "\ea76"; +} +.icon-stumbleupon-with-circle:before { + content: "\ea77"; +} +.icon-stumbleupon:before { + content: "\ea78"; +} +.icon-tumblr-with-circle:before { + content: "\ea79"; +} +.icon-tumblr:before { + content: "\ea7a"; +} +.icon-twitter-with-circle:before { + content: "\ea7b"; +} +.icon-twitter:before { + content: "\ea7c"; +} +.icon-vimeo-with-circle:before { + content: "\ea7d"; +} +.icon-vimeo:before { + content: "\ea7e"; +} +.icon-youtube-with-circle:before { + content: "\ea7f"; +} +.icon-youtube:before { + content: "\ea80"; +} +.icon-eye3:before { + content: "\e000"; +} +.icon-paper-clip:before { + content: "\e001"; +} +.icon-mail2:before { + content: "\e002"; +} +.icon-toggle:before { + content: "\e003"; +} +.icon-layout:before { + content: "\e004"; +} +.icon-link2:before { + content: "\e005"; +} +.icon-bell3:before { + content: "\e006"; +} +.icon-lock2:before { + content: "\e007"; +} +.icon-unlock:before { + content: "\e008"; +} +.icon-ribbon:before { + content: "\e009"; +} +.icon-image3:before { + content: "\e010"; +} +.icon-signal2:before { + content: "\e011"; +} +.icon-target2:before { + content: "\e012"; +} +.icon-clipboard2:before { + content: "\e013"; +} +.icon-clock3:before { + content: "\e014"; +} +.icon-watch:before { + content: "\e015"; +} +.icon-air-play:before { + content: "\e016"; +} +.icon-camera3:before { + content: "\e017"; +} +.icon-video2:before { + content: "\e018"; +} +.icon-disc:before { + content: "\e019"; +} +.icon-printer2:before { + content: "\e020"; +} +.icon-monitor2:before { + content: "\e021"; +} +.icon-server:before { + content: "\e022"; +} +.icon-cog3:before { + content: "\e023"; +} +.icon-heart3:before { + content: "\e024"; +} +.icon-paragraph:before { + content: "\e025"; +} +.icon-align-justify:before { + content: "\e026"; +} +.icon-align-left2:before { + content: "\e027"; +} +.icon-align-center:before { + content: "\e028"; +} +.icon-align-right2:before { + content: "\e029"; +} +.icon-book3:before { + content: "\e030"; +} +.icon-layers2:before { + content: "\e031"; +} +.icon-stack:before { + content: "\e032"; +} +.icon-stack-2:before { + content: "\e033"; +} +.icon-paper:before { + content: "\e034"; +} +.icon-paper-stack:before { + content: "\e035"; +} +.icon-search2:before { + content: "\e036"; +} +.icon-zoom-in:before { + content: "\e037"; +} +.icon-zoom-out:before { + content: "\e038"; +} +.icon-reply3:before { + content: "\e039"; +} +.icon-circle-plus:before { + content: "\e040"; +} +.icon-circle-minus:before { + content: "\e041"; +} +.icon-circle-check:before { + content: "\e042"; +} +.icon-circle-cross:before { + content: "\e043"; +} +.icon-square-plus:before { + content: "\e044"; +} +.icon-square-minus:before { + content: "\e045"; +} +.icon-square-check:before { + content: "\e046"; +} +.icon-square-cross:before { + content: "\e047"; +} +.icon-microphone2:before { + content: "\e048"; +} +.icon-record:before { + content: "\e049"; +} +.icon-skip-back:before { + content: "\e050"; +} +.icon-rewind:before { + content: "\e051"; +} +.icon-play2:before { + content: "\e052"; +} +.icon-pause:before { + content: "\e053"; +} +.icon-stop:before { + content: "\e054"; +} +.icon-fast-forward2:before { + content: "\e055"; +} +.icon-skip-forward:before { + content: "\e056"; +} +.icon-shuffle2:before { + content: "\e057"; +} +.icon-repeat:before { + content: "\e058"; +} +.icon-folder3:before { + content: "\e059"; +} +.icon-umbrella:before { + content: "\e060"; +} +.icon-moon3:before { + content: "\e061"; +} +.icon-thermometer2:before { + content: "\e062"; +} +.icon-drop2:before { + content: "\e063"; +} +.icon-sun2:before { + content: "\e064"; +} +.icon-cloud3:before { + content: "\e065"; +} +.icon-cloud-upload:before { + content: "\e066"; +} +.icon-cloud-download:before { + content: "\e067"; +} +.icon-upload3:before { + content: "\e068"; +} +.icon-download3:before { + content: "\e069"; +} +.icon-location3:before { + content: "\e070"; +} +.icon-location-2:before { + content: "\e071"; +} +.icon-map2:before { + content: "\e072"; +} +.icon-battery2:before { + content: "\e073"; +} +.icon-head:before { + content: "\e074"; +} +.icon-briefcase2:before { + content: "\e075"; +} +.icon-speech-bubble:before { + content: "\e076"; +} +.icon-anchor:before { + content: "\e077"; +} +.icon-globe2:before { + content: "\e078"; +} +.icon-box3:before { + content: "\e079"; +} +.icon-reload:before { + content: "\e080"; +} +.icon-share2:before { + content: "\e081"; +} +.icon-marquee:before { + content: "\e082"; +} +.icon-marquee-plus:before { + content: "\e083"; +} +.icon-marquee-minus:before { + content: "\e084"; +} +.icon-tag3:before { + content: "\e085"; +} +.icon-power:before { + content: "\e086"; +} +.icon-command:before { + content: "\e087"; +} +.icon-alt:before { + content: "\e088"; +} +.icon-esc:before { + content: "\e089"; +} +.icon-bar-graph2:before { + content: "\e090"; +} +.icon-bar-graph-2:before { + content: "\e091"; +} +.icon-pie-graph:before { + content: "\e092"; +} +.icon-star2:before { + content: "\e093"; +} +.icon-arrow-left2:before { + content: "\e094"; +} +.icon-arrow-right2:before { + content: "\e095"; +} +.icon-arrow-up2:before { + content: "\e096"; +} +.icon-arrow-down2:before { + content: "\e097"; +} +.icon-volume:before { + content: "\e098"; +} +.icon-mute:before { + content: "\e099"; +} +.icon-content-right:before { + content: "\e100"; +} +.icon-content-left:before { + content: "\e101"; +} +.icon-grid2:before { + content: "\e102"; +} +.icon-grid-2:before { + content: "\e103"; +} +.icon-columns:before { + content: "\e104"; +} +.icon-loader:before { + content: "\e105"; +} +.icon-bag:before { + content: "\e106"; +} +.icon-ban:before { + content: "\e107"; +} +.icon-flag3:before { + content: "\e108"; +} +.icon-trash3:before { + content: "\e109"; +} +.icon-expand:before { + content: "\e110"; +} +.icon-contract:before { + content: "\e111"; +} +.icon-maximize:before { + content: "\e112"; +} +.icon-minimize:before { + content: "\e113"; +} +.icon-plus3:before { + content: "\e114"; +} +.icon-minus2:before { + content: "\e115"; +} +.icon-check2:before { + content: "\e116"; +} +.icon-cross3:before { + content: "\e117"; +} +.icon-move:before { + content: "\e118"; +} +.icon-delete:before { + content: "\e119"; +} +.icon-menu2:before { + content: "\e120"; +} +.icon-archive2:before { + content: "\e121"; +} +.icon-inbox2:before { + content: "\e122"; +} +.icon-outbox:before { + content: "\e123"; +} +.icon-file:before { + content: "\e124"; +} +.icon-file-add:before { + content: "\e125"; +} +.icon-file-subtract:before { + content: "\e126"; +} +.icon-help2:before { + content: "\e127"; +} +.icon-open:before { + content: "\e128"; +} +.icon-ellipsis:before { + content: "\e129"; +} + diff --git a/tests/demo/site/css/magnific-popup.css b/tests/demo/site/css/magnific-popup.css new file mode 100644 index 00000000..06615782 --- /dev/null +++ b/tests/demo/site/css/magnific-popup.css @@ -0,0 +1,368 @@ +/* Magnific Popup CSS */ +.mfp-bg { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1042; + overflow: hidden; + position: fixed; + background: #0b0b0b; + opacity: 0.8; + filter: alpha(opacity=80); } + +.mfp-wrap { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1043; + position: fixed; + outline: none !important; + -webkit-backface-visibility: hidden; } + +.mfp-container { + text-align: center; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + padding: 0 8px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +.mfp-container:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +.mfp-align-top .mfp-container:before { + display: none; } + +.mfp-content { + position: relative; + display: inline-block; + vertical-align: middle; + margin: 0 auto; + text-align: left; + z-index: 1045; } + +.mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content { + width: 100%; + cursor: auto; } + +.mfp-ajax-cur { + cursor: progress; } + +.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { + cursor: -moz-zoom-out; + cursor: -webkit-zoom-out; + cursor: zoom-out; } + +.mfp-zoom { + cursor: pointer; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + cursor: zoom-in; } + +.mfp-auto-cursor .mfp-content { + cursor: auto; } + +.mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; } + +.mfp-loading.mfp-figure { + display: none; } + +.mfp-hide { + display: none !important; } + +.mfp-preloader { + color: #cccccc; + position: absolute; + top: 50%; + width: auto; + text-align: center; + margin-top: -0.8em; + left: 8px; + right: 8px; + z-index: 1044; } + .mfp-preloader a { + color: #cccccc; } + .mfp-preloader a:hover { + color: white; } + +.mfp-s-ready .mfp-preloader { + display: none; } + +.mfp-s-error .mfp-content { + display: none; } + +button.mfp-close, button.mfp-arrow { + overflow: visible; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + display: block; + outline: none; + padding: 0; + z-index: 1046; + -webkit-box-shadow: none; + box-shadow: none; } +button::-moz-focus-inner { + padding: 0; + border: 0; } + +.mfp-close { + width: 44px; + height: 44px; + line-height: 44px; + position: absolute; + right: 0; + top: 0; + text-decoration: none; + text-align: center; + opacity: 0.65; + filter: alpha(opacity=65); + padding: 0 0 18px 10px; + color: white; + font-style: normal; + font-size: 28px; + font-family: Arial, Baskerville, monospace; } + .mfp-close:hover, .mfp-close:focus { + opacity: 1; + filter: alpha(opacity=100); } + .mfp-close:active { + top: 1px; } + +.mfp-close-btn-in .mfp-close { + color: #333333; } + +.mfp-image-holder .mfp-close, .mfp-iframe-holder .mfp-close { + color: white; + right: -6px; + text-align: right; + padding-right: 6px; + width: 100%; } + +.mfp-counter { + position: absolute; + top: 0; + right: 0; + color: #cccccc; + font-size: 12px; + line-height: 18px; } + +.mfp-arrow { + position: absolute; + opacity: 0.65; + filter: alpha(opacity=65); + margin: 0; + top: 50%; + margin-top: -55px; + padding: 0; + width: 90px; + height: 110px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + .mfp-arrow:active { + margin-top: -54px; } + .mfp-arrow:hover, .mfp-arrow:focus { + opacity: 1; + filter: alpha(opacity=100); } + .mfp-arrow:before, .mfp-arrow:after, .mfp-arrow .mfp-b, .mfp-arrow .mfp-a { + content: ''; + display: block; + width: 0; + height: 0; + position: absolute; + left: 0; + top: 0; + margin-top: 35px; + margin-left: 35px; + border: medium inset transparent; } + .mfp-arrow:after, .mfp-arrow .mfp-a { + border-top-width: 13px; + border-bottom-width: 13px; + top: 8px; } + .mfp-arrow:before, .mfp-arrow .mfp-b { + border-top-width: 21px; + border-bottom-width: 21px; + opacity: 0.7; } + +.mfp-arrow-left { + left: 0; } + .mfp-arrow-left:after, .mfp-arrow-left .mfp-a { + border-right: 17px solid white; + margin-left: 31px; } + .mfp-arrow-left:before, .mfp-arrow-left .mfp-b { + margin-left: 25px; + border-right: 27px solid #3f3f3f; } + +.mfp-arrow-right { + right: 0; } + .mfp-arrow-right:after, .mfp-arrow-right .mfp-a { + border-left: 17px solid white; + margin-left: 39px; } + .mfp-arrow-right:before, .mfp-arrow-right .mfp-b { + border-left: 27px solid #3f3f3f; } + +.mfp-iframe-holder { + padding-top: 40px; + padding-bottom: 40px; } + .mfp-iframe-holder .mfp-content { + line-height: 0; + width: 100%; + max-width: 900px; } + .mfp-iframe-holder .mfp-close { + top: -40px; } + +.mfp-iframe-scaler { + width: 100%; + height: 0; + overflow: hidden; + padding-top: 56.25%; } + .mfp-iframe-scaler iframe { + position: absolute; + display: block; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: black; } + +/* Main image in popup */ +img.mfp-img { + width: auto; + max-width: 100%; + height: auto; + display: block; + line-height: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 40px 0 40px; + margin: 0 auto; } + +/* The shadow behind the image */ +.mfp-figure { + line-height: 0; } + .mfp-figure:after { + content: ''; + position: absolute; + left: 0; + top: 40px; + bottom: 40px; + display: block; + right: 0; + width: auto; + height: auto; + z-index: -1; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #444444; } + .mfp-figure small { + color: #bdbdbd; + display: block; + font-size: 12px; + line-height: 14px; } + .mfp-figure figure { + margin: 0; } + +.mfp-bottom-bar { + margin-top: -36px; + position: absolute; + top: 100%; + left: 0; + width: 100%; + cursor: auto; } + +.mfp-title { + text-align: left; + line-height: 18px; + color: #f3f3f3; + word-wrap: break-word; + padding-right: 36px; } + +.mfp-image-holder .mfp-content { + max-width: 100%; } + +.mfp-gallery .mfp-image-holder .mfp-figure { + cursor: pointer; } + +@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { + /** + * Remove all paddings around the image on small screen + */ + .mfp-img-mobile .mfp-image-holder { + padding-left: 0; + padding-right: 0; } + .mfp-img-mobile img.mfp-img { + padding: 0; } + .mfp-img-mobile .mfp-figure:after { + top: 0; + bottom: 0; } + .mfp-img-mobile .mfp-figure small { + display: inline; + margin-left: 5px; } + .mfp-img-mobile .mfp-bottom-bar { + background: rgba(0, 0, 0, 0.6); + bottom: 0; + margin: 0; + top: auto; + padding: 3px 5px; + position: fixed; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .mfp-img-mobile .mfp-bottom-bar:empty { + padding: 0; } + .mfp-img-mobile .mfp-counter { + right: 5px; + top: 3px; } + .mfp-img-mobile .mfp-close { + top: 0; + right: 0; + width: 35px; + height: 35px; + line-height: 35px; + background: rgba(0, 0, 0, 0.6); + position: fixed; + text-align: center; + padding: 0; } } + +@media all and (max-width: 900px) { + .mfp-arrow { + -webkit-transform: scale(0.75); + transform: scale(0.75); } + .mfp-arrow-left { + -webkit-transform-origin: 0; + transform-origin: 0; } + .mfp-arrow-right { + -webkit-transform-origin: 100%; + transform-origin: 100%; } + .mfp-container { + padding-left: 6px; + padding-right: 6px; } } + +.mfp-ie7 .mfp-img { + padding: 0; } +.mfp-ie7 .mfp-bottom-bar { + width: 600px; + left: 50%; + margin-left: -300px; + margin-top: 5px; + padding-bottom: 5px; } +.mfp-ie7 .mfp-container { + padding: 0; } +.mfp-ie7 .mfp-content { + padding-top: 44px; } +.mfp-ie7 .mfp-close { + top: 0; + right: 0; + padding-top: 0; } \ No newline at end of file diff --git a/tests/demo/site/css/salvattore.css b/tests/demo/site/css/salvattore.css new file mode 100644 index 00000000..dfa0c8f2 --- /dev/null +++ b/tests/demo/site/css/salvattore.css @@ -0,0 +1,57 @@ +/* + Spezific styling for salvattore + Feel free to edit it as you like + More info at http://salvattore.com + */ + +/* Base styles */ +.column { + float: left; +} +@media screen and (max-width: 480px) { + .column { + float: none; + position: relative; + clear: both; + } +} +.size-1of4 { + width: 25%; +} +.size-1of3 { + width: 33.333%; +} +.size-1of2 { + width: 50%; +} + + +#fh5co-board[data-columns]::before { + content: '4 .column.size-1of4'; +} + +/* Configurate salvattore with media queries */ +@media screen and (max-width: 450px) { + #fh5co-board[data-columns]::before { + content: '1 .column'; + } +} + +@media screen and (min-width: 451px) and (max-width: 700px) { + #fh5co-board[data-columns]::before { + content: '2 .column.size-1of2'; + } +} + +@media screen and (min-width: 701px) and (max-width: 850px) { + #fh5co-board[data-columns]::before { + content: '3 .column.size-1of3'; + } +} + +@media screen and (min-width: 851px) { + #fh5co-board[data-columns]::before { + content: '4 .column.size-1of4'; + } +} + diff --git a/tests/demo/site/css/style.css b/tests/demo/site/css/style.css new file mode 100644 index 00000000..9f03e6f4 --- /dev/null +++ b/tests/demo/site/css/style.css @@ -0,0 +1,829 @@ +@font-face { + font-family: 'icomoon'; + src: url("../fonts/icomoon/icomoon.eot?srf3rx"); + src: url("../fonts/icomoon/icomoon.eot?srf3rx#iefix") format("embedded-opentype"), url("../fonts/icomoon/icomoon.ttf?srf3rx") format("truetype"), url("../fonts/icomoon/icomoon.woff?srf3rx") format("woff"), url("../fonts/icomoon/icomoon.svg?srf3rx#icomoon") format("svg"); + font-weight: normal; + font-style: normal; +} +html { + background: #fff; +} + +body { + font-family: "Roboto", arial, sans-serif; + font-size: 18px; + font-weight: 300; + line-height: 1.8; + color: #222; + background: #fff; +} +body.fh5co-overflow { + overflow-x: auto; +} + +::-webkit-selection { + color: #fff; + background: #f7c873; +} + +::-moz-selection { + color: #fff; + background: #f7c873; +} + +::selection { + color: #fff; + background: #f7c873; +} + +a { + color: #f7c873; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +a:hover, a:focus, a:active { + color: #f3ac2b; + outline: none; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + font-family: "Playfair Display", times, serif; + color: #000; +} + +p { + margin-bottom: 30px; +} + +.btn { + margin-right: 4px; + margin-bottom: 4px; + font-family: "Playfair Display", times, serif; + font-size: 12px; + letter-spacing: 2px; + text-transform: uppercase; + font-weight: 700; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +.btn.btn-md { + padding: 10px 20px !important; +} +.btn.btn-lg { + padding: 18px 36px !important; +} +.btn:hover, .btn:active, .btn:focus { + box-shadow: none !important; + outline: none !important; +} + +.btn-primary { + background: #f7c873; + color: #fff; + border: 2px solid #f7c873; +} +.btn-primary:hover, .btn-primary:focus, .btn-primary:active { + background: #f6bf5b !important; + border-color: #f6bf5b !important; +} +.btn-primary.btn-outline { + background: transparent; + color: #f7c873; + border: 2px solid #f7c873; +} +.btn-primary.btn-outline:hover, .btn-primary.btn-outline:focus, .btn-primary.btn-outline:active { + background: #f7c873; + color: #fff; +} + +.btn-success { + background: #58ca7e; + color: #fff; + border: 2px solid #58ca7e; +} +.btn-success:hover, .btn-success:focus, .btn-success:active { + background: #45c46f !important; + border-color: #45c46f !important; +} +.btn-success.btn-outline { + background: transparent; + color: #58ca7e; + border: 2px solid #58ca7e; +} +.btn-success.btn-outline:hover, .btn-success.btn-outline:focus, .btn-success.btn-outline:active { + background: #58ca7e; + color: #fff; +} + +.btn-info { + background: #1784fb; + color: #fff; + border: 2px solid #1784fb; +} +.btn-info:hover, .btn-info:focus, .btn-info:active { + background: #0477f4 !important; + border-color: #0477f4 !important; +} +.btn-info.btn-outline { + background: transparent; + color: #1784fb; + border: 2px solid #1784fb; +} +.btn-info.btn-outline:hover, .btn-info.btn-outline:focus, .btn-info.btn-outline:active { + background: #1784fb; + color: #fff; +} + +.btn-warning { + background: #fed330; + color: #fff; + border: 2px solid #fed330; +} +.btn-warning:hover, .btn-warning:focus, .btn-warning:active { + background: #fece17 !important; + border-color: #fece17 !important; +} +.btn-warning.btn-outline { + background: transparent; + color: #fed330; + border: 2px solid #fed330; +} +.btn-warning.btn-outline:hover, .btn-warning.btn-outline:focus, .btn-warning.btn-outline:active { + background: #fed330; + color: #fff; +} + +.btn-danger { + background: #fb4f59; + color: #fff; + border: 2px solid #fb4f59; +} +.btn-danger:hover, .btn-danger:focus, .btn-danger:active { + background: #fa3641 !important; + border-color: #fa3641 !important; +} +.btn-danger.btn-outline { + background: transparent; + color: #fb4f59; + border: 2px solid #fb4f59; +} +.btn-danger.btn-outline:hover, .btn-danger.btn-outline:focus, .btn-danger.btn-outline:active { + background: #fb4f59; + color: #fff; +} + +.btn-outline { + background: none; + border: 2px solid gray; + font-size: 12px; + letter-spacing: 2px; + text-transform: uppercase; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; +} +.btn-outline:hover, .btn-outline:focus, .btn-outline:active { + box-shadow: none; +} + +.form-control { + box-shadow: none; + background: transparent; + border: 2px solid rgba(0, 0, 0, 0.1); + height: 54px; + font-size: 18px; + font-weight: 300; +} +.form-control:active, .form-control:focus { + outline: none; + box-shadow: none; + border-color: #f7c873; +} + +#fh5co-header { + padding: 3em 3em; + float: left; + width: 100%; +} +@media screen and (max-width: 1200px) { + #fh5co-header { + padding-left: 15px; + padding-right: 15px; + } +} +@media screen and (max-width: 480px) { + #fh5co-header { + padding-bottom: 5em !important; + } +} +#fh5co-header .fh5co-nav-toggle { + position: absolute; + top: 4.2em; + left: 3em; + z-index: 99; +} +@media screen and (max-width: 1200px) { + #fh5co-header .fh5co-nav-toggle { + top: 4em; + left: 15px; + } +} +@media screen and (max-width: 768px) { + #fh5co-header .fh5co-nav-toggle { + top: 2.5em; + left: 15px; + } +} +#fh5co-header .fh5co-social { + position: absolute !important; + right: 3em !important; + top: 3.2em; + z-index: 99; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +@media screen and (max-width: 1200px) { + #fh5co-header .fh5co-social { + right: 15px !important; + top: 3.2em; + } +} +@media screen and (max-width: 768px) { + #fh5co-header .fh5co-social { + right: 15px !important; + top: 1.5em; + } +} +@media screen and (max-width: 480px) { + #fh5co-header .fh5co-social { + right: inherit !important; + left: inherit !important; + top: 5em; + left: 50% !important; + margin-left: -50px; + } +} +@media screen and (max-width: 768px) { + #fh5co-header { + padding-top: 1.5em; + padding-bottom: 1.5em; + padding-left: 15px; + padding-right: 15px; + } +} +#fh5co-header #fh5co-logo { + text-align: center; +} +#fh5co-header #fh5co-logo a { + color: #000; +} +#fh5co-header #fh5co-logo a sup { + font-size: 20px; + top: -20px; +} + +.fh5co-post-prev, +.fh5co-post-next { + position: fixed; + z-index: 999; + top: 50%; + height: 50px; + margin-top: -25px; + color: #000; + text-transform: uppercase; + font-weight: bold; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +@media screen and (max-width: 768px) { + .fh5co-post-prev, + .fh5co-post-next { + position: relative; + text-align: center; + display: -moz-inline-stack; + display: inline-block; + zoom: 1; + *display: inline; + } +} +.fh5co-post-prev span, +.fh5co-post-next span { + vertical-align: base; + width: 100px; +} +.fh5co-post-prev span i, +.fh5co-post-next span i { + top: 7px; + position: relative; + font-size: 30px; + color: #000; +} + +.fh5co-post-prev { + left: 0; + margin-left: -25px; +} +.fh5co-post-prev:hover { + margin-left: 10px; + color: #000; +} +@media screen and (max-width: 768px) { + .fh5co-post-prev { + margin-left: 15px; + float: left; + } +} + +.fh5co-post-next { + right: 0; + margin-right: -25px; +} +.fh5co-post-next:hover { + margin-right: 10px; + color: #000; +} +@media screen and (max-width: 768px) { + .fh5co-post-next { + margin-right: 15px; + float: right; + } +} + +.fh5co-post-entry.single-entry .fh5co-article-title { + font-size: 80px; +} +@media screen and (max-width: 992px) { + .fh5co-post-entry.single-entry .fh5co-article-title { + font-size: 56px; + } +} +@media screen and (max-width: 768px) { + .fh5co-post-entry.single-entry .fh5co-article-title { + font-size: 34px; + } +} +.fh5co-post-entry article { + text-align: center; + float: left; + margin-bottom: 110px; + padding-left: 3em; + padding-right: 3em; +} +@media screen and (max-width: 1200px) { + .fh5co-post-entry article { + margin-bottom: 80px; + padding-left: 15px; + padding-right: 15px; + } +} +@media screen and (max-width: 992px) { + .fh5co-post-entry article { + margin-bottom: 80px; + padding-left: 15px; + padding-right: 15px; + } +} +@media screen and (max-width: 768px) { + .fh5co-post-entry article { + margin-bottom: 40px; + padding-left: 15px; + padding-right: 15px; + } +} +.fh5co-post-entry article a img { + opacity: 1; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +.fh5co-post-entry article a:hover img { + opacity: .4; +} +.fh5co-post-entry article figure { + margin-bottom: 30px; +} +.fh5co-post-entry article h2 { + font-family: "Playfair Display", times, serif; + font-size: 34px; + color: #000; + margin-bottom: 30px; +} +.fh5co-post-entry article h2 a { + color: #000; +} +@media screen and (max-width: 992px) { + .fh5co-post-entry article h2 { + font-size: 26px; + } +} +@media screen and (max-width: 768px) { + .fh5co-post-entry article h2 { + font-size: 24px; + margin-bottom: 20px; + } +} +.fh5co-post-entry article .fh5co-meta { + font-size: 16px; + font-family: "Roboto", arial, sans-serif; + color: #999999; + margin-bottom: 20px; + display: block; +} +@media screen and (max-width: 480px) { + .fh5co-post-entry article .fh5co-meta { + margin-bottom: 10px; + } +} +.fh5co-post-entry article .fh5co-meta.fh5co-date { + text-transform: uppercase; + letter-spacing: 2px; +} +.fh5co-post-entry article .content-article { + padding-top: 4em; +} +.fh5co-post-entry article .content-article a { + text-decoration: underline; +} +.fh5co-post-entry article .content-article blockquote { + border-left: none; + padding-left: 0; +} +.fh5co-post-entry article .content-article blockquote p { + font-family: "Playfair Display", times, serif; + font-size: 27px; + font-style: italic; + line-height: 1.5; +} +.fh5co-post-entry article .content-article blockquote p cite { + padding-top: 20px; + display: block; + font-size: 16px; + font-style: normal; + color: gray; +} +.fh5co-post-entry article .fh5co-highlight { + border: 4px solid #f2f2f2; + padding: 30px; + width: 100%; + margin-bottom: 30px; +} +.fh5co-post-entry article .fh5co-highlight.right { + float: right; + margin-left: 30px; +} +.fh5co-post-entry article .fh5co-highlight.left { + float: left; +} +.fh5co-post-entry article .fh5co-highlight h4 { + font-size: 14px; + letter-spacing: 2px; + color: #b3b3b3; + text-transform: uppercase; + font-family: "Roboto", arial, sans-serif; +} +.fh5co-post-entry article .fh5co-highlight p { + font-family: "Playfair Display", times, serif; + color: #000; + font-size: 20px; +} + +.fh5co-social { + padding: 0; + margin: 30px 0 0 0; + position: relative; +} +.fh5co-social li { + padding: 0; + margin: 0; + list-style: none; + display: inline; +} +.fh5co-social li a { + font-size: 20px; + padding: 4px; + color: #000; +} + +figure figcaption { + padding-top: 15px; + font-size: 14px; + color: #999999; +} + +#fh5co-offcanvas { + background: #fff; + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: 700px; + z-index: 99999; + overflow-y: auto; + opacity: 0; + display: none; +} +@media screen and (max-width: 768px) { + #fh5co-offcanvas { + padding-top: 30px; + width: 270px; + } +} +#fh5co-offcanvas .fh5co-close-offcanvas { + position: absolute; + top: 20px; + right: 20px; + font-size: 30px; + width: 30px; + overflow: hidden; + color: #cccccc; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; +} +@media screen and (max-width: 768px) { + #fh5co-offcanvas .fh5co-close-offcanvas { + top: 5px; + } +} +#fh5co-offcanvas .fh5co-close-offcanvas:hover { + width: 85px; + color: #000; +} +#fh5co-offcanvas .fh5co-close-offcanvas > span { + width: 100px; + display: -moz-inline-stack; + display: inline-block; + zoom: 1; + *display: inline; +} +#fh5co-offcanvas .fh5co-close-offcanvas > span > span { + top: 7px; + position: relative; + font-size: 18px; + vertical-align: top; +} +#fh5co-offcanvas .fh5co-box { + float: left; + margin-bottom: 30px; + width: 100%; +} +#fh5co-offcanvas .fh5co-menu, +#fh5co-offcanvas .fh5co-bio { + width: 50%; + padding: 50px; +} +@media screen and (max-width: 768px) { + #fh5co-offcanvas .fh5co-menu, + #fh5co-offcanvas .fh5co-bio { + width: 100%; + padding: 30px; + } +} +#fh5co-offcanvas .fh5co-bio { + text-align: center; + float: left; +} +#fh5co-offcanvas .fh5co-bio figure { + text-align: center; + display: block; + margin-bottom: 30px; +} +#fh5co-offcanvas .fh5co-bio img { + width: 180px; + margin: 0 auto; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; +} +#fh5co-offcanvas .fh5co-bio p { + font-size: 16px; +} +#fh5co-offcanvas .heading { + font-size: 16px; + letter-spacing: 2px; + text-transform: uppercase; + color: #cccccc; + margin-bottom: 30px; +} +#fh5co-offcanvas .fh5co-menu { + float: right; +} +#fh5co-offcanvas .fh5co-menu ul { + padding: 0; + margin: 0; +} +#fh5co-offcanvas .fh5co-menu ul li { + padding: 0; + margin: 0 0 10px 0; + list-style: none; + display: block; +} +#fh5co-offcanvas .fh5co-menu ul li a { + color: #000; +} + +#fh5co-footer { + padding: 3em 0; + text-align: center; +} + +.js .to-animate, .js +.to-animate-2, .js +.animate-box { + opacity: 0; +} + +.fh5co-nav-toggle { + width: 25px; + height: 25px; + cursor: pointer; + text-decoration: none; +} +.fh5co-nav-toggle.active i::before, .fh5co-nav-toggle.active i::after { + background: #f7c873; +} +.fh5co-nav-toggle:hover, .fh5co-nav-toggle:focus, .fh5co-nav-toggle:active { + outline: none; + border-bottom: none !important; +} +.fh5co-nav-toggle i { + position: relative; + display: -moz-inline-stack; + display: inline-block; + zoom: 1; + *display: inline; + width: 25px; + height: 3px; + color: #535659; + font: bold 14px/.4 Helvetica; + text-transform: uppercase; + text-indent: -55px; + background: #535659; + transition: all .2s ease-out; +} +.fh5co-nav-toggle i::before, .fh5co-nav-toggle i::after { + content: ''; + width: 25px; + height: 3px; + background: #535659; + position: absolute; + left: 0; + -webkit-transition: 0.2s; + -o-transition: 0.2s; + transition: 0.2s; +} + +.fh5co-nav-toggle i::before { + top: -7px; +} + +.fh5co-nav-toggle i::after { + bottom: -7px; +} + +.fh5co-nav-toggle:hover i::before { + top: -10px; +} + +.fh5co-nav-toggle:hover i::after { + bottom: -10px; +} + +.fh5co-nav-toggle.active i { + background: transparent; +} + +.fh5co-nav-toggle.active i::before { + top: 0; + -webkit-transform: rotateZ(45deg); + -moz-transform: rotateZ(45deg); + -ms-transform: rotateZ(45deg); + -o-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.fh5co-nav-toggle.active i::after { + bottom: 0; + -webkit-transform: rotateZ(-45deg); + -moz-transform: rotateZ(-45deg); + -ms-transform: rotateZ(-45deg); + -o-transform: rotateZ(-45deg); + transform: rotateZ(-45deg); +} + +.fh5co-nav-toggle { + position: absolute; + top: 18px; + left: 0; + z-index: 21; + padding: 6px 0 0 0; + display: block; + margin: 0 auto; + display: block; + height: 44px; + width: 25px; + border-bottom: none !important; +} +@media screen and (max-width: 768px) { + .fh5co-nav-toggle { + display: block; + } +} + +.fh5co-animated { + -webkit-animation-duration: .3s; + animation-duration: .3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.rp-b { + padding-bottom: 40px; +} + +.cp-l { + padding-left: 50px; +} +@media screen and (max-width: 992px) { + .cp-l { + padding-left: 15px; + } +} + +.cp-r { + padding-right: 50px; +} +@media screen and (max-width: 992px) { + .cp-r { + padding-right: 15px; + } +} + +@media screen and (max-width: 480px) { + .col-xxs-12 { + width: 100%; + float: none; + } +} + +#fh5co-board .item { + margin: 10px 10px 20px 10px; + background: #fff; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; + overflow: hidden; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); +} +#fh5co-board .item a { + display: block; +} +#fh5co-board .item .fh5co-desc { + padding: 20px; + float: left; + line-height: 24px; +} +#fh5co-board .item .fh5co-item-title { + font-family: "Montserrat", arial, sans-serif; + font-size: 17px; + line-height: 24px; + margin: 0; + padding: 0; +} +#fh5co-board .item img { + max-width: 100%; + -webkit-transition: 0.2s; + -o-transition: 0.2s; + transition: 0.2s; +} +#fh5co-board .item .fh5co-board-img { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + overflow: hidden; +} +#fh5co-board .item .image-popup:hover img { + opacity: .5; +} + +.js .animate-box { + opacity: 0; +} + +.fb-comments { + margin-left: 10%; + width: 80%; +} +/*# sourceMappingURL=style.css.map */ diff --git a/tests/demo/site/css/style.css.map b/tests/demo/site/css/style.css.map new file mode 100644 index 00000000..ce795e67 --- /dev/null +++ b/tests/demo/site/css/style.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../sass/style.scss","../sass/bootstrap/_variables.scss","../sass/bootstrap/mixins/_vendor-prefixes.scss"], +"names": [], +"file": "style.css" +} \ No newline at end of file diff --git a/tests/demo/site/fonts/icomoon/icomoon.eot b/tests/demo/site/fonts/icomoon/icomoon.eot new file mode 100755 index 00000000..f9f75645 Binary files /dev/null and b/tests/demo/site/fonts/icomoon/icomoon.eot differ diff --git a/tests/demo/site/fonts/icomoon/icomoon.svg b/tests/demo/site/fonts/icomoon/icomoon.svg new file mode 100755 index 00000000..6c5403a6 --- /dev/null +++ b/tests/demo/site/fonts/icomoon/icomoon.svg @@ -0,0 +1,525 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/demo/site/fonts/icomoon/icomoon.ttf b/tests/demo/site/fonts/icomoon/icomoon.ttf new file mode 100755 index 00000000..0b4c685f Binary files /dev/null and b/tests/demo/site/fonts/icomoon/icomoon.ttf differ diff --git a/tests/demo/site/fonts/icomoon/icomoon.woff b/tests/demo/site/fonts/icomoon/icomoon.woff new file mode 100755 index 00000000..ebf731b7 Binary files /dev/null and b/tests/demo/site/fonts/icomoon/icomoon.woff differ diff --git a/tests/demo/site/image/23903458785_35179dfac2_k-c076.jpg b/tests/demo/site/image/23903458785_35179dfac2_k-c076.jpg new file mode 100644 index 00000000..0f33abff Binary files /dev/null and b/tests/demo/site/image/23903458785_35179dfac2_k-c076.jpg differ diff --git a/tests/demo/site/image/5237956755_14ba1d3880_b-8d68.jpg b/tests/demo/site/image/5237956755_14ba1d3880_b-8d68.jpg new file mode 100644 index 00000000..c26e807c Binary files /dev/null and b/tests/demo/site/image/5237956755_14ba1d3880_b-8d68.jpg differ diff --git a/tests/demo/site/image/5238561864_86a3ccb678_b-7c9e.jpg b/tests/demo/site/image/5238561864_86a3ccb678_b-7c9e.jpg new file mode 100644 index 00000000..fdf20398 Binary files /dev/null and b/tests/demo/site/image/5238561864_86a3ccb678_b-7c9e.jpg differ diff --git a/tests/demo/site/image/header_australian_winter-aaaa_321x427-af09.jpg b/tests/demo/site/image/header_australian_winter-aaaa_321x427-af09.jpg new file mode 100644 index 00000000..f0edbe99 Binary files /dev/null and b/tests/demo/site/image/header_australian_winter-aaaa_321x427-af09.jpg differ diff --git a/tests/demo/site/images/abejs.jpg b/tests/demo/site/images/abejs.jpg new file mode 100644 index 00000000..46fe3c13 Binary files /dev/null and b/tests/demo/site/images/abejs.jpg differ diff --git a/tests/demo/site/images/greg.png b/tests/demo/site/images/greg.png new file mode 100644 index 00000000..dc2b2c46 Binary files /dev/null and b/tests/demo/site/images/greg.png differ diff --git a/tests/demo/site/images/img_1.jpg b/tests/demo/site/images/img_1.jpg new file mode 100644 index 00000000..fa956a53 Binary files /dev/null and b/tests/demo/site/images/img_1.jpg differ diff --git a/tests/demo/site/images/img_10.jpg b/tests/demo/site/images/img_10.jpg new file mode 100644 index 00000000..ac722602 Binary files /dev/null and b/tests/demo/site/images/img_10.jpg differ diff --git a/tests/demo/site/images/img_11.jpg b/tests/demo/site/images/img_11.jpg new file mode 100644 index 00000000..51bc1f35 Binary files /dev/null and b/tests/demo/site/images/img_11.jpg differ diff --git a/tests/demo/site/images/img_12.jpg b/tests/demo/site/images/img_12.jpg new file mode 100644 index 00000000..bab679a8 Binary files /dev/null and b/tests/demo/site/images/img_12.jpg differ diff --git a/tests/demo/site/images/img_13.jpg b/tests/demo/site/images/img_13.jpg new file mode 100644 index 00000000..7cdfae3d Binary files /dev/null and b/tests/demo/site/images/img_13.jpg differ diff --git a/tests/demo/site/images/img_14.jpg b/tests/demo/site/images/img_14.jpg new file mode 100644 index 00000000..06603adc Binary files /dev/null and b/tests/demo/site/images/img_14.jpg differ diff --git a/tests/demo/site/images/img_15.jpg b/tests/demo/site/images/img_15.jpg new file mode 100644 index 00000000..8bc37dac Binary files /dev/null and b/tests/demo/site/images/img_15.jpg differ diff --git a/tests/demo/site/images/img_16.jpg b/tests/demo/site/images/img_16.jpg new file mode 100644 index 00000000..7ec4f2d2 Binary files /dev/null and b/tests/demo/site/images/img_16.jpg differ diff --git a/tests/demo/site/images/img_17.jpg b/tests/demo/site/images/img_17.jpg new file mode 100644 index 00000000..a0ca90c6 Binary files /dev/null and b/tests/demo/site/images/img_17.jpg differ diff --git a/tests/demo/site/images/img_18.jpg b/tests/demo/site/images/img_18.jpg new file mode 100644 index 00000000..2734d6a1 Binary files /dev/null and b/tests/demo/site/images/img_18.jpg differ diff --git a/tests/demo/site/images/img_19.jpg b/tests/demo/site/images/img_19.jpg new file mode 100644 index 00000000..843b502f Binary files /dev/null and b/tests/demo/site/images/img_19.jpg differ diff --git a/tests/demo/site/images/img_2.jpg b/tests/demo/site/images/img_2.jpg new file mode 100644 index 00000000..045a6f39 Binary files /dev/null and b/tests/demo/site/images/img_2.jpg differ diff --git a/tests/demo/site/images/img_20.jpg b/tests/demo/site/images/img_20.jpg new file mode 100644 index 00000000..d29c580a Binary files /dev/null and b/tests/demo/site/images/img_20.jpg differ diff --git a/tests/demo/site/images/img_21.jpg b/tests/demo/site/images/img_21.jpg new file mode 100644 index 00000000..df0c02fa Binary files /dev/null and b/tests/demo/site/images/img_21.jpg differ diff --git a/tests/demo/site/images/img_22.jpg b/tests/demo/site/images/img_22.jpg new file mode 100644 index 00000000..f074a3a2 Binary files /dev/null and b/tests/demo/site/images/img_22.jpg differ diff --git a/tests/demo/site/images/img_23.jpg b/tests/demo/site/images/img_23.jpg new file mode 100644 index 00000000..212e15eb Binary files /dev/null and b/tests/demo/site/images/img_23.jpg differ diff --git a/tests/demo/site/images/img_24.jpg b/tests/demo/site/images/img_24.jpg new file mode 100644 index 00000000..3d1e46f7 Binary files /dev/null and b/tests/demo/site/images/img_24.jpg differ diff --git a/tests/demo/site/images/img_25.jpg b/tests/demo/site/images/img_25.jpg new file mode 100644 index 00000000..da84cdcd Binary files /dev/null and b/tests/demo/site/images/img_25.jpg differ diff --git a/tests/demo/site/images/img_26.jpg b/tests/demo/site/images/img_26.jpg new file mode 100644 index 00000000..927c625d Binary files /dev/null and b/tests/demo/site/images/img_26.jpg differ diff --git a/tests/demo/site/images/img_27.jpg b/tests/demo/site/images/img_27.jpg new file mode 100644 index 00000000..a9f424d4 Binary files /dev/null and b/tests/demo/site/images/img_27.jpg differ diff --git a/tests/demo/site/images/img_28.jpg b/tests/demo/site/images/img_28.jpg new file mode 100644 index 00000000..2b1d20e2 Binary files /dev/null and b/tests/demo/site/images/img_28.jpg differ diff --git a/tests/demo/site/images/img_29.jpg b/tests/demo/site/images/img_29.jpg new file mode 100644 index 00000000..e6466990 Binary files /dev/null and b/tests/demo/site/images/img_29.jpg differ diff --git a/tests/demo/site/images/img_29_large.jpg b/tests/demo/site/images/img_29_large.jpg new file mode 100644 index 00000000..cceb2def Binary files /dev/null and b/tests/demo/site/images/img_29_large.jpg differ diff --git a/tests/demo/site/images/img_3.jpg b/tests/demo/site/images/img_3.jpg new file mode 100644 index 00000000..6397d210 Binary files /dev/null and b/tests/demo/site/images/img_3.jpg differ diff --git a/tests/demo/site/images/img_30.jpg b/tests/demo/site/images/img_30.jpg new file mode 100644 index 00000000..e5114bbd Binary files /dev/null and b/tests/demo/site/images/img_30.jpg differ diff --git a/tests/demo/site/images/img_4.jpg b/tests/demo/site/images/img_4.jpg new file mode 100644 index 00000000..a5c4a213 Binary files /dev/null and b/tests/demo/site/images/img_4.jpg differ diff --git a/tests/demo/site/images/img_5.jpg b/tests/demo/site/images/img_5.jpg new file mode 100644 index 00000000..e4c7c2d0 Binary files /dev/null and b/tests/demo/site/images/img_5.jpg differ diff --git a/tests/demo/site/images/img_6.jpg b/tests/demo/site/images/img_6.jpg new file mode 100644 index 00000000..619684f9 Binary files /dev/null and b/tests/demo/site/images/img_6.jpg differ diff --git a/tests/demo/site/images/img_7.jpg b/tests/demo/site/images/img_7.jpg new file mode 100644 index 00000000..7362009d Binary files /dev/null and b/tests/demo/site/images/img_7.jpg differ diff --git a/tests/demo/site/images/img_8.jpg b/tests/demo/site/images/img_8.jpg new file mode 100644 index 00000000..d6bfea73 Binary files /dev/null and b/tests/demo/site/images/img_8.jpg differ diff --git a/tests/demo/site/images/img_9.jpg b/tests/demo/site/images/img_9.jpg new file mode 100644 index 00000000..7804eb6b Binary files /dev/null and b/tests/demo/site/images/img_9.jpg differ diff --git a/tests/demo/site/images/loader.gif b/tests/demo/site/images/loader.gif new file mode 100644 index 00000000..41bae588 Binary files /dev/null and b/tests/demo/site/images/loader.gif differ diff --git a/tests/demo/site/images/pic_1.jpg b/tests/demo/site/images/pic_1.jpg new file mode 100644 index 00000000..213c2aa4 Binary files /dev/null and b/tests/demo/site/images/pic_1.jpg differ diff --git a/tests/demo/site/images/pic_2.jpg b/tests/demo/site/images/pic_2.jpg new file mode 100644 index 00000000..3cc55b0c Binary files /dev/null and b/tests/demo/site/images/pic_2.jpg differ diff --git a/tests/demo/site/images/pic_3.jpg b/tests/demo/site/images/pic_3.jpg new file mode 100644 index 00000000..bf8d7e98 Binary files /dev/null and b/tests/demo/site/images/pic_3.jpg differ diff --git a/tests/demo/site/images/pic_4.jpg b/tests/demo/site/images/pic_4.jpg new file mode 100644 index 00000000..2250bbce Binary files /dev/null and b/tests/demo/site/images/pic_4.jpg differ diff --git a/tests/demo/site/images/pic_5.jpg b/tests/demo/site/images/pic_5.jpg new file mode 100644 index 00000000..94375036 Binary files /dev/null and b/tests/demo/site/images/pic_5.jpg differ diff --git a/tests/demo/site/images/pic_6.jpg b/tests/demo/site/images/pic_6.jpg new file mode 100644 index 00000000..6069a40c Binary files /dev/null and b/tests/demo/site/images/pic_6.jpg differ diff --git a/tests/demo/site/images/pic_7.jpg b/tests/demo/site/images/pic_7.jpg new file mode 100644 index 00000000..2aa93958 Binary files /dev/null and b/tests/demo/site/images/pic_7.jpg differ diff --git a/tests/demo/site/images/pic_8.jpg b/tests/demo/site/images/pic_8.jpg new file mode 100644 index 00000000..aabcc480 Binary files /dev/null and b/tests/demo/site/images/pic_8.jpg differ diff --git a/tests/demo/site/images/single_1.jpg b/tests/demo/site/images/single_1.jpg new file mode 100644 index 00000000..2b60dfc9 Binary files /dev/null and b/tests/demo/site/images/single_1.jpg differ diff --git a/tests/demo/site/index.html b/tests/demo/site/index.html new file mode 100644 index 00000000..11d26004 --- /dev/null +++ b/tests/demo/site/index.html @@ -0,0 +1,123 @@ + + + + + + + + + + Abejs demo website + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/demo/site/js/bootstrap.min.js b/tests/demo/site/js/bootstrap.min.js new file mode 100644 index 00000000..133aeecb --- /dev/null +++ b/tests/demo/site/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/tests/demo/site/js/jquery.easing.1.3.js b/tests/demo/site/js/jquery.easing.1.3.js new file mode 100644 index 00000000..2c8f71ca --- /dev/null +++ b/tests/demo/site/js/jquery.easing.1.3.js @@ -0,0 +1,205 @@ +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright © 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +jQuery.easing['jswing'] = jQuery.easing['swing']; + +jQuery.extend( jQuery.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert(jQuery.easing.default); + return jQuery.easing[jQuery.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright © 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ \ No newline at end of file diff --git a/tests/demo/site/js/jquery.magnific-popup.min.js b/tests/demo/site/js/jquery.magnific-popup.min.js new file mode 100644 index 00000000..4e3e16ff --- /dev/null +++ b/tests/demo/site/js/jquery.magnific-popup.min.js @@ -0,0 +1,4 @@ +/*! Magnific Popup - v0.9.9 - 2014-09-06 +* http://dimsemenov.com/plugins/magnific-popup/ +* Copyright (c) 2014 Dmitry Semenov; */ +(function(e){var t,n,i,o,r,a,s,l="Close",c="BeforeClose",d="AfterClose",u="BeforeAppend",p="MarkupParse",f="Open",m="Change",g="mfp",h="."+g,v="mfp-ready",C="mfp-removing",y="mfp-prevent-close",w=function(){},b=!!window.jQuery,I=e(window),x=function(e,n){t.ev.on(g+e+h,n)},k=function(t,n,i,o){var r=document.createElement("div");return r.className="mfp-"+t,i&&(r.innerHTML=i),o?n&&n.appendChild(r):(r=e(r),n&&r.appendTo(n)),r},T=function(n,i){t.ev.triggerHandler(g+n,i),t.st.callbacks&&(n=n.charAt(0).toLowerCase()+n.slice(1),t.st.callbacks[n]&&t.st.callbacks[n].apply(t,e.isArray(i)?i:[i]))},E=function(n){return n===s&&t.currTemplate.closeBtn||(t.currTemplate.closeBtn=e(t.st.closeMarkup.replace("%title%",t.st.tClose)),s=n),t.currTemplate.closeBtn},_=function(){e.magnificPopup.instance||(t=new w,t.init(),e.magnificPopup.instance=t)},S=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1};w.prototype={constructor:w,init:function(){var n=navigator.appVersion;t.isIE7=-1!==n.indexOf("MSIE 7."),t.isIE8=-1!==n.indexOf("MSIE 8."),t.isLowIE=t.isIE7||t.isIE8,t.isAndroid=/android/gi.test(n),t.isIOS=/iphone|ipad|ipod/gi.test(n),t.supportsTransition=S(),t.probablyMobile=t.isAndroid||t.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),o=e(document),t.popupsCache={}},open:function(n){i||(i=e(document.body));var r;if(n.isObj===!1){t.items=n.items.toArray(),t.index=0;var s,l=n.items;for(r=0;l.length>r;r++)if(s=l[r],s.parsed&&(s=s.el[0]),s===n.el[0]){t.index=r;break}}else t.items=e.isArray(n.items)?n.items:[n.items],t.index=n.index||0;if(t.isOpen)return t.updateItemHTML(),void 0;t.types=[],a="",t.ev=n.mainEl&&n.mainEl.length?n.mainEl.eq(0):o,n.key?(t.popupsCache[n.key]||(t.popupsCache[n.key]={}),t.currTemplate=t.popupsCache[n.key]):t.currTemplate={},t.st=e.extend(!0,{},e.magnificPopup.defaults,n),t.fixedContentPos="auto"===t.st.fixedContentPos?!t.probablyMobile:t.st.fixedContentPos,t.st.modal&&(t.st.closeOnContentClick=!1,t.st.closeOnBgClick=!1,t.st.showCloseBtn=!1,t.st.enableEscapeKey=!1),t.bgOverlay||(t.bgOverlay=k("bg").on("click"+h,function(){t.close()}),t.wrap=k("wrap").attr("tabindex",-1).on("click"+h,function(e){t._checkIfClose(e.target)&&t.close()}),t.container=k("container",t.wrap)),t.contentContainer=k("content"),t.st.preloader&&(t.preloader=k("preloader",t.container,t.st.tLoading));var c=e.magnificPopup.modules;for(r=0;c.length>r;r++){var d=c[r];d=d.charAt(0).toUpperCase()+d.slice(1),t["init"+d].call(t)}T("BeforeOpen"),t.st.showCloseBtn&&(t.st.closeBtnInside?(x(p,function(e,t,n,i){n.close_replaceWith=E(i.type)}),a+=" mfp-close-btn-in"):t.wrap.append(E())),t.st.alignTop&&(a+=" mfp-align-top"),t.fixedContentPos?t.wrap.css({overflow:t.st.overflowY,overflowX:"hidden",overflowY:t.st.overflowY}):t.wrap.css({top:I.scrollTop(),position:"absolute"}),(t.st.fixedBgPos===!1||"auto"===t.st.fixedBgPos&&!t.fixedContentPos)&&t.bgOverlay.css({height:o.height(),position:"absolute"}),t.st.enableEscapeKey&&o.on("keyup"+h,function(e){27===e.keyCode&&t.close()}),I.on("resize"+h,function(){t.updateSize()}),t.st.closeOnContentClick||(a+=" mfp-auto-cursor"),a&&t.wrap.addClass(a);var u=t.wH=I.height(),m={};if(t.fixedContentPos&&t._hasScrollBar(u)){var g=t._getScrollbarSize();g&&(m.marginRight=g)}t.fixedContentPos&&(t.isIE7?e("body, html").css("overflow","hidden"):m.overflow="hidden");var C=t.st.mainClass;return t.isIE7&&(C+=" mfp-ie7"),C&&t._addClassToMFP(C),t.updateItemHTML(),T("BuildControls"),e("html").css(m),t.bgOverlay.add(t.wrap).prependTo(t.st.prependTo||i),t._lastFocusedEl=document.activeElement,setTimeout(function(){t.content?(t._addClassToMFP(v),t._setFocus()):t.bgOverlay.addClass(v),o.on("focusin"+h,t._onFocusIn)},16),t.isOpen=!0,t.updateSize(u),T(f),n},close:function(){t.isOpen&&(T(c),t.isOpen=!1,t.st.removalDelay&&!t.isLowIE&&t.supportsTransition?(t._addClassToMFP(C),setTimeout(function(){t._close()},t.st.removalDelay)):t._close())},_close:function(){T(l);var n=C+" "+v+" ";if(t.bgOverlay.detach(),t.wrap.detach(),t.container.empty(),t.st.mainClass&&(n+=t.st.mainClass+" "),t._removeClassFromMFP(n),t.fixedContentPos){var i={marginRight:""};t.isIE7?e("body, html").css("overflow",""):i.overflow="",e("html").css(i)}o.off("keyup"+h+" focusin"+h),t.ev.off(h),t.wrap.attr("class","mfp-wrap").removeAttr("style"),t.bgOverlay.attr("class","mfp-bg"),t.container.attr("class","mfp-container"),!t.st.showCloseBtn||t.st.closeBtnInside&&t.currTemplate[t.currItem.type]!==!0||t.currTemplate.closeBtn&&t.currTemplate.closeBtn.detach(),t._lastFocusedEl&&e(t._lastFocusedEl).focus(),t.currItem=null,t.content=null,t.currTemplate=null,t.prevHeight=0,T(d)},updateSize:function(e){if(t.isIOS){var n=document.documentElement.clientWidth/window.innerWidth,i=window.innerHeight*n;t.wrap.css("height",i),t.wH=i}else t.wH=e||I.height();t.fixedContentPos||t.wrap.css("height",t.wH),T("Resize")},updateItemHTML:function(){var n=t.items[t.index];t.contentContainer.detach(),t.content&&t.content.detach(),n.parsed||(n=t.parseEl(t.index));var i=n.type;if(T("BeforeChange",[t.currItem?t.currItem.type:"",i]),t.currItem=n,!t.currTemplate[i]){var o=t.st[i]?t.st[i].markup:!1;T("FirstMarkupParse",o),t.currTemplate[i]=o?e(o):!0}r&&r!==n.type&&t.container.removeClass("mfp-"+r+"-holder");var a=t["get"+i.charAt(0).toUpperCase()+i.slice(1)](n,t.currTemplate[i]);t.appendContent(a,i),n.preloaded=!0,T(m,n),r=n.type,t.container.prepend(t.contentContainer),T("AfterChange")},appendContent:function(e,n){t.content=e,e?t.st.showCloseBtn&&t.st.closeBtnInside&&t.currTemplate[n]===!0?t.content.find(".mfp-close").length||t.content.append(E()):t.content=e:t.content="",T(u),t.container.addClass("mfp-"+n+"-holder"),t.contentContainer.append(t.content)},parseEl:function(n){var i,o=t.items[n];if(o.tagName?o={el:e(o)}:(i=o.type,o={data:o,src:o.src}),o.el){for(var r=t.types,a=0;r.length>a;a++)if(o.el.hasClass("mfp-"+r[a])){i=r[a];break}o.src=o.el.attr("data-mfp-src"),o.src||(o.src=o.el.attr("href"))}return o.type=i||t.st.type||"inline",o.index=n,o.parsed=!0,t.items[n]=o,T("ElementParse",o),t.items[n]},addGroup:function(e,n){var i=function(i){i.mfpEl=this,t._openClick(i,e,n)};n||(n={});var o="click.magnificPopup";n.mainEl=e,n.items?(n.isObj=!0,e.off(o).on(o,i)):(n.isObj=!1,n.delegate?e.off(o).on(o,n.delegate,i):(n.items=e,e.off(o).on(o,i)))},_openClick:function(n,i,o){var r=void 0!==o.midClick?o.midClick:e.magnificPopup.defaults.midClick;if(r||2!==n.which&&!n.ctrlKey&&!n.metaKey){var a=void 0!==o.disableOn?o.disableOn:e.magnificPopup.defaults.disableOn;if(a)if(e.isFunction(a)){if(!a.call(t))return!0}else if(a>I.width())return!0;n.type&&(n.preventDefault(),t.isOpen&&n.stopPropagation()),o.el=e(n.mfpEl),o.delegate&&(o.items=i.find(o.delegate)),t.open(o)}},updateStatus:function(e,i){if(t.preloader){n!==e&&t.container.removeClass("mfp-s-"+n),i||"loading"!==e||(i=t.st.tLoading);var o={status:e,text:i};T("UpdateStatus",o),e=o.status,i=o.text,t.preloader.html(i),t.preloader.find("a").on("click",function(e){e.stopImmediatePropagation()}),t.container.addClass("mfp-s-"+e),n=e}},_checkIfClose:function(n){if(!e(n).hasClass(y)){var i=t.st.closeOnContentClick,o=t.st.closeOnBgClick;if(i&&o)return!0;if(!t.content||e(n).hasClass("mfp-close")||t.preloader&&n===t.preloader[0])return!0;if(n===t.content[0]||e.contains(t.content[0],n)){if(i)return!0}else if(o&&e.contains(document,n))return!0;return!1}},_addClassToMFP:function(e){t.bgOverlay.addClass(e),t.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),t.wrap.removeClass(e)},_hasScrollBar:function(e){return(t.isIE7?o.height():document.body.scrollHeight)>(e||I.height())},_setFocus:function(){(t.st.focus?t.content.find(t.st.focus).eq(0):t.wrap).focus()},_onFocusIn:function(n){return n.target===t.wrap[0]||e.contains(t.wrap[0],n.target)?void 0:(t._setFocus(),!1)},_parseMarkup:function(t,n,i){var o;i.data&&(n=e.extend(i.data,n)),T(p,[t,n,i]),e.each(n,function(e,n){if(void 0===n||n===!1)return!0;if(o=e.split("_"),o.length>1){var i=t.find(h+"-"+o[0]);if(i.length>0){var r=o[1];"replaceWith"===r?i[0]!==n[0]&&i.replaceWith(n):"img"===r?i.is("img")?i.attr("src",n):i.replaceWith(''):i.attr(o[1],n)}}else t.find(h+"-"+e).html(n)})},_getScrollbarSize:function(){if(void 0===t.scrollbarSize){var e=document.createElement("div");e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),t.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return t.scrollbarSize}},e.magnificPopup={instance:null,proto:w.prototype,modules:[],open:function(t,n){return _(),t=t?e.extend(!0,{},t):{},t.isObj=!0,t.index=n||0,this.instance.open(t)},close:function(){return e.magnificPopup.instance&&e.magnificPopup.instance.close()},registerModule:function(t,n){n.options&&(e.magnificPopup.defaults[t]=n.options),e.extend(this.proto,n.proto),this.modules.push(t)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},e.fn.magnificPopup=function(n){_();var i=e(this);if("string"==typeof n)if("open"===n){var o,r=b?i.data("magnificPopup"):i[0].magnificPopup,a=parseInt(arguments[1],10)||0;r.items?o=r.items[a]:(o=i,r.delegate&&(o=o.find(r.delegate)),o=o.eq(a)),t._openClick({mfpEl:o},i,r)}else t.isOpen&&t[n].apply(t,Array.prototype.slice.call(arguments,1));else n=e.extend(!0,{},n),b?i.data("magnificPopup",n):i[0].magnificPopup=n,t.addGroup(i,n);return i};var P,O,z,M="inline",B=function(){z&&(O.after(z.addClass(P)).detach(),z=null)};e.magnificPopup.registerModule(M,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){t.types.push(M),x(l+"."+M,function(){B()})},getInline:function(n,i){if(B(),n.src){var o=t.st.inline,r=e(n.src);if(r.length){var a=r[0].parentNode;a&&a.tagName&&(O||(P=o.hiddenClass,O=k(P),P="mfp-"+P),z=r.after(O).detach().removeClass(P)),t.updateStatus("ready")}else t.updateStatus("error",o.tNotFound),r=e("
");return n.inlineElement=r,r}return t.updateStatus("ready"),t._parseMarkup(i,{},n),i}}});var F,H="ajax",L=function(){F&&i.removeClass(F)},A=function(){L(),t.req&&t.req.abort()};e.magnificPopup.registerModule(H,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){t.types.push(H),F=t.st.ajax.cursor,x(l+"."+H,A),x("BeforeChange."+H,A)},getAjax:function(n){F&&i.addClass(F),t.updateStatus("loading");var o=e.extend({url:n.src,success:function(i,o,r){var a={data:i,xhr:r};T("ParseAjax",a),t.appendContent(e(a.data),H),n.finished=!0,L(),t._setFocus(),setTimeout(function(){t.wrap.addClass(v)},16),t.updateStatus("ready"),T("AjaxContentAdded")},error:function(){L(),n.finished=n.loadError=!0,t.updateStatus("error",t.st.ajax.tError.replace("%url%",n.src))}},t.st.ajax.settings);return t.req=e.ajax(o),""}}});var j,N=function(n){if(n.data&&void 0!==n.data.title)return n.data.title;var i=t.st.image.titleSrc;if(i){if(e.isFunction(i))return i.call(t,n);if(n.el)return n.el.attr(i)||""}return""};e.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=t.st.image,n=".image";t.types.push("image"),x(f+n,function(){"image"===t.currItem.type&&e.cursor&&i.addClass(e.cursor)}),x(l+n,function(){e.cursor&&i.removeClass(e.cursor),I.off("resize"+h)}),x("Resize"+n,t.resizeImage),t.isLowIE&&x("AfterChange",t.resizeImage)},resizeImage:function(){var e=t.currItem;if(e&&e.img&&t.st.image.verticalFit){var n=0;t.isLowIE&&(n=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",t.wH-n)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,j&&clearInterval(j),e.isCheckingImgSize=!1,T("ImageHasSize",e),e.imgHidden&&(t.content&&t.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(e){var n=0,i=e.img[0],o=function(r){j&&clearInterval(j),j=setInterval(function(){return i.naturalWidth>0?(t._onImageHasSize(e),void 0):(n>200&&clearInterval(j),n++,3===n?o(10):40===n?o(50):100===n&&o(500),void 0)},r)};o(1)},getImage:function(n,i){var o=0,r=function(){n&&(n.img[0].complete?(n.img.off(".mfploader"),n===t.currItem&&(t._onImageHasSize(n),t.updateStatus("ready")),n.hasSize=!0,n.loaded=!0,T("ImageLoadComplete")):(o++,200>o?setTimeout(r,100):a()))},a=function(){n&&(n.img.off(".mfploader"),n===t.currItem&&(t._onImageHasSize(n),t.updateStatus("error",s.tError.replace("%url%",n.src))),n.hasSize=!0,n.loaded=!0,n.loadError=!0)},s=t.st.image,l=i.find(".mfp-img");if(l.length){var c=document.createElement("img");c.className="mfp-img",n.img=e(c).on("load.mfploader",r).on("error.mfploader",a),c.src=n.src,l.is("img")&&(n.img=n.img.clone()),c=n.img[0],c.naturalWidth>0?n.hasSize=!0:c.width||(n.hasSize=!1)}return t._parseMarkup(i,{title:N(n),img_replaceWith:n.img},n),t.resizeImage(),n.hasSize?(j&&clearInterval(j),n.loadError?(i.addClass("mfp-loading"),t.updateStatus("error",s.tError.replace("%url%",n.src))):(i.removeClass("mfp-loading"),t.updateStatus("ready")),i):(t.updateStatus("loading"),n.loading=!0,n.hasSize||(n.imgHidden=!0,i.addClass("mfp-loading"),t.findImageSize(n)),i)}}});var W,R=function(){return void 0===W&&(W=void 0!==document.createElement("p").style.MozTransform),W};e.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(e){return e.is("img")?e:e.find("img")}},proto:{initZoom:function(){var e,n=t.st.zoom,i=".zoom";if(n.enabled&&t.supportsTransition){var o,r,a=n.duration,s=function(e){var t=e.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),i="all "+n.duration/1e3+"s "+n.easing,o={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},r="transition";return o["-webkit-"+r]=o["-moz-"+r]=o["-o-"+r]=o[r]=i,t.css(o),t},d=function(){t.content.css("visibility","visible")};x("BuildControls"+i,function(){if(t._allowZoom()){if(clearTimeout(o),t.content.css("visibility","hidden"),e=t._getItemToZoom(),!e)return d(),void 0;r=s(e),r.css(t._getOffset()),t.wrap.append(r),o=setTimeout(function(){r.css(t._getOffset(!0)),o=setTimeout(function(){d(),setTimeout(function(){r.remove(),e=r=null,T("ZoomAnimationEnded")},16)},a)},16)}}),x(c+i,function(){if(t._allowZoom()){if(clearTimeout(o),t.st.removalDelay=a,!e){if(e=t._getItemToZoom(),!e)return;r=s(e)}r.css(t._getOffset(!0)),t.wrap.append(r),t.content.css("visibility","hidden"),setTimeout(function(){r.css(t._getOffset())},16)}}),x(l+i,function(){t._allowZoom()&&(d(),r&&r.remove(),e=null)})}},_allowZoom:function(){return"image"===t.currItem.type},_getItemToZoom:function(){return t.currItem.hasSize?t.currItem.img:!1},_getOffset:function(n){var i;i=n?t.currItem.img:t.st.zoom.opener(t.currItem.el||t.currItem);var o=i.offset(),r=parseInt(i.css("padding-top"),10),a=parseInt(i.css("padding-bottom"),10);o.top-=e(window).scrollTop()-r;var s={width:i.width(),height:(b?i.innerHeight():i[0].offsetHeight)-a-r};return R()?s["-moz-transform"]=s.transform="translate("+o.left+"px,"+o.top+"px)":(s.left=o.left,s.top=o.top),s}}});var Z="iframe",q="//about:blank",D=function(e){if(t.currTemplate[Z]){var n=t.currTemplate[Z].find("iframe");n.length&&(e||(n[0].src=q),t.isIE8&&n.css("display",e?"block":"none"))}};e.magnificPopup.registerModule(Z,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(Z),x("BeforeChange",function(e,t,n){t!==n&&(t===Z?D():n===Z&&D(!0))}),x(l+"."+Z,function(){D()})},getIframe:function(n,i){var o=n.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(i,a,n),t.updateStatus("ready"),i}}});var K=function(e){var n=t.items.length;return e>n-1?e-n:0>e?n+e:e},Y=function(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var n=t.st.gallery,i=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,n&&n.enabled?(a+=" mfp-gallery",x(f+i,function(){n.navigateByImgClick&&t.wrap.on("click"+i,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+i,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+i,function(e,n){n.text&&(n.text=Y(n.text,t.currItem.index,t.items.length))}),x(p+i,function(e,i,o,r){var a=t.items.length;o.counter=a>1?Y(n.tCounter,r.index,a):""}),x("BuildControls"+i,function(){if(t.items.length>1&&n.arrows&&!t.arrowLeft){var i=n.arrowMarkup,o=t.arrowLeft=e(i.replace(/%title%/gi,n.tPrev).replace(/%dir%/gi,"left")).addClass(y),a=t.arrowRight=e(i.replace(/%title%/gi,n.tNext).replace(/%dir%/gi,"right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+i,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+i,function(){o.off(i),t.wrap.off("click"+i),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=K(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=K(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,n=t.st.gallery.preload,i=Math.min(n[0],t.items.length),o=Math.min(n[1],t.items.length);for(e=1;(t.direction?o:i)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?i:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(n){if(n=K(n),!t.items[n].preloaded){var i=t.items[n];i.parsed||(i=t.parseEl(n)),T("LazyLoad",i),"image"===i.type&&(i.img=e('').on("load.mfploader",function(){i.hasSize=!0}).on("error.mfploader",function(){i.hasSize=!0,i.loadError=!0,T("LazyLoadError",i)}).attr("src",i.src)),i.preloaded=!0}}}});var U="retina";e.magnificPopup.registerModule(U,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,n=e.ratio;n=isNaN(n)?n():n,n>1&&(x("ImageHasSize."+U,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/n,width:"100%"})}),x("ElementParse."+U,function(t,i){i.src=e.replaceSrc(i,n)}))}}}}),function(){var t=1e3,n="ontouchstart"in window,i=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(n){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,i())}).on("touchend"+r,function(e){i(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),n&&I.off("touchmove"+r+" touchend"+r)}}(),_()})(window.jQuery||window.Zepto); \ No newline at end of file diff --git a/tests/demo/site/js/jquery.min.js b/tests/demo/site/js/jquery.min.js new file mode 100644 index 00000000..fad9ab12 --- /dev/null +++ b/tests/demo/site/js/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v2.1.4 | (c) 2005, 2015 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={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,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=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.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},n.extend=n.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||n.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&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!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=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.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?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.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),n.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||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.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,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=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)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(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 pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(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 p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.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},B=b?function(a,b){if(a===b)return l=!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===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.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=ga.selectors={cacheLength:50,createPseudo:ia,match:X,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(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===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]||ga.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]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(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(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.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.replace(Q," ")+" ").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(),s=!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&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&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]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)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&&(s&&((l[u]||(l[u]={}))[a]=[w,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()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(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),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?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===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.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 Z.test(a.nodeName)},input:function(a){return Y.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:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;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=[w,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[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(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 ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(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 wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(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?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.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)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.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 n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.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&&n(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}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.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?n(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&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(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(n.unique(n.merge(this.get(),n(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}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.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){n.each(b,function(b,c){var d=n.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&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.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},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.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?n.extend(a,d):d}},e={};return d.pipe=d.then,n.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&&n.isFunction(a.promise)?e:0,g=1===f?a:n.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]&&n.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;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(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};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.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,n.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(n.isEmptyObject(f))n.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,n.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{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.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!n.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)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.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)}}),n.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--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.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=n.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)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.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:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,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),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,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])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],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||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.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]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.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=((n.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?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(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++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(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)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.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===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.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=ja(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=ja(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?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(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 n.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&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(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,n.cleanData(oa(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,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.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(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(Z),x("BeforeChange",function(e,t,n){t!==n&&(t===Z?D():n===Z&&D(!0))}),x(l+"."+Z,function(){D()})},getIframe:function(n,i){var o=n.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(i,a,n),t.updateStatus("ready"),i}}});var K=function(e){var n=t.items.length;return e>n-1?e-n:0>e?n+e:e},Y=function(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var n=t.st.gallery,i=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,n&&n.enabled?(a+=" mfp-gallery",x(f+i,function(){n.navigateByImgClick&&t.wrap.on("click"+i,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+i,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+i,function(e,n){n.text&&(n.text=Y(n.text,t.currItem.index,t.items.length))}),x(p+i,function(e,i,o,r){var a=t.items.length;o.counter=a>1?Y(n.tCounter,r.index,a):""}),x("BuildControls"+i,function(){if(t.items.length>1&&n.arrows&&!t.arrowLeft){var i=n.arrowMarkup,o=t.arrowLeft=e(i.replace(/%title%/gi,n.tPrev).replace(/%dir%/gi,"left")).addClass(y),a=t.arrowRight=e(i.replace(/%title%/gi,n.tNext).replace(/%dir%/gi,"right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+i,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+i,function(){o.off(i),t.wrap.off("click"+i),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=K(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=K(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,n=t.st.gallery.preload,i=Math.min(n[0],t.items.length),o=Math.min(n[1],t.items.length);for(e=1;(t.direction?o:i)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?i:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(n){if(n=K(n),!t.items[n].preloaded){var i=t.items[n];i.parsed||(i=t.parseEl(n)),T("LazyLoad",i),"image"===i.type&&(i.img=e('').on("load.mfploader",function(){i.hasSize=!0}).on("error.mfploader",function(){i.hasSize=!0,i.loadError=!0,T("LazyLoadError",i)}).attr("src",i.src)),i.preloaded=!0}}}});var U="retina";e.magnificPopup.registerModule(U,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,n=e.ratio;n=isNaN(n)?n():n,n>1&&(x("ImageHasSize."+U,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/n,width:"100%"})}),x("ElementParse."+U,function(t,i){i.src=e.replaceSrc(i,n)}))}}}}),function(){var t=1e3,n="ontouchstart"in window,i=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(n){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,i())}).on("touchend"+r,function(e){i(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),n&&I.off("touchmove"+r+" touchend"+r)}}(),_()})(window.jQuery||window.Zepto); \ No newline at end of file diff --git a/tests/demo/templates/index_files/js/jquery.min.js b/tests/demo/templates/index_files/js/jquery.min.js new file mode 100644 index 00000000..fad9ab12 --- /dev/null +++ b/tests/demo/templates/index_files/js/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v2.1.4 | (c) 2005, 2015 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={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,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=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.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},n.extend=n.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||n.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&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!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=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.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?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.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),n.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||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.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,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=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)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(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 pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(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 p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.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},B=b?function(a,b){if(a===b)return l=!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===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.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=ga.selectors={cacheLength:50,createPseudo:ia,match:X,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(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===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]||ga.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]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(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(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.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.replace(Q," ")+" ").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(),s=!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&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&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]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)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&&(s&&((l[u]||(l[u]={}))[a]=[w,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()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(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),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?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===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.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 Z.test(a.nodeName)},input:function(a){return Y.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:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;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=[w,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[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(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 ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(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 wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(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?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.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)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.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 n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.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&&n(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}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.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?n(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&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(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(n.unique(n.merge(this.get(),n(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}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.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){n.each(b,function(b,c){var d=n.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&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.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},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.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?n.extend(a,d):d}},e={};return d.pipe=d.then,n.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&&n.isFunction(a.promise)?e:0,g=1===f?a:n.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]&&n.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;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(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};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.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,n.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(n.isEmptyObject(f))n.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,n.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{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.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!n.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)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.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)}}),n.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--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.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=n.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)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.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:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,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),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,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])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],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||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.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]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.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=((n.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?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(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++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(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)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.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===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.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=ja(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=ja(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?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(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 n.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&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(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,n.cleanData(oa(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,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.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(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("