├── .gitignore ├── examples ├── assets │ └── img │ │ ├── bootstrap.gif │ │ ├── bootstrap-small.gif │ │ ├── bootstrap-advanced-spinkit.gif │ │ └── bootstrap-advanced-font-awesome.gif ├── bootstrap-advanced-spinkit │ ├── bower_components │ │ └── SpinKit │ │ │ ├── scss │ │ │ ├── _variables.scss │ │ │ ├── spinkit.scss │ │ │ └── spinners │ │ │ │ ├── 5-pulse.scss │ │ │ │ ├── 1-rotating-plane.scss │ │ │ │ ├── 2-double-bounce.scss │ │ │ │ ├── 7-three-bounce.scss │ │ │ │ ├── 3-wave.scss │ │ │ │ ├── 6-chasing-dots.scss │ │ │ │ ├── 4-wandering-cubes.scss │ │ │ │ ├── 9-cube-grid.scss │ │ │ │ ├── 11-folding-cube.scss │ │ │ │ ├── 8-circle.scss │ │ │ │ └── 10-fading-circle.scss │ │ │ ├── bower.json │ │ │ ├── .bower.json │ │ │ ├── css │ │ │ ├── spinners │ │ │ │ ├── 5-pulse.css │ │ │ │ ├── 2-double-bounce.css │ │ │ │ ├── 7-three-bounce.css │ │ │ │ ├── 1-rotating-plane.css │ │ │ │ ├── 6-chasing-dots.css │ │ │ │ ├── 3-wave.css │ │ │ │ ├── 9-cube-grid.css │ │ │ │ ├── 4-wandering-cubes.css │ │ │ │ ├── 11-folding-cube.css │ │ │ │ ├── 10-fading-circle.css │ │ │ │ └── 8-circle.css │ │ │ └── spinkit.css │ │ │ ├── package.json │ │ │ ├── examples │ │ │ ├── 5-pulse.html │ │ │ ├── 2-double-bounce.html │ │ │ ├── 1-rotating-plane.html │ │ │ ├── 7-three-bounce.html │ │ │ ├── 6-chasing-dots.html │ │ │ ├── 3-wave.html │ │ │ ├── 4-wandering-cubes.html │ │ │ ├── 9-cube-grid.html │ │ │ ├── 11-folding-cube.html │ │ │ ├── 10-fading-circle.html │ │ │ └── 8-circle.html │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── CONTRIBUTING.md │ │ │ ├── README.md │ │ │ └── gulpfile.js │ ├── bower.json │ ├── assets │ │ ├── js │ │ │ └── main.js │ │ └── css │ │ │ └── style.css │ └── index.html ├── bootstrap-advanced-font-awesome │ ├── assets │ │ └── css │ │ │ ├── font-awesome-4.7.0 │ │ │ └── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ └── style.css │ └── index.html ├── bootstrap │ └── index.html └── bootstrap-small │ └── index.html ├── .npmignore ├── .travis.yml ├── tests ├── index.test.js ├── karma.conf.js ├── __init.test.js └── helpers.js ├── LICENSE ├── package.json ├── README.md ├── index.html ├── dist ├── aframe-preloader-component.min.js └── aframe-preloader-component.js └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /gh-pages 3 | -------------------------------------------------------------------------------- /examples/assets/img/bootstrap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/assets/img/bootstrap.gif -------------------------------------------------------------------------------- /examples/assets/img/bootstrap-small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/assets/img/bootstrap-small.gif -------------------------------------------------------------------------------- /examples/assets/img/bootstrap-advanced-spinkit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/assets/img/bootstrap-advanced-spinkit.gif -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .sw[ponm] 2 | examples/build.js 3 | examples/node_modules/ 4 | gh-pages 5 | node_modules/ 6 | npm-debug.log 7 | .component 8 | package-lock.json 9 | yarn.lock 10 | -------------------------------------------------------------------------------- /examples/assets/img/bootstrap-advanced-font-awesome.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/assets/img/bootstrap-advanced-font-awesome.gif -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | $spinkit-spinner-margin: 40px auto !default; 2 | $spinkit-size: 40px !default; 3 | $spinkit-spinner-color: #333 !default; 4 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gladeye/aframe-preloader-component/HEAD/examples/bootstrap-advanced-font-awesome/assets/css/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinkit.scss: -------------------------------------------------------------------------------- 1 | @import 2 | "spinners/1-rotating-plane", 3 | "spinners/2-double-bounce", 4 | "spinners/3-wave", 5 | "spinners/4-wandering-cubes", 6 | "spinners/5-pulse", 7 | "spinners/6-chasing-dots", 8 | "spinners/7-three-bounce", 9 | "spinners/8-circle", 10 | "spinners/9-cube-grid", 11 | "spinners/10-fading-circle", 12 | "spinners/11-folding-cube"; 13 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-font-awesome/assets/css/style.css: -------------------------------------------------------------------------------- 1 | #preloader-modal.preloader-modal__complete .preloader-modal__ok, #preloader-modal .preloader-modal__spinner{ 2 | display: inline-block; 3 | margin-bottom: 0.5em; 4 | } 5 | 6 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner, #preloader-modal .preloader-modal__ok{ 7 | display: none; 8 | margin-bottom: 0.5em; 9 | } 10 | 11 | #preloader-modal .btn{ 12 | margin-top: 2em; 13 | } -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SpinKit", 3 | "homepage": "https://github.com/tobiasahlin/SpinKit", 4 | "authors": [ 5 | "Tobias Ahlin" 6 | ], 7 | "description": "A collection of loading indicators animated with CSS", 8 | "main": "css/spinkit.css", 9 | "keywords": [ 10 | "css", 11 | "scss", 12 | "web" 13 | ], 14 | "license": "MIT", 15 | "ignore": [ 16 | "**/.*", 17 | "node_modules" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/5-pulse.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 | * 6 | */ 7 | @import "../variables"; 8 | 9 | .sk-spinner-pulse { 10 | width: $spinkit-size; 11 | height: $spinkit-size; 12 | margin: $spinkit-spinner-margin; 13 | background-color: $spinkit-spinner-color; 14 | border-radius: 100%; 15 | animation: sk-pulseScaleOut 1.0s infinite ease-in-out; 16 | } 17 | 18 | @keyframes sk-pulseScaleOut { 19 | 0% { 20 | transform: scale(0); 21 | } 100% { 22 | transform: scale(1.0); 23 | opacity: 0; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | addons: 3 | firefox: 'latest' 4 | node_js: 5 | - '6.9' 6 | 7 | install: 8 | - npm install 9 | - ./node_modules/.bin/mozilla-download ./firefox/ --product firefox --branch mozilla-aurora 10 | - export FIREFOX_NIGHTLY_BIN="./firefox/firefox/firefox-bin" 11 | 12 | before_script: 13 | - export DISPLAY=:99.0 14 | - sh -e /etc/init.d/xvfb start 15 | 16 | script: 17 | - $CI_ACTION 18 | 19 | env: 20 | global: 21 | - TEST_SUITE=unit 22 | matrix: 23 | - CI_ACTION="npm run test" 24 | - CI_ACTION="npm run dist" 25 | # - CI_ACTION="npm run lint" 26 | 27 | branches: 28 | only: 29 | - master 30 | 31 | cache: 32 | directories: 33 | - node_modules 34 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aframe-preloader-bootstrap-advanced-spinkit", 3 | "homepage": "https://github.com/gladeye/aframe-preloader-component", 4 | "authors": [ 5 | "Michael Andrew " 6 | ], 7 | "description": "Advanced example for A-Frame Preloader component using Spinkit", 8 | "main": "index.html", 9 | "keywords": [ 10 | "preloader", 11 | "spinner", 12 | "loading" 13 | ], 14 | "license": "MIT", 15 | "private": true, 16 | "ignore": [ 17 | "**/.*", 18 | "node_modules", 19 | "bower_components", 20 | "test", 21 | "tests" 22 | ], 23 | "dependencies": { 24 | "SpinKit": "spinkit#^1.2.5" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/1-rotating-plane.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 | * 6 | */ 7 | @import "../variables"; 8 | 9 | .sk-rotating-plane { 10 | width: $spinkit-size; 11 | height: $spinkit-size; 12 | background-color: $spinkit-spinner-color; 13 | margin: $spinkit-spinner-margin; 14 | animation: sk-rotatePlane 1.2s infinite ease-in-out; 15 | } 16 | 17 | @keyframes sk-rotatePlane { 18 | 0% { 19 | transform: perspective(120px) rotateX(0deg) rotateY(0deg); 20 | } 50% { 21 | transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); 22 | } 100% { 23 | transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/index.test.js: -------------------------------------------------------------------------------- 1 | /* global assert, setup, suite, test */ 2 | require('aframe'); 3 | require('jquery'); 4 | require('bootstrap'); 5 | require('../index.js'); 6 | var entityFactory = require('./helpers').entityFactory; 7 | 8 | suite('preloader component', function () { 9 | var component; 10 | var el; 11 | 12 | setup(function (done) { 13 | el = entityFactory(); 14 | el.addEventListener('componentinitialized', function (evt) { 15 | if (evt.detail.name !== 'preloader') { return; } 16 | component = el.components['preloader']; 17 | done(); 18 | }); 19 | el.setAttribute('preloader', {}); 20 | }); 21 | 22 | /*suite('foo property', function () { 23 | test('is good', function () { 24 | assert.equal(1, 1); 25 | }); 26 | });*/ 27 | }); 28 | -------------------------------------------------------------------------------- /tests/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration. 2 | module.exports = function (config) { 3 | config.set({ 4 | basePath: '../', 5 | browserify: { 6 | debug: true, 7 | paths: ['./'] 8 | }, 9 | browsers: ['Firefox', 'Chrome'], 10 | client: { 11 | captureConsole: true, 12 | mocha: {ui: 'tdd'} 13 | }, 14 | envPreprocessor: ['TEST_ENV'], 15 | files: [ 16 | // Define test files. 17 | {pattern: 'tests/**/*.test.js'}, 18 | // Serve test assets. 19 | {pattern: 'tests/assets/**/*', included: false, served: true} 20 | ], 21 | frameworks: ['mocha', 'sinon-chai', 'chai-shallow-deep-equal', 'browserify'], 22 | preprocessors: {'tests/**/*.js': ['browserify', 'env']}, 23 | reporters: ['mocha'] 24 | }); 25 | }; 26 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SpinKit", 3 | "homepage": "https://github.com/tobiasahlin/SpinKit", 4 | "authors": [ 5 | "Tobias Ahlin" 6 | ], 7 | "description": "A collection of loading indicators animated with CSS", 8 | "main": "css/spinkit.css", 9 | "keywords": [ 10 | "css", 11 | "scss", 12 | "web" 13 | ], 14 | "license": "MIT", 15 | "ignore": [ 16 | "**/.*", 17 | "node_modules" 18 | ], 19 | "version": "1.2.5", 20 | "_release": "1.2.5", 21 | "_resolution": { 22 | "type": "version", 23 | "tag": "1.2.5", 24 | "commit": "384fbc3f654f7ef7349134e116f9b6d0a4d7d852" 25 | }, 26 | "_source": "https://github.com/tobiasahlin/SpinKit.git", 27 | "_target": "^1.2.5", 28 | "_originalSource": "spinkit", 29 | "_direct": true 30 | } -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/5-pulse.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 | * 6 | */ 7 | .sk-spinner-pulse { 8 | width: 40px; 9 | height: 40px; 10 | margin: 40px auto; 11 | background-color: #333; 12 | border-radius: 100%; 13 | -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out; 14 | animation: sk-pulseScaleOut 1s infinite ease-in-out; } 15 | 16 | @-webkit-keyframes sk-pulseScaleOut { 17 | 0% { 18 | -webkit-transform: scale(0); 19 | transform: scale(0); } 20 | 100% { 21 | -webkit-transform: scale(1); 22 | transform: scale(1); 23 | opacity: 0; } } 24 | 25 | @keyframes sk-pulseScaleOut { 26 | 0% { 27 | -webkit-transform: scale(0); 28 | transform: scale(0); } 29 | 100% { 30 | -webkit-transform: scale(1); 31 | transform: scale(1); 32 | opacity: 0; } } 33 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spinkit", 3 | "version": "1.2.5", 4 | "description": "A collection of loading indicators animated with CSS", 5 | "keywords": [ 6 | "css", 7 | "spinkit", 8 | "spinner", 9 | "loading", 10 | "ui" 11 | ], 12 | "main": "gulpfile.js", 13 | "scripts": { 14 | "test": "echo \"Error: no test specified\" && exit 1" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/tobiasahlin/SpinKit.git" 19 | }, 20 | "author": "Tobias Ahlin", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/tobiasahlin/SpinKit/issues" 24 | }, 25 | "homepage": "https://github.com/tobiasahlin/SpinKit", 26 | "devDependencies": { 27 | "del": "^1.2.0", 28 | "gulp": "^3.9.0", 29 | "gulp-autoprefixer": "^2.3.1", 30 | "gulp-sass": "^2.0.3", 31 | "lodash": "^3.10.0", 32 | "q": "^1.4.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/2-double-bounce.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 | * 9 | */ 10 | @import "../variables"; 11 | 12 | .sk-double-bounce { 13 | width: $spinkit-size; 14 | height: $spinkit-size; 15 | position: relative; 16 | margin: $spinkit-spinner-margin; 17 | 18 | .sk-child { 19 | width: 100%; 20 | height: 100%; 21 | border-radius: 50%; 22 | background-color: $spinkit-spinner-color; 23 | opacity: 0.6; 24 | position: absolute; 25 | top: 0; 26 | left: 0; 27 | animation: sk-doubleBounce 2.0s infinite ease-in-out; 28 | } 29 | 30 | .sk-double-bounce2 { 31 | animation-delay: -1.0s; 32 | } 33 | } 34 | 35 | @keyframes sk-doubleBounce { 36 | 0%, 100% { transform: scale(0) } 37 | 50% { transform: scale(1.0) } 38 | } 39 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/7-three-bounce.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 | * 10 | */ 11 | @import "../variables"; 12 | 13 | .sk-three-bounce { 14 | $animationDuration: 1.4s; 15 | $delayRange: 0.32s; 16 | margin: $spinkit-spinner-margin; 17 | width: $spinkit-size * 2; 18 | text-align: center; 19 | 20 | .sk-child { 21 | width: $spinkit-size / 2; 22 | height: $spinkit-size / 2; 23 | background-color: $spinkit-spinner-color; 24 | 25 | border-radius: 100%; 26 | display: inline-block; 27 | animation: sk-three-bounce $animationDuration ease-in-out 0s infinite both; 28 | } 29 | 30 | .sk-bounce1 { animation-delay: -$delayRange; } 31 | .sk-bounce2 { animation-delay: -$delayRange / 2; } 32 | } 33 | 34 | @keyframes sk-three-bounce { 35 | 0%, 80%, 100% { 36 | transform: scale(0); 37 | } 40% { 38 | transform: scale(1.0); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Gladeye 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/5-pulse.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 pulse 5 | 40 | 41 | 42 | 43 | 44 |
45 | 46 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 1.2.5 2 | 3 | * Fixed: Add folding cube spinner (11) to combined CSS file 4 | 5 | # 1.2.4 6 | 7 | * Fixed: Borked gulp script (#106) 8 | * Fixed: Moved changes made in CSS, to SCSS 9 | 10 | # 1.2.3 11 | 12 | * Fixed: More exact (33% -> 33.33%) cube dimensions for cube grid spinner 13 | * Fixed: Comment format for HTML inside CSS, for easier copy and pasting (removed * at the beginning of each row) 14 | 15 | # 1.2.2 16 | 17 | * Fixed: Use variable for spinner size (defaults to 40px) 18 | 19 | # 1.2.1 20 | 21 | * Fixed: Two spinners were slightly broken on Android 22 | * Changed: Bumped default top and bottom margin to 40px 23 | 24 | # 1.2.0 25 | 26 | * Added: Folding cube spinner 27 | * Fixed: Lowercase in package name 28 | 29 | # 1.1.0 30 | 31 | * Removed one spinner (circle with rotating circle, not polished enough) 32 | * Cleaned up the CSS 33 | * Added more SCSS variables to more easily customize spinners 34 | * Introduced SCSS `@for` loops to more easily change timing of spinners 35 | * Removed moot `version` property from bower.json 36 | 37 | 38 | # 1.0.1 39 | 40 | * Fix: Missed sass variables for background-color 41 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Tobias Ahlin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/3-wave.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | * 12 | */ 13 | @import "../variables"; 14 | 15 | .sk-wave { 16 | $rectCount: 5; 17 | $animationDuration: 1.2s; 18 | $delayRange: 0.4s; 19 | 20 | margin: $spinkit-spinner-margin; 21 | width: $spinkit-size * 1.25; 22 | height: $spinkit-size; 23 | text-align: center; 24 | font-size: 10px; 25 | 26 | .sk-rect { 27 | background-color: $spinkit-spinner-color; 28 | height: 100%; 29 | width: 6px; 30 | display: inline-block; 31 | animation: sk-waveStretchDelay $animationDuration infinite ease-in-out; 32 | } 33 | 34 | @for $i from 1 through $rectCount { 35 | .sk-rect#{$i} { animation-delay: - $animationDuration + $delayRange / ($rectCount - 1) * ($i - 1); } 36 | } 37 | } 38 | 39 | @keyframes sk-waveStretchDelay { 40 | 0%, 40%, 100% { transform: scaleY(0.4) } 41 | 20% { transform: scaleY(1.0) } 42 | } 43 | -------------------------------------------------------------------------------- /tests/__init.test.js: -------------------------------------------------------------------------------- 1 | /* global sinon, setup, teardown */ 2 | 3 | /** 4 | * __init.test.js is run before every test case. 5 | */ 6 | window.debug = true; 7 | $ = jQuery = require('jquery'); 8 | var AScene = require('aframe').AScene; 9 | 10 | navigator.getVRDisplays = function () { 11 | var resolvePromise = Promise.resolve(); 12 | var mockVRDisplay = { 13 | requestPresent: resolvePromise, 14 | exitPresent: resolvePromise, 15 | getPose: function () { return {orientation: null, position: null}; }, 16 | requestAnimationFrame: function () { return 1; } 17 | }; 18 | return Promise.resolve([mockVRDisplay]); 19 | }; 20 | 21 | setup(function () { 22 | this.sinon = sinon.sandbox.create(); 23 | // Stubs to not create a WebGL context since Travis CI runs headless. 24 | this.sinon.stub(AScene.prototype, 'render'); 25 | this.sinon.stub(AScene.prototype, 'resize'); 26 | this.sinon.stub(AScene.prototype, 'setupRenderer'); 27 | }); 28 | 29 | teardown(function () { 30 | // Clean up any attached elements. 31 | var attachedEls = ['canvas', 'a-assets', 'a-scene']; 32 | var els = document.querySelectorAll(attachedEls.join(',')); 33 | for (var i = 0; i < els.length; i++) { 34 | els[i].parentNode.removeChild(els[i]); 35 | } 36 | this.sinon.restore(); 37 | }); 38 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/6-chasing-dots.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 | * 9 | */ 10 | @import "../variables"; 11 | 12 | .sk-chasing-dots { 13 | $animationDuration: 2.0s; 14 | 15 | margin: $spinkit-spinner-margin; 16 | width: $spinkit-size; 17 | height: $spinkit-size; 18 | position: relative; 19 | text-align: center; 20 | animation: sk-chasingDotsRotate $animationDuration infinite linear; 21 | 22 | .sk-child { 23 | width: 60%; 24 | height: 60%; 25 | display: inline-block; 26 | position: absolute; 27 | top: 0; 28 | background-color: $spinkit-spinner-color; 29 | border-radius: 100%; 30 | animation: sk-chasingDotsBounce $animationDuration infinite ease-in-out; 31 | } 32 | 33 | .sk-dot2 { 34 | top: auto; 35 | bottom: 0; 36 | animation-delay: - $animationDuration/2; 37 | } 38 | } 39 | 40 | @keyframes sk-chasingDotsRotate { 41 | 100% { 42 | transform: rotate(360deg); 43 | } 44 | } 45 | 46 | @keyframes sk-chasingDotsBounce { 47 | 0%, 100% { 48 | transform: scale(0); 49 | } 50% { 50 | transform: scale(1.0); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/2-double-bounce.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 | * 9 | */ 10 | .sk-double-bounce { 11 | width: 40px; 12 | height: 40px; 13 | position: relative; 14 | margin: 40px auto; } 15 | .sk-double-bounce .sk-child { 16 | width: 100%; 17 | height: 100%; 18 | border-radius: 50%; 19 | background-color: #333; 20 | opacity: 0.6; 21 | position: absolute; 22 | top: 0; 23 | left: 0; 24 | -webkit-animation: sk-doubleBounce 2s infinite ease-in-out; 25 | animation: sk-doubleBounce 2s infinite ease-in-out; } 26 | .sk-double-bounce .sk-double-bounce2 { 27 | -webkit-animation-delay: -1.0s; 28 | animation-delay: -1.0s; } 29 | 30 | @-webkit-keyframes sk-doubleBounce { 31 | 0%, 100% { 32 | -webkit-transform: scale(0); 33 | transform: scale(0); } 34 | 50% { 35 | -webkit-transform: scale(1); 36 | transform: scale(1); } } 37 | 38 | @keyframes sk-doubleBounce { 39 | 0%, 100% { 40 | -webkit-transform: scale(0); 41 | transform: scale(0); } 42 | 50% { 43 | -webkit-transform: scale(1); 44 | transform: scale(1); } } 45 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/7-three-bounce.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 | * 10 | */ 11 | .sk-three-bounce { 12 | margin: 40px auto; 13 | width: 80px; 14 | text-align: center; } 15 | .sk-three-bounce .sk-child { 16 | width: 20px; 17 | height: 20px; 18 | background-color: #333; 19 | border-radius: 100%; 20 | display: inline-block; 21 | -webkit-animation: sk-three-bounce 1.4s ease-in-out 0s infinite both; 22 | animation: sk-three-bounce 1.4s ease-in-out 0s infinite both; } 23 | .sk-three-bounce .sk-bounce1 { 24 | -webkit-animation-delay: -0.32s; 25 | animation-delay: -0.32s; } 26 | .sk-three-bounce .sk-bounce2 { 27 | -webkit-animation-delay: -0.16s; 28 | animation-delay: -0.16s; } 29 | 30 | @-webkit-keyframes sk-three-bounce { 31 | 0%, 80%, 100% { 32 | -webkit-transform: scale(0); 33 | transform: scale(0); } 34 | 40% { 35 | -webkit-transform: scale(1); 36 | transform: scale(1); } } 37 | 38 | @keyframes sk-three-bounce { 39 | 0%, 80%, 100% { 40 | -webkit-transform: scale(0); 41 | transform: scale(0); } 42 | 40% { 43 | -webkit-transform: scale(1); 44 | transform: scale(1); } } 45 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/4-wandering-cubes.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 | * 9 | */ 10 | @import "../variables"; 11 | 12 | .sk-wandering-cubes { 13 | $animationDuration: 1.8s; 14 | 15 | margin: $spinkit-spinner-margin; 16 | width: $spinkit-size; 17 | height: $spinkit-size; 18 | position: relative; 19 | 20 | .sk-cube { 21 | background-color: $spinkit-spinner-color; 22 | width: 10px; 23 | height: 10px; 24 | position: absolute; 25 | top: 0; 26 | left: 0; 27 | animation: sk-wanderingCube $animationDuration ease-in-out #{-$animationDuration} infinite both; 28 | } 29 | 30 | .sk-cube2 { 31 | animation-delay: -$animationDuration / 2; 32 | } 33 | } 34 | 35 | @keyframes sk-wanderingCube { 36 | $cubeDistance: 30px; 37 | 0% { 38 | transform: rotate(0deg); 39 | } 25% { 40 | transform: translateX($cubeDistance) rotate(-90deg) scale(0.5); 41 | } 50% { 42 | /* Hack to make FF rotate in the right direction */ 43 | transform: translateX($cubeDistance) translateY($cubeDistance) rotate(-179deg); 44 | } 50.1% { 45 | transform: translateX($cubeDistance) translateY($cubeDistance) rotate(-180deg); 46 | } 75% { 47 | transform: translateX(0) translateY($cubeDistance) rotate(-270deg) scale(0.5); 48 | } 100% { 49 | transform: rotate(-360deg); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/1-rotating-plane.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 | * 6 | */ 7 | .sk-rotating-plane { 8 | width: 40px; 9 | height: 40px; 10 | background-color: #333; 11 | margin: 40px auto; 12 | -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out; 13 | animation: sk-rotatePlane 1.2s infinite ease-in-out; } 14 | 15 | @-webkit-keyframes sk-rotatePlane { 16 | 0% { 17 | -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); 18 | transform: perspective(120px) rotateX(0deg) rotateY(0deg); } 19 | 50% { 20 | -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); 21 | transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); } 22 | 100% { 23 | -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); 24 | transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } } 25 | 26 | @keyframes sk-rotatePlane { 27 | 0% { 28 | -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); 29 | transform: perspective(120px) rotateX(0deg) rotateY(0deg); } 30 | 50% { 31 | -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); 32 | transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); } 33 | 100% { 34 | -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); 35 | transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } } 36 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/2-double-bounce.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 2 double bounce 5 | 52 | 53 | 54 | 55 | 56 |
57 |
58 |
59 |
60 | 61 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/9-cube-grid.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | * 16 | */ 17 | @import "../variables"; 18 | 19 | .sk-cube-grid { 20 | $delayRange: 0.4s; 21 | 22 | width: $spinkit-size; 23 | height: $spinkit-size; 24 | margin: $spinkit-spinner-margin; 25 | 26 | .sk-cube { 27 | width: 33.33%; 28 | height: 33.33%; 29 | background-color: $spinkit-spinner-color; 30 | float: left; 31 | animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; 32 | } 33 | 34 | /* 35 | * Spinner positions 36 | * 1 2 3 37 | * 4 5 6 38 | * 7 8 9 39 | */ 40 | 41 | .sk-cube1 { animation-delay: $delayRange * 0.50 } 42 | .sk-cube2 { animation-delay: $delayRange * 0.75 } 43 | .sk-cube3 { animation-delay: $delayRange } 44 | .sk-cube4 { animation-delay: $delayRange * 0.25 } 45 | .sk-cube5 { animation-delay: $delayRange * 0.50 } 46 | .sk-cube6 { animation-delay: $delayRange * 0.75 } 47 | .sk-cube7 { animation-delay: 0.0s } 48 | .sk-cube8 { animation-delay: $delayRange * 0.25 } 49 | .sk-cube9 { animation-delay: $delayRange * 0.50 } 50 | } 51 | 52 | @keyframes sk-cubeGridScaleDelay { 53 | 0%, 70%, 100% { transform:scale3D(1.0, 1.0, 1.0) } 54 | 35% { transform:scale3D(0.0, 0.0, 1.0) } 55 | } 56 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/1-rotating-plane.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1 rotating plane 5 | 43 | 44 | 45 | 46 | 47 |
48 | 49 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/6-chasing-dots.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 | * 9 | */ 10 | .sk-chasing-dots { 11 | margin: 40px auto; 12 | width: 40px; 13 | height: 40px; 14 | position: relative; 15 | text-align: center; 16 | -webkit-animation: sk-chasingDotsRotate 2s infinite linear; 17 | animation: sk-chasingDotsRotate 2s infinite linear; } 18 | .sk-chasing-dots .sk-child { 19 | width: 60%; 20 | height: 60%; 21 | display: inline-block; 22 | position: absolute; 23 | top: 0; 24 | background-color: #333; 25 | border-radius: 100%; 26 | -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out; 27 | animation: sk-chasingDotsBounce 2s infinite ease-in-out; } 28 | .sk-chasing-dots .sk-dot2 { 29 | top: auto; 30 | bottom: 0; 31 | -webkit-animation-delay: -1s; 32 | animation-delay: -1s; } 33 | 34 | @-webkit-keyframes sk-chasingDotsRotate { 35 | 100% { 36 | -webkit-transform: rotate(360deg); 37 | transform: rotate(360deg); } } 38 | 39 | @keyframes sk-chasingDotsRotate { 40 | 100% { 41 | -webkit-transform: rotate(360deg); 42 | transform: rotate(360deg); } } 43 | 44 | @-webkit-keyframes sk-chasingDotsBounce { 45 | 0%, 100% { 46 | -webkit-transform: scale(0); 47 | transform: scale(0); } 48 | 50% { 49 | -webkit-transform: scale(1); 50 | transform: scale(1); } } 51 | 52 | @keyframes sk-chasingDotsBounce { 53 | 0%, 100% { 54 | -webkit-transform: scale(0); 55 | transform: scale(0); } 56 | 50% { 57 | -webkit-transform: scale(1); 58 | transform: scale(1); } } 59 | -------------------------------------------------------------------------------- /tests/helpers.js: -------------------------------------------------------------------------------- 1 | /* global suite */ 2 | 3 | /** 4 | * Helper method to create a scene, create an entity, add entity to scene, 5 | * add scene to document. 6 | * 7 | * @returns {object} An `` element. 8 | */ 9 | module.exports.entityFactory = function (opts) { 10 | var scene = document.createElement('a-scene'); 11 | var assets = document.createElement('a-assets'); 12 | var entity = document.createElement('a-entity'); 13 | scene.appendChild(assets); 14 | scene.appendChild(entity); 15 | 16 | opts = opts || {}; 17 | 18 | if (opts.assets) { 19 | opts.assets.forEach(function (asset) { 20 | assets.appendChild(asset); 21 | }); 22 | } 23 | 24 | document.body.appendChild(scene); 25 | return entity; 26 | }; 27 | 28 | /** 29 | * Creates and attaches a mixin element (and an `` element if necessary). 30 | * 31 | * @param {string} id - ID of mixin. 32 | * @param {object} obj - Map of component names to attribute values. 33 | * @param {Element} scene - Indicate which scene to apply mixin to if necessary. 34 | * @returns {object} An attached `` element. 35 | */ 36 | module.exports.mixinFactory = function (id, obj, scene) { 37 | var mixinEl = document.createElement('a-mixin'); 38 | mixinEl.setAttribute('id', id); 39 | Object.keys(obj).forEach(function (componentName) { 40 | mixinEl.setAttribute(componentName, obj[componentName]); 41 | }); 42 | 43 | var assetsEl = scene ? scene.querySelector('a-assets') : document.querySelector('a-assets'); 44 | assetsEl.appendChild(mixinEl); 45 | 46 | return mixinEl; 47 | }; 48 | 49 | /** 50 | * Test that is only run locally and is skipped on CI. 51 | */ 52 | module.exports.getSkipCISuite = function () { 53 | if (window.__env__.TEST_ENV === 'ci') { 54 | return suite.skip; 55 | } else { 56 | return suite; 57 | } 58 | }; 59 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/3-wave.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | * 12 | */ 13 | .sk-wave { 14 | margin: 40px auto; 15 | width: 50px; 16 | height: 40px; 17 | text-align: center; 18 | font-size: 10px; } 19 | .sk-wave .sk-rect { 20 | background-color: #333; 21 | height: 100%; 22 | width: 6px; 23 | display: inline-block; 24 | -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out; 25 | animation: sk-waveStretchDelay 1.2s infinite ease-in-out; } 26 | .sk-wave .sk-rect1 { 27 | -webkit-animation-delay: -1.2s; 28 | animation-delay: -1.2s; } 29 | .sk-wave .sk-rect2 { 30 | -webkit-animation-delay: -1.1s; 31 | animation-delay: -1.1s; } 32 | .sk-wave .sk-rect3 { 33 | -webkit-animation-delay: -1s; 34 | animation-delay: -1s; } 35 | .sk-wave .sk-rect4 { 36 | -webkit-animation-delay: -0.9s; 37 | animation-delay: -0.9s; } 38 | .sk-wave .sk-rect5 { 39 | -webkit-animation-delay: -0.8s; 40 | animation-delay: -0.8s; } 41 | 42 | @-webkit-keyframes sk-waveStretchDelay { 43 | 0%, 40%, 100% { 44 | -webkit-transform: scaleY(0.4); 45 | transform: scaleY(0.4); } 46 | 20% { 47 | -webkit-transform: scaleY(1); 48 | transform: scaleY(1); } } 49 | 50 | @keyframes sk-waveStretchDelay { 51 | 0%, 40%, 100% { 52 | -webkit-transform: scaleY(0.4); 53 | transform: scaleY(0.4); } 54 | 20% { 55 | -webkit-transform: scaleY(1); 56 | transform: scaleY(1); } } 57 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/11-folding-cube.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 | * 11 | */ 12 | @import "../variables"; 13 | 14 | .sk-folding-cube { 15 | $cubeCount: 4; 16 | $animationDuration: 2.4s; 17 | $delayRange: $animationDuration/2; 18 | 19 | margin: $spinkit-spinner-margin; 20 | width: $spinkit-size; 21 | height: $spinkit-size; 22 | position: relative; 23 | transform: rotateZ(45deg); 24 | 25 | .sk-cube { 26 | float: left; 27 | width: 50%; 28 | height: 50%; 29 | position: relative; 30 | transform: scale(1.1); 31 | } 32 | 33 | .sk-cube:before { 34 | content: ''; 35 | position: absolute; 36 | top: 0; 37 | left: 0; 38 | width: 100%; 39 | height: 100%; 40 | background-color: $spinkit-spinner-color; 41 | animation: sk-foldCubeAngle $animationDuration infinite linear both; 42 | transform-origin: 100% 100%; 43 | } 44 | 45 | // Rotation / angle 46 | @for $i from 2 through $cubeCount { 47 | .sk-cube#{$i} { 48 | transform: scale(1.1) rotateZ(90deg * ($i - 1)); 49 | } 50 | } 51 | 52 | @for $i from 2 through $cubeCount { 53 | .sk-cube#{$i}:before { 54 | animation-delay: $delayRange / $cubeCount * ($i - 1); 55 | } 56 | } 57 | } 58 | 59 | @keyframes sk-foldCubeAngle { 60 | 0%, 10% { 61 | transform: perspective(140px) rotateX(-180deg); 62 | opacity: 0; 63 | } 25%, 75% { 64 | transform: perspective(140px) rotateX(0deg); 65 | opacity: 1; 66 | } 90%, 100% { 67 | transform: perspective(140px) rotateY(180deg); 68 | opacity: 0; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/7-three-bounce.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 three bounce 5 | 52 | 53 | 54 | 55 | 56 |
57 |
58 |
59 |
60 |
61 | 62 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/8-circle.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | * 19 | */ 20 | @import "../variables"; 21 | 22 | .sk-circle { 23 | $circleCount: 12; 24 | $animationDuration: 1.2s; 25 | 26 | margin: $spinkit-spinner-margin; 27 | width: $spinkit-size; 28 | height: $spinkit-size; 29 | position: relative; 30 | 31 | .sk-child { 32 | width: 100%; 33 | height: 100%; 34 | position: absolute; 35 | left: 0; 36 | top: 0; 37 | } 38 | 39 | .sk-child:before { 40 | content: ''; 41 | display: block; 42 | margin: 0 auto; 43 | width: 15%; 44 | height: 15%; 45 | background-color: $spinkit-spinner-color; 46 | border-radius: 100%; 47 | animation: sk-circleBounceDelay $animationDuration infinite ease-in-out both; 48 | } 49 | 50 | @for $i from 2 through $circleCount { 51 | .sk-circle#{$i} { transform: rotate(360deg / $circleCount * ($i - 1)); } 52 | } 53 | 54 | @for $i from 2 through $circleCount { 55 | .sk-circle#{$i}:before { animation-delay: - $animationDuration + $animationDuration / $circleCount * ($i - 1); } 56 | } 57 | } 58 | 59 | @keyframes sk-circleBounceDelay { 60 | 0%, 80%, 100% { transform: scale(0) } 61 | 40% { transform: scale(1.0) } 62 | } 63 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/scss/spinners/10-fading-circle.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | * 19 | */ 20 | @import "../variables"; 21 | 22 | .sk-fading-circle { 23 | $circleCount: 12; 24 | $animationDuration: 1.2s; 25 | 26 | margin: $spinkit-spinner-margin; 27 | width: $spinkit-size; 28 | height: $spinkit-size; 29 | position: relative; 30 | 31 | .sk-circle { 32 | width: 100%; 33 | height: 100%; 34 | position: absolute; 35 | left: 0; 36 | top: 0; 37 | } 38 | 39 | .sk-circle:before { 40 | content: ''; 41 | display: block; 42 | margin: 0 auto; 43 | width: 15%; 44 | height: 15%; 45 | background-color: $spinkit-spinner-color; 46 | border-radius: 100%; 47 | animation: sk-circleFadeDelay $animationDuration infinite ease-in-out both; 48 | } 49 | 50 | @for $i from 2 through $circleCount { 51 | .sk-circle#{$i} { transform: rotate(360deg / $circleCount * ($i - 1)); } 52 | } 53 | 54 | @for $i from 2 through $circleCount { 55 | .sk-circle#{$i}:before { animation-delay: - $animationDuration + $animationDuration / $circleCount * ($i - 1); } 56 | } 57 | 58 | } 59 | 60 | @keyframes sk-circleFadeDelay { 61 | 0%, 39%, 100% { opacity: 0 } 62 | 40% { opacity: 1 } 63 | } 64 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Pull Request Guidelines 2 | 3 | We all love Pull Requests so if you have something you'd like to share with the community we'd be happy to help you out with contributing. But before you create your PR please read and understand the following. :heart: 4 | 5 | ## Code 6 | 7 | If you're submitting a new animation, make sure that it looks identical in [all browsers that support CSS animations](http://caniuse.com/css-animation). 8 | 9 | The animation styles should be put in an [SCSS](http://sass-lang.com/) file which you place in [scss/spinners/](https://github.com/tobiasahlin/SpinKit/blob/master/scss/spinners). It must also be imported in [scss/spinkit.scss](https://github.com/tobiasahlin/SpinKit/blob/master/scss/spinkit.scss). Carefully look at the existing spinners to make sure you follow the same conventions and that you list an example on top of the page exactly like the other spinners (we extract this when generating the HTML files). Don't use any browser prefixes as this will be added automatically to the generated CSS files by [autoprefixer](https://github.com/postcss/autoprefixer). 10 | 11 | To generate the CSS and HTML files you need to have [node.js](http://nodejs.org/) installed on your system. After that you need to issue `npm install` from the SpinKit project directory to install [gulp](https://github.com/gulpjs/gulp) and other dependencies listed in `package.json`. After doing this you should be able to just call `gulp build` to generate the files. These files should be included in your pull requests. 12 | 13 | 14 | ## Style 15 | 16 | Following the same code style makes all of our lives a bit easier, currently we ask that you use: 17 | 18 | - 2 spaces for indenting 19 | - No trailing spaces 20 | - One trailing newline at the end of each file 21 | 22 | If you use Sublime Text (or any other editor with the same capability) you can install EditorConfig (through [Sublime Package Control](https://sublime.wbond.net/installation)), which will pick up our project's `.editorconfig` and make your file conform to above rules on each save. 23 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/6-chasing-dots.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 chasing dots 5 | 66 | 67 | 68 | 69 | 70 |
71 |
72 |
73 |
74 | 75 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/3-wave.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 3 wave 5 | 64 | 65 | 66 | 67 | 68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | 76 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/9-cube-grid.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | * 16 | */ 17 | .sk-cube-grid { 18 | width: 40px; 19 | height: 40px; 20 | margin: 40px auto; 21 | /* 22 | * Spinner positions 23 | * 1 2 3 24 | * 4 5 6 25 | * 7 8 9 26 | */ } 27 | .sk-cube-grid .sk-cube { 28 | width: 33.33%; 29 | height: 33.33%; 30 | background-color: #333; 31 | float: left; 32 | -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; 33 | animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; } 34 | .sk-cube-grid .sk-cube1 { 35 | -webkit-animation-delay: 0.2s; 36 | animation-delay: 0.2s; } 37 | .sk-cube-grid .sk-cube2 { 38 | -webkit-animation-delay: 0.3s; 39 | animation-delay: 0.3s; } 40 | .sk-cube-grid .sk-cube3 { 41 | -webkit-animation-delay: 0.4s; 42 | animation-delay: 0.4s; } 43 | .sk-cube-grid .sk-cube4 { 44 | -webkit-animation-delay: 0.1s; 45 | animation-delay: 0.1s; } 46 | .sk-cube-grid .sk-cube5 { 47 | -webkit-animation-delay: 0.2s; 48 | animation-delay: 0.2s; } 49 | .sk-cube-grid .sk-cube6 { 50 | -webkit-animation-delay: 0.3s; 51 | animation-delay: 0.3s; } 52 | .sk-cube-grid .sk-cube7 { 53 | -webkit-animation-delay: 0.0s; 54 | animation-delay: 0.0s; } 55 | .sk-cube-grid .sk-cube8 { 56 | -webkit-animation-delay: 0.1s; 57 | animation-delay: 0.1s; } 58 | .sk-cube-grid .sk-cube9 { 59 | -webkit-animation-delay: 0.2s; 60 | animation-delay: 0.2s; } 61 | 62 | @-webkit-keyframes sk-cubeGridScaleDelay { 63 | 0%, 70%, 100% { 64 | -webkit-transform: scale3D(1, 1, 1); 65 | transform: scale3D(1, 1, 1); } 66 | 35% { 67 | -webkit-transform: scale3D(0, 0, 1); 68 | transform: scale3D(0, 0, 1); } } 69 | 70 | @keyframes sk-cubeGridScaleDelay { 71 | 0%, 70%, 100% { 72 | -webkit-transform: scale3D(1, 1, 1); 73 | transform: scale3D(1, 1, 1); } 74 | 35% { 75 | -webkit-transform: scale3D(0, 0, 1); 76 | transform: scale3D(0, 0, 1); } } 77 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@gladeye/aframe-preloader-component", 3 | "version": "1.0.2", 4 | "description": "A preloading animation that automatically displays while scene assets load.", 5 | "main": "index.js", 6 | "cdn": "dist/aframe-preloader-component.min.js", 7 | "scripts": { 8 | "dev": "budo index.js:dist/aframe-preloader-component.min.js --port 7000 --live --open", 9 | "dist": "webpack index.js dist/aframe-preloader-component.js && webpack -p index.js dist/aframe-preloader-component.min.js", 10 | "lint": "semistandard -v | snazzy", 11 | "preghpages": "rm -rf gh-pages && mkdir gh-pages && cp index.html gh-pages && cp -r dist gh-pages && cp -r examples gh-pages", 12 | "ghpages": "npm run preghpages && ghpages -p gh-pages", 13 | "start": "npm run dev", 14 | "test": "karma start ./tests/karma.conf.js", 15 | "test:firefox": "karma start ./tests/karma.conf.js --browsers Firefox", 16 | "test:chrome": "karma start ./tests/karma.conf.js --browsers Chrome" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/gladeye/aframe-preloader-component.git" 21 | }, 22 | "keywords": [ 23 | "aframe", 24 | "aframe-component", 25 | "aframe-vr", 26 | "vr", 27 | "mozvr", 28 | "webvr", 29 | "preloader" 30 | ], 31 | "author": "Michael Andrew ", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/gladeye/aframe-preloader-component/issues" 35 | }, 36 | "homepage": "https://github.com/gladeye/aframe-preloader-component#readme", 37 | "devDependencies": { 38 | "aframe": "*", 39 | "browserify": "^13.0.0", 40 | "budo": "^8.2.2", 41 | "chai": "^3.4.1", 42 | "chai-shallow-deep-equal": "^1.3.0", 43 | "ghpages": "0.0.10", 44 | "karma": "^0.13.15", 45 | "karma-browserify": "^4.4.2", 46 | "karma-chai-shallow-deep-equal": "0.0.4", 47 | "karma-chrome-launcher": "2.0.0", 48 | "karma-env-preprocessor": "^0.1.1", 49 | "karma-firefox-launcher": "^0.1.7", 50 | "karma-mocha": "^0.2.1", 51 | "karma-mocha-reporter": "^1.1.3", 52 | "karma-sinon-chai": "^1.1.0", 53 | "mocha": "^2.3.4", 54 | "randomcolor": "^0.4.4", 55 | "semistandard": "^8.0.0", 56 | "shelljs": "^0.7.0", 57 | "shx": "^0.1.1", 58 | "sinon": "^1.17.5", 59 | "sinon-chai": "^2.8.0", 60 | "snazzy": "^4.0.0", 61 | "webpack": "^1.13.0" 62 | }, 63 | "semistandard": { 64 | "globals": [ 65 | "AFRAME", 66 | "THREE" 67 | ], 68 | "ignore": [ 69 | "examples/build.js", 70 | "dist/**" 71 | ] 72 | }, 73 | "dependencies": { 74 | "bootstrap": "^3.3.7", 75 | "jquery": "^1.12.4" 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/4-wandering-cubes.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 | * 9 | */ 10 | .sk-wandering-cubes { 11 | margin: 40px auto; 12 | width: 40px; 13 | height: 40px; 14 | position: relative; } 15 | .sk-wandering-cubes .sk-cube { 16 | background-color: #333; 17 | width: 10px; 18 | height: 10px; 19 | position: absolute; 20 | top: 0; 21 | left: 0; 22 | -webkit-animation: sk-wanderingCube 1.8s ease-in-out -1.8s infinite both; 23 | animation: sk-wanderingCube 1.8s ease-in-out -1.8s infinite both; } 24 | .sk-wandering-cubes .sk-cube2 { 25 | -webkit-animation-delay: -0.9s; 26 | animation-delay: -0.9s; } 27 | 28 | @-webkit-keyframes sk-wanderingCube { 29 | 0% { 30 | -webkit-transform: rotate(0deg); 31 | transform: rotate(0deg); } 32 | 25% { 33 | -webkit-transform: translateX(30px) rotate(-90deg) scale(0.5); 34 | transform: translateX(30px) rotate(-90deg) scale(0.5); } 35 | 50% { 36 | /* Hack to make FF rotate in the right direction */ 37 | -webkit-transform: translateX(30px) translateY(30px) rotate(-179deg); 38 | transform: translateX(30px) translateY(30px) rotate(-179deg); } 39 | 50.1% { 40 | -webkit-transform: translateX(30px) translateY(30px) rotate(-180deg); 41 | transform: translateX(30px) translateY(30px) rotate(-180deg); } 42 | 75% { 43 | -webkit-transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); 44 | transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); } 45 | 100% { 46 | -webkit-transform: rotate(-360deg); 47 | transform: rotate(-360deg); } } 48 | 49 | @keyframes sk-wanderingCube { 50 | 0% { 51 | -webkit-transform: rotate(0deg); 52 | transform: rotate(0deg); } 53 | 25% { 54 | -webkit-transform: translateX(30px) rotate(-90deg) scale(0.5); 55 | transform: translateX(30px) rotate(-90deg) scale(0.5); } 56 | 50% { 57 | /* Hack to make FF rotate in the right direction */ 58 | -webkit-transform: translateX(30px) translateY(30px) rotate(-179deg); 59 | transform: translateX(30px) translateY(30px) rotate(-179deg); } 60 | 50.1% { 61 | -webkit-transform: translateX(30px) translateY(30px) rotate(-180deg); 62 | transform: translateX(30px) translateY(30px) rotate(-180deg); } 63 | 75% { 64 | -webkit-transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); 65 | transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); } 66 | 100% { 67 | -webkit-transform: rotate(-360deg); 68 | transform: rotate(-360deg); } } 69 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/assets/js/main.js: -------------------------------------------------------------------------------- 1 | function getQueryVariable(variable) 2 | { 3 | var query = window.location.search.substring(1); 4 | var vars = query.split("&"); 5 | for (var i=0;i
')); 24 | break; 25 | case 'sk-wave': 26 | $spinnerEl.html($('
')); 27 | break; 28 | case 'sk-wandering-cubes': 29 | $spinnerEl.html($('
')); 30 | break; 31 | case 'sk-chasing-dots': 32 | $spinnerEl.html($('
')); 33 | break; 34 | case 'sk-three-bounce': 35 | $spinnerEl.html($('
')); 36 | break; 37 | case 'sk-cube-grid': 38 | $spinnerEl.html($('
')); 39 | break; 40 | case 'sk-folding-cube': 41 | $spinnerEl.html($('
')); 42 | break; 43 | case 'sk-pulse': 44 | //nothing to add 45 | break; 46 | case 'sk-circle': 47 | case 'sk-fading-circle': 48 | //not supported 49 | console.error('Spinkit sk-circle and sk-fading-circle are not supported!'); 50 | break; 51 | default: 52 | break; 53 | } 54 | } 55 | 56 | 57 | }); -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/README.md: -------------------------------------------------------------------------------- 1 | # [SpinKit](http://tobiasahlin.com/spinkit/) 2 | 3 | Simple loading spinners animated with CSS. See [demo](http://tobiasahlin.com/spinkit/). SpinKit uses hardware accelerated (`translate` and `opacity`) CSS animations to create smooth and easily customizable animations. 4 | 5 | ## Usage 6 | 7 | ### Regular CSS 8 | 9 | Grab the HTML and CSS for a spinner from the example files, or add SpinKit directly to your project with `bower`: 10 | 11 | ```bash 12 | $ bower install spinkit 13 | ``` 14 | 15 | or npm: 16 | 17 | ```bash 18 | $ npm install spinkit 19 | ``` 20 | 21 | ### SCSS 22 | 23 | If you're using SCSS you can include specific spinners (rather than all of them) by importing them one by one: 24 | 25 | ```scss 26 | @import '../bower_components/spinkit/scss/spinners/1-rotating-plane', 27 | '../bower_components/spinkit/scss/spinners/3-wave'; 28 | ``` 29 | 30 | You currently need to use an [autoprefixer](https://github.com/postcss/autoprefixer) if you want to support all browsers. If you're compiling your SCSS with gulp you can use [gulp-autoprefixer](https://github.com/sindresorhus/gulp-autoprefixer), and [grunt-autoprefixer](https://github.com/nDmitry/grunt-autoprefixer) if you use grunt. 31 | 32 | Variables that can be overridden are listed in [scss/_variables.scss](https://github.com/tobiasahlin/SpinKit/blob/master/scss/_variables.scss). 33 | 34 | ## Web browser compatibility 35 | 36 | CSS animations are supported in the latest version of all major browsers, and browsers with `animation` support make up [almost 90% of all usage](http://caniuse.com/#feat=css-animation). If you need to support IE9 and below, however, this section is for you. 37 | 38 | ### Implementing a fallback spinner 39 | 40 | How do you know if you need to provide a fallback? You can easily check for animation support with [Modernizr](http://modernizr.com), or manually check for the `animation` property, and replace the spinner with a GIF if it's not supported: 41 | 42 | ```javascript 43 | function browserSupportsCSSProperty(propertyName) { 44 | var elm = document.createElement('div'); 45 | propertyName = propertyName.toLowerCase(); 46 | 47 | if (elm.style[propertyName] != undefined) 48 | return true; 49 | 50 | var propertyNameCapital = propertyName.charAt(0).toUpperCase() + propertyName.substr(1), 51 | domPrefixes = 'Webkit Moz ms O'.split(' '); 52 | 53 | for (var i = 0; i < domPrefixes.length; i++) { 54 | if (elm.style[domPrefixes[i] + propertyNameCapital] != undefined) 55 | return true; 56 | } 57 | 58 | return false; 59 | } 60 | ``` 61 | 62 | Use it to check for `animation` support: 63 | 64 | ```javascript 65 | if (!browserSupportsCSSProperty('animation')) { 66 | // fallback… 67 | } 68 | ``` 69 | 70 | ## Contributing 71 | 72 | See [CONTRIBUTING.md](https://github.com/tobiasahlin/SpinKit/blob/master/CONTRIBUTING.md) for details. 73 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var _ = require('lodash'); 3 | var fs = require('fs'); 4 | var Q = require('q'); 5 | var gulp = require('gulp'); 6 | var autoprefixer = require('gulp-autoprefixer'); 7 | var sass = require('gulp-sass'); 8 | var del = require('del'); 9 | 10 | var htmlDir = './examples', 11 | cssDir = './css', 12 | scssDir = './scss', 13 | htmlTmpl = '\n\ 14 | \n\ 15 | \n\ 16 | <%= title %>\n\ 17 | \n\ 20 | \n\ 21 | \n\ 22 | <%= bodyContent %>\n\ 23 | \n\ 24 | '; 25 | 26 | var getHtmlUsageExample = function(cssContent) { 27 | var match = cssContent.match(/Usage:([\s\S]+\*[.\s\S]+\>)/); 28 | return match && match.length > 1 ? match[1].replace(/ \*/g, '') : ''; 29 | }; 30 | 31 | gulp.task('clean-styles', function(cb) { 32 | del([cssDir], cb); 33 | }); 34 | 35 | 36 | gulp.task('styles', ['clean-styles'], function() { 37 | return gulp.src(scssDir + '/**/*.scss') 38 | .pipe(sass({errLogToConsole: true})) 39 | .pipe(autoprefixer('last 2 versions', {map: false})) 40 | .pipe(gulp.dest(cssDir)); 41 | }); 42 | 43 | 44 | gulp.task('clean-html', function(cb) { 45 | del([htmlDir], cb); 46 | }); 47 | 48 | 49 | // Generates HTML files from the usage examples found in the CSS files 50 | gulp.task('html', ['styles', 'clean-html'], function() { 51 | var spinnersDir = cssDir + '/spinners/'; 52 | var allDeferred = Q.defer(); 53 | 54 | fs.mkdirSync(htmlDir); 55 | 56 | fs.readdir(spinnersDir, function(err, filenames) { 57 | var promises = filenames.map(function(filename) { 58 | if (filename.indexOf('.css') === -1) { return; } 59 | var deferred = Q.defer(); 60 | var title = filename.replace('.css', '').replace(/-/g, ' '); 61 | var cssFilepath = spinnersDir + filename; 62 | var htmlFilename = filename.replace('.css', '.html'); 63 | 64 | var readCssFile = function(err, cssContent) { 65 | if (err) { console.log(err); deferred.reject(err); } 66 | var bodyContent = getHtmlUsageExample(cssContent); 67 | var html = _.template(htmlTmpl)({ 68 | css: cssContent, 69 | title: title, 70 | bodyContent: bodyContent 71 | }); 72 | fs.writeFile(htmlDir + '/' + htmlFilename, html, function(err, data) { 73 | if (err) { console.log(err); deferred.reject(err); } 74 | deferred.resolve(); 75 | }); 76 | }; 77 | 78 | fs.readFile(cssFilepath, {encoding: 'utf8'}, readCssFile); 79 | return deferred.promise; 80 | }); 81 | Q.all(promises).then(allDeferred.resolve); 82 | 83 | }); 84 | 85 | return allDeferred; 86 | }); 87 | 88 | 89 | gulp.task('build', ['html', 'styles']); 90 | 91 | 92 | gulp.task('default', ['build']); 93 | 94 | 95 | gulp.task('watch', ['build'], function() { 96 | gulp.watch(scssDir + '/**/*.scss', ['build']); 97 | }); 98 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinners/11-folding-cube.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 |
6 |
7 |
8 |
9 |
10 | * 11 | */ 12 | .sk-folding-cube { 13 | margin: 40px auto; 14 | width: 40px; 15 | height: 40px; 16 | position: relative; 17 | -webkit-transform: rotateZ(45deg); 18 | transform: rotateZ(45deg); } 19 | .sk-folding-cube .sk-cube { 20 | float: left; 21 | width: 50%; 22 | height: 50%; 23 | position: relative; 24 | -webkit-transform: scale(1.1); 25 | -ms-transform: scale(1.1); 26 | transform: scale(1.1); } 27 | .sk-folding-cube .sk-cube:before { 28 | content: ''; 29 | position: absolute; 30 | top: 0; 31 | left: 0; 32 | width: 100%; 33 | height: 100%; 34 | background-color: #333; 35 | -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; 36 | animation: sk-foldCubeAngle 2.4s infinite linear both; 37 | -webkit-transform-origin: 100% 100%; 38 | -ms-transform-origin: 100% 100%; 39 | transform-origin: 100% 100%; } 40 | .sk-folding-cube .sk-cube2 { 41 | -webkit-transform: scale(1.1) rotateZ(90deg); 42 | transform: scale(1.1) rotateZ(90deg); } 43 | .sk-folding-cube .sk-cube3 { 44 | -webkit-transform: scale(1.1) rotateZ(180deg); 45 | transform: scale(1.1) rotateZ(180deg); } 46 | .sk-folding-cube .sk-cube4 { 47 | -webkit-transform: scale(1.1) rotateZ(270deg); 48 | transform: scale(1.1) rotateZ(270deg); } 49 | .sk-folding-cube .sk-cube2:before { 50 | -webkit-animation-delay: 0.3s; 51 | animation-delay: 0.3s; } 52 | .sk-folding-cube .sk-cube3:before { 53 | -webkit-animation-delay: 0.6s; 54 | animation-delay: 0.6s; } 55 | .sk-folding-cube .sk-cube4:before { 56 | -webkit-animation-delay: 0.9s; 57 | animation-delay: 0.9s; } 58 | 59 | @-webkit-keyframes sk-foldCubeAngle { 60 | 0%, 10% { 61 | -webkit-transform: perspective(140px) rotateX(-180deg); 62 | transform: perspective(140px) rotateX(-180deg); 63 | opacity: 0; } 64 | 25%, 75% { 65 | -webkit-transform: perspective(140px) rotateX(0deg); 66 | transform: perspective(140px) rotateX(0deg); 67 | opacity: 1; } 68 | 90%, 100% { 69 | -webkit-transform: perspective(140px) rotateY(180deg); 70 | transform: perspective(140px) rotateY(180deg); 71 | opacity: 0; } } 72 | 73 | @keyframes sk-foldCubeAngle { 74 | 0%, 10% { 75 | -webkit-transform: perspective(140px) rotateX(-180deg); 76 | transform: perspective(140px) rotateX(-180deg); 77 | opacity: 0; } 78 | 25%, 75% { 79 | -webkit-transform: perspective(140px) rotateX(0deg); 80 | transform: perspective(140px) rotateX(0deg); 81 | opacity: 1; } 82 | 90%, 100% { 83 | -webkit-transform: perspective(140px) rotateY(180deg); 84 | transform: perspective(140px) rotateY(180deg); 85 | opacity: 0; } } 86 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/4-wandering-cubes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 4 wandering cubes 5 | 76 | 77 | 78 | 79 | 80 |
81 |
82 |
83 |
84 | 85 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/9-cube-grid.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 cube grid 5 | 84 | 85 | 86 | 87 | 88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 | 100 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/assets/css/style.css: -------------------------------------------------------------------------------- 1 | #preloader-modal .preloader-modal__spinner{ 2 | display: inline-block; 3 | margin-bottom: 2em; 4 | } 5 | 6 | #preloader-modal .preloader-modal__spinner{ 7 | transform: scale3d(2,2,1); 8 | } 9 | 10 | #preloader-modal .btn{ 11 | margin-top: 2em; 12 | } 13 | 14 | /* SPINKIT CUSTOMIZATION CLASSES */ 15 | 16 | 17 | /* sk-rotating-plane */ 18 | 19 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-rotating-plane{ 20 | background-color: #009900; 21 | } 22 | 23 | #preloader-modal .preloader-modal__spinner.sk-rotating-plane{ 24 | background-color: #c8c8c8; 25 | } 26 | 27 | /* sk-double-bounce */ 28 | 29 | #preloader-modal .preloader-modal__spinner.sk-double-bounce .sk-child{ 30 | background-color: #c8c8c8; 31 | } 32 | 33 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-double-bounce .sk-child{ 34 | background-color: #009900; 35 | } 36 | 37 | /* sk-wave */ 38 | 39 | #preloader-modal .preloader-modal__spinner.sk-wave .sk-rect{ 40 | background-color: #c8c8c8; 41 | } 42 | 43 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-wave .sk-rect{ 44 | background-color: #009900; 45 | } 46 | 47 | /* sk-wandering-cubes */ 48 | 49 | #preloader-modal .preloader-modal__spinner.sk-wandering-cubes .sk-cube{ 50 | background-color: #c8c8c8; 51 | } 52 | 53 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-wandering-cubes .sk-cube{ 54 | background-color: #009900; 55 | } 56 | 57 | /* sk-spinner-pulse */ 58 | 59 | #preloader-modal .preloader-modal__spinner.sk-spinner-pulse{ 60 | background-color: #c8c8c8; 61 | } 62 | 63 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-spinner-pulse{ 64 | background-color: #009900; 65 | } 66 | 67 | /* sk-chasing-dots */ 68 | 69 | #preloader-modal .preloader-modal__spinner.sk-chasing-dots{ 70 | transform: none; 71 | } 72 | 73 | #preloader-modal .preloader-modal__spinner.sk-chasing-dots .sk-child{ 74 | background-color: #c8c8c8; 75 | } 76 | 77 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-chasing-dots .sk-child{ 78 | background-color: #009900; 79 | } 80 | 81 | /* sk-three-bounce */ 82 | 83 | #preloader-modal .preloader-modal__spinner.sk-three-bounce .sk-child{ 84 | background-color: #c8c8c8; 85 | } 86 | 87 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-three-bounce .sk-child{ 88 | background-color: #009900; 89 | } 90 | 91 | /* sk-cube-grid */ 92 | 93 | #preloader-modal .preloader-modal__spinner.sk-cube-grid .sk-cube{ 94 | background-color: #c8c8c8; 95 | } 96 | 97 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-cube-grid .sk-cube{ 98 | background-color: #009900; 99 | } 100 | 101 | /* sk-folding-cube */ 102 | 103 | #preloader-modal .preloader-modal__spinner.sk-folding-cube .sk-cube{ 104 | background-color: #c8c8c8; 105 | } 106 | 107 | #preloader-modal .preloader-modal__spinner.sk-folding-cube .sk-cube:before{ 108 | background-color: #535353; 109 | } 110 | 111 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-folding-cube .sk-cube{ 112 | background-color: #009900; 113 | } 114 | 115 | #preloader-modal.preloader-modal__complete .preloader-modal__spinner.sk-folding-cube .sk-cube:before{ 116 | background-color: #004700; 117 | } 118 | 119 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/11-folding-cube.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 folding cube 5 | 93 | 94 | 95 | 96 | 97 |
98 |
99 |
100 |
101 |
102 |
103 | 104 | -------------------------------------------------------------------------------- /examples/bootstrap/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A-Frame Preloader Component - Bootstrap Font Awesome 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 48 | 49 | 50 |

A-Frame Preloader Component

51 | 52 |

Basic Usage

53 | 54 |

These examples demonstrate dropping in the preloader component to easily add a loading bar to your scenes.

55 | 56 |
    57 |
  • 58 | 59 |

    Bootstrap Default

    60 |

    Example showing a full-screen Bootstrap modal preloader. Blocks the entire view until preloading is complete.

    61 |
  • 62 |
  • 63 | 64 |

    Bootstrap Small

    65 |

    Example showing a small Bootstrap modal preloader with close button. Useful if you want part of the scene to load while the user waits for large assets to download.

    66 |
  • 67 | 68 |
69 | 70 |

Advanced Usage

71 | 72 |

These examples show how to specify your own preloader modal using Bootstrap and third party CSS libraries for 73 | displaying a custom spinner in place of the loading bar.

74 | 75 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/10-fading-circle.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 fading circle 5 | 137 | 138 | 139 | 140 | 141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 | 156 | -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/examples/8-circle.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 circle 5 | 141 | 142 | 143 | 144 | 145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 | 160 | -------------------------------------------------------------------------------- /dist/aframe-preloader-component.min.js: -------------------------------------------------------------------------------- 1 | !function(t){function e(s){if(a[s])return a[s].exports;var o=a[s]={exports:{},id:s,loaded:!1};return t[s].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var a={};return e.m=t,e.c=a,e.p="",e(0)}([function(t,e){if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");String.prototype.format||(String.prototype.format=function(){var t=arguments;return this.replace(/{(\d+)}/g,function(e,a){return"undefined"!=typeof t[a]?t[a]:e})}),AFRAME.registerSystem("preloader",{schema:{type:{type:"string",default:"bootstrap"},id:{type:"string",default:"preloader-modal"},autoInject:{type:"boolean",default:!0},target:{type:"selector",default:"#preloader-modal"},progressValueAttr:{type:"string",default:"aria-valuenow"},barProgressStyle:{type:"string",default:"width"},bar:{type:"selector",default:"#preloader-modal .progress-bar"},label:{type:"selector",default:"#preloader-modal .progress-label"},labelText:{type:"string",default:"{0}% Complete"},autoClose:{type:"boolean",default:!0},clickToClose:{type:"boolean",default:!1},closeLabelText:{type:"string",default:"Continue"},title:{type:"string",default:""},debug:{type:"boolean",default:!1},disableVRModeUI:{type:"boolean",default:!0},slowLoad:{type:"boolean",default:!1},doneLabelText:{type:"string",default:"Done"}},multiple:!1,loadedAssetCount:0,totalAssetCount:0,slowLoadTimeAssetUpdate:1e3,slowLoadTimePreloadFinish:4e3,init:function(){this.data.debug&&console.log("Initialized preloader"),"bootstrap"===this.data.type&&"undefined"==typeof $&&console.error("jQuery is not present, cannot instantiate Bootstrap modal for preloader!"),document.querySelector("a-assets").addEventListener("loaded",function(){this.data.debug&&console.info("All assets loaded"),this.triggerProgressComplete()}.bind(this));var t=document.querySelectorAll("a-assets a-asset-item,a-assets img,a-assets audio,a-assets video");if(this.totalAssetCount=t.length,this.watchPreloadProgress(t),!this.data.target&&this.data.autoInject)this.data.debug&&console.info("No preloader html found, auto-injecting"),this.injectHTML();else switch(this.data.type){case"bootstrap":this.initBootstrapModal($(this.data.target))}this.data.disableVRModeUI&&this.el.setAttribute("vr-mode-ui","enabled","false")},update:function(t){},watchPreloadProgress:function(t){for(var e=0;e");else var t=$('");$("body").append(t),this.data.target=t[0],this.data.label=t.find(".progress-label")[0],this.data.bar=t.find(".progress-bar")[0],this.initBootstrapModal(t)},initBootstrapModal:function(t){if(t.modal({backdrop:"static",keyboard:!1}),!this.data.title){var e=$("");$("head").append(e)}if(this.data.clickToClose){var a=t.find("[data-dismiss=modal]");a.length>0?(this.closeBtn=a[0],this.closeBtn.setAttribute("style","display: none"),t.on("hidden.bs.modal",function(t){this.triggerPreloadingComplete()}.bind(this))):console.error('No Bootstrap modal close button is set in the HTML. Please add a button with the data-dismiss="modal" attribute to use clickToClose.')}},triggerPreloadingComplete:function(){this.data.debug&&console.info("Preloading complete"),this.data.disableVRModeUI&&this.el.setAttribute("vr-mode-ui","enabled","true"),this.el.emit("preloading-complete")},closeModal:function(){switch(this.data.type){case"bootstrap":$(this.data.target).modal("hide")}}})}]); -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* global AFRAME */ 2 | 3 | if (typeof AFRAME === 'undefined') { 4 | throw new Error('Component attempted to register before AFRAME was available.'); 5 | } 6 | 7 | // First, checks if it isn't implemented yet. 8 | if (!String.prototype.format) { 9 | String.prototype.format = function() { 10 | var args = arguments; 11 | return this.replace(/{(\d+)}/g, function(match, number) { 12 | return typeof args[number] != 'undefined' 13 | ? args[number] 14 | : match 15 | ; 16 | }); 17 | }; 18 | } 19 | 20 | /** 21 | * Visual preloader system for A-Frame. 22 | * 23 | * When applied to the will automatically display a preloader modal that reflects the current loading progress 24 | * of resources in that have been flagged for preloading and will auto-close the modal when it reaches 100%. 25 | * Alternately, the modal can be manually closed 26 | * 27 | * Emits a 'preloading-complete' event when done. 28 | */ 29 | AFRAME.registerSystem('preloader', { 30 | schema: { 31 | type: { type: 'string', default: 'bootstrap' }, //type of CSS framework to use - acceptable values are: 'bootstrap' or 'custom' 32 | id: {type: 'string', default: 'preloader-modal'}, //ID of the auto injected preloader modal 33 | autoInject: { type: 'boolean', default: true }, //whether or not to auto-inject the preloader html into the page 34 | target: { type: 'selector', default: '#preloader-modal'}, //the html target selector 35 | progressValueAttr: { type: 'string', default: 'aria-valuenow' },//an attribute of the progress bar to set when progress is updated 36 | barProgressStyle: { type: 'string', default: 'width'}, //target css style to set as a percentage on the bar 37 | bar: { type: 'selector', default: '#preloader-modal .progress-bar'}, //html class of progress bar in preloader - used to set the width 38 | label: { type: 'selector', default: '#preloader-modal .progress-label'}, //html class of label in preloader - used to set the percentage 39 | labelText: { type: 'string', default: '{0}% Complete'}, //loading text format {0} will be replaced with the percent progress e.g. 30% 40 | autoClose: { type: 'boolean', default: true}, //automatically close preloader by default - not supported if clickToClose is set to 'true' 41 | clickToClose: { type: 'boolean', default: false}, //whether the user must click a button to close the modal when preloading is finished 42 | closeLabelText: { type: 'string', default: 'Continue'}, //default label text of click to close button 43 | title: { type: 'string', default: ''}, //title of preloader modal 44 | debug: { type: 'boolean', default: false}, //whether or not to enable logging to console 45 | disableVRModeUI: { type: 'boolean', default: true}, //whether or not to disable VR Mode UI when preloading 46 | slowLoad: { type: 'boolean', default: false}, //deliberately slow down the load progress by adding 2 second delays before updating progress - used to showcase loader on fast connections and should not be enabled in production 47 | doneLabelText: { type: 'string', default: 'Done'} //text to set on label when loading is complete 48 | }, 49 | 50 | /** 51 | * Set if component needs multiple instancing. 52 | */ 53 | multiple: false, 54 | 55 | loadedAssetCount: 0, //total number of assets loaded 56 | totalAssetCount: 0, //total number of assets to load 57 | slowLoadTimeAssetUpdate: 1000, //length of time to slow down asset load progress if slowLoad is set to 'true' 58 | slowLoadTimePreloadFinish: 4000, //length of time to slow down preload finish if slowLoad is set to 'true' 59 | 60 | /** 61 | * Called once when component is attached. Generally for initial setup. 62 | */ 63 | init: function () { 64 | 65 | if(this.data.debug){ 66 | console.log('Initialized preloader'); 67 | } 68 | 69 | if(this.data.type === 'bootstrap' && typeof $ === 'undefined'){ 70 | console.error('jQuery is not present, cannot instantiate Bootstrap modal for preloader!'); 71 | } 72 | 73 | document.querySelector('a-assets').addEventListener('loaded',function(){ 74 | if(this.data.debug){ 75 | console.info('All assets loaded'); 76 | } 77 | this.triggerProgressComplete(); 78 | 79 | }.bind(this)); 80 | 81 | var assetItems = document.querySelectorAll('a-assets a-asset-item,a-assets img,a-assets audio,a-assets video'); 82 | 83 | this.totalAssetCount = assetItems.length; 84 | 85 | this.watchPreloadProgress(assetItems); 86 | 87 | if(!this.data.target && this.data.autoInject){ 88 | if(this.data.debug){ 89 | console.info('No preloader html found, auto-injecting'); 90 | } 91 | this.injectHTML(); 92 | }else{ 93 | switch(this.data.type){ 94 | case 'bootstrap': 95 | this.initBootstrapModal($(this.data.target)); 96 | break; 97 | default: 98 | //do nothing 99 | break; 100 | } 101 | } 102 | 103 | if(this.data.disableVRModeUI){ 104 | this.sceneEl.setAttribute('vr-mode-ui','enabled','false'); 105 | } 106 | }, 107 | 108 | /** 109 | * Called when component is attached and when component data changes. 110 | * Generally modifies the entity based on the data. 111 | */ 112 | update: function (oldData) { }, 113 | 114 | /** 115 | * 116 | * @param assetItems A NodeList with a list of elements that you wish to watch 117 | */ 118 | watchPreloadProgress: function(assetItems){ 119 | for (var a = 0; a < assetItems.length; a++) { 120 | 121 | var eventName; 122 | 123 | switch(assetItems[a].nodeName.toLowerCase()){ 124 | case 'a-asset-item': 125 | eventName = 'loaded'; 126 | break; 127 | case 'img': 128 | eventName = 'load'; 129 | break; 130 | case 'audio': 131 | case 'video': 132 | eventName = 'loadeddata'; 133 | break; 134 | } 135 | 136 | assetItems[a].addEventListener(eventName,function(e){ 137 | this.loadedAssetCount++; 138 | if(this.data.debug) { 139 | console.info('Loaded ' + this.loadedAssetCount + '/' + this.totalAssetCount + ' asset items'); 140 | } 141 | this.onAssetLoaded(); 142 | }.bind(this)); 143 | } 144 | }, 145 | 146 | onAssetLoaded: function(){ 147 | if(this.loadedAssetCount === this.totalAssetCount){ 148 | this.triggerProgressComplete(); 149 | }else{ 150 | var percentage = Math.floor(this.loadedAssetCount/this.totalAssetCount*100); 151 | if(this.data.slowLoad) { 152 | setTimeout(function () { 153 | this.drawProgress(percentage); 154 | }.bind(this), this.slowLoadTimeAssetUpdate) 155 | }else{ 156 | this.drawProgress(percentage); 157 | } 158 | } 159 | }, 160 | 161 | triggerProgressComplete: function(){ 162 | 163 | if(this.data.slowLoad){ 164 | setTimeout(function(){ 165 | if(this.data.type === 'bootstrap') $(this.data.bar).addClass('progress-bar-success'); 166 | this.drawProgress(100); 167 | this.data.target.classList.add('preloader-modal__complete'); 168 | }.bind(this),this.slowLoadTimePreloadFinish-1000); 169 | }else{ 170 | if(this.data.type === 'bootstrap') $(this.data.bar).addClass('progress-bar-success'); 171 | this.drawProgress(100); 172 | this.data.target.classList.add('preloader-modal__complete'); 173 | } 174 | 175 | if(this.data.autoClose && !this.data.clickToClose){ 176 | if(this.data.slowLoad){ 177 | setTimeout(function(){ 178 | this.triggerPreloadingComplete(); 179 | this.closeModal(); 180 | }.bind(this),this.slowLoadTimePreloadFinish) 181 | }else{ 182 | this.triggerPreloadingComplete(); 183 | this.closeModal(); 184 | } 185 | 186 | }else{ 187 | if(this.closeBtn && this.data.clickToClose){ 188 | if(this.data.slowLoad){ 189 | setTimeout(function(){ 190 | this.closeBtn.setAttribute('style','display: inline-block'); 191 | }.bind(this),this.slowLoadTimePreloadFinish) 192 | }else{ 193 | this.closeBtn.setAttribute('style','display: inline-block'); 194 | } 195 | 196 | } 197 | } 198 | }, 199 | 200 | drawProgress: function(percentage){ 201 | //update loading bar if exists 202 | if(this.data.label){ 203 | this.data.label.innerHTML = (percentage === 100) ? this.data.doneLabelText : this.data.labelText.format(percentage); 204 | } 205 | 206 | if(this.data.bar){ 207 | this.data.bar.setAttribute(this.data.progressValueAttr,percentage); 208 | this.data.bar.setAttribute('style',this.data.barProgressStyle+':'+percentage+'%'); 209 | } 210 | }, 211 | 212 | injectHTML: function(){ 213 | switch(this.data.type){ 214 | case 'bootstrap': 215 | this.injectBootstrapModal(); 216 | break; 217 | default: 218 | //do nothing 219 | break; 220 | } 221 | }, 222 | 223 | injectBootstrapModal: function(){ 224 | 225 | if(this.data.debug){ 226 | console.info('Injecting bootstrap modal'); 227 | } 228 | 229 | if(!this.data.title){ 230 | //full screen modal 231 | var $modal = $('' + 232 | ''+ 246 | ''); 247 | }else{ 248 | //regular modal 249 | var $modal = $('' + 250 | ''+ 271 | ''); 272 | } 273 | 274 | $('body').append($modal); 275 | 276 | this.data.target = $modal[0]; 277 | this.data.label = $modal.find('.progress-label')[0]; 278 | this.data.bar = $modal.find('.progress-bar')[0]; 279 | 280 | this.initBootstrapModal($modal); 281 | }, 282 | 283 | initBootstrapModal: function($modal){ 284 | $modal.modal({ 285 | backdrop: 'static', 286 | keyboard: false 287 | }); 288 | 289 | if(!this.data.title){ 290 | var $modalStyle = $(''); 307 | $('head').append($modalStyle); 308 | } 309 | 310 | if(this.data.clickToClose){ 311 | var $closeBtn = $modal.find('[data-dismiss=modal]'); 312 | 313 | if($closeBtn.length > 0){ 314 | this.closeBtn = $closeBtn[0]; 315 | 316 | this.closeBtn.setAttribute('style','display: none'); 317 | 318 | $modal.on('hidden.bs.modal', function (e) { 319 | this.triggerPreloadingComplete(); 320 | }.bind(this)) 321 | }else{ 322 | console.error('No Bootstrap modal close button is set in the HTML. Please add a button with the data-dismiss="modal" attribute to use clickToClose.'); 323 | } 324 | } 325 | }, 326 | 327 | triggerPreloadingComplete: function(){ 328 | if(this.data.debug){ 329 | console.info('Preloading complete'); 330 | } 331 | if(this.data.disableVRModeUI){ 332 | this.sceneEl.setAttribute('vr-mode-ui','enabled','true'); 333 | } 334 | 335 | this.sceneEl.emit('preloading-complete'); 336 | }, 337 | 338 | closeModal: function(){ 339 | switch(this.data.type){ 340 | case 'bootstrap': 341 | $(this.data.target).modal('hide'); 342 | break; 343 | default: 344 | //do nothing 345 | break; 346 | } 347 | } 348 | }); 349 | -------------------------------------------------------------------------------- /dist/aframe-preloader-component.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // The module cache 3 | /******/ var installedModules = {}; 4 | 5 | /******/ // The require function 6 | /******/ function __webpack_require__(moduleId) { 7 | 8 | /******/ // Check if module is in cache 9 | /******/ if(installedModules[moduleId]) 10 | /******/ return installedModules[moduleId].exports; 11 | 12 | /******/ // Create a new module (and put it into the cache) 13 | /******/ var module = installedModules[moduleId] = { 14 | /******/ exports: {}, 15 | /******/ id: moduleId, 16 | /******/ loaded: false 17 | /******/ }; 18 | 19 | /******/ // Execute the module function 20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 | 22 | /******/ // Flag the module as loaded 23 | /******/ module.loaded = true; 24 | 25 | /******/ // Return the exports of the module 26 | /******/ return module.exports; 27 | /******/ } 28 | 29 | 30 | /******/ // expose the modules object (__webpack_modules__) 31 | /******/ __webpack_require__.m = modules; 32 | 33 | /******/ // expose the module cache 34 | /******/ __webpack_require__.c = installedModules; 35 | 36 | /******/ // __webpack_public_path__ 37 | /******/ __webpack_require__.p = ""; 38 | 39 | /******/ // Load entry module and return exports 40 | /******/ return __webpack_require__(0); 41 | /******/ }) 42 | /************************************************************************/ 43 | /******/ ([ 44 | /* 0 */ 45 | /***/ (function(module, exports) { 46 | 47 | /* global AFRAME */ 48 | 49 | if (typeof AFRAME === 'undefined') { 50 | throw new Error('Component attempted to register before AFRAME was available.'); 51 | } 52 | 53 | // First, checks if it isn't implemented yet. 54 | if (!String.prototype.format) { 55 | String.prototype.format = function() { 56 | var args = arguments; 57 | return this.replace(/{(\d+)}/g, function(match, number) { 58 | return typeof args[number] != 'undefined' 59 | ? args[number] 60 | : match 61 | ; 62 | }); 63 | }; 64 | } 65 | 66 | /** 67 | * Visual preloader system for A-Frame. 68 | * 69 | * When applied to the will automatically display a preloader modal that reflects the current loading progress 70 | * of resources in that have been flagged for preloading and will auto-close the modal when it reaches 100%. 71 | * Alternately, the modal can be manually closed 72 | * 73 | * Emits a 'preloading-complete' event when done. 74 | */ 75 | AFRAME.registerSystem('preloader', { 76 | schema: { 77 | type: { type: 'string', default: 'bootstrap' }, //type of CSS framework to use - acceptable values are: 'bootstrap' or 'custom' 78 | id: {type: 'string', default: 'preloader-modal'}, //ID of the auto injected preloader modal 79 | autoInject: { type: 'boolean', default: true }, //whether or not to auto-inject the preloader html into the page 80 | target: { type: 'selector', default: '#preloader-modal'}, //the html target selector 81 | progressValueAttr: { type: 'string', default: 'aria-valuenow' },//an attribute of the progress bar to set when progress is updated 82 | barProgressStyle: { type: 'string', default: 'width'}, //target css style to set as a percentage on the bar 83 | bar: { type: 'selector', default: '#preloader-modal .progress-bar'}, //html class of progress bar in preloader - used to set the width 84 | label: { type: 'selector', default: '#preloader-modal .progress-label'}, //html class of label in preloader - used to set the percentage 85 | labelText: { type: 'string', default: '{0}% Complete'}, //loading text format {0} will be replaced with the percent progress e.g. 30% 86 | autoClose: { type: 'boolean', default: true}, //automatically close preloader by default - not supported if clickToClose is set to 'true' 87 | clickToClose: { type: 'boolean', default: false}, //whether the user must click a button to close the modal when preloading is finished 88 | closeLabelText: { type: 'string', default: 'Continue'}, //default label text of click to close button 89 | title: { type: 'string', default: ''}, //title of preloader modal 90 | debug: { type: 'boolean', default: false}, //whether or not to enable logging to console 91 | disableVRModeUI: { type: 'boolean', default: true}, //whether or not to disable VR Mode UI when preloading 92 | slowLoad: { type: 'boolean', default: false}, //deliberately slow down the load progress by adding 2 second delays before updating progress - used to showcase loader on fast connections and should not be enabled in production 93 | doneLabelText: { type: 'string', default: 'Done'} //text to set on label when loading is complete 94 | }, 95 | 96 | /** 97 | * Set if component needs multiple instancing. 98 | */ 99 | multiple: false, 100 | 101 | loadedAssetCount: 0, //total number of assets loaded 102 | totalAssetCount: 0, //total number of assets to load 103 | slowLoadTimeAssetUpdate: 1000, //length of time to slow down asset load progress if slowLoad is set to 'true' 104 | slowLoadTimePreloadFinish: 4000, //length of time to slow down preload finish if slowLoad is set to 'true' 105 | 106 | /** 107 | * Called once when component is attached. Generally for initial setup. 108 | */ 109 | init: function () { 110 | 111 | if(this.data.debug){ 112 | console.log('Initialized preloader'); 113 | } 114 | 115 | if(this.data.type === 'bootstrap' && typeof $ === 'undefined'){ 116 | console.error('jQuery is not present, cannot instantiate Bootstrap modal for preloader!'); 117 | } 118 | 119 | document.querySelector('a-assets').addEventListener('loaded',function(){ 120 | if(this.data.debug){ 121 | console.info('All assets loaded'); 122 | } 123 | this.triggerProgressComplete(); 124 | 125 | }.bind(this)); 126 | 127 | var assetItems = document.querySelectorAll('a-assets a-asset-item,a-assets img,a-assets audio,a-assets video'); 128 | 129 | this.totalAssetCount = assetItems.length; 130 | 131 | this.watchPreloadProgress(assetItems); 132 | 133 | if(!this.data.target && this.data.autoInject){ 134 | if(this.data.debug){ 135 | console.info('No preloader html found, auto-injecting'); 136 | } 137 | this.injectHTML(); 138 | }else{ 139 | switch(this.data.type){ 140 | case 'bootstrap': 141 | this.initBootstrapModal($(this.data.target)); 142 | break; 143 | default: 144 | //do nothing 145 | break; 146 | } 147 | } 148 | 149 | if(this.data.disableVRModeUI){ 150 | this.el.setAttribute('vr-mode-ui','enabled','false'); 151 | } 152 | }, 153 | 154 | /** 155 | * Called when component is attached and when component data changes. 156 | * Generally modifies the entity based on the data. 157 | */ 158 | update: function (oldData) { }, 159 | 160 | /** 161 | * 162 | * @param assetItems A NodeList with a list of elements that you wish to watch 163 | */ 164 | watchPreloadProgress: function(assetItems){ 165 | for (var a = 0; a < assetItems.length; a++) { 166 | 167 | var eventName; 168 | 169 | switch(assetItems[a].nodeName){ 170 | case 'A-ASSET-ITEM': 171 | eventName = 'loaded'; 172 | break; 173 | case 'img': 174 | eventName = 'load'; 175 | break; 176 | case 'audio': 177 | case 'video': 178 | eventName = 'loadeddata'; 179 | break; 180 | } 181 | 182 | assetItems[a].addEventListener(eventName,function(e){ 183 | this.loadedAssetCount++; 184 | if(this.data.debug) { 185 | console.info('Loaded ' + this.loadedAssetCount + '/' + this.totalAssetCount + ' asset items'); 186 | } 187 | this.onAssetLoaded(); 188 | }.bind(this)); 189 | } 190 | }, 191 | 192 | onAssetLoaded: function(){ 193 | if(this.loadedAssetCount === this.totalAssetCount){ 194 | this.triggerProgressComplete(); 195 | }else{ 196 | var percentage = Math.floor(this.loadedAssetCount/this.totalAssetCount*100); 197 | if(this.data.slowLoad) { 198 | setTimeout(function () { 199 | this.drawProgress(percentage); 200 | }.bind(this), this.slowLoadTimeAssetUpdate) 201 | }else{ 202 | this.drawProgress(percentage); 203 | } 204 | } 205 | }, 206 | 207 | triggerProgressComplete: function(){ 208 | 209 | if(this.data.slowLoad){ 210 | setTimeout(function(){ 211 | if(this.data.type === 'bootstrap') $(this.data.bar).addClass('progress-bar-success'); 212 | this.drawProgress(100); 213 | this.data.target.classList.add('preloader-modal__complete'); 214 | }.bind(this),this.slowLoadTimePreloadFinish-1000); 215 | }else{ 216 | if(this.data.type === 'bootstrap') $(this.data.bar).addClass('progress-bar-success'); 217 | this.drawProgress(100); 218 | this.data.target.classList.add('preloader-modal__complete'); 219 | } 220 | 221 | if(this.data.autoClose && !this.data.clickToClose){ 222 | if(this.data.slowLoad){ 223 | setTimeout(function(){ 224 | this.triggerPreloadingComplete(); 225 | this.closeModal(); 226 | }.bind(this),this.slowLoadTimePreloadFinish) 227 | }else{ 228 | this.triggerPreloadingComplete(); 229 | this.closeModal(); 230 | } 231 | 232 | }else{ 233 | if(this.closeBtn && this.data.clickToClose){ 234 | if(this.data.slowLoad){ 235 | setTimeout(function(){ 236 | this.closeBtn.setAttribute('style','display: inline-block'); 237 | }.bind(this),this.slowLoadTimePreloadFinish) 238 | }else{ 239 | this.closeBtn.setAttribute('style','display: inline-block'); 240 | } 241 | 242 | } 243 | } 244 | }, 245 | 246 | drawProgress: function(percentage){ 247 | //update loading bar if exists 248 | if(this.data.label){ 249 | this.data.label.innerHTML = (percentage === 100) ? this.data.doneLabelText : this.data.labelText.format(percentage); 250 | } 251 | 252 | if(this.data.bar){ 253 | this.data.bar.setAttribute(this.data.progressValueAttr,percentage); 254 | this.data.bar.setAttribute('style',this.data.barProgressStyle+':'+percentage+'%'); 255 | } 256 | }, 257 | 258 | injectHTML: function(){ 259 | switch(this.data.type){ 260 | case 'bootstrap': 261 | this.injectBootstrapModal(); 262 | break; 263 | default: 264 | //do nothing 265 | break; 266 | } 267 | }, 268 | 269 | injectBootstrapModal: function(){ 270 | 271 | if(this.data.debug){ 272 | console.info('Injecting bootstrap modal'); 273 | } 274 | 275 | if(!this.data.title){ 276 | //full screen modal 277 | var $modal = $('' + 278 | ''+ 292 | ''); 293 | }else{ 294 | //regular modal 295 | var $modal = $('' + 296 | ''+ 317 | ''); 318 | } 319 | 320 | $('body').append($modal); 321 | 322 | this.data.target = $modal[0]; 323 | this.data.label = $modal.find('.progress-label')[0]; 324 | this.data.bar = $modal.find('.progress-bar')[0]; 325 | 326 | this.initBootstrapModal($modal); 327 | }, 328 | 329 | initBootstrapModal: function($modal){ 330 | $modal.modal({ 331 | backdrop: 'static', 332 | keyboard: false 333 | }); 334 | 335 | if(!this.data.title){ 336 | var $modalStyle = $(''); 353 | $('head').append($modalStyle); 354 | } 355 | 356 | if(this.data.clickToClose){ 357 | var $closeBtn = $modal.find('[data-dismiss=modal]'); 358 | 359 | if($closeBtn.length > 0){ 360 | this.closeBtn = $closeBtn[0]; 361 | 362 | this.closeBtn.setAttribute('style','display: none'); 363 | 364 | $modal.on('hidden.bs.modal', function (e) { 365 | this.triggerPreloadingComplete(); 366 | }.bind(this)) 367 | }else{ 368 | console.error('No Bootstrap modal close button is set in the HTML. Please add a button with the data-dismiss="modal" attribute to use clickToClose.'); 369 | } 370 | } 371 | }, 372 | 373 | triggerPreloadingComplete: function(){ 374 | if(this.data.debug){ 375 | console.info('Preloading complete'); 376 | } 377 | if(this.data.disableVRModeUI){ 378 | this.el.setAttribute('vr-mode-ui','enabled','true'); 379 | } 380 | this.el.emit('preloading-complete'); 381 | }, 382 | 383 | closeModal: function(){ 384 | switch(this.data.type){ 385 | case 'bootstrap': 386 | $(this.data.target).modal('hide'); 387 | break; 388 | default: 389 | //do nothing 390 | break; 391 | } 392 | } 393 | }); 394 | 395 | /***/ }) 396 | /******/ ]); -------------------------------------------------------------------------------- /examples/bootstrap-advanced-spinkit/bower_components/SpinKit/css/spinkit.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: 3 | * 4 |
5 | * 6 | */ 7 | .sk-rotating-plane { 8 | width: 40px; 9 | height: 40px; 10 | background-color: #333; 11 | margin: 40px auto; 12 | -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out; 13 | animation: sk-rotatePlane 1.2s infinite ease-in-out; } 14 | 15 | @-webkit-keyframes sk-rotatePlane { 16 | 0% { 17 | -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); 18 | transform: perspective(120px) rotateX(0deg) rotateY(0deg); } 19 | 50% { 20 | -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); 21 | transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); } 22 | 100% { 23 | -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); 24 | transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } } 25 | 26 | @keyframes sk-rotatePlane { 27 | 0% { 28 | -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); 29 | transform: perspective(120px) rotateX(0deg) rotateY(0deg); } 30 | 50% { 31 | -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); 32 | transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); } 33 | 100% { 34 | -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); 35 | transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } } 36 | 37 | /* 38 | * Usage: 39 | * 40 |
41 |
42 |
43 |
44 | * 45 | */ 46 | .sk-double-bounce { 47 | width: 40px; 48 | height: 40px; 49 | position: relative; 50 | margin: 40px auto; } 51 | .sk-double-bounce .sk-child { 52 | width: 100%; 53 | height: 100%; 54 | border-radius: 50%; 55 | background-color: #333; 56 | opacity: 0.6; 57 | position: absolute; 58 | top: 0; 59 | left: 0; 60 | -webkit-animation: sk-doubleBounce 2s infinite ease-in-out; 61 | animation: sk-doubleBounce 2s infinite ease-in-out; } 62 | .sk-double-bounce .sk-double-bounce2 { 63 | -webkit-animation-delay: -1.0s; 64 | animation-delay: -1.0s; } 65 | 66 | @-webkit-keyframes sk-doubleBounce { 67 | 0%, 100% { 68 | -webkit-transform: scale(0); 69 | transform: scale(0); } 70 | 50% { 71 | -webkit-transform: scale(1); 72 | transform: scale(1); } } 73 | 74 | @keyframes sk-doubleBounce { 75 | 0%, 100% { 76 | -webkit-transform: scale(0); 77 | transform: scale(0); } 78 | 50% { 79 | -webkit-transform: scale(1); 80 | transform: scale(1); } } 81 | 82 | /* 83 | * Usage: 84 | * 85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | * 93 | */ 94 | .sk-wave { 95 | margin: 40px auto; 96 | width: 50px; 97 | height: 40px; 98 | text-align: center; 99 | font-size: 10px; } 100 | .sk-wave .sk-rect { 101 | background-color: #333; 102 | height: 100%; 103 | width: 6px; 104 | display: inline-block; 105 | -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out; 106 | animation: sk-waveStretchDelay 1.2s infinite ease-in-out; } 107 | .sk-wave .sk-rect1 { 108 | -webkit-animation-delay: -1.2s; 109 | animation-delay: -1.2s; } 110 | .sk-wave .sk-rect2 { 111 | -webkit-animation-delay: -1.1s; 112 | animation-delay: -1.1s; } 113 | .sk-wave .sk-rect3 { 114 | -webkit-animation-delay: -1s; 115 | animation-delay: -1s; } 116 | .sk-wave .sk-rect4 { 117 | -webkit-animation-delay: -0.9s; 118 | animation-delay: -0.9s; } 119 | .sk-wave .sk-rect5 { 120 | -webkit-animation-delay: -0.8s; 121 | animation-delay: -0.8s; } 122 | 123 | @-webkit-keyframes sk-waveStretchDelay { 124 | 0%, 40%, 100% { 125 | -webkit-transform: scaleY(0.4); 126 | transform: scaleY(0.4); } 127 | 20% { 128 | -webkit-transform: scaleY(1); 129 | transform: scaleY(1); } } 130 | 131 | @keyframes sk-waveStretchDelay { 132 | 0%, 40%, 100% { 133 | -webkit-transform: scaleY(0.4); 134 | transform: scaleY(0.4); } 135 | 20% { 136 | -webkit-transform: scaleY(1); 137 | transform: scaleY(1); } } 138 | 139 | /* 140 | * Usage: 141 | * 142 |
143 |
144 |
145 |
146 | * 147 | */ 148 | .sk-wandering-cubes { 149 | margin: 40px auto; 150 | width: 40px; 151 | height: 40px; 152 | position: relative; } 153 | .sk-wandering-cubes .sk-cube { 154 | background-color: #333; 155 | width: 10px; 156 | height: 10px; 157 | position: absolute; 158 | top: 0; 159 | left: 0; 160 | -webkit-animation: sk-wanderingCube 1.8s ease-in-out -1.8s infinite both; 161 | animation: sk-wanderingCube 1.8s ease-in-out -1.8s infinite both; } 162 | .sk-wandering-cubes .sk-cube2 { 163 | -webkit-animation-delay: -0.9s; 164 | animation-delay: -0.9s; } 165 | 166 | @-webkit-keyframes sk-wanderingCube { 167 | 0% { 168 | -webkit-transform: rotate(0deg); 169 | transform: rotate(0deg); } 170 | 25% { 171 | -webkit-transform: translateX(30px) rotate(-90deg) scale(0.5); 172 | transform: translateX(30px) rotate(-90deg) scale(0.5); } 173 | 50% { 174 | /* Hack to make FF rotate in the right direction */ 175 | -webkit-transform: translateX(30px) translateY(30px) rotate(-179deg); 176 | transform: translateX(30px) translateY(30px) rotate(-179deg); } 177 | 50.1% { 178 | -webkit-transform: translateX(30px) translateY(30px) rotate(-180deg); 179 | transform: translateX(30px) translateY(30px) rotate(-180deg); } 180 | 75% { 181 | -webkit-transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); 182 | transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); } 183 | 100% { 184 | -webkit-transform: rotate(-360deg); 185 | transform: rotate(-360deg); } } 186 | 187 | @keyframes sk-wanderingCube { 188 | 0% { 189 | -webkit-transform: rotate(0deg); 190 | transform: rotate(0deg); } 191 | 25% { 192 | -webkit-transform: translateX(30px) rotate(-90deg) scale(0.5); 193 | transform: translateX(30px) rotate(-90deg) scale(0.5); } 194 | 50% { 195 | /* Hack to make FF rotate in the right direction */ 196 | -webkit-transform: translateX(30px) translateY(30px) rotate(-179deg); 197 | transform: translateX(30px) translateY(30px) rotate(-179deg); } 198 | 50.1% { 199 | -webkit-transform: translateX(30px) translateY(30px) rotate(-180deg); 200 | transform: translateX(30px) translateY(30px) rotate(-180deg); } 201 | 75% { 202 | -webkit-transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); 203 | transform: translateX(0) translateY(30px) rotate(-270deg) scale(0.5); } 204 | 100% { 205 | -webkit-transform: rotate(-360deg); 206 | transform: rotate(-360deg); } } 207 | 208 | /* 209 | * Usage: 210 | * 211 |
212 | * 213 | */ 214 | .sk-spinner-pulse { 215 | width: 40px; 216 | height: 40px; 217 | margin: 40px auto; 218 | background-color: #333; 219 | border-radius: 100%; 220 | -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out; 221 | animation: sk-pulseScaleOut 1s infinite ease-in-out; } 222 | 223 | @-webkit-keyframes sk-pulseScaleOut { 224 | 0% { 225 | -webkit-transform: scale(0); 226 | transform: scale(0); } 227 | 100% { 228 | -webkit-transform: scale(1); 229 | transform: scale(1); 230 | opacity: 0; } } 231 | 232 | @keyframes sk-pulseScaleOut { 233 | 0% { 234 | -webkit-transform: scale(0); 235 | transform: scale(0); } 236 | 100% { 237 | -webkit-transform: scale(1); 238 | transform: scale(1); 239 | opacity: 0; } } 240 | 241 | /* 242 | * Usage: 243 | * 244 |
245 |
246 |
247 |
248 | * 249 | */ 250 | .sk-chasing-dots { 251 | margin: 40px auto; 252 | width: 40px; 253 | height: 40px; 254 | position: relative; 255 | text-align: center; 256 | -webkit-animation: sk-chasingDotsRotate 2s infinite linear; 257 | animation: sk-chasingDotsRotate 2s infinite linear; } 258 | .sk-chasing-dots .sk-child { 259 | width: 60%; 260 | height: 60%; 261 | display: inline-block; 262 | position: absolute; 263 | top: 0; 264 | background-color: #333; 265 | border-radius: 100%; 266 | -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out; 267 | animation: sk-chasingDotsBounce 2s infinite ease-in-out; } 268 | .sk-chasing-dots .sk-dot2 { 269 | top: auto; 270 | bottom: 0; 271 | -webkit-animation-delay: -1s; 272 | animation-delay: -1s; } 273 | 274 | @-webkit-keyframes sk-chasingDotsRotate { 275 | 100% { 276 | -webkit-transform: rotate(360deg); 277 | transform: rotate(360deg); } } 278 | 279 | @keyframes sk-chasingDotsRotate { 280 | 100% { 281 | -webkit-transform: rotate(360deg); 282 | transform: rotate(360deg); } } 283 | 284 | @-webkit-keyframes sk-chasingDotsBounce { 285 | 0%, 100% { 286 | -webkit-transform: scale(0); 287 | transform: scale(0); } 288 | 50% { 289 | -webkit-transform: scale(1); 290 | transform: scale(1); } } 291 | 292 | @keyframes sk-chasingDotsBounce { 293 | 0%, 100% { 294 | -webkit-transform: scale(0); 295 | transform: scale(0); } 296 | 50% { 297 | -webkit-transform: scale(1); 298 | transform: scale(1); } } 299 | 300 | /* 301 | * Usage: 302 | * 303 |
304 |
305 |
306 |
307 |
308 | * 309 | */ 310 | .sk-three-bounce { 311 | margin: 40px auto; 312 | width: 80px; 313 | text-align: center; } 314 | .sk-three-bounce .sk-child { 315 | width: 20px; 316 | height: 20px; 317 | background-color: #333; 318 | border-radius: 100%; 319 | display: inline-block; 320 | -webkit-animation: sk-three-bounce 1.4s ease-in-out 0s infinite both; 321 | animation: sk-three-bounce 1.4s ease-in-out 0s infinite both; } 322 | .sk-three-bounce .sk-bounce1 { 323 | -webkit-animation-delay: -0.32s; 324 | animation-delay: -0.32s; } 325 | .sk-three-bounce .sk-bounce2 { 326 | -webkit-animation-delay: -0.16s; 327 | animation-delay: -0.16s; } 328 | 329 | @-webkit-keyframes sk-three-bounce { 330 | 0%, 80%, 100% { 331 | -webkit-transform: scale(0); 332 | transform: scale(0); } 333 | 40% { 334 | -webkit-transform: scale(1); 335 | transform: scale(1); } } 336 | 337 | @keyframes sk-three-bounce { 338 | 0%, 80%, 100% { 339 | -webkit-transform: scale(0); 340 | transform: scale(0); } 341 | 40% { 342 | -webkit-transform: scale(1); 343 | transform: scale(1); } } 344 | 345 | /* 346 | * Usage: 347 | * 348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 | * 363 | */ 364 | .sk-circle { 365 | margin: 40px auto; 366 | width: 40px; 367 | height: 40px; 368 | position: relative; } 369 | .sk-circle .sk-child { 370 | width: 100%; 371 | height: 100%; 372 | position: absolute; 373 | left: 0; 374 | top: 0; } 375 | .sk-circle .sk-child:before { 376 | content: ''; 377 | display: block; 378 | margin: 0 auto; 379 | width: 15%; 380 | height: 15%; 381 | background-color: #333; 382 | border-radius: 100%; 383 | -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out both; 384 | animation: sk-circleBounceDelay 1.2s infinite ease-in-out both; } 385 | .sk-circle .sk-circle2 { 386 | -webkit-transform: rotate(30deg); 387 | -ms-transform: rotate(30deg); 388 | transform: rotate(30deg); } 389 | .sk-circle .sk-circle3 { 390 | -webkit-transform: rotate(60deg); 391 | -ms-transform: rotate(60deg); 392 | transform: rotate(60deg); } 393 | .sk-circle .sk-circle4 { 394 | -webkit-transform: rotate(90deg); 395 | -ms-transform: rotate(90deg); 396 | transform: rotate(90deg); } 397 | .sk-circle .sk-circle5 { 398 | -webkit-transform: rotate(120deg); 399 | -ms-transform: rotate(120deg); 400 | transform: rotate(120deg); } 401 | .sk-circle .sk-circle6 { 402 | -webkit-transform: rotate(150deg); 403 | -ms-transform: rotate(150deg); 404 | transform: rotate(150deg); } 405 | .sk-circle .sk-circle7 { 406 | -webkit-transform: rotate(180deg); 407 | -ms-transform: rotate(180deg); 408 | transform: rotate(180deg); } 409 | .sk-circle .sk-circle8 { 410 | -webkit-transform: rotate(210deg); 411 | -ms-transform: rotate(210deg); 412 | transform: rotate(210deg); } 413 | .sk-circle .sk-circle9 { 414 | -webkit-transform: rotate(240deg); 415 | -ms-transform: rotate(240deg); 416 | transform: rotate(240deg); } 417 | .sk-circle .sk-circle10 { 418 | -webkit-transform: rotate(270deg); 419 | -ms-transform: rotate(270deg); 420 | transform: rotate(270deg); } 421 | .sk-circle .sk-circle11 { 422 | -webkit-transform: rotate(300deg); 423 | -ms-transform: rotate(300deg); 424 | transform: rotate(300deg); } 425 | .sk-circle .sk-circle12 { 426 | -webkit-transform: rotate(330deg); 427 | -ms-transform: rotate(330deg); 428 | transform: rotate(330deg); } 429 | .sk-circle .sk-circle2:before { 430 | -webkit-animation-delay: -1.1s; 431 | animation-delay: -1.1s; } 432 | .sk-circle .sk-circle3:before { 433 | -webkit-animation-delay: -1s; 434 | animation-delay: -1s; } 435 | .sk-circle .sk-circle4:before { 436 | -webkit-animation-delay: -0.9s; 437 | animation-delay: -0.9s; } 438 | .sk-circle .sk-circle5:before { 439 | -webkit-animation-delay: -0.8s; 440 | animation-delay: -0.8s; } 441 | .sk-circle .sk-circle6:before { 442 | -webkit-animation-delay: -0.7s; 443 | animation-delay: -0.7s; } 444 | .sk-circle .sk-circle7:before { 445 | -webkit-animation-delay: -0.6s; 446 | animation-delay: -0.6s; } 447 | .sk-circle .sk-circle8:before { 448 | -webkit-animation-delay: -0.5s; 449 | animation-delay: -0.5s; } 450 | .sk-circle .sk-circle9:before { 451 | -webkit-animation-delay: -0.4s; 452 | animation-delay: -0.4s; } 453 | .sk-circle .sk-circle10:before { 454 | -webkit-animation-delay: -0.3s; 455 | animation-delay: -0.3s; } 456 | .sk-circle .sk-circle11:before { 457 | -webkit-animation-delay: -0.2s; 458 | animation-delay: -0.2s; } 459 | .sk-circle .sk-circle12:before { 460 | -webkit-animation-delay: -0.1s; 461 | animation-delay: -0.1s; } 462 | 463 | @-webkit-keyframes sk-circleBounceDelay { 464 | 0%, 80%, 100% { 465 | -webkit-transform: scale(0); 466 | transform: scale(0); } 467 | 40% { 468 | -webkit-transform: scale(1); 469 | transform: scale(1); } } 470 | 471 | @keyframes sk-circleBounceDelay { 472 | 0%, 80%, 100% { 473 | -webkit-transform: scale(0); 474 | transform: scale(0); } 475 | 40% { 476 | -webkit-transform: scale(1); 477 | transform: scale(1); } } 478 | 479 | /* 480 | * Usage: 481 | * 482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 | * 494 | */ 495 | .sk-cube-grid { 496 | width: 40px; 497 | height: 40px; 498 | margin: 40px auto; 499 | /* 500 | * Spinner positions 501 | * 1 2 3 502 | * 4 5 6 503 | * 7 8 9 504 | */ } 505 | .sk-cube-grid .sk-cube { 506 | width: 33.33%; 507 | height: 33.33%; 508 | background-color: #333; 509 | float: left; 510 | -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; 511 | animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; } 512 | .sk-cube-grid .sk-cube1 { 513 | -webkit-animation-delay: 0.2s; 514 | animation-delay: 0.2s; } 515 | .sk-cube-grid .sk-cube2 { 516 | -webkit-animation-delay: 0.3s; 517 | animation-delay: 0.3s; } 518 | .sk-cube-grid .sk-cube3 { 519 | -webkit-animation-delay: 0.4s; 520 | animation-delay: 0.4s; } 521 | .sk-cube-grid .sk-cube4 { 522 | -webkit-animation-delay: 0.1s; 523 | animation-delay: 0.1s; } 524 | .sk-cube-grid .sk-cube5 { 525 | -webkit-animation-delay: 0.2s; 526 | animation-delay: 0.2s; } 527 | .sk-cube-grid .sk-cube6 { 528 | -webkit-animation-delay: 0.3s; 529 | animation-delay: 0.3s; } 530 | .sk-cube-grid .sk-cube7 { 531 | -webkit-animation-delay: 0.0s; 532 | animation-delay: 0.0s; } 533 | .sk-cube-grid .sk-cube8 { 534 | -webkit-animation-delay: 0.1s; 535 | animation-delay: 0.1s; } 536 | .sk-cube-grid .sk-cube9 { 537 | -webkit-animation-delay: 0.2s; 538 | animation-delay: 0.2s; } 539 | 540 | @-webkit-keyframes sk-cubeGridScaleDelay { 541 | 0%, 70%, 100% { 542 | -webkit-transform: scale3D(1, 1, 1); 543 | transform: scale3D(1, 1, 1); } 544 | 35% { 545 | -webkit-transform: scale3D(0, 0, 1); 546 | transform: scale3D(0, 0, 1); } } 547 | 548 | @keyframes sk-cubeGridScaleDelay { 549 | 0%, 70%, 100% { 550 | -webkit-transform: scale3D(1, 1, 1); 551 | transform: scale3D(1, 1, 1); } 552 | 35% { 553 | -webkit-transform: scale3D(0, 0, 1); 554 | transform: scale3D(0, 0, 1); } } 555 | 556 | /* 557 | * Usage: 558 | * 559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 | * 574 | */ 575 | .sk-fading-circle { 576 | margin: 40px auto; 577 | width: 40px; 578 | height: 40px; 579 | position: relative; } 580 | .sk-fading-circle .sk-circle { 581 | width: 100%; 582 | height: 100%; 583 | position: absolute; 584 | left: 0; 585 | top: 0; } 586 | .sk-fading-circle .sk-circle:before { 587 | content: ''; 588 | display: block; 589 | margin: 0 auto; 590 | width: 15%; 591 | height: 15%; 592 | background-color: #333; 593 | border-radius: 100%; 594 | -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out both; 595 | animation: sk-circleFadeDelay 1.2s infinite ease-in-out both; } 596 | .sk-fading-circle .sk-circle2 { 597 | -webkit-transform: rotate(30deg); 598 | -ms-transform: rotate(30deg); 599 | transform: rotate(30deg); } 600 | .sk-fading-circle .sk-circle3 { 601 | -webkit-transform: rotate(60deg); 602 | -ms-transform: rotate(60deg); 603 | transform: rotate(60deg); } 604 | .sk-fading-circle .sk-circle4 { 605 | -webkit-transform: rotate(90deg); 606 | -ms-transform: rotate(90deg); 607 | transform: rotate(90deg); } 608 | .sk-fading-circle .sk-circle5 { 609 | -webkit-transform: rotate(120deg); 610 | -ms-transform: rotate(120deg); 611 | transform: rotate(120deg); } 612 | .sk-fading-circle .sk-circle6 { 613 | -webkit-transform: rotate(150deg); 614 | -ms-transform: rotate(150deg); 615 | transform: rotate(150deg); } 616 | .sk-fading-circle .sk-circle7 { 617 | -webkit-transform: rotate(180deg); 618 | -ms-transform: rotate(180deg); 619 | transform: rotate(180deg); } 620 | .sk-fading-circle .sk-circle8 { 621 | -webkit-transform: rotate(210deg); 622 | -ms-transform: rotate(210deg); 623 | transform: rotate(210deg); } 624 | .sk-fading-circle .sk-circle9 { 625 | -webkit-transform: rotate(240deg); 626 | -ms-transform: rotate(240deg); 627 | transform: rotate(240deg); } 628 | .sk-fading-circle .sk-circle10 { 629 | -webkit-transform: rotate(270deg); 630 | -ms-transform: rotate(270deg); 631 | transform: rotate(270deg); } 632 | .sk-fading-circle .sk-circle11 { 633 | -webkit-transform: rotate(300deg); 634 | -ms-transform: rotate(300deg); 635 | transform: rotate(300deg); } 636 | .sk-fading-circle .sk-circle12 { 637 | -webkit-transform: rotate(330deg); 638 | -ms-transform: rotate(330deg); 639 | transform: rotate(330deg); } 640 | .sk-fading-circle .sk-circle2:before { 641 | -webkit-animation-delay: -1.1s; 642 | animation-delay: -1.1s; } 643 | .sk-fading-circle .sk-circle3:before { 644 | -webkit-animation-delay: -1s; 645 | animation-delay: -1s; } 646 | .sk-fading-circle .sk-circle4:before { 647 | -webkit-animation-delay: -0.9s; 648 | animation-delay: -0.9s; } 649 | .sk-fading-circle .sk-circle5:before { 650 | -webkit-animation-delay: -0.8s; 651 | animation-delay: -0.8s; } 652 | .sk-fading-circle .sk-circle6:before { 653 | -webkit-animation-delay: -0.7s; 654 | animation-delay: -0.7s; } 655 | .sk-fading-circle .sk-circle7:before { 656 | -webkit-animation-delay: -0.6s; 657 | animation-delay: -0.6s; } 658 | .sk-fading-circle .sk-circle8:before { 659 | -webkit-animation-delay: -0.5s; 660 | animation-delay: -0.5s; } 661 | .sk-fading-circle .sk-circle9:before { 662 | -webkit-animation-delay: -0.4s; 663 | animation-delay: -0.4s; } 664 | .sk-fading-circle .sk-circle10:before { 665 | -webkit-animation-delay: -0.3s; 666 | animation-delay: -0.3s; } 667 | .sk-fading-circle .sk-circle11:before { 668 | -webkit-animation-delay: -0.2s; 669 | animation-delay: -0.2s; } 670 | .sk-fading-circle .sk-circle12:before { 671 | -webkit-animation-delay: -0.1s; 672 | animation-delay: -0.1s; } 673 | 674 | @-webkit-keyframes sk-circleFadeDelay { 675 | 0%, 39%, 100% { 676 | opacity: 0; } 677 | 40% { 678 | opacity: 1; } } 679 | 680 | @keyframes sk-circleFadeDelay { 681 | 0%, 39%, 100% { 682 | opacity: 0; } 683 | 40% { 684 | opacity: 1; } } 685 | 686 | /* 687 | * Usage: 688 | * 689 |
690 |
691 |
692 |
693 |
694 |
695 | * 696 | */ 697 | .sk-folding-cube { 698 | margin: 40px auto; 699 | width: 40px; 700 | height: 40px; 701 | position: relative; 702 | -webkit-transform: rotateZ(45deg); 703 | transform: rotateZ(45deg); } 704 | .sk-folding-cube .sk-cube { 705 | float: left; 706 | width: 50%; 707 | height: 50%; 708 | position: relative; 709 | -webkit-transform: scale(1.1); 710 | -ms-transform: scale(1.1); 711 | transform: scale(1.1); } 712 | .sk-folding-cube .sk-cube:before { 713 | content: ''; 714 | position: absolute; 715 | top: 0; 716 | left: 0; 717 | width: 100%; 718 | height: 100%; 719 | background-color: #333; 720 | -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; 721 | animation: sk-foldCubeAngle 2.4s infinite linear both; 722 | -webkit-transform-origin: 100% 100%; 723 | -ms-transform-origin: 100% 100%; 724 | transform-origin: 100% 100%; } 725 | .sk-folding-cube .sk-cube2 { 726 | -webkit-transform: scale(1.1) rotateZ(90deg); 727 | transform: scale(1.1) rotateZ(90deg); } 728 | .sk-folding-cube .sk-cube3 { 729 | -webkit-transform: scale(1.1) rotateZ(180deg); 730 | transform: scale(1.1) rotateZ(180deg); } 731 | .sk-folding-cube .sk-cube4 { 732 | -webkit-transform: scale(1.1) rotateZ(270deg); 733 | transform: scale(1.1) rotateZ(270deg); } 734 | .sk-folding-cube .sk-cube2:before { 735 | -webkit-animation-delay: 0.3s; 736 | animation-delay: 0.3s; } 737 | .sk-folding-cube .sk-cube3:before { 738 | -webkit-animation-delay: 0.6s; 739 | animation-delay: 0.6s; } 740 | .sk-folding-cube .sk-cube4:before { 741 | -webkit-animation-delay: 0.9s; 742 | animation-delay: 0.9s; } 743 | 744 | @-webkit-keyframes sk-foldCubeAngle { 745 | 0%, 10% { 746 | -webkit-transform: perspective(140px) rotateX(-180deg); 747 | transform: perspective(140px) rotateX(-180deg); 748 | opacity: 0; } 749 | 25%, 75% { 750 | -webkit-transform: perspective(140px) rotateX(0deg); 751 | transform: perspective(140px) rotateX(0deg); 752 | opacity: 1; } 753 | 90%, 100% { 754 | -webkit-transform: perspective(140px) rotateY(180deg); 755 | transform: perspective(140px) rotateY(180deg); 756 | opacity: 0; } } 757 | 758 | @keyframes sk-foldCubeAngle { 759 | 0%, 10% { 760 | -webkit-transform: perspective(140px) rotateX(-180deg); 761 | transform: perspective(140px) rotateX(-180deg); 762 | opacity: 0; } 763 | 25%, 75% { 764 | -webkit-transform: perspective(140px) rotateX(0deg); 765 | transform: perspective(140px) rotateX(0deg); 766 | opacity: 1; } 767 | 90%, 100% { 768 | -webkit-transform: perspective(140px) rotateY(180deg); 769 | transform: perspective(140px) rotateY(180deg); 770 | opacity: 0; } } 771 | --------------------------------------------------------------------------------