From dfd816d1891545aa8ead982b57891858f1c82bb4 Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Wed, 6 Apr 2022 16:24:05 +0200
Subject: chore: add a ResponsiveImage component

---
 .../molecules/images/responsive-image.tsx          | 68 ++++++++++++++++++++++
 1 file changed, 68 insertions(+)
 create mode 100644 src/components/molecules/images/responsive-image.tsx

(limited to 'src/components/molecules/images/responsive-image.tsx')

diff --git a/src/components/molecules/images/responsive-image.tsx b/src/components/molecules/images/responsive-image.tsx
new file mode 100644
index 0000000..db2f5ab
--- /dev/null
+++ b/src/components/molecules/images/responsive-image.tsx
@@ -0,0 +1,68 @@
+import Link from '@components/atoms/links/link';
+import Image, { ImageProps } from 'next/image';
+import { FC } from 'react';
+import styles from './responsive-image.module.scss';
+
+type ResponsiveImageProps = Omit<ImageProps, 'alt' | 'width' | 'height'> & {
+  /**
+   * An alternative text.
+   */
+  alt: string;
+  /**
+   * A figure caption.
+   */
+  caption?: string;
+  /**
+   * The image height.
+   */
+  height: number | string;
+  /**
+   * A link target.
+   */
+  target?: string;
+  /**
+   * The image width.
+   */
+  width: number | string;
+};
+
+/**
+ * ResponsiveImage component
+ *
+ * Render a responsive image wrapped in a figure element.
+ */
+const ResponsiveImage: FC<ResponsiveImageProps> = ({
+  alt,
+  caption,
+  layout,
+  objectFit,
+  target,
+  ...props
+}) => {
+  return (
+    <figure className={styles.wrapper}>
+      {target ? (
+        <Link href={target} classes={styles.link}>
+          <Image alt={alt} layout={layout || 'intrinsic'} {...props} />
+          {caption && (
+            <figcaption className={styles.caption}>{caption}</figcaption>
+          )}
+        </Link>
+      ) : (
+        <>
+          <Image
+            alt={alt}
+            layout={layout || 'intrinsic'}
+            objectFit={objectFit || 'contain'}
+            {...props}
+          />
+          {caption && (
+            <figcaption className={styles.caption}>{caption}</figcaption>
+          )}
+        </>
+      )}
+    </figure>
+  );
+};
+
+export default ResponsiveImage;
-- 
cgit v1.2.3

