halogen
Version:
A collection of loading spinners with React.js
181 lines (163 loc) • 4.62 kB
JavaScript
'use strict';
var React = require('react');
var assign = require('domkit/appendVendorPrefix');
var insertKeyframesRule = require('domkit/insertKeyframesRule');
/**
* @type {Object}
*/
var keyframes = {
'50%': {
opacity: 0.3
},
'100%': {
opacity: 1
}
};
/**
* @type {String}
*/
var animationName = insertKeyframesRule(keyframes);
var Loader = React.createClass({
displayName: 'Loader',
/**
* @type {Object}
*/
propTypes: {
loading: React.PropTypes.bool,
color: React.PropTypes.string,
height: React.PropTypes.string,
width: React.PropTypes.string,
margin: React.PropTypes.string,
radius: React.PropTypes.string
},
/**
* @return {Object}
*/
getDefaultProps: function getDefaultProps() {
return {
loading: true,
color: '#ffffff',
height: '15px',
width: '5px',
margin: '2px',
radius: '2px'
};
},
/**
* @param {Number} i
* @return {Object}
*/
getLineStyle: function getLineStyle(i) {
return {
backgroundColor: this.props.color,
height: this.props.height,
width: this.props.width,
margin: this.props.margin,
borderRadius: this.props.radius,
verticalAlign: this.props.verticalAlign
};
},
/**
* @param {Number} i
* @return {Object}
*/
getAnimationStyle: function getAnimationStyle(i) {
var animation = [animationName, '1.2s', i * 0.12 + 's', 'infinite', 'ease-in-out'].join(' ');
var animationFillMode = 'both';
return {
animation: animation,
animationFillMode: animationFillMode
};
},
/**
* @param {Number} i
* @return {Object}
*/
getPosStyle: function getPosStyle(i) {
var radius = '20';
var quarter = radius / 2 + radius / 5.5;
var lines = {
l1: {
top: radius,
left: 0
},
l2: {
top: quarter,
left: quarter,
transform: 'rotate(-45deg)'
},
l3: {
top: 0,
left: radius,
transform: 'rotate(90deg)'
},
l4: {
top: -quarter,
left: quarter,
transform: 'rotate(45deg)'
},
l5: {
top: -radius,
left: 0
},
l6: {
top: -quarter,
left: -quarter,
transform: 'rotate(-45deg)'
},
l7: {
top: 0,
left: -radius,
transform: 'rotate(90deg)'
},
l8: {
top: quarter,
left: -quarter,
transform: 'rotate(45deg)'
}
};
return lines['l' + i];
},
/**
* @param {Number} i
* @return {Object}
*/
getStyle: function getStyle(i) {
return assign(this.getLineStyle(i), this.getPosStyle(i), this.getAnimationStyle(i), {
position: 'absolute'
});
},
/**
* @param {Boolean} loading
* @return {ReactComponent || null}
*/
renderLoader: function renderLoader(loading) {
if (loading) {
var style = {
position: 'relative',
fontSize: 0
};
return React.createElement(
'div',
{ id: this.props.id, className: this.props.className },
React.createElement(
'div',
{ style: style },
React.createElement('div', { style: this.getStyle(1) }),
React.createElement('div', { style: this.getStyle(2) }),
React.createElement('div', { style: this.getStyle(3) }),
React.createElement('div', { style: this.getStyle(4) }),
React.createElement('div', { style: this.getStyle(5) }),
React.createElement('div', { style: this.getStyle(6) }),
React.createElement('div', { style: this.getStyle(7) }),
React.createElement('div', { style: this.getStyle(8) })
)
);
}
return null;
},
render: function render() {
return this.renderLoader(this.props.loading);
}
});
module.exports = Loader;