@kobalte/core
Version:
Unstyled components and primitives for building accessible web apps and design systems with SolidJS.
146 lines (137 loc) • 3.65 kB
JSX
import {
Polymorphic
} from "./FLVHQV4A.jsx";
import {
__export
} from "./5WXHJDCZ.jsx";
// src/image/index.tsx
var image_exports = {};
__export(image_exports, {
Fallback: () => ImageFallback,
Image: () => Image,
Img: () => ImageImg,
Root: () => ImageRoot,
useImageContext: () => useImageContext
});
// src/image/image-fallback.tsx
import {
Show,
createEffect,
createSignal,
onCleanup
} from "solid-js";
// src/image/image-context.tsx
import { createContext, useContext } from "solid-js";
var ImageContext = createContext();
function useImageContext() {
const context = useContext(ImageContext);
if (context === void 0) {
throw new Error(
"[kobalte]: `useImageContext` must be used within an `Image.Root` component"
);
}
return context;
}
// src/image/image-fallback.tsx
function ImageFallback(props) {
const context = useImageContext();
const [canRender, setCanRender] = createSignal(
context.fallbackDelay() === void 0
);
createEffect(() => {
const delayMs = context.fallbackDelay();
if (delayMs !== void 0) {
const timerId = window.setTimeout(() => setCanRender(true), delayMs);
onCleanup(() => window.clearTimeout(timerId));
}
});
return <Show when={canRender() && context.imageLoadingStatus() !== "loaded"}><Polymorphic
as="span"
{...props}
/></Show>;
}
// src/image/image-img.tsx
import {
Show as Show2,
createEffect as createEffect2,
createSignal as createSignal2,
on,
onCleanup as onCleanup2
} from "solid-js";
function ImageImg(props) {
const context = useImageContext();
const [loadingStatus, setLoadingStatus] = createSignal2("idle");
createEffect2(
on(
() => props.src,
(src) => {
if (!src) {
setLoadingStatus("error");
return;
}
let isMounted = true;
const image = new window.Image();
const updateStatus = (status) => () => {
if (!isMounted) {
return;
}
setLoadingStatus(status);
};
setLoadingStatus("loading");
if (props.crossOrigin !== void 0) {
image.crossOrigin = props.crossOrigin;
}
if (props.referrerPolicy !== void 0) {
image.referrerPolicy = props.referrerPolicy;
}
image.onload = updateStatus("loaded");
image.onerror = updateStatus("error");
image.src = src;
onCleanup2(() => {
isMounted = false;
});
}
)
);
createEffect2(() => {
const imageLoadingStatus = loadingStatus();
if (imageLoadingStatus !== "idle") {
context.onImageLoadingStatusChange(imageLoadingStatus);
}
});
return <Show2 when={loadingStatus() === "loaded"}><Polymorphic
as="img"
{...props}
/></Show2>;
}
// src/image/image-root.tsx
import { createSignal as createSignal3, splitProps } from "solid-js";
function ImageRoot(props) {
const [local, others] = splitProps(props, [
"fallbackDelay",
"onLoadingStatusChange"
]);
const [imageLoadingStatus, setImageLoadingStatus] = createSignal3("idle");
const context = {
fallbackDelay: () => local.fallbackDelay,
imageLoadingStatus,
onImageLoadingStatusChange: (status) => {
setImageLoadingStatus(status);
local.onLoadingStatusChange?.(status);
}
};
return <ImageContext.Provider value={context}><Polymorphic as="span" {...others} /></ImageContext.Provider>;
}
// src/image/index.tsx
var Image = Object.assign(ImageRoot, {
Fallback: ImageFallback,
Img: ImageImg
});
export {
useImageContext,
ImageFallback,
ImageImg,
ImageRoot,
Image,
image_exports
};