├── .babelrc
├── .gitignore
├── images
├── react-page-loading.png
└── react-page-loading-features.gif
├── example
├── pages
│ ├── index.js
│ ├── bar.js
│ ├── bubble.js
│ ├── spin.js
│ ├── bubble-spin.js
│ ├── comet-spin.js
│ ├── resize-spin.js
│ ├── rotate-spin.js
│ └── cylinder-spin.js
├── README.md
├── package.json
└── components
│ ├── Layout.js
│ └── Header.js
├── src
├── bar
│ ├── BarLoader.js
│ └── Bar.js
├── bubble
│ ├── BubbleLoader.js
│ └── Bubble.js
├── comet-spin
│ ├── CometSpinLoader.js
│ └── CometSpin.js
├── bubble-spin
│ ├── BubbleSpinLoader.js
│ └── BubbleSpin.js
├── rotate-spin
│ ├── RotateSpinLoader.js
│ └── RotateSpin.js
├── spin
│ ├── SpinLoader.js
│ └── Spin.js
├── cylinder-spin
│ ├── CylinderSpinLoader.js
│ └── CylinderSpin.js
├── resize-spin
│ ├── ResizeSpinLoader.js
│ └── ResizeSpin.js
└── index.js
├── webpack.config.prod.js
├── LICENSE
├── package.json
└── README.md
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["es2015", "react"]
3 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | note.txt
3 | example/node_modules
--------------------------------------------------------------------------------
/images/react-page-loading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/svelte-barcode/react-page-loading/HEAD/images/react-page-loading.png
--------------------------------------------------------------------------------
/images/react-page-loading-features.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/svelte-barcode/react-page-loading/HEAD/images/react-page-loading-features.gif
--------------------------------------------------------------------------------
/example/pages/index.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | Hello Next.js
6 |
7 | )
8 |
--------------------------------------------------------------------------------
/example/pages/bar.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the bar page
6 |
7 | )
--------------------------------------------------------------------------------
/example/pages/bubble.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the bubble page
6 |
7 | )
--------------------------------------------------------------------------------
/example/pages/spin.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the spin page
6 |
7 | )
--------------------------------------------------------------------------------
/example/pages/bubble-spin.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the bubble-spin page
6 |
7 | )
--------------------------------------------------------------------------------
/example/pages/comet-spin.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the comet-spin page
6 |
7 | )
--------------------------------------------------------------------------------
/example/pages/resize-spin.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the resize-spin page
6 |
7 | )
--------------------------------------------------------------------------------
/example/pages/rotate-spin.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the rotate-spin page
6 |
7 | )
--------------------------------------------------------------------------------
/example/pages/cylinder-spin.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/Layout.js'
2 |
3 | export default () => (
4 |
5 | This is the cylinder-spin page
6 |
7 | )
--------------------------------------------------------------------------------
/example/README.md:
--------------------------------------------------------------------------------
1 | # Setup
2 |
3 | Run the following command to install dependencies:
4 |
5 | ```
6 | npm install
7 | ```
8 |
9 | Run the following command to start the dev server:
10 |
11 | ```
12 | npm run dev
13 | ```
14 |
15 | Then open http://localhost:3000 from your favourite browser.
--------------------------------------------------------------------------------
/example/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-page-loading-demo",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "dev": "next"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "next": "^5.1.0",
14 | "react": "^16.3.2",
15 | "react-dom": "^16.3.2",
16 | "react-page-loading": "^1.0.2"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/bar/BarLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import Bar from './Bar'
4 |
5 | const BarLoader = props => (
6 |
7 | )
8 |
9 | BarLoader.propTypes = {
10 | color: PropTypes.string,
11 | duration: PropTypes.number,
12 | size: PropTypes.number,
13 | }
14 |
15 | BarLoader.defaultProps = {
16 | color: '#bebebe',
17 | duration: 1,
18 | size: 4,
19 | }
20 |
21 | export default BarLoader
--------------------------------------------------------------------------------
/src/bubble/BubbleLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import Bubble from './Bubble'
4 |
5 | const BubbleLoader = props => (
6 |
7 | )
8 |
9 | BubbleLoader.propTypes = {
10 | color: PropTypes.string,
11 | duration: PropTypes.number,
12 | size: PropTypes.number,
13 | }
14 |
15 | BubbleLoader.defaultProps = {
16 | color: '#bebebe',
17 | duration: 1.8,
18 | size: 5,
19 | }
20 |
21 | export default BubbleLoader
--------------------------------------------------------------------------------
/src/comet-spin/CometSpinLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import CometSpin from './CometSpin'
4 |
5 | const CometSpinLoader = props => (
6 |
7 | )
8 |
9 | CometSpinLoader.propTypes = {
10 | color: PropTypes.string,
11 | duration: PropTypes.number,
12 | size: PropTypes.number,
13 | }
14 |
15 | CometSpinLoader.defaultProps = {
16 | color: '#bebebe',
17 | duration: 1.7,
18 | size: 30,
19 | }
20 |
21 | export default CometSpinLoader
--------------------------------------------------------------------------------
/src/bubble-spin/BubbleSpinLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import BubbleSpin from './BubbleSpin'
4 |
5 | const BubbleSpinLoader = props => (
6 |
7 | )
8 |
9 | BubbleSpinLoader.propTypes = {
10 | color: PropTypes.string,
11 | duration: PropTypes.number,
12 | size: PropTypes.number,
13 | }
14 |
15 | BubbleSpinLoader.defaultProps = {
16 | color: '#bebebe',
17 | duration: 1.3,
18 | size: 8,
19 | }
20 |
21 | export default BubbleSpinLoader
--------------------------------------------------------------------------------
/src/rotate-spin/RotateSpinLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import RotateSpin from './RotateSpin'
4 |
5 | const RotateSpinLoader = props => (
6 |
7 | )
8 |
9 | RotateSpinLoader.propTypes = {
10 | color: PropTypes.string,
11 | duration: PropTypes.number,
12 | size: PropTypes.number,
13 | }
14 |
15 | RotateSpinLoader.defaultProps = {
16 | color: '#bebebe',
17 | duration: 1.1,
18 | size: 4,
19 | }
20 |
21 | export default RotateSpinLoader
--------------------------------------------------------------------------------
/src/spin/SpinLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import Spin from './Spin'
4 |
5 | const SpinLoader = props => (
6 |
7 | )
8 |
9 | SpinLoader.propTypes = {
10 | background: PropTypes.string,
11 | color: PropTypes.string,
12 | duration: PropTypes.number,
13 | size: PropTypes.number,
14 | }
15 |
16 | SpinLoader.defaultProps = {
17 | background: '#fff',
18 | color: '#bebebe',
19 | duration: 1.4,
20 | size: 4,
21 | }
22 |
23 | export default SpinLoader
--------------------------------------------------------------------------------
/example/components/Layout.js:
--------------------------------------------------------------------------------
1 | import Header from './Header'
2 | import Page from 'react-page-loading'
3 |
4 | const layoutStyle = {
5 | margin: 20,
6 | padding: 20,
7 | }
8 |
9 | const contentStyle = {
10 | color: '#808080'
11 | }
12 |
13 | const Layout = (props) => (
14 |
15 |
16 |
17 |
18 | {props.children}
19 |
20 |
21 |
22 | )
23 |
24 | export default Layout
--------------------------------------------------------------------------------
/webpack.config.prod.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = {
4 | entry: path.resolve(__dirname, 'src/index'),
5 | output: {
6 | path: path.resolve(__dirname, 'dist'),
7 | library: 'reactLoaders',
8 | libraryTarget: 'umd',
9 | },
10 | resolve: {
11 | extensions: ['.js', '.jsx'],
12 | },
13 | module: {
14 | rules: [
15 | {
16 | test: /\.jsx?$/,
17 | exclude: /(node_modules|bower_components)/,
18 | use: ['babel-loader'],
19 | },
20 | ],
21 | },
22 | };
--------------------------------------------------------------------------------
/src/cylinder-spin/CylinderSpinLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import CylinderSpin from './CylinderSpin'
4 |
5 | const CylinderSpinLoader = props => (
6 |
7 | )
8 |
9 | CylinderSpinLoader.propTypes = {
10 | color: PropTypes.string,
11 | duration: PropTypes.number,
12 | size: PropTypes.number,
13 | }
14 |
15 | CylinderSpinLoader.defaultProps = {
16 | color: '#bebebe',
17 | duration: 1.1,
18 | size: 8,
19 | }
20 |
21 | export default CylinderSpinLoader
22 |
--------------------------------------------------------------------------------
/src/resize-spin/ResizeSpinLoader.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import ResizeSpin from './ResizeSpin'
4 |
5 | const ResizeSpinLoader = props => (
6 |
7 | )
8 |
9 | ResizeSpinLoader.propTypes = {
10 | background: PropTypes.string,
11 | color: PropTypes.string,
12 | duration: PropTypes.number,
13 | size: PropTypes.number,
14 | }
15 |
16 | ResizeSpinLoader.defaultProps = {
17 | background: '#fff',
18 | color: '#bebebe',
19 | duration: 2,
20 | size: 4,
21 | }
22 |
23 | export default ResizeSpinLoader
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2018 Code Facebook
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 |
7 | The above copyright notice and this permission notice shall be included in
8 | all copies or substantial portions of the Software.
9 |
10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
15 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
16 | THE SOFTWARE.
17 |
--------------------------------------------------------------------------------
/example/components/Header.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 |
3 | const linkStyle = {
4 | marginRight: 15,
5 | textDecoration: 'none',
6 | color: '#0b8caf'
7 | }
8 |
9 | const navStyle = {
10 | marginBottom: 50
11 | }
12 |
13 | const Header = () => (
14 |
43 | )
44 |
45 | export default Header
--------------------------------------------------------------------------------
/src/rotate-spin/RotateSpin.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | const loading = keyframes`
4 | 0% {
5 | transform: rotate(0deg);
6 | }
7 | 100% {
8 | transform: rotate(360deg);
9 | }
10 | `
11 |
12 | function getColor(props) {
13 | const d = document.createElement('div')
14 | d.style.color = props.color
15 | document.body.appendChild(d)
16 | const rgbcolor = window.getComputedStyle(d).color;
17 | const match = /rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(rgbcolor)
18 | const color = `${match[1]}, ${match[2]}, ${match[3]}`;
19 | return color
20 | }
21 |
22 | const RotateSpin = styled.div`
23 | animation: ${props => `${loading} ${props.duration}s infinite linear`};
24 | border: ${props => `1.1em solid rgba(${getColor(props)}, 0.2)`};
25 | border-left: ${props => `1.1em solid ${props.color}`};
26 | border-radius: 50%;
27 | font-size: ${props => `${props.size}px`};
28 | height: 10em;
29 | margin: 60px auto;
30 | position: relative;
31 | text-indent: -9999em;
32 | transform: translateZ(0);
33 | width: 10em;
34 | &:after {
35 | border-radius: 50%;
36 | height: 10em;
37 | width: 10em;
38 | }
39 | `
40 |
41 | export default RotateSpin
--------------------------------------------------------------------------------
/src/spin/Spin.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | const loading = keyframes`
4 | 0% {
5 | transform: rotate(0deg);
6 | }
7 | 100% {
8 | transform: rotate(360deg);
9 | }
10 | `
11 |
12 | const Spin = styled.div`
13 | animation: ${props => `${loading} ${props.duration}s infinite linear;`};
14 | background: ${props => props.color};
15 | background: ${props => `linear-gradient(to right, ${props.color} 10%, rgba(255, 255, 255, 0) 42%);`};
16 | border-radius: 50%;
17 | font-size: ${props => `${props.size}px`};
18 | height: 11em;
19 | margin: 50px auto;
20 | position: relative;
21 | text-indent: -9999em;
22 | transform: translateZ(0);
23 | width: 11em;
24 | &:before {
25 | background: ${props => props.color};
26 | border-radius: 100% 0 0 0;
27 | content: '';
28 | height: 50%;
29 | left: 0;
30 | position: absolute;
31 | top: 0;
32 | width: 50%;
33 | }
34 | &:after {
35 | background: ${props => props.background};
36 | border-radius: 50%;
37 | bottom: 0;
38 | content: '';
39 | height: 75%;
40 | left: 0;
41 | margin: auto;
42 | position: absolute;
43 | right: 0;
44 | top: 0;
45 | width: 75%;
46 | }
47 | `
48 |
49 | export default Spin
--------------------------------------------------------------------------------
/src/resize-spin/ResizeSpin.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | const loading = keyframes`
4 | 0% {
5 | transform: rotate(0deg);
6 | }
7 | 100% {
8 | transform: rotate(360deg);
9 | }
10 | `
11 |
12 | const ResizeSpin = styled.div`
13 | border-radius: 50%;
14 | box-shadow: inset 0 0 0 1em;
15 | color: ${props => props.color};
16 | font-size: ${props => `${props.size}px`};
17 | height: 10em;
18 | margin: 55px auto;
19 | position: relative;
20 | text-indent: -99999em;
21 | transform: translateZ(0);
22 | width: 10em;
23 | &:before {
24 | animation: ${props => `${loading} ${props.duration}s infinite ease 1.5s`};
25 | background: ${props => props.background};
26 | border-radius: 50%;
27 | border-radius: 10.2em 0 0 10.2em;
28 | content: '';
29 | height: 10.2em;
30 | left: -0.1em;
31 | position: absolute;
32 | top: -0.1em;
33 | transform-origin: 5.2em 5.1em;
34 | width: 5.2em;
35 | }
36 | &:after {
37 | animation: ${props => `${loading} ${props.duration}s infinite ease`};
38 | background: ${props => props.background};
39 | border-radius: 50%;
40 | border-radius: 0 10.2em 10.2em 0;
41 | content: '';
42 | height: 10.2em;
43 | left: 5.1em;
44 | position: absolute;
45 | top: -0.1em;
46 | transform-origin: 0px 5.1em;
47 | width: 5.2em;
48 | }
49 | `
50 |
51 | export default ResizeSpin
--------------------------------------------------------------------------------
/src/bubble/Bubble.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | const loading = keyframes`
4 | 0%,
5 | 80%,
6 | 100% {
7 | box-shadow: 0 2.5em 0 -1.3em;
8 | }
9 | 40% {
10 | box-shadow: 0 2.5em 0 0;
11 | }
12 | `
13 |
14 | const Bubble = styled.div`
15 | animation: ${props => `${loading} ${props.duration}s infinite ease-in-out;`};
16 | animation-delay: ${props => `${props.duration * -0.16}s`};
17 | animation-fill-mode: both;
18 | border-radius: 50%;
19 | color: ${props => props.color};
20 | font-size: ${props => `${props.size}px`};
21 | height: 2.5em;
22 | margin: 80px auto;
23 | position: relative;
24 | text-indent: -9999em;
25 | transform: translateZ(0);
26 | width: 2.5em;
27 | &:before {
28 | animation: ${props => `${loading} ${props.duration}s infinite ease-in-out;`};
29 | animation-delay: ${props => `${props.duration * -0.32}s`};
30 | animation-fill-mode: both;
31 | border-radius: 50%;
32 | content: '';
33 | height: 2.5em;
34 | left: -3.5em;
35 | position: absolute;
36 | top: 0;
37 | width: 2.5em;
38 | }
39 | &:after {
40 | animation: ${props => `${loading} ${props.duration}s infinite ease-in-out;`};
41 | animation-fill-mode: both;
42 | border-radius: 50%;
43 | content: '';
44 | height: 2.5em;
45 | left: 3.5em;
46 | position: absolute;
47 | top: 0;
48 | width: 2.5em;
49 | }
50 | `
51 |
52 | export default Bubble
--------------------------------------------------------------------------------
/src/bar/Bar.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | const loading = keyframes`
4 | 0%,
5 | 80%,
6 | 100% {
7 | box-shadow: 0 0;
8 | height: 4em;
9 | }
10 | 40% {
11 | box-shadow: 0 -2em;
12 | height: 5em;
13 | }
14 | `
15 |
16 | const Bar = styled.div`
17 | animation: ${props => `${loading} ${props.duration}s infinite ease-in-out`};
18 | animation-delay: ${props => `${props.duration * -0.16}s`};
19 | background: ${props => props.color};
20 | color: ${props => props.color};
21 | font-size: ${props => `${props.size}px`};
22 | height: 4em;
23 | margin: 88px auto;
24 | position: relative;
25 | text-indent: -9999em;
26 | transform: translateZ(0);
27 | width: 1em;
28 | &:before {
29 | animation: ${props => `${loading} ${props.duration}s infinite ease-in-out;`};
30 | animation-delay: ${props => `${props.duration * -0.32}s`};
31 | background: ${props => props.color};
32 | content: '';
33 | height: 4em;
34 | left: -1.5em;
35 | position: absolute;
36 | top: 0;
37 | width: 1em;
38 | }
39 | &:after {
40 | animation: ${props => `${loading} ${props.duration}s infinite ease-in-out`};
41 | animation-delay: ${props => `${props.duration * 0.08}s`};
42 | background: ${props => props.color};
43 | content: '';
44 | height: 4em;
45 | left: 1.5em;
46 | position: absolute;
47 | top: 0;
48 | width: 1em;
49 | }
50 | `
51 |
52 | export default Bar
--------------------------------------------------------------------------------
/src/comet-spin/CometSpin.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | const loading = keyframes`
4 | 0% {
5 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
6 | }
7 | 5%,
8 | 95% {
9 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
10 | }
11 | 10%,
12 | 59% {
13 | box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
14 | }
15 | 20% {
16 | box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
17 | }
18 | 38% {
19 | box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
20 | }
21 | 100% {
22 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
23 | }
24 | `
25 |
26 | const round = keyframes`
27 | 0% {
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | transform: rotate(360deg);
32 | }
33 | `
34 |
35 | const CometSpin = styled.div`
36 | animation: ${props => `${loading} ${props.duration}s infinite ease, ${round} ${props.duration}s infinite ease`};
37 | border-radius: 50%;
38 | color: ${props => props.color};
39 | font-size: ${props => `${props.size}px`};
40 | height: 1em;
41 | margin: 72px auto;
42 | overflow: hidden;
43 | position: relative;
44 | text-indent: -9999em;
45 | transform: translateZ(0);
46 | width: 1em;
47 | `
48 |
49 | export default CometSpin
--------------------------------------------------------------------------------
/src/bubble-spin/BubbleSpin.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | const loading = keyframes`
4 | 0%,
5 | 100% {
6 | box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
7 | }
8 | 12.5% {
9 | box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
10 | }
11 | 25% {
12 | box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
13 | }
14 | 37.5% {
15 | box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
16 | }
17 | 50% {
18 | box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
19 | }
20 | 62.5% {
21 | box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
22 | }
23 | 75% {
24 | box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
25 | }
26 | 87.5% {
27 | box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
28 | }
29 | `
30 |
31 | const BubbleSpin = styled.div`
32 | animation: ${props => `${loading} ${props.duration}s infinite linear;`};
33 | border-radius: 50%;
34 | color: ${props => props.color};
35 | font-size: ${props => `${props.size}px`};
36 | height: 1em;
37 | margin: 100px auto;
38 | position: relative;
39 | text-indent: -9999em;
40 | transform: translateZ(0);
41 | width: 1em;
42 | `
43 |
44 | export default BubbleSpin
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-page-loading",
3 | "version": "1.0.2",
4 | "description": "React page loading components using to display a loading spin until the page loads completely.",
5 | "main": "dist/react-page-loading.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "lint": "./node_modules/.bin/eslint lib/*.jsx",
9 | "prepush": "npm run lint",
10 | "build": "webpack --config webpack.config.prod.js --output-filename react-page-loading.js"
11 | },
12 | "author": "Bunlong",
13 | "license": "MIT",
14 | "devDependencies": {
15 | "babel-core": "^6.7.7",
16 | "babel-eslint": "^7.1.1",
17 | "babel-loader": "^7.1.1",
18 | "babel-polyfill": "^6.7.4",
19 | "babel-preset-es2015": "6.24.0",
20 | "babel-preset-react": "^6.11.1",
21 | "babel-register": "^6.24.1",
22 | "chai": "^3.5.0",
23 | "clean-webpack-plugin": "^0.1.8",
24 | "copy-webpack-plugin": "^2.1.1",
25 | "coveralls": "^2.13.1",
26 | "enzyme": "^2.8.0",
27 | "eslint": "^3.19.0",
28 | "eslint-config-airbnb": "^14.1.0",
29 | "eslint-plugin-import": "^2.2.0",
30 | "eslint-plugin-jsx-a11y": "^4.0.0",
31 | "eslint-plugin-react": "^6.10.3",
32 | "file-loader": "^0.11.1",
33 | "husky": "^0.13.3",
34 | "jsdom": "^9.12.0",
35 | "mocha": "^3.2.0",
36 | "nyc": "^10.2.0",
37 | "react-addons-test-utils": "^15.5.0",
38 | "sinon": "^2.1.0",
39 | "webpack": "^3.3.0",
40 | "webpack-dev-server": "^2.5.1"
41 | },
42 | "dependencies": {
43 | "prop-types": "^15.5.8",
44 | "react": "^15.5.4",
45 | "react-dom": "^15.5.4",
46 | "styled-components": "^3.2.6"
47 | },
48 | "keywords": [
49 | "react-page-loading",
50 | "page-loading",
51 | "page-load",
52 | "page-loading-spin",
53 | "page-load-spin",
54 | "react",
55 | "react-component",
56 | "react-components",
57 | "react"
58 | ],
59 | "bugs": {
60 | "url": "https://github.com/codefacebook/react-page-loading/issues"
61 | },
62 | "homepage": "https://github.com/codefacebook/react-page-loading",
63 | "repository": {
64 | "type": "git",
65 | "url": "https://github.com/codefacebook/react-page-loading"
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | # react-page-loading [](https://www.npmjs.com/package/react-page-loading) [](https://www.npmjs.com/package/react-page-loading) [](http://opensource.org/licenses/MIT)
4 |
5 | React page loading components using to display a loading spin until the page loads completely.
6 |
7 | We'd love to have your helping hand on contributions to react-page-loading by forking and sending a pull request!
8 |
9 |
10 |
11 | ## Features
12 |
13 | * Working with react-router
14 |
15 | * Working with react-router-redux
16 |
17 | * ... etc.
18 |
19 | ## Installation
20 |
21 | ```
22 | npm install react-page-loading --save
23 | ```
24 |
25 | ## Usage
26 |
27 | ```
28 | import React, { Component } from 'react'
29 | import Page from 'react-page-loading'
30 |
31 | export default class App extends Component {
32 | constructor(props) {
33 | super(props)
34 | }
35 |
36 | render() {
37 | return (
38 |
39 |
40 | Title
41 | content goes here
42 |
43 |
44 | )
45 | }
46 | }
47 | ```
48 |
49 | ## Properties
50 |
51 | | Name | Type | Default value |
52 | |:------------- |:---------------- |:-------------- |
53 | | loader | PropTypes.string | bar |
54 | | color | PropTypes.string | #A9A9A9 |
55 | | size | PropTypes.number | 4 |
56 | | duration | PropTypes.number | 1 |
57 |
58 | ### loader
59 |
60 | | Value |
61 | |:------------- |
62 | | bar |
63 | | bubble-spin |
64 | | bubble |
65 | | comet-spin |
66 | | cylinder-spin |
67 | | resize-spin |
68 | | rotate-spin |
69 | | spin |
70 |
71 | ## Contributing
72 |
73 | We'd love to have your helping hand on contributions to react-chartjsx by forking and sending a pull request!
74 |
75 | Your contributions are heartily ♡ welcome, recognized and appreciated. (✿◠‿◠)
76 |
77 | ## License
78 |
79 | MIT License
80 |
81 | Copyright (c) 2018 [codefacebook](https://github.com/codefacebook), Maintained by [Bunlong](https://github.com/Bunlong)
82 |
--------------------------------------------------------------------------------
/src/cylinder-spin/CylinderSpin.js:
--------------------------------------------------------------------------------
1 | import styled, { keyframes } from 'styled-components'
2 |
3 | function animation(props) {
4 | const d = document.createElement('div')
5 | d.style.color = props.color
6 | document.body.appendChild(d)
7 | const rgbcolor = window.getComputedStyle(d).color
8 | const match = /rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(rgbcolor)
9 | const color = `${match[1]}, ${match[2]}, ${match[3]}`
10 |
11 | return keyframes`
12 | 0%,
13 | 100% {
14 | box-shadow: 0em -2.6em 0em 0em ${props.color}, 1.8em -1.8em 0 0em rgba(${color}, 0.2), 2.5em 0em 0 0em rgba(${color}, 0.2), 1.75em 1.75em 0 0em rgba(${color}, 0.2), 0em 2.5em 0 0em rgba(${color}, 0.2), -1.8em 1.8em 0 0em rgba(${color}, 0.2), -2.6em 0em 0 0em rgba(${color}, 0.5), -1.8em -1.8em 0 0em rgba(${color}, 0.7);
15 | }
16 | 12.5% {
17 | box-shadow: 0em -2.6em 0em 0em rgba(${color}, 0.7), 1.8em -1.8em 0 0em ${props.color}, 2.5em 0em 0 0em rgba(${color}, 0.2), 1.75em 1.75em 0 0em rgba(${color}, 0.2), 0em 2.5em 0 0em rgba(${color}, 0.2), -1.8em 1.8em 0 0em rgba(${color}, 0.2), -2.6em 0em 0 0em rgba(${color}, 0.2), -1.8em -1.8em 0 0em rgba(${color}, 0.5);
18 | }
19 | 25% {
20 | box-shadow: 0em -2.6em 0em 0em rgba(${color}, 0.5), 1.8em -1.8em 0 0em rgba(${color}, 0.7), 2.5em 0em 0 0em ${props.color}, 1.75em 1.75em 0 0em rgba(${color}, 0.2), 0em 2.5em 0 0em rgba(${color}, 0.2), -1.8em 1.8em 0 0em rgba(${color}, 0.2), -2.6em 0em 0 0em rgba(${color}, 0.2), -1.8em -1.8em 0 0em rgba(${color}, 0.2);
21 | }
22 | 37.5% {
23 | box-shadow: 0em -2.6em 0em 0em rgba(${color}, 0.2), 1.8em -1.8em 0 0em rgba(${color}, 0.5), 2.5em 0em 0 0em rgba(${color}, 0.7), 1.75em 1.75em 0 0em ${props.color}, 0em 2.5em 0 0em rgba(${color}, 0.2), -1.8em 1.8em 0 0em rgba(${color}, 0.2), -2.6em 0em 0 0em rgba(${color}, 0.2), -1.8em -1.8em 0 0em rgba(${color}, 0.2);
24 | }
25 | 50% {
26 | box-shadow: 0em -2.6em 0em 0em rgba(${color}, 0.2), 1.8em -1.8em 0 0em rgba(${color}, 0.2), 2.5em 0em 0 0em rgba(${color}, 0.5), 1.75em 1.75em 0 0em rgba(${color}, 0.7), 0em 2.5em 0 0em ${props.color}, -1.8em 1.8em 0 0em rgba(${color}, 0.2), -2.6em 0em 0 0em rgba(${color}, 0.2), -1.8em -1.8em 0 0em rgba(${color}, 0.2);
27 | }
28 | 62.5% {
29 | box-shadow: 0em -2.6em 0em 0em rgba(${color}, 0.2), 1.8em -1.8em 0 0em rgba(${color}, 0.2), 2.5em 0em 0 0em rgba(${color}, 0.2), 1.75em 1.75em 0 0em rgba(${color}, 0.5), 0em 2.5em 0 0em rgba(${color}, 0.7), -1.8em 1.8em 0 0em ${props.color}, -2.6em 0em 0 0em rgba(${color}, 0.2), -1.8em -1.8em 0 0em rgba(${color}, 0.2);
30 | }
31 | 75% {
32 | box-shadow: 0em -2.6em 0em 0em rgba(${color}, 0.2), 1.8em -1.8em 0 0em rgba(${color}, 0.2), 2.5em 0em 0 0em rgba(${color}, 0.2), 1.75em 1.75em 0 0em rgba(${color}, 0.2), 0em 2.5em 0 0em rgba(${color}, 0.5), -1.8em 1.8em 0 0em rgba(${color}, 0.7), -2.6em 0em 0 0em ${props.color}, -1.8em -1.8em 0 0em rgba(${color}, 0.2);
33 | }
34 | 87.5% {
35 | box-shadow: 0em -2.6em 0em 0em rgba(${color}, 0.2), 1.8em -1.8em 0 0em rgba(${color}, 0.2), 2.5em 0em 0 0em rgba(${color}, 0.2), 1.75em 1.75em 0 0em rgba(${color}, 0.2), 0em 2.5em 0 0em rgba(${color}, 0.2), -1.8em 1.8em 0 0em rgba(${color}, 0.5), -2.6em 0em 0 0em rgba(${color}, 0.7), -1.8em -1.8em 0 0em ${props.color};
36 | }
37 | `;
38 | }
39 |
40 | const CylinderSpin = styled.div`
41 | animation: ${props => `${animation(props)} ${props.duration}s infinite ease;`};
42 | border-radius: 50%;
43 | font-size: ${props => `${props.size}px`};
44 | height: 1em;
45 | margin: 100px auto;
46 | position: relative;
47 | text-indent: -9999em;
48 | transform: translateZ(0);
49 | width: 1em;
50 | `
51 |
52 | export default CylinderSpin
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import BarLoader from './bar/BarLoader'
4 | import BubbleSpinLoader from './bubble-spin/BubbleSpinLoader'
5 | import BubbleLoader from './bubble/BubbleLoader'
6 | import CometSpinLoader from './comet-spin/CometSpinLoader'
7 | import CylinderSpinLoader from './cylinder-spin/CylinderSpinLoader'
8 | import ResizeSpinLoader from './resize-spin/ResizeSpinLoader'
9 | import RotateSpinLoader from './rotate-spin/RotateSpinLoader'
10 | import SpinLoader from './spin/SpinLoader'
11 |
12 | export default class PageLoading extends React.Component {
13 | constructor(props) {
14 | super(props)
15 | this.state = {
16 | loading: true
17 | }
18 | }
19 |
20 | componentDidMount() {
21 | setTimeout(() => {
22 | this.setState({ loading: false })
23 | }, 1000)
24 | }
25 |
26 | render() {
27 | const { loading } = this.state
28 | const { color, duration, size, loader } = this.props
29 |
30 | let containerStyle = {
31 | position: 'absolute',
32 | left: '50%',
33 | top: '50%',
34 | transform: 'translate(-50%, -50%)'
35 | }
36 |
37 | if (loading) {
38 | if (loader == "bar") {
39 | return (
40 |
41 |
45 |
46 | )
47 | } else if (loader == "bubble-spin") {
48 | return (
49 |
50 |
54 |
55 | )
56 | } else if (loader == "bubble") {
57 | return (
58 |
59 |
63 |
64 | )
65 | } else if (loader == "comet-spin") {
66 | return (
67 |
68 |
72 |
73 | )
74 | } else if (loader == "cylinder-spin") {
75 | return (
76 |
77 |
81 |
82 | )
83 | } else if (loader == "resize-spin") {
84 | return (
85 |
86 |
90 |
91 | )
92 | } else if (loader == "rotate-spin") {
93 | return (
94 |
95 |
99 |
100 | )
101 | } else if (loader == "spin") {
102 | return (
103 |
104 |
108 |
109 | )
110 | }
111 | }
112 |
113 | return (
114 |
115 | { this.props.children }
116 |
117 | )
118 | }
119 | }
120 |
121 | PageLoading.propTypes = {
122 | color: PropTypes.string,
123 | duration: PropTypes.number,
124 | size: PropTypes.number,
125 | loader: PropTypes.string,
126 | }
127 |
128 | PageLoading.defaultProps = {
129 | color: '#A9A9A9',
130 | duration: 1.3,
131 | size: 4,
132 | loader: "bar",
133 | }
--------------------------------------------------------------------------------