Skip to content

Commit feac43e

Browse files
authored
Skeleton component page (#107)
* #85 Skeleton examples * #85 tests * #85 rename LoaderSkeleton to Skeleton * #85 upgrade deps
1 parent 4d2a839 commit feac43e

18 files changed

Lines changed: 938 additions & 754 deletions

package-lock.json

Lines changed: 643 additions & 643 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,40 +32,40 @@
3232
"@fortawesome/react-fontawesome": "0.2.2",
3333
"@hookform/resolvers": "4.1.3",
3434
"@react-spring/web": "9.7.5",
35-
"@tailwindcss/vite": "4.0.13",
36-
"@tanstack/react-query": "5.67.3",
37-
"@tanstack/react-query-devtools": "5.67.3",
35+
"@tailwindcss/vite": "4.0.14",
36+
"@tanstack/react-query": "5.69.0",
37+
"@tanstack/react-query-devtools": "5.69.0",
3838
"@tanstack/react-table": "8.21.2",
39-
"axios": "1.8.3",
39+
"axios": "1.8.4",
4040
"class-variance-authority": "0.7.1",
4141
"clsx": "2.1.1",
4242
"dayjs": "1.11.13",
43-
"i18next": "24.2.2",
43+
"i18next": "24.2.3",
4444
"i18next-browser-languagedetector": "8.0.4",
4545
"lodash": "4.17.21",
4646
"qs": "6.14.0",
4747
"react": "18.3.1",
4848
"react-dom": "18.3.1",
4949
"react-hook-form": "7.54.2",
5050
"react-i18next": "15.4.1",
51-
"react-router-dom": "7.3.0",
51+
"react-router-dom": "7.4.0",
5252
"recharts": "2.15.1",
5353
"tailwind-merge": "3.0.2",
54-
"tailwindcss": "4.0.13",
54+
"tailwindcss": "4.0.14",
5555
"uuid": "11.1.0",
5656
"yup": "1.6.1"
5757
},
5858
"devDependencies": {
59-
"@chromatic-com/storybook": "3.2.5",
59+
"@chromatic-com/storybook": "3.2.6",
6060
"@eslint/js": "9.22.0",
61-
"@storybook/addon-essentials": "8.6.4",
62-
"@storybook/addon-interactions": "8.6.4",
63-
"@storybook/addon-onboarding": "8.6.4",
64-
"@storybook/addon-themes": "8.6.4",
65-
"@storybook/blocks": "8.6.4",
66-
"@storybook/react": "8.6.4",
67-
"@storybook/react-vite": "8.6.4",
68-
"@storybook/test": "8.6.4",
61+
"@storybook/addon-essentials": "8.6.7",
62+
"@storybook/addon-interactions": "8.6.7",
63+
"@storybook/addon-onboarding": "8.6.7",
64+
"@storybook/addon-themes": "8.6.7",
65+
"@storybook/blocks": "8.6.7",
66+
"@storybook/react": "8.6.7",
67+
"@storybook/react-vite": "8.6.7",
68+
"@storybook/test": "8.6.7",
6969
"@testing-library/jest-dom": "6.6.3",
7070
"@testing-library/react": "16.2.0",
7171
"@testing-library/user-event": "14.6.1",
@@ -76,21 +76,21 @@
7676
"@types/react-dom": "18.3.1",
7777
"@types/uuid": "10.0.0",
7878
"@vitejs/plugin-react": "4.3.4",
79-
"@vitest/coverage-v8": "3.0.8",
79+
"@vitest/coverage-v8": "3.0.9",
8080
"eslint": "9.22.0",
8181
"eslint-plugin-react-hooks": "5.2.0",
8282
"eslint-plugin-react-refresh": "0.4.19",
83-
"eslint-plugin-storybook": "0.11.4",
83+
"eslint-plugin-storybook": "0.11.6",
8484
"globals": "16.0.0",
8585
"jsdom": "26.0.0",
8686
"msw": "2.7.3",
8787
"prettier": "3.5.3",
8888
"prettier-plugin-tailwindcss": "0.6.11",
8989
"rimraf": "6.0.1",
90-
"storybook": "8.6.4",
91-
"typescript": "5.7.3",
92-
"typescript-eslint": "8.26.1",
93-
"vite": "6.2.1",
94-
"vitest": "3.0.8"
90+
"storybook": "8.6.7",
91+
"typescript": "5.8.2",
92+
"typescript-eslint": "8.27.0",
93+
"vite": "6.2.2",
94+
"vitest": "3.0.9"
9595
}
9696
}

src/common/components/Loader/LoaderSkeleton.tsx

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { cn } from 'common/utils/css';
2+
import { BaseComponentProps } from 'common/utils/types';
3+
4+
/**
5+
* Properties for the `Skeleton` component.
6+
*/
7+
export interface SkeletonProps extends BaseComponentProps {}
8+
9+
/**
10+
* The `Skeleton` component renders an animated loader which pulses
11+
* faintly. Typically used when initially loading some data asynchronously.
12+
*/
13+
const Skeleton = ({ className, testId = 'skeleton' }: SkeletonProps): JSX.Element => {
14+
return (
15+
<div
16+
className={cn('animate-pulse rounded-md bg-neutral-200 dark:bg-neutral-700', className)}
17+
data-testid={testId}
18+
/>
19+
);
20+
};
21+
22+
export default Skeleton;

src/common/components/Loader/__stories__/LoaderSkeleton.stories.tsx renamed to src/common/components/Loader/__stories__/Skeleton.stories.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type { Meta, StoryObj } from '@storybook/react';
22

3-
import LoaderSkeleton from '../LoaderSkeleton';
3+
import Skeleton from '../Skeleton';
44

55
const meta = {
6-
title: 'Common/Loader/LoaderSkeleton',
7-
component: LoaderSkeleton,
6+
title: 'Common/Loader/Skeleton',
7+
component: Skeleton,
88
parameters: {
99
layout: 'centered',
1010
},
@@ -13,7 +13,7 @@ const meta = {
1313
className: { description: 'Additional CSS classes.' },
1414
testId: { description: 'The test identifier.' },
1515
},
16-
} satisfies Meta<typeof LoaderSkeleton>;
16+
} satisfies Meta<typeof Skeleton>;
1717

1818
export default meta;
1919

src/common/components/Loader/__tests__/LoaderSkeleton.test.tsx

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { describe, expect, it } from 'vitest';
2+
import { render, screen } from 'test/test-utils';
3+
4+
import Skeleton from '../Skeleton';
5+
6+
describe('Skeleton', () => {
7+
it('should render successfully', async () => {
8+
// ARRANGE
9+
render(<Skeleton />);
10+
await screen.findByTestId('skeleton');
11+
12+
// ASSERT
13+
expect(screen.getByTestId('skeleton')).toBeDefined();
14+
});
15+
16+
it('should render custom testId', async () => {
17+
// ARRANGE
18+
render(<Skeleton testId="test" />);
19+
await screen.findByTestId('test');
20+
21+
// ASSERT
22+
expect(screen.getByTestId('test')).toBeDefined();
23+
});
24+
25+
it('should render custom class name', async () => {
26+
// ARRANGE
27+
render(<Skeleton className="my-class" />);
28+
await screen.findByTestId('skeleton');
29+
30+
// ASSERT
31+
expect(screen.getByTestId('skeleton').classList).toContain('my-class');
32+
});
33+
});

src/common/components/Router/Router.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const SearchInputComponents = lazy(
4242
() => import('pages/Components/components/SearchInputComponents'),
4343
);
4444
const SelectComponents = lazy(() => import('pages/Components/components/SelectComponents'));
45+
const SkeletonComponents = lazy(() => import('pages/Components/components/SkeletonComponents'));
4546
const TabsComponents = lazy(() => import('pages/Components/components/TabsComponents'));
4647
const TextComponents = lazy(() => import('pages/Components/components/TextComponents'));
4748
const TextareaComponents = lazy(() => import('pages/Components/components/TextareaComponents'));
@@ -170,6 +171,10 @@ export const routes: RouteObject[] = [
170171
path: 'select',
171172
element: withSuspense(<SelectComponents />),
172173
},
174+
{
175+
path: 'skeleton',
176+
element: withSuspense(<SkeletonComponents />),
177+
},
173178
{
174179
path: 'tabs',
175180
element: withSuspense(<TabsComponents />),

src/pages/Components/ComponentsPage.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ const ComponentsPage = (): JSX.Element => {
8282
<MenuNavLink to="select" styleActive>
8383
Select
8484
</MenuNavLink>
85+
<MenuNavLink to="skeleton" styleActive>
86+
Skeleton
87+
</MenuNavLink>
8588
<MenuNavLink to="tabs" styleActive>
8689
Tabs
8790
</MenuNavLink>

0 commit comments

Comments
 (0)