diff --git a/package-lock.json b/package-lock.json index e256c39a..7f0c7e44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31547,7 +31547,7 @@ }, "packages/react-front-kit": { "name": "@smile/react-front-kit", - "version": "0.0.3", + "version": "0.4.0", "license": "MIT", "dependencies": { "@mantine/dropzone": "^6.0.21", @@ -31586,7 +31586,7 @@ }, "packages/react-front-kit-dropzone": { "name": "@smile/react-front-kit-dropzone", - "version": "0.0.3", + "version": "0.4.0", "license": "MIT", "dependencies": { "@smile/react-front-kit": "*", @@ -32563,7 +32563,7 @@ }, "packages/react-front-kit-shared": { "name": "@smile/react-front-kit-shared", - "version": "0.0.3", + "version": "0.4.0", "license": "MIT", "devDependencies": { "@babel/preset-env": "^7.22.20", @@ -33534,7 +33534,7 @@ }, "packages/react-front-kit-table": { "name": "@smile/react-front-kit-table", - "version": "0.0.3", + "version": "0.4.0", "license": "MIT", "dependencies": { "@smile/react-front-kit": "*", diff --git a/packages/react-front-kit/src/Components/Filters/Filters.stories.tsx b/packages/react-front-kit/src/Components/Filters/Filters.stories.tsx new file mode 100644 index 00000000..306b164d --- /dev/null +++ b/packages/react-front-kit/src/Components/Filters/Filters.stories.tsx @@ -0,0 +1,16 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { Filters as Cmp } from './Filters'; + +const meta = { + component: Cmp, + tags: ['autodocs'], + title: '3-custom/Components/Filters', +} satisfies Meta; + +export default meta; +type IStory = StoryObj; + +export const Filters: IStory = { + args: {}, +}; diff --git a/packages/react-front-kit/src/Components/Filters/Filters.style.tsx b/packages/react-front-kit/src/Components/Filters/Filters.style.tsx new file mode 100644 index 00000000..30c8c6a4 --- /dev/null +++ b/packages/react-front-kit/src/Components/Filters/Filters.style.tsx @@ -0,0 +1,44 @@ +import { createStyles } from '@mantine/styles'; + +export const useStyles = createStyles((theme) => ({ + activeFilters: { + display: 'flex', + flexWrap: 'nowrap', + marginTop: '16px', + }, + badgeInner: { + fontWeight: 600, + position: 'relative', + right: '4px', + }, + badgeRight: { + position: 'relative', + right: '4px', + top: '1px', + }, + badgeRoot: { + border: '2px solid white', + color: 'white', + cursor: 'pointer', + fontSize: '12px', + fontWeight: 'normal', + marginBottom: '8px', + marginRight: '8px', + textTransform: 'capitalize', + }, + buttonRemoveRoot: { color: 'white', fontSize: '14px', padding: '0' }, + root: { + backgroundColor: 'white', + borderRadius: '16px', + }, + title: { + fontWeight: 600, + }, + top: { + background: theme.colors.cyan[9], + border: '8px solid white', + borderRadius: '16px 16px 0px 0px', + color: 'white', + padding: '24px', + }, +})); diff --git a/packages/react-front-kit/src/Components/Filters/Filters.test.tsx b/packages/react-front-kit/src/Components/Filters/Filters.test.tsx new file mode 100644 index 00000000..6f82fcf9 --- /dev/null +++ b/packages/react-front-kit/src/Components/Filters/Filters.test.tsx @@ -0,0 +1,10 @@ +import { renderWithProviders } from '@smile/react-front-kit-shared/src/test-utils'; + +import { Filters } from './Filters'; + +describe('Filters', () => { + it('matches snapshot', () => { + const { container } = renderWithProviders(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/packages/react-front-kit/src/Components/Filters/Filters.tsx b/packages/react-front-kit/src/Components/Filters/Filters.tsx new file mode 100644 index 00000000..c3af6320 --- /dev/null +++ b/packages/react-front-kit/src/Components/Filters/Filters.tsx @@ -0,0 +1,137 @@ +'use client'; + +import type { ReactElement, ReactNode } from 'react'; + +import { Badge, Box, Button, Group } from '@mantine/core'; +import { TrashSimple, X } from '@phosphor-icons/react'; + +import { useStyles } from './Filters.style'; + +export interface ISidebarFilter { + id: number | string; + label: string; + onRemove: (filter: ISidebarFilter) => void; + value: unknown; +} + +export interface IFiltersProps { + activeFilters?: ISidebarFilter[] | []; + deleteButtonLabel?: string; + title?: ReactNode; +} + +export function Filters(props: IFiltersProps): ReactElement { + const { + activeFilters = [ + { + id: 1, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + { + id: 2, + label: 'truck', + onRemove: (filter: ISidebarFilter) => { + console.log(filter); + }, + value: 'truck', + }, + ], + title = 'Active filters', + deleteButtonLabel = 'Remove all', + } = props; + const { classes } = useStyles(); + return ( + +
+ + {title} + + +
+ {activeFilters.map((filter) => ( + filter.onRemove(filter)} + pr={3} + rightSection={} + size="xl" + variant="outline" + > + {filter.label} + + ))} +
+ + ); +} diff --git a/packages/react-front-kit/src/index.tsx b/packages/react-front-kit/src/index.tsx index 9818e859..0f59f86d 100644 --- a/packages/react-front-kit/src/index.tsx +++ b/packages/react-front-kit/src/index.tsx @@ -1,6 +1,7 @@ /* eslint-disable react-refresh/only-export-components */ export * from '@smile/react-front-kit-shared'; // component exports +export * from './Components/Filters/Filters'; export * from './Components/DocumentCard/DocumentCard'; export * from './Components/BitConverter/BitConverter'; export * from './Components/Breadcrumbs/Breadcrumbs';