diff --git a/.changeset/small-queens-breathe.md b/.changeset/small-queens-breathe.md new file mode 100644 index 0000000000..739f242e0d --- /dev/null +++ b/.changeset/small-queens-breathe.md @@ -0,0 +1,6 @@ +--- +"@digdir/designsystemet-css": patch +"@digdir/designsystemet-react": patch +--- + +Spinner: Style using data attributes diff --git a/packages/css/spinner.css b/packages/css/spinner.css index cbf5a9d31c..16712296fd 100644 --- a/packages/css/spinner.css +++ b/packages/css/spinner.css @@ -1,9 +1,41 @@ .ds-spinner { --dsc-spinner-background: var(--ds-color-neutral-surface-default); - --dsc-spinner-stroke: var(--ds-color-accent-base-default); + --dsc-spinner-stroke: var(--ds-color-neutral-border-default); + --dsc-spinner-size: var(--ds-sizing-11); + --dsc-spinner-animation-duration: 2s; + width: var(--dsc-spinner-size); + height: var(--dsc-spinner-size); animation: ds-spinner-rotate-animation linear infinite; - animation-duration: 2s; + animation-duration: var(--dsc-spinner-animation-duration); + + &[data-color='accent'] { + --dsc-spinner-stroke: var(--ds-color-accent-base-default); + } + + &[data-size='2xs'] { + --dsc-spinner-size: var(--ds-sizing-3); + } + + &[data-size='xs'] { + --dsc-spinner-size: var(--ds-sizing-5); + } + + &[data-size='sm'] { + --dsc-spinner-size: var(--ds-sizing-8); + } + + &[data-size='lg'] { + --dsc-spinner-size: var(--ds-sizing-15); + } + + &[data-size='xl'] { + --dsc-spinner-size: var(--ds-sizing-22); + } +} + +.ds-spinner__background { + stroke: var(--dsc-spinner-background); } .ds-spinner__circle { @@ -11,7 +43,7 @@ stroke-dasharray: 1px, 200px; transform-origin: center; animation: ds-spinner-stroke-animation ease-in-out infinite; - animation-duration: 2s; + animation-duration: var(--dsc-spinner-animation-duration); } /* Prefers reduced motion needs longer animation, @@ -19,24 +51,8 @@ but don't remove it since it is not decorative. */ @media (prefers-reduced-motion: reduce) { .ds-spinner { - animation-duration: 6s; + --dsc-spinner-animation-duration: 6s; } - - .ds-spinner__circle { - animation-duration: 6s; - } -} - -.ds-spinner--neutral { - --dsc-spinner-stroke: var(--ds-color-neutral-border-default); -} - -.ds-spinner--accent { - --dsc-spinner-stroke: var(--ds-color-accent-base-default); -} - -.ds-spinner__background { - stroke: var(--dsc-spinner-background); } @keyframes ds-spinner-rotate-animation { diff --git a/packages/react/src/components/Spinner/Spinner.test.tsx b/packages/react/src/components/Spinner/Spinner.test.tsx index d0c33fedad..ac7c6cc49e 100644 --- a/packages/react/src/components/Spinner/Spinner.test.tsx +++ b/packages/react/src/components/Spinner/Spinner.test.tsx @@ -9,9 +9,10 @@ beforeAll(() => { describe('spinner', (): void => { it('should render with default medium size', (): void => { render(); - expect(screen.getByTitle('Loading').parentElement).toHaveStyle({ - width: '40px', - }); + expect(screen.getByTitle('Loading').parentElement).toHaveAttribute( + 'data-size', + 'md', + ); }); it('should render with title "loading', (): void => { diff --git a/packages/react/src/components/Spinner/Spinner.tsx b/packages/react/src/components/Spinner/Spinner.tsx index 2f9da6eb95..0423d38ef0 100644 --- a/packages/react/src/components/Spinner/Spinner.tsx +++ b/packages/react/src/components/Spinner/Spinner.tsx @@ -3,17 +3,6 @@ import type * as React from 'react'; import { useSynchronizedAnimation } from '../../utilities'; -const sizeMap: { - [key in NonNullable]: number; -} = { - '2xs': 13, - xs: 20, - sm: 27, - md: 40, - lg: 56, - xl: 79, -}; - export type SpinnerProps = { /** Spinner title */ title: string; @@ -36,7 +25,6 @@ export const Spinner = ({ color = 'neutral', size = 'md', className, - style, ...rest }: SpinnerProps): JSX.Element => { const svgRef = useSynchronizedAnimation( @@ -49,10 +37,11 @@ export const Spinner = ({ return ( {title}