diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-04-15 22:20:09 +0200 | 
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-04-15 22:31:17 +0200 | 
| commit | edea15c845b33848b7b4f63616841e675b74d572 (patch) | |
| tree | 8b9d9bc0ae8db49b13c76e80a4ed2d3e3a247573 /src/components | |
| parent | 52295600772281d83885a49f57d5d2092fcc8397 (diff) | |
chore: add an Overview component
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/molecules/layout/meta.tsx | 4 | ||||
| -rw-r--r-- | src/components/organisms/layout/overview.module.scss | 12 | ||||
| -rw-r--r-- | src/components/organisms/layout/overview.stories.tsx | 50 | ||||
| -rw-r--r-- | src/components/organisms/layout/overview.test.tsx | 29 | ||||
| -rw-r--r-- | src/components/organisms/layout/overview.tsx | 33 | 
5 files changed, 128 insertions, 0 deletions
| diff --git a/src/components/molecules/layout/meta.tsx b/src/components/molecules/layout/meta.tsx index ace6f89..218ebd9 100644 --- a/src/components/molecules/layout/meta.tsx +++ b/src/components/molecules/layout/meta.tsx @@ -32,6 +32,10 @@ export type MetaProps = {     * The meta layout.     */    layout?: DescriptionListProps['layout']; +  /** +   * Determine if the layout should be responsive. +   */ +  responsiveLayout?: DescriptionListProps['responsiveLayout'];  };  /** diff --git a/src/components/organisms/layout/overview.module.scss b/src/components/organisms/layout/overview.module.scss new file mode 100644 index 0000000..4d50ad1 --- /dev/null +++ b/src/components/organisms/layout/overview.module.scss @@ -0,0 +1,12 @@ +@use "@styles/abstracts/functions" as fun; + +.wrapper { +  padding: var(--spacing-sm) var(--spacing-md); +  border: fun.convert-px(1) solid var(--color-border); +} + +.cover { +  max-height: fun.convert-px(150); +  margin: 0 auto var(--spacing-md); +  border: fun.convert-px(1) solid var(--color-border); +} diff --git a/src/components/organisms/layout/overview.stories.tsx b/src/components/organisms/layout/overview.stories.tsx new file mode 100644 index 0000000..61d8b35 --- /dev/null +++ b/src/components/organisms/layout/overview.stories.tsx @@ -0,0 +1,50 @@ +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import OverviewComponent from './overview'; + +export default { +  title: 'Organisms/Layout', +  component: OverviewComponent, +  argTypes: { +    cover: { +      description: 'The overview cover.', +      type: { +        name: 'object', +        required: true, +        value: {}, +      }, +    }, +    meta: { +      description: 'The overview metadata.', +      type: { +        name: 'object', +        required: true, +        value: {}, +      }, +    }, +  }, +} as ComponentMeta<typeof OverviewComponent>; + +const Template: ComponentStory<typeof OverviewComponent> = (args) => ( +  <OverviewComponent {...args} /> +); + +const cover = { +  alt: 'picture', +  height: 480, +  src: 'http://placeimg.com/640/480/cats', +  width: 640, +}; + +const meta = { +  publication: { name: 'Illo ut odio:', value: 'Sequi et excepturi' }, +  update: { +    name: 'Perspiciatis vel laudantium:', +    value: 'Dignissimos ratione veritatis', +  }, +}; + +export const Overview = Template.bind({}); +Overview.args = { +  cover, +  meta, +}; diff --git a/src/components/organisms/layout/overview.test.tsx b/src/components/organisms/layout/overview.test.tsx new file mode 100644 index 0000000..0738d3f --- /dev/null +++ b/src/components/organisms/layout/overview.test.tsx @@ -0,0 +1,29 @@ +import { render, screen } from '@test-utils'; +import Overview from './overview'; + +const cover = { +  alt: 'Incidunt unde quam', +  height: 480, +  src: 'http://placeimg.com/640/480/cats', +  width: 640, +}; + +const meta = { +  publication: { name: 'Illo ut odio:', value: 'Sequi et excepturi' }, +  update: { +    name: 'Perspiciatis vel laudantium:', +    value: 'Dignissimos ratione veritatis', +  }, +}; + +describe('Overview', () => { +  it('renders some meta', () => { +    render(<Overview meta={meta} />); +    expect(screen.getByText(meta['publication'].name)).toBeInTheDocument(); +  }); + +  it('renders a cover', () => { +    render(<Overview meta={meta} cover={cover} />); +    expect(screen.getByRole('img', { name: cover.alt })).toBeInTheDocument(); +  }); +}); diff --git a/src/components/organisms/layout/overview.tsx b/src/components/organisms/layout/overview.tsx new file mode 100644 index 0000000..3f83342 --- /dev/null +++ b/src/components/organisms/layout/overview.tsx @@ -0,0 +1,33 @@ +import ResponsiveImage, { +  type ResponsiveImageProps, +} from '@components/molecules/images/responsive-image'; +import Meta, { type MetaMap } from '@components/molecules/layout/meta'; +import { VFC } from 'react'; +import styles from './overview.module.scss'; + +export type OverviewProps = { +  cover?: Pick<ResponsiveImageProps, 'alt' | 'src' | 'width' | 'height'>; +  meta: MetaMap; +}; + +/** + * Overview component + * + * Render an overview. + */ +const Overview: VFC<OverviewProps> = ({ cover, meta }) => { +  return ( +    <div className={styles.wrapper}> +      {cover && ( +        <ResponsiveImage +          objectFit="cover" +          className={styles.cover} +          {...cover} +        /> +      )} +      <Meta data={meta} layout="column" responsiveLayout={true} /> +    </div> +  ); +}; + +export default Overview; | 
