Skip to content

Commit 0a9217b

Browse files
committed
Add Spinner component and examples
1 parent 760a4b5 commit 0a9217b

File tree

7 files changed

+83
-0
lines changed

7 files changed

+83
-0
lines changed

src/components/Spinner.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import classnames from 'classnames';
2+
3+
/**
4+
* @typedef SpinnerProps
5+
* @prop {string} [classes] - Additional CSS classes to apply
6+
*/
7+
8+
/**
9+
* Loading indicator.
10+
*
11+
* @param {SpinnerProps} props
12+
*/
13+
export function Spinner({ classes = '' }) {
14+
return (
15+
<span className={classnames('Hyp-Spinner', classes)}>
16+
<span>
17+
<span />
18+
</span>
19+
</span>
20+
);
21+
}

src/components/test/Spinner-test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { mount } from 'enzyme';
2+
3+
import { Spinner } from '../Spinner';
4+
5+
import { checkAccessibility } from '../../../test/util/accessibility';
6+
7+
describe('Spinner', () => {
8+
const createSpinner = (props = {}) => mount(<Spinner {...props} />);
9+
10+
it('renders', () => {
11+
createSpinner();
12+
assert.exists('span.Hyp-Spinner');
13+
});
14+
15+
it('applies additional classes', () => {
16+
createSpinner({ classes: 'foo bar' });
17+
assert.exists('span.Hyp-Spinner.foo.bar');
18+
});
19+
20+
it(
21+
'should pass a11y checks',
22+
checkAccessibility({
23+
content: () => createSpinner(),
24+
})
25+
);
26+
});

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export { Frame, Card, Actions } from './components/containers';
55
export { Dialog } from './components/Dialog';
66
export { Modal, ConfirmModal } from './components/Modal';
77
export { Panel } from './components/Panel';
8+
export { Spinner } from './components/Spinner';
89
export { SvgIcon, registerIcons } from './components/SvgIcon';
910
export { TextInput, TextInputWithButton } from './components/TextInput';
1011

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Spinner } from '../../..';
2+
3+
import {
4+
PatternPage,
5+
Pattern,
6+
PatternExamples,
7+
PatternExample,
8+
} from '../PatternPage';
9+
10+
export default function SpinnerComponents() {
11+
return (
12+
<PatternPage title="Spinner">
13+
<Pattern title="Spinner">
14+
<PatternExamples>
15+
<PatternExample details="basic loading spinner">
16+
<Spinner />
17+
</PatternExample>
18+
</PatternExamples>
19+
</Pattern>
20+
</PatternPage>
21+
);
22+
}

src/pattern-library/routes.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import ContainerComponents from './components/patterns/ContainerComponents';
1313
import DialogComponents from './components/patterns/DialogComponents';
1414
import FormComponents from './components/patterns/FormComponents';
1515
import PanelComponents from './components/patterns/PanelComponents';
16+
import SpinnerComponents from './components/patterns/SpinnerComponents';
1617

1718
/**
1819
* @typedef {'home'|'foundations'|'patterns'|'components'} PlaygroundRouteGroup
@@ -100,6 +101,12 @@ const routes = [
100101
component: PanelComponents,
101102
group: 'components',
102103
},
104+
{
105+
route: '/components-spinner',
106+
title: 'Spinner',
107+
component: SpinnerComponents,
108+
group: 'components',
109+
},
103110
];
104111

105112
/**

styles/components/Spinner.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@use '../mixins/patterns/spinners';
2+
3+
.Hyp-Spinner {
4+
@include spinners.spinner;
5+
}

styles/index.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
@use './components/Dialog';
99
@use './components/Modal';
1010
@use './components/Panel';
11+
@use './components/Spinner';
1112
@use './components/SvgIcon';
1213
@use './components/TextInput';
1314
@use './components/buttons/styles';

0 commit comments

Comments
 (0)