diff --git a/lerna.json b/lerna.json
index d27721d5f6..d376164513 100644
--- a/lerna.json
+++ b/lerna.json
@@ -8,8 +8,5 @@
}
},
"changelogPreset": "angular",
- "packages": [
- "packages/*",
- "themes/*"
- ]
+ "packages": ["packages/*", "themes/*"]
}
diff --git a/packages/store-ui/src/atoms/Spinner/Spinner.test.tsx b/packages/store-ui/src/atoms/Spinner/Spinner.test.tsx
new file mode 100644
index 0000000000..7db73b52e8
--- /dev/null
+++ b/packages/store-ui/src/atoms/Spinner/Spinner.test.tsx
@@ -0,0 +1,12 @@
+import { render } from '@testing-library/react'
+import React from 'react'
+
+import Spinner from './Spinner'
+
+describe('Spinner', () => {
+ it('`data-store-spinner` is present', () => {
+ const { getByTestId } = render()
+
+ expect(getByTestId('store-spinner')).toHaveAttribute('data-store-spinner')
+ })
+})
diff --git a/packages/store-ui/src/atoms/Spinner/Spinner.tsx b/packages/store-ui/src/atoms/Spinner/Spinner.tsx
new file mode 100644
index 0000000000..104929e343
--- /dev/null
+++ b/packages/store-ui/src/atoms/Spinner/Spinner.tsx
@@ -0,0 +1,17 @@
+import React, { forwardRef } from 'react'
+
+export type SpinnerProps = {
+ /**
+ * ID to find this component in testing tools (e.g.: cypress, testing library, and jest).
+ */
+ testId?: string
+}
+
+const Spinner = forwardRef(function Spinner(
+ { children, testId = 'store-spinner', ...props },
+ ref
+) {
+ return
+})
+
+export default Spinner
diff --git a/packages/store-ui/src/atoms/Spinner/index.tsx b/packages/store-ui/src/atoms/Spinner/index.tsx
new file mode 100644
index 0000000000..49db185901
--- /dev/null
+++ b/packages/store-ui/src/atoms/Spinner/index.tsx
@@ -0,0 +1,2 @@
+export { default } from './Spinner'
+export type { SpinnerProps } from './Spinner'
diff --git a/packages/store-ui/src/atoms/Spinner/stories/Spinner.mdx b/packages/store-ui/src/atoms/Spinner/stories/Spinner.mdx
new file mode 100644
index 0000000000..a148bb1c0c
--- /dev/null
+++ b/packages/store-ui/src/atoms/Spinner/stories/Spinner.mdx
@@ -0,0 +1,18 @@
+import { Story, Canvas, ArgsTable } from '@storybook/addon-docs'
+import Spinner from '../Spinner'
+
+# Spinner
+
+
+
+## Props
+
+
+
+## CSS Selectors
+
+```css
+[data-store-spinner] {}
+```
diff --git a/packages/store-ui/src/atoms/Spinner/stories/Spinner.stories.tsx b/packages/store-ui/src/atoms/Spinner/stories/Spinner.stories.tsx
new file mode 100644
index 0000000000..7aafc67daa
--- /dev/null
+++ b/packages/store-ui/src/atoms/Spinner/stories/Spinner.stories.tsx
@@ -0,0 +1,21 @@
+import type { Story } from '@storybook/react'
+import React from 'react'
+
+import type { SpinnerProps } from '../Spinner'
+import Component from '../Spinner'
+import mdx from './Spinner.mdx'
+
+const SpinnerTemplate: Story = ({ testId }) => (
+
+)
+
+export const Spinner = SpinnerTemplate.bind({})
+
+export default {
+ title: 'Atoms/Spinner',
+ parameters: {
+ docs: {
+ page: mdx,
+ },
+ },
+}
diff --git a/packages/store-ui/src/index.ts b/packages/store-ui/src/index.ts
index 360591eff4..6a75f5138f 100644
--- a/packages/store-ui/src/index.ts
+++ b/packages/store-ui/src/index.ts
@@ -41,6 +41,9 @@ export type { ListProps } from './atoms/List'
export { default as Skeleton } from './atoms/Skeleton'
export type { SkeletonProps } from './atoms/Skeleton'
+export { default as Spinner } from './atoms/Spinner'
+export type { SpinnerProps } from './atoms/Spinner'
+
// Molecules
export { default as Bullets } from './molecules/Bullets'
export type { BulletsProps } from './molecules/Bullets'
diff --git a/themes/theme-b2c-tailwind/src/atoms/index.css b/themes/theme-b2c-tailwind/src/atoms/index.css
index 67a976fc11..52fe6a4da0 100644
--- a/themes/theme-b2c-tailwind/src/atoms/index.css
+++ b/themes/theme-b2c-tailwind/src/atoms/index.css
@@ -1,10 +1,11 @@
+@import "./badge.css";
@import "./button.css";
@import "./icon.css";
@import "./input.css";
+@import "./overlay.css";
@import "./popover.css";
@import "./price.css";
-@import "./textarea.css";
-@import "./overlay.css";
-@import "./badge.css";
@import "./slider.css";
@import "./skeleton.css";
+@import "./spinner.css";
+@import "./textarea.css";
diff --git a/themes/theme-b2c-tailwind/src/atoms/spinner.css b/themes/theme-b2c-tailwind/src/atoms/spinner.css
new file mode 100644
index 0000000000..49483b3e5f
--- /dev/null
+++ b/themes/theme-b2c-tailwind/src/atoms/spinner.css
@@ -0,0 +1,13 @@
+[data-store-spinner] {
+ @apply block animate-spin text-xs relative;
+
+ border-top: 0.2em solid rgba(0, 0, 0, 0.2);
+ border-right: 0.2em solid rgba(0, 0, 0, 0.2);
+ border-bottom: 0.2em solid rgba(0, 0, 0, 0.2);
+ border-left: 0.2em solid #000000;
+}
+
+[data-store-spinner], [data-store-spinner]:after {
+ @apply h-4 w-4;
+ border-radius: 50%;
+}