diff --git a/packages/twenty-ui/src/feedback/loader/__stories__/Loader.stories.tsx b/packages/twenty-ui/src/feedback/loader/__stories__/Loader.stories.tsx new file mode 100644 index 000000000..3ca878030 --- /dev/null +++ b/packages/twenty-ui/src/feedback/loader/__stories__/Loader.stories.tsx @@ -0,0 +1,96 @@ +import { Meta, StoryObj } from '@storybook/react'; +import { expect, waitFor } from '@storybook/test'; + +import { ComponentDecorator } from '@ui/testing'; + +import { Loader } from '../components/Loader'; + +const meta: Meta = { + title: 'UI/Feedback/Loader', + component: Loader, + decorators: [ComponentDecorator], +}; + +export default meta; + +type Story = StoryObj; + +export const WithColor: Story = { + args: { + color: 'red', + }, + play: async ({ canvasElement }) => { + await waitFor(() => { + const element = canvasElement.querySelector(':first-child'); + + expect(element).toBeVisible(); + + return element; + }); + }, +}; + +export const WithDefaultCssVariable: Story = { + decorators: [ + (Story) => ( + // @ts-expect-error: Custom CSS variable for demonstration purposes +
+ +
+ ), + ], + play: async ({ canvasElement }) => { + await waitFor(() => { + const element = canvasElement.querySelector(':first-child'); + + expect(element).toBeVisible(); + + return element; + }); + }, +}; + +export const WithDefaultColor: Story = { + play: async ({ canvasElement }) => { + await waitFor(() => { + const element = canvasElement.querySelector(':first-child'); + + expect(element).toBeVisible(); + + return element; + }); + }, +}; + +export const WithDifferentColors: Story = { + render: () => ( +
+ + + + +
+ ), + play: async ({ canvasElement }) => { + const loaders = await waitFor(() => { + const elements = canvasElement.querySelectorAll('#container > *'); + + expect(elements).toHaveLength(4); + + return elements; + }); + + expect(loaders[0]).toHaveStyle({ + borderColor: expect.stringContaining('red'), + }); + expect(loaders[1]).toHaveStyle({ + borderColor: expect.stringContaining('blue'), + }); + expect(loaders[2]).toHaveStyle({ + borderColor: expect.stringContaining('yellow'), + }); + expect(loaders[3]).toHaveStyle({ + borderColor: expect.stringContaining('green'), + }); + }, +}; diff --git a/packages/twenty-ui/src/feedback/loader/components/Loader.tsx b/packages/twenty-ui/src/feedback/loader/components/Loader.tsx index 4d007ab0b..9b5066245 100644 --- a/packages/twenty-ui/src/feedback/loader/components/Loader.tsx +++ b/packages/twenty-ui/src/feedback/loader/components/Loader.tsx @@ -15,7 +15,9 @@ const StyledLoaderContainer = styled.div<{ border-radius: ${({ theme }) => theme.border.radius.pill}; border: 1px solid ${({ color, theme }) => - color ? theme.tag.text[color] : `var(--tw-button-color)`}; + color + ? theme.tag.text[color] + : `var(--tw-button-color, ${theme.font.color.tertiary})`}; overflow: hidden; `; @@ -23,7 +25,9 @@ const StyledLoader = styled(motion.div)<{ color?: ThemeColor; }>` background-color: ${({ color, theme }) => - color ? theme.tag.text[color] : `var(--tw-button-color)`}; + color + ? theme.tag.text[color] + : `var(--tw-button-color, ${theme.font.color.tertiary})`}; border-radius: ${({ theme }) => theme.border.radius.pill}; height: 8px; width: 8px;