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%; +}