mirror of
https://github.com/afoim/fuwari.git
synced 2026-01-31 09:03:18 +08:00
68 lines
2.1 KiB
Plaintext
68 lines
2.1 KiB
Plaintext
---
|
|
import path from "node:path";
|
|
interface Props {
|
|
id?: string;
|
|
src: string;
|
|
class?: string;
|
|
alt?: string;
|
|
position?: string;
|
|
basePath?: string;
|
|
}
|
|
import { Image } from "astro:assets";
|
|
import { imageFallbackConfig, siteConfig } from "../../config";
|
|
import { url } from "../../utils/url-utils";
|
|
|
|
const { id, src, alt, position = "center", basePath = "/" } = Astro.props;
|
|
const className = Astro.props.class;
|
|
|
|
const isLocal = !(
|
|
src.startsWith("/") ||
|
|
src.startsWith("http") ||
|
|
src.startsWith("https") ||
|
|
src.startsWith("data:")
|
|
);
|
|
const isPublic = src.startsWith("/");
|
|
|
|
// TODO temporary workaround for images dynamic import
|
|
// https://github.com/withastro/astro/issues/3373
|
|
// biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
|
|
let img;
|
|
if (isLocal) {
|
|
const files = import.meta.glob<ImageMetadata>("../../**", {
|
|
import: "default",
|
|
});
|
|
let normalizedPath = path
|
|
.normalize(path.join("../../", basePath, src))
|
|
.replace(/\\/g, "/");
|
|
const file = files[normalizedPath];
|
|
if (!file) {
|
|
console.error(
|
|
`\n[ERROR] Image file not found: ${normalizedPath.replace("../../", "src/")}`,
|
|
);
|
|
}
|
|
img = await file();
|
|
}
|
|
|
|
const imageClass = "w-full h-full object-cover";
|
|
const imageStyle = `object-position: ${position}`;
|
|
---
|
|
<div id={id} class:list={[className, 'overflow-hidden relative image-wrapper']} style={`--theme-hue: ${siteConfig.themeColor.hue}`}>
|
|
{isLocal && img && <Image src={img} alt={alt || ""} class={`${imageClass} image-content`} style={imageStyle}/>}
|
|
{!isLocal && (
|
|
imageFallbackConfig.enable && src.includes(imageFallbackConfig.originalDomain) ?
|
|
<img src={isPublic ? url(src) : src} alt={alt || ""} class={`${imageClass} image-content`} style={imageStyle} onerror={`this.onerror=null; this.src='${(isPublic ? url(src) : src).replace(imageFallbackConfig.originalDomain, imageFallbackConfig.fallbackDomain)}';`}/> :
|
|
<img src={isPublic ? url(src) : src} alt={alt || ""} class={`${imageClass} image-content`} style={imageStyle}/>
|
|
)}
|
|
</div>
|
|
|
|
<style>
|
|
.image-content {
|
|
transition: transform 0.3s ease-out;
|
|
}
|
|
|
|
.image-wrapper:hover .image-content {
|
|
transform: scale(1.05);
|
|
}
|
|
</style>
|
|
|