UNPKG

halogen

Version:

A collection of loading spinners with React.js

181 lines (163 loc) 4.62 kB
'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;