diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-04-15 14:31:40 +0200 | 
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-04-15 14:31:40 +0200 | 
| commit | 0ff94252e27a80221e221c6159761f46aa111ac3 (patch) | |
| tree | 96dc62063e39f46fcadd86c0b7e9377d3d5fbcd6 /src/components/atoms | |
| parent | 894621cbf347485010de612b0f7fec74bdd26778 (diff) | |
chore: add a Notice component
Diffstat (limited to 'src/components/atoms')
| -rw-r--r-- | src/components/atoms/layout/notice.module.scss | 28 | ||||
| -rw-r--r-- | src/components/atoms/layout/notice.stories.tsx | 40 | ||||
| -rw-r--r-- | src/components/atoms/layout/notice.test.tsx | 11 | ||||
| -rw-r--r-- | src/components/atoms/layout/notice.tsx | 25 | 
4 files changed, 104 insertions, 0 deletions
| diff --git a/src/components/atoms/layout/notice.module.scss b/src/components/atoms/layout/notice.module.scss new file mode 100644 index 0000000..38ec7ee --- /dev/null +++ b/src/components/atoms/layout/notice.module.scss @@ -0,0 +1,28 @@ +@use "@styles/abstracts/functions" as fun; + +.wrapper { +  width: max-content; +  padding: var(--spacing-2xs) var(--spacing-xs); +  border: fun.convert-px(2) solid; +  font-weight: bold; + +  &--error { +    border-color: var(--color-token-red); +    color: var(--color-token-red); +  } + +  &--info { +    border-color: var(--color-token-blue); +    color: var(--color-token-blue); +  } + +  &--success { +    border-color: var(--color-token-green); +    color: var(--color-token-green); +  } + +  &--warning { +    border-color: var(--color-token-orange); +    color: var(--color-token-orange); +  } +} diff --git a/src/components/atoms/layout/notice.stories.tsx b/src/components/atoms/layout/notice.stories.tsx new file mode 100644 index 0000000..0555a2e --- /dev/null +++ b/src/components/atoms/layout/notice.stories.tsx @@ -0,0 +1,40 @@ +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import NoticeComponent from './notice'; + +export default { +  title: 'Atoms/Layout', +  component: NoticeComponent, +  argTypes: { +    kind: { +      control: { +        type: 'select', +      }, +      description: 'The notice kind.', +      options: ['error', 'info', 'success', 'warning'], +      type: { +        name: 'string', +        required: true, +      }, +    }, +    message: { +      control: { +        type: 'text', +      }, +      description: 'The notice body.', +      type: { +        name: 'string', +        required: true, +      }, +    }, +  }, +} as ComponentMeta<typeof NoticeComponent>; + +const Template: ComponentStory<typeof NoticeComponent> = (args) => ( +  <NoticeComponent {...args} /> +); + +export const Notice = Template.bind({}); +Notice.args = { +  kind: 'info', +  message: 'Nisi provident sapiente.', +}; diff --git a/src/components/atoms/layout/notice.test.tsx b/src/components/atoms/layout/notice.test.tsx new file mode 100644 index 0000000..4501f8f --- /dev/null +++ b/src/components/atoms/layout/notice.test.tsx @@ -0,0 +1,11 @@ +import { render, screen } from '@test-utils'; +import Notice from './notice'; + +const message = 'Tenetur consequuntur tempore.'; + +describe('Notice', () => { +  it('renders a message', () => { +    render(<Notice kind="info" message={message} />); +    expect(screen.getByText(message)).toBeInTheDocument(); +  }); +}); diff --git a/src/components/atoms/layout/notice.tsx b/src/components/atoms/layout/notice.tsx new file mode 100644 index 0000000..e919182 --- /dev/null +++ b/src/components/atoms/layout/notice.tsx @@ -0,0 +1,25 @@ +import { VFC } from 'react'; +import styles from './notice.module.scss'; + +export type NoticeKind = 'error' | 'info' | 'success' | 'warning'; + +export type NoticeProps = { +  /** +   * The notice kind. +   */ +  kind: NoticeKind; +  /** +   * The notice body. +   */ +  message: string; +}; + +const Notice: VFC<NoticeProps> = ({ kind, message }) => { +  const kindClass = `wrapper--${kind}`; + +  return ( +    <div className={`${styles.wrapper} ${styles[kindClass]}`}>{message}</div> +  ); +}; + +export default Notice; | 
