UNPKG

halogen

Version:

A collection of loading spinners with React.js

112 lines (98 loc) 2.67 kB
'use strict'; var React = require('react'); var assign = require('domkit/appendVendorPrefix'); var insertKeyframesRule = require('domkit/insertKeyframesRule'); /** * @type {Object} */ var keyframes = { '25%': { transform: 'perspective(100px) rotateX(180deg) rotateY(0)' }, '50%': { transform: 'perspective(100px) rotateX(180deg) rotateY(180deg)' }, '75%': { transform: 'perspective(100px) rotateX(0) rotateY(180deg)' }, '100%': { transform: 'perspective(100px) rotateX(0) rotateY(0)' } }; /** * @type {String} */ var animationName = insertKeyframesRule(keyframes); var Loader = React.createClass({ displayName: 'Loader', /** * @type {Object} */ propTypes: { loading: React.PropTypes.bool, color: React.PropTypes.string, size: React.PropTypes.string }, /** * @return {Object} */ getDefaultProps: function getDefaultProps() { return { loading: true, color: '#ffffff', size: '20px' }; }, /** * @return {Object} */ getSharpStyle: function getSharpStyle() { return { width: 0, height: 0, borderLeft: this.props.size + ' solid transparent', borderRight: this.props.size + ' solid transparent', borderBottom: this.props.size + ' solid ' + this.props.color, verticalAlign: this.props.verticalAlign }; }, /** * @param {Number} i * @return {Object} */ getAnimationStyle: function getAnimationStyle(i) { var animation = [animationName, '3s', '0s', 'infinite', 'cubic-bezier(.09,.57,.49,.9)'].join(' '); var animationFillMode = 'both'; return { animation: animation, animationFillMode: animationFillMode }; }, /** * @param {Number} i * @return {Object} */ getStyle: function getStyle(i) { return assign(this.getSharpStyle(i), this.getAnimationStyle(i), { display: 'inline-block' }); }, /** * @param {Boolean} loading * @return {ReactComponent || null} */ renderLoader: function renderLoader(loading) { if (loading) { return React.createElement( 'div', { id: this.props.id, className: this.props.className }, React.createElement('div', { style: this.getStyle() }) ); }; return null; }, render: function render() { return this.renderLoader(this.props.loading); } }); module.exports = Loader;