From d8a5c90ef58fa451c19e8d9e0aab0c493a0a6a9f Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Fri, 15 Apr 2022 22:56:36 +0200
Subject: chore: add an ImageWidget component

---
 src/components/organisms/widgets/image-widget.tsx | 75 +++++++++++++++++++++++
 1 file changed, 75 insertions(+)
 create mode 100644 src/components/organisms/widgets/image-widget.tsx

(limited to 'src/components/organisms/widgets/image-widget.tsx')

diff --git a/src/components/organisms/widgets/image-widget.tsx b/src/components/organisms/widgets/image-widget.tsx
new file mode 100644
index 0000000..928d5ea
--- /dev/null
+++ b/src/components/organisms/widgets/image-widget.tsx
@@ -0,0 +1,75 @@
+import ResponsiveImage from '@components/molecules/images/responsive-image';
+import Widget, { type WidgetProps } from '@components/molecules/layout/widget';
+import { VFC } from 'react';
+import styles from './image-widget.module.scss';
+
+export type Alignment = 'left' | 'center' | 'right';
+
+export type Image = {
+  /**
+   * An alternative text for the image.
+   */
+  alt: string;
+  /**
+   * The image height.
+   */
+  height: number;
+  /**
+   * The image source.
+   */
+  src: string;
+  /**
+   * The image width.
+   */
+  width: number;
+};
+
+export type ImageWidgetProps = Pick<
+  WidgetProps,
+  'expanded' | 'level' | 'title'
+> & {
+  /**
+   * The content alignment.
+   */
+  alignment?: Alignment;
+  /**
+   * Add a caption to the image.
+   */
+  description?: string;
+  /**
+   * An object describing the image.
+   */
+  img: Image;
+  /**
+   * Add a link to the image.
+   */
+  url?: string;
+};
+
+/**
+ * ImageWidget component
+ *
+ * Renders a widget that print an image and an optional text.
+ */
+const ImageWidget: VFC<ImageWidgetProps> = ({
+  alignment = 'left',
+  description,
+  img,
+  url,
+  ...props
+}) => {
+  const alignmentClass = `widget--${alignment}`;
+
+  return (
+    <Widget className={styles[alignmentClass]} {...props}>
+      <ResponsiveImage
+        target={url}
+        caption={description}
+        className={styles.img}
+        {...img}
+      />
+    </Widget>
+  );
+};
+
+export default ImageWidget;
-- 
cgit v1.2.3

