summaryrefslogtreecommitdiffstats
path: root/src/components/organisms/layout
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/organisms/layout')
-rw-r--r--src/components/organisms/layout/overview.module.scss12
-rw-r--r--src/components/organisms/layout/overview.stories.tsx50
-rw-r--r--src/components/organisms/layout/overview.test.tsx29
-rw-r--r--src/components/organisms/layout/overview.tsx33
4 files changed, 124 insertions, 0 deletions
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;