Skip to content

Commit 88127d8

Browse files
committed
simplify user-facing API
1 parent 924b7c3 commit 88127d8

2 files changed

Lines changed: 13 additions & 14 deletions

File tree

apps/fixtures/image/src/routes/index.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import { Image } from "@solidjs/image";
22
import { Title } from "@solidjs/meta";
33
import imageData from "../images/example.jpg?image";
44

5-
const { src, transformer } = imageData;
6-
75
export default function Home() {
86
return (
97
<main>
@@ -14,8 +12,7 @@ export default function Home() {
1412
</p>
1513
<div style={{ width: "60vw", "margin-left": "auto", "margin-right": "auto", background: "white", padding: "1rem" }}>
1614
<Image
17-
src={src}
18-
transformer={transformer}
15+
src={imageData}
1916
alt="Example"
2017
/>
2118
</div>

packages/image/src/Image.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import { ssr as ssrHtml, isServer } from "solid-js/web";
33
import type { StartImageSource, StartImageTransformer, StartImageVariant } from "./types";
44

55
export interface ImageProps<T> {
6-
src: StartImageSource<T>;
6+
src: {
7+
src: StartImageSource<T>
8+
transformer?: StartImageTransformer<T>
9+
}
710
alt: string;
8-
transformer?: StartImageTransformer<T>;
911
fallback?: (visible: () => boolean, onLoad: () => void) => JSX.Element;
1012
}
1113

@@ -25,13 +27,13 @@ function mergeImageVariantsToSrcSet(variants: StartImageVariant[]) {
2527

2628
export function Image<T>(props: ImageProps<T>): JSX.Element {
2729
if (isServer) {
28-
const variants = props.transformer
29-
? props.transformer.transform(props.src)
30+
const variants = props.src.transformer
31+
? props.src.transformer.transform(props.src.src)
3032
: [];
3133
const variantArray = Array.isArray(variants) ? variants : [variants];
3234

3335
let html = `<div data-start-image="container">`;
34-
html += `<div data-start-image="aspect-ratio" style="position:relative;padding-top:${(props.src.height * 100) / props.src.width}%;width:100%;height:0;overflow:hidden;">`;
36+
html += `<div data-start-image="aspect-ratio" style="position:relative;padding-top:${(props.src.src.height * 100) / props.src.src.width}%;width:100%;height:0;overflow:hidden;">`;
3537
html += `<picture data-start-picture="picture">`;
3638

3739
if (variantArray.length > 0) {
@@ -42,7 +44,7 @@ export function Image<T>(props: ImageProps<T>): JSX.Element {
4244
}
4345
}
4446

45-
html += `<img data-start-image="image" src="${props.src.source}" alt="${props.alt}" style="position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;"/>`;
47+
html += `<img data-start-image="image" src="${props.src.src.source}" alt="${props.alt}" style="position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;"/>`;
4648
html += `</picture></div></div>`;
4749

4850
return ssrHtml(html) as unknown as JSX.Element;
@@ -54,15 +56,15 @@ export function Image<T>(props: ImageProps<T>): JSX.Element {
5456
data-start-image="aspect-ratio"
5557
style={{
5658
position: "relative",
57-
"padding-top": `${(props.src.height * 100) / props.src.width}%`,
59+
"padding-top": `${(props.src.src.height * 100) / props.src.src.width}%`,
5860
width: "100%",
5961
height: "0",
6062
overflow: "hidden",
6163
}}
6264
>
6365
<picture data-start-picture="picture">
64-
{props.transformer && (() => {
65-
const variants = props.transformer!.transform(props.src);
66+
{props.src.transformer && (() => {
67+
const variants = props.src.transformer!.transform(props.src.src);
6668
const variantArray = Array.isArray(variants) ? variants : [variants];
6769
const merged = mergeImageVariantsByType(variantArray);
6870
return Array.from(merged).map(([type, vars]) => (
@@ -74,7 +76,7 @@ export function Image<T>(props: ImageProps<T>): JSX.Element {
7476
})()}
7577
<img
7678
data-start-image="image"
77-
src={props.src.source}
79+
src={props.src.src.source}
7880
alt={props.alt}
7981
style={{
8082
position: "absolute",

0 commit comments

Comments
 (0)