UNPKG

1.5 kBJavaScriptView Raw
1import React from 'react';
2import PropTypes from 'prop-types';
3import classNames from 'classnames';
4import { mapToCssModules, tagPropType } from './utils';
5
6const propTypes = {
7 /** Set a custom element for this component */
8 tag: tagPropType,
9 /** Change animation of spinner */
10 type: PropTypes.oneOf(['border', 'grow']),
11 /** Change size of spinner */
12 size: PropTypes.oneOf(['sm']),
13 /** Change color of spinner */
14 color: PropTypes.oneOf([
15 'primary',
16 'secondary',
17 'success',
18 'danger',
19 'warning',
20 'info',
21 'light',
22 'dark',
23 ]),
24 /** Add custom class */
25 className: PropTypes.string,
26 /** Change existing className with a new className */
27 cssModule: PropTypes.object,
28 /** Pass children so this component can wrap the child elements */
29 children: PropTypes.string,
30};
31
32function Spinner(props) {
33 const {
34 className,
35 cssModule,
36 type = 'border',
37 size,
38 color,
39 children = 'Loading...',
40 tag: Tag = 'div',
41 ...attributes
42 } = props;
43
44 const classes = mapToCssModules(
45 classNames(
46 className,
47 size ? `spinner-${type}-${size}` : false,
48 `spinner-${type}`,
49 color ? `text-${color}` : false,
50 ),
51 cssModule,
52 );
53
54 return (
55 <Tag role="status" {...attributes} className={classes}>
56 {children && (
57 <span className={mapToCssModules('visually-hidden', cssModule)}>
58 {children}
59 </span>
60 )}
61 </Tag>
62 );
63}
64
65Spinner.propTypes = propTypes;
66
67export default Spinner;