diff --git a/.gitignore b/.gitignore
index 05be2b29..1d5da3db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -65,4 +65,5 @@ typings/
/dist
/lib
/full
-.coverage
\ No newline at end of file
+.coverage
+.vscode
\ No newline at end of file
diff --git a/src/__test__/__snapshots__/index.test.js.snap b/src/__test__/__snapshots__/index.test.js.snap
index 4a03bcb8..67376a84 100644
--- a/src/__test__/__snapshots__/index.test.js.snap
+++ b/src/__test__/__snapshots__/index.test.js.snap
@@ -25,6 +25,7 @@ Object {
"Icon": [Function],
"Image": [Function],
"Level": [Function],
+ "Loader": [Function],
"Media": [Function],
"Modal": [Function],
"Notification": [Function],
diff --git a/src/components/loader/__test__/__snapshots__/loader.test.js.snap b/src/components/loader/__test__/__snapshots__/loader.test.js.snap
new file mode 100644
index 00000000..62585cb8
--- /dev/null
+++ b/src/components/loader/__test__/__snapshots__/loader.test.js.snap
@@ -0,0 +1,36 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Box component Should Exist 1`] = `[Function]`;
+
+exports[`Box component Should concat Bulma class with classes in props 1`] = `
+
+`;
+
+exports[`Box component Should have box classname 1`] = `
+
+`;
+
+exports[`Box component Should have custom inline styles 1`] = `
+
+`;
+
+exports[`Box component Should render as an html section 1`] = `
+
+`;
diff --git a/src/components/loader/__test__/loader.test.js b/src/components/loader/__test__/loader.test.js
new file mode 100644
index 00000000..c09eedd7
--- /dev/null
+++ b/src/components/loader/__test__/loader.test.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import Loader from '..';
+
+describe('Box component', () => {
+ it('Should Exist', () => {
+ expect(Loader).toMatchSnapshot();
+ });
+ it('Should have box classname', () => {
+ const component = renderer.create(
+ ,
+ );
+ expect(component.toJSON()).toMatchSnapshot();
+ });
+ it('Should concat Bulma class with classes in props', () => {
+ const component = renderer.create(
+ ,
+ );
+ expect(component.toJSON()).toMatchSnapshot();
+ });
+ it('Should render as an html section', () => {
+ const component = renderer.create(
+ ,
+ );
+ expect(component.toJSON()).toMatchSnapshot();
+ });
+ it('Should have custom inline styles', () => {
+ const component = renderer.create(
+ ,
+ );
+ expect(component.toJSON()).toMatchSnapshot();
+ });
+});
diff --git a/src/components/loader/index.js b/src/components/loader/index.js
new file mode 100644
index 00000000..c80ef0be
--- /dev/null
+++ b/src/components/loader/index.js
@@ -0,0 +1,3 @@
+import './loader.sass';
+
+export { default } from './loader';
diff --git a/src/components/loader/loader.js b/src/components/loader/loader.js
new file mode 100644
index 00000000..dd938bd2
--- /dev/null
+++ b/src/components/loader/loader.js
@@ -0,0 +1,36 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classnames from 'classnames';
+
+const Loader = ({
+ children,
+ className,
+ style,
+ renderAs,
+}) => {
+ const Element = renderAs;
+ return (
+
+ {children}
+
+ );
+};
+
+Loader.propTypes = {
+ children: PropTypes.node,
+ className: PropTypes.string,
+ style: PropTypes.object,
+ renderAs: PropTypes.string,
+};
+
+Loader.defaultProps = {
+ children: null,
+ className: '',
+ style: {},
+ renderAs: 'div',
+};
+
+export default Loader;
diff --git a/src/components/loader/loader.sass b/src/components/loader/loader.sass
new file mode 100644
index 00000000..406131f8
--- /dev/null
+++ b/src/components/loader/loader.sass
@@ -0,0 +1,4 @@
+@import '../utils.sass';
+
+.loader
+ +loader
\ No newline at end of file
diff --git a/src/components/loader/loader.story.js b/src/components/loader/loader.story.js
new file mode 100644
index 00000000..7754b09a
--- /dev/null
+++ b/src/components/loader/loader.story.js
@@ -0,0 +1,23 @@
+import React from 'react';
+
+import { storiesOf } from '@storybook/react';
+import { withInfo } from '@storybook/addon-info';
+
+import './loader.story.sass';
+import Loader from '.';
+
+storiesOf('Loader', module)
+ .addDecorator(story => (
+
+ {story()}
+
+ ))
+ .add('Default', withInfo()(() => (
+
+ )))
+ .add('with inline style', withInfo()(() => (
+
+ )))
+ .add('with other classes', withInfo()(() => (
+
+ )));
diff --git a/src/components/loader/loader.story.sass b/src/components/loader/loader.story.sass
new file mode 100644
index 00000000..94903c47
--- /dev/null
+++ b/src/components/loader/loader.story.sass
@@ -0,0 +1,8 @@
+.loader-override
+ margin-left: auto
+ margin-right: auto
+ height: 4em
+ width: 4em
+ border: 4px solid red
+ border-right-color: transparent
+ border-top-color: transparent
diff --git a/src/index.js b/src/index.js
index 414c9bc2..943f2273 100644
--- a/src/index.js
+++ b/src/index.js
@@ -22,4 +22,5 @@ export { default as Tile } from './components/tile';
export { default as Modal } from './components/modal';
export { default as Dropdown } from './components/dropdown';
export { default as Icon } from './components/icon';
+export { default as Loader } from './components/loader';