diff --git a/src/ui/PodcastView/EpisodeListItem.svelte b/src/ui/PodcastView/EpisodeListItem.svelte
index 54d440f..2e4f727 100644
--- a/src/ui/PodcastView/EpisodeListItem.svelte
+++ b/src/ui/PodcastView/EpisodeListItem.svelte
@@ -38,6 +38,8 @@
src={episode.artworkUrl}
alt={episode.title}
fadeIn={true}
+ width="5rem"
+ height="5rem"
class="podcast-episode-thumbnail"
/>
diff --git a/src/ui/common/Image.svelte b/src/ui/common/Image.svelte
index fbcfb6c..2d1b850 100644
--- a/src/ui/common/Image.svelte
+++ b/src/ui/common/Image.svelte
@@ -6,11 +6,12 @@
export let fadeIn: boolean = false;
export let opacity: number = 0; // Falsey value so condition isn't triggered if not set.
export let interactive: boolean = false;
+ export let loading: "lazy" | "eager" | null | undefined = undefined;
export {_class as class};
let _class = "";
let loaded = false;
- let loading = true;
+ let isLoading = true;
let failed = false;
const dispatcher = createEventDispatcher();
@@ -20,7 +21,7 @@
}
-{#if loading || loaded}
+{#if isLoading || loaded}
{#if interactive}
{:else}
@@ -44,11 +46,12 @@
draggable="false"
{src}
{alt}
+ {loading}
class={_class}
style:opacity={opacity ? opacity : !fadeIn ? 1 : loaded ? 1 : 0}
style:transition={fadeIn ? "opacity 0.5s ease-out" : ""}
- on:load={() => {loaded = true; loading = false;}}
- on:error={() => {failed = true; loading = false;}}
+ on:load={() => {loaded = true; isLoading = false;}}
+ on:error={() => {failed = true; isLoading = false;}}
/>
{/if}
diff --git a/src/ui/common/ImageLoader.svelte b/src/ui/common/ImageLoader.svelte
index 5ea1908..ee66b3f 100644
--- a/src/ui/common/ImageLoader.svelte
+++ b/src/ui/common/ImageLoader.svelte
@@ -4,26 +4,46 @@
export let alt: string;
export let fadeIn: boolean = false;
export let interactive: boolean = false;
+ export let width: string | number | undefined;
+ export let height: string | number | undefined;
+ export let aspectRatio: string | undefined = "1 / 1";
export { _class as class };
let _class: string = "";
- import IntersectionObserver from "./IntersectionObserver.svelte";
import Image from "./Image.svelte";
import { createEventDispatcher } from "svelte";
const dispatcher = createEventDispatcher();
+
+ const toDimension = (value?: string | number) =>
+ typeof value === "number" ? `${value}px` : value;
+
+ $: resolvedWidth = toDimension(width);
+ $: resolvedHeight = toDimension(height);
+ $: resolvedAspectRatio = resolvedHeight ? undefined : aspectRatio;
-