diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-01-26 12:43:20 +0100 | 
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-01-26 12:43:20 +0100 | 
| commit | c18f2f8a9d189343db9740945196af46c903d2d9 (patch) | |
| tree | aa676f9aa24edc6e5d6eab841b134f028800f5ba /src/components/MDX/ResponsiveImage | |
| parent | 7e12b2aa7f511e70b727bd865a0b5d0ac6723cb8 (diff) | |
chore: create a ResponsiveImage component for MDX rendering
Diffstat (limited to 'src/components/MDX/ResponsiveImage')
| -rw-r--r-- | src/components/MDX/ResponsiveImage/ResponsiveImage.module.scss | 49 | ||||
| -rw-r--r-- | src/components/MDX/ResponsiveImage/ResponsiveImage.tsx | 36 | 
2 files changed, 85 insertions, 0 deletions
| diff --git a/src/components/MDX/ResponsiveImage/ResponsiveImage.module.scss b/src/components/MDX/ResponsiveImage/ResponsiveImage.module.scss new file mode 100644 index 0000000..34b1a92 --- /dev/null +++ b/src/components/MDX/ResponsiveImage/ResponsiveImage.module.scss @@ -0,0 +1,49 @@ +@use "@styles/abstracts/functions" as fun; + +.wrapper { +  width: max-content; +  max-width: 100%; +  margin: var(--spacing-sm) auto; +  position: relative; +} + +.link { +  display: flex; +  flex-flow: column; +  background: none; +  text-decoration: none; + +  .caption { +    color: var(--color-primary-darker); +  } + +  &:hover, +  &:focus { +    transform: scale(1.1); +  } + +  &:focus { +    .caption { +      text-decoration: underline solid var(--color-primary-darker) +        fun.convert-px(3); +    } +  } + +  &:active { +    transform: scale(0.9); + +    .caption { +      text-decoration: none; +    } +  } +} + +.caption { +  margin: 0; +  padding: fun.convert-px(4) var(--spacing-2xs); +  background: var(--color-bg-secondary); +  border: fun.convert-px(1) solid var(--color-border); +  box-shadow: 0 fun.convert-px(-1) fun.convert-px(1) fun.convert-px(1) +    var(--color-shadow-light); +  font-weight: 500; +} diff --git a/src/components/MDX/ResponsiveImage/ResponsiveImage.tsx b/src/components/MDX/ResponsiveImage/ResponsiveImage.tsx new file mode 100644 index 0000000..062c04b --- /dev/null +++ b/src/components/MDX/ResponsiveImage/ResponsiveImage.tsx @@ -0,0 +1,36 @@ +import Image, { ImageProps } from 'next/image'; +import Link from 'next/link'; +import styles from './ResponsiveImage.module.scss'; + +type ResponsiveImageProps = ImageProps & { +  caption?: string; +  linkTarget?: string; +}; + +const ResponsiveImage = (props: ResponsiveImageProps) => { +  const { caption, linkTarget, ...attributes } = props; + +  return ( +    <figure className={styles.wrapper}> +      {linkTarget ? ( +        <Link href={linkTarget}> +          <a className={styles.link}> +            <Image alt={attributes.alt} layout="intrinsic" {...attributes} /> +            {caption && ( +              <figcaption className={styles.caption}>{caption}</figcaption> +            )} +          </a> +        </Link> +      ) : ( +        <> +          <Image alt={attributes.alt} layout="intrinsic" {...attributes} /> +          {caption && ( +            <figcaption className={styles.caption}>{caption}</figcaption> +          )} +        </> +      )} +    </figure> +  ); +}; + +export default ResponsiveImage; | 
