webapp/src/components/_shared/Image/Image.tsx

31 lines
813 B
TypeScript
Raw Normal View History

2023-03-24 14:51:05 +00:00
import type { JSX } from 'solid-js'
2023-12-24 12:56:30 +00:00
import { splitProps } from 'solid-js'
2024-05-07 15:17:31 +00:00
import { Link } from '../../../context/meta'
import { getImageUrl } from '../../../utils/getImageUrl'
2023-03-24 14:51:05 +00:00
type Props = JSX.ImgHTMLAttributes<HTMLImageElement> & {
width: number
alt: string
}
export const Image = (props: Props) => {
const [local, others] = splitProps(props, ['src', 'alt'])
const imageUrl = getImageUrl(local.src, { width: others.width })
const imageSrcSet = [1, 2, 3]
.map(
(pixelDensity) =>
`${getImageUrl(local.src, { width: others.width * pixelDensity })} ${pixelDensity}x`,
)
.join(', ')
return (
<>
2023-12-24 08:16:41 +00:00
<Link rel="preload" as="image" imagesrcset={imageSrcSet} href={imageUrl} />
<img src={imageUrl} alt={local.alt} srcSet={imageSrcSet} {...others} />
</>
)
2023-03-24 14:51:05 +00:00
}