From 16222f01a565442ee14808d80009192169c5f4c6 Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 18 Jul 2026 09:12:52 +0000 Subject: [PATCH 1/6] feat: stateful image component with dynamic skeleton loaders for publications --- src/lib/components/ImageLoader.svelte | 51 +++++++ src/lib/helpers/projectsProvider.ts | 134 +++++++++++++++++++ src/lib/types.ts | 16 ++- src/routes/publications/+page.svelte | 7 +- src/routes/publications/[paper]/+page.svelte | 11 +- 5 files changed, 207 insertions(+), 12 deletions(-) create mode 100644 src/lib/components/ImageLoader.svelte diff --git a/src/lib/components/ImageLoader.svelte b/src/lib/components/ImageLoader.svelte new file mode 100644 index 0000000..838cf31 --- /dev/null +++ b/src/lib/components/ImageLoader.svelte @@ -0,0 +1,51 @@ + + +
+ + {#if !loaded && !error} + + {/if} + + + +
diff --git a/src/lib/helpers/projectsProvider.ts b/src/lib/helpers/projectsProvider.ts index 73d9e9f..ea1c8cc 100644 --- a/src/lib/helpers/projectsProvider.ts +++ b/src/lib/helpers/projectsProvider.ts @@ -5,6 +5,134 @@ import Web from 'svelte-material-icons/Web.svelte'; import Youtube from 'svelte-material-icons/Youtube.svelte'; import { FunProject, LinkWithIcon, ResearchProject } from '../types'; +const imageDimensions: Record = { + "images/NAPs.png": { + "width": 1000, + "height": 450 + }, + "images/alphaevolve.png": { + "width": 2043, + "height": 1077 + }, + "images/bert.png": { + "width": 1926, + "height": 830 + }, + "images/breath.png": { + "width": 1200, + "height": 512 + }, + "images/cgvc.png": { + "width": 1600, + "height": 1200 + }, + "images/contagion.png": { + "width": 1024, + "height": 1024 + }, + "images/dotfiles.png": { + "width": 256, + "height": 256 + }, + "images/eot.png": { + "width": 500, + "height": 412 + }, + "images/exploRNN.png": { + "width": 1926, + "height": 992 + }, + "images/fibrils.png": { + "width": 2866, + "height": 1250 + }, + "images/gemini.png": { + "width": 3846, + "height": 1624 + }, + "images/hie.png": { + "width": 1000, + "height": 729 + }, + "images/humboldt.png": { + "width": 1292, + "height": 625 + }, + "images/image_quality.png": { + "width": 923, + "height": 477 + }, + "images/luna.png": { + "width": 1000, + "height": 1000 + }, + "images/midosa.png": { + "width": 1114, + "height": 1114 + }, + "images/mint.png": { + "width": 888, + "height": 538 + }, + "images/mySnow.png": { + "width": 1024, + "height": 1024 + }, + "images/nPMI.png": { + "width": 1596, + "height": 774 + }, + "images/net2vis.png": { + "width": 1916, + "height": 1046 + }, + "images/npmiVIS.png": { + "width": 4000, + "height": 2240 + }, + "images/openhands.png": { + "width": 542, + "height": 362 + }, + "images/other_left.png": { + "width": 678, + "height": 424 + }, + "images/pc-missing-data.png": { + "width": 2500, + "height": 850 + }, + "images/preview.png": { + "width": 1200, + "height": 630 + }, + "images/svelte-vega.png": { + "width": 434, + "height": 336 + }, + "images/symphony.png": { + "width": 291, + "height": 296 + }, + "images/tox.png": { + "width": 357, + "height": 260 + }, + "images/vegaprof.png": { + "width": 2100, + "height": 688 + }, + "images/zeno.png": { + "width": 617, + "height": 615 + }, + "images/vispositions.svg": { + "width": 1000, + "height": 500 + } +}; + + let cachedResearchProjects: ResearchProject[] | null = null; /** @@ -400,6 +528,9 @@ export function getResearchProjects(): ResearchProject[] { ) ]; projects.sort((a, b) => parseInt(b.year) - parseInt(a.year)); + projects.forEach(p => { + if (imageDimensions[p.imageSrc]) p.imageDimensions = imageDimensions[p.imageSrc]; + }); cachedResearchProjects = projects; return projects; } @@ -505,6 +636,9 @@ export function getFunProjects(): FunProject[] { ] ) ]; + projects.forEach(p => { + if (imageDimensions[p.imageSrc]) p.imageDimensions = imageDimensions[p.imageSrc]; + }); cachedFunProjects = projects; return projects; } diff --git a/src/lib/types.ts b/src/lib/types.ts index fbb99d1..2812374 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -24,6 +24,7 @@ export class Project { title: string; abstract: string; imageSrc: string; + imageDimensions?: { width: number; height: number }; links: LinkWithIcon[]; /** * Creates a project @@ -32,11 +33,13 @@ export class Project { * @param {String} abstract the abstract of the project/paper * @param {String} imageSrc the image source for the project * @param {[LinkWithIcon]} links links from the project to more information + * @param {{ width: number; height: number }} imageDimensions dimensions of the image */ - constructor(title: string, abstract: string, imageSrc: string, links: LinkWithIcon[] = []) { + constructor(title: string, abstract: string, imageSrc: string, links: LinkWithIcon[] = [], imageDimensions?: { width: number; height: number }) { this.title = title; this.abstract = abstract; this.imageSrc = imageSrc; + this.imageDimensions = imageDimensions; this.links = links; } } @@ -59,6 +62,7 @@ export class ResearchProject extends Project { * @param {String} venue the venue of the publication * @param {String} imageSRC the image source for the project * @param {[LinkWithIcon]} links links from the project to more information + * @param {{ width: number; height: number }} imageDimensions dimensions of the image */ constructor( title: string, @@ -67,9 +71,10 @@ export class ResearchProject extends Project { year: string, venue: string, imageSRC: string, - links: LinkWithIcon[] = [] + links: LinkWithIcon[] = [], + imageDimensions?: { width: number; height: number } ) { - super(title, abstract, imageSRC, links); + super(title, abstract, imageSRC, links, imageDimensions); this.authors = authors; this.year = year; this.venue = venue; @@ -87,9 +92,10 @@ export class FunProject extends Project { * @param {String} abstract the abstract of the project/paper * @param {String} imageSRC the image source for the project * @param {[LinkWithIcon]} links links from the project to more information + * @param {{ width: number; height: number }} imageDimensions dimensions of the image */ - constructor(title: string, abstract: string, imageSRC: string, links: LinkWithIcon[] = []) { - super(title, abstract, imageSRC, links); + constructor(title: string, abstract: string, imageSRC: string, links: LinkWithIcon[] = [], imageDimensions?: { width: number; height: number }) { + super(title, abstract, imageSRC, links, imageDimensions); } } diff --git a/src/routes/publications/+page.svelte b/src/routes/publications/+page.svelte index d0c1f6b..cab3259 100644 --- a/src/routes/publications/+page.svelte +++ b/src/routes/publications/+page.svelte @@ -1,5 +1,6 @@ -
+
{#if !loaded && !error} - + {/if} @@ -46,6 +38,9 @@ {alt} on:load={handleLoad} on:error={handleError} - class="absolute inset-0 h-full w-full object-contain transition-all duration-700 ease-in-out {loaded && !error ? 'opacity-100' : 'opacity-0'} {imageClassName}" + class="absolute inset-0 h-full w-full object-contain transition-all duration-700 ease-in-out {loaded && + !error + ? 'opacity-100' + : 'opacity-0'} {imageClassName}" />
diff --git a/src/lib/helpers/projectsProvider.ts b/src/lib/helpers/projectsProvider.ts index ea1c8cc..a70ec9e 100644 --- a/src/lib/helpers/projectsProvider.ts +++ b/src/lib/helpers/projectsProvider.ts @@ -6,133 +6,132 @@ import Youtube from 'svelte-material-icons/Youtube.svelte'; import { FunProject, LinkWithIcon, ResearchProject } from '../types'; const imageDimensions: Record = { - "images/NAPs.png": { - "width": 1000, - "height": 450 - }, - "images/alphaevolve.png": { - "width": 2043, - "height": 1077 - }, - "images/bert.png": { - "width": 1926, - "height": 830 - }, - "images/breath.png": { - "width": 1200, - "height": 512 - }, - "images/cgvc.png": { - "width": 1600, - "height": 1200 - }, - "images/contagion.png": { - "width": 1024, - "height": 1024 - }, - "images/dotfiles.png": { - "width": 256, - "height": 256 - }, - "images/eot.png": { - "width": 500, - "height": 412 - }, - "images/exploRNN.png": { - "width": 1926, - "height": 992 - }, - "images/fibrils.png": { - "width": 2866, - "height": 1250 - }, - "images/gemini.png": { - "width": 3846, - "height": 1624 - }, - "images/hie.png": { - "width": 1000, - "height": 729 - }, - "images/humboldt.png": { - "width": 1292, - "height": 625 - }, - "images/image_quality.png": { - "width": 923, - "height": 477 - }, - "images/luna.png": { - "width": 1000, - "height": 1000 - }, - "images/midosa.png": { - "width": 1114, - "height": 1114 - }, - "images/mint.png": { - "width": 888, - "height": 538 - }, - "images/mySnow.png": { - "width": 1024, - "height": 1024 - }, - "images/nPMI.png": { - "width": 1596, - "height": 774 - }, - "images/net2vis.png": { - "width": 1916, - "height": 1046 - }, - "images/npmiVIS.png": { - "width": 4000, - "height": 2240 - }, - "images/openhands.png": { - "width": 542, - "height": 362 - }, - "images/other_left.png": { - "width": 678, - "height": 424 - }, - "images/pc-missing-data.png": { - "width": 2500, - "height": 850 - }, - "images/preview.png": { - "width": 1200, - "height": 630 - }, - "images/svelte-vega.png": { - "width": 434, - "height": 336 - }, - "images/symphony.png": { - "width": 291, - "height": 296 - }, - "images/tox.png": { - "width": 357, - "height": 260 - }, - "images/vegaprof.png": { - "width": 2100, - "height": 688 - }, - "images/zeno.png": { - "width": 617, - "height": 615 - }, - "images/vispositions.svg": { - "width": 1000, - "height": 500 - } + 'images/NAPs.png': { + width: 1000, + height: 450 + }, + 'images/alphaevolve.png': { + width: 2043, + height: 1077 + }, + 'images/bert.png': { + width: 1926, + height: 830 + }, + 'images/breath.png': { + width: 1200, + height: 512 + }, + 'images/cgvc.png': { + width: 1600, + height: 1200 + }, + 'images/contagion.png': { + width: 1024, + height: 1024 + }, + 'images/dotfiles.png': { + width: 256, + height: 256 + }, + 'images/eot.png': { + width: 500, + height: 412 + }, + 'images/exploRNN.png': { + width: 1926, + height: 992 + }, + 'images/fibrils.png': { + width: 2866, + height: 1250 + }, + 'images/gemini.png': { + width: 3846, + height: 1624 + }, + 'images/hie.png': { + width: 1000, + height: 729 + }, + 'images/humboldt.png': { + width: 1292, + height: 625 + }, + 'images/image_quality.png': { + width: 923, + height: 477 + }, + 'images/luna.png': { + width: 1000, + height: 1000 + }, + 'images/midosa.png': { + width: 1114, + height: 1114 + }, + 'images/mint.png': { + width: 888, + height: 538 + }, + 'images/mySnow.png': { + width: 1024, + height: 1024 + }, + 'images/nPMI.png': { + width: 1596, + height: 774 + }, + 'images/net2vis.png': { + width: 1916, + height: 1046 + }, + 'images/npmiVIS.png': { + width: 4000, + height: 2240 + }, + 'images/openhands.png': { + width: 542, + height: 362 + }, + 'images/other_left.png': { + width: 678, + height: 424 + }, + 'images/pc-missing-data.png': { + width: 2500, + height: 850 + }, + 'images/preview.png': { + width: 1200, + height: 630 + }, + 'images/svelte-vega.png': { + width: 434, + height: 336 + }, + 'images/symphony.png': { + width: 291, + height: 296 + }, + 'images/tox.png': { + width: 357, + height: 260 + }, + 'images/vegaprof.png': { + width: 2100, + height: 688 + }, + 'images/zeno.png': { + width: 617, + height: 615 + }, + 'images/vispositions.svg': { + width: 1000, + height: 500 + } }; - let cachedResearchProjects: ResearchProject[] | null = null; /** @@ -528,7 +527,7 @@ export function getResearchProjects(): ResearchProject[] { ) ]; projects.sort((a, b) => parseInt(b.year) - parseInt(a.year)); - projects.forEach(p => { + projects.forEach((p) => { if (imageDimensions[p.imageSrc]) p.imageDimensions = imageDimensions[p.imageSrc]; }); cachedResearchProjects = projects; @@ -636,7 +635,7 @@ export function getFunProjects(): FunProject[] { ] ) ]; - projects.forEach(p => { + projects.forEach((p) => { if (imageDimensions[p.imageSrc]) p.imageDimensions = imageDimensions[p.imageSrc]; }); cachedFunProjects = projects; diff --git a/src/lib/types.ts b/src/lib/types.ts index 2812374..52ee71b 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -35,7 +35,13 @@ export class Project { * @param {[LinkWithIcon]} links links from the project to more information * @param {{ width: number; height: number }} imageDimensions dimensions of the image */ - constructor(title: string, abstract: string, imageSrc: string, links: LinkWithIcon[] = [], imageDimensions?: { width: number; height: number }) { + constructor( + title: string, + abstract: string, + imageSrc: string, + links: LinkWithIcon[] = [], + imageDimensions?: { width: number; height: number } + ) { this.title = title; this.abstract = abstract; this.imageSrc = imageSrc; @@ -94,7 +100,13 @@ export class FunProject extends Project { * @param {[LinkWithIcon]} links links from the project to more information * @param {{ width: number; height: number }} imageDimensions dimensions of the image */ - constructor(title: string, abstract: string, imageSRC: string, links: LinkWithIcon[] = [], imageDimensions?: { width: number; height: number }) { + constructor( + title: string, + abstract: string, + imageSRC: string, + links: LinkWithIcon[] = [], + imageDimensions?: { width: number; height: number } + ) { super(title, abstract, imageSRC, links, imageDimensions); } } From 828dc3d6e0be16e9f5e919c8de9dac77fd60dd70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Ba=CC=88uerle?= Date: Sat, 1 Aug 2026 11:15:30 +0200 Subject: [PATCH 3/6] Derive image dimensions at build time instead of hardcoding Replace the hand-maintained 127-line image dimensions map with a small Vite plugin that reads intrinsic dimensions from static/images at build time and exposes them via a `virtual:image-dimensions` module. New images are picked up automatically and dimensions can't drift out of sync with the assets. This also fixes vispositions.svg, whose dimensions were hardcoded as 1000x500 but are actually 100x100 (a 1:1 icon), so its reserved aspect ratio was wrong. Co-Authored-By: Claude Opus 4.8 --- bun.lockb | Bin 198666 -> 203105 bytes package.json | 1 + src/lib/helpers/projectsProvider.ts | 128 +--------------------------- src/virtual-modules.d.ts | 4 + vite-plugin-image-dimensions.ts | 56 ++++++++++++ vite.config.ts | 3 +- 6 files changed, 64 insertions(+), 128 deletions(-) create mode 100644 src/virtual-modules.d.ts create mode 100644 vite-plugin-image-dimensions.ts diff --git a/bun.lockb b/bun.lockb index 7b010a6a7a14a2d150b814a650865c5f85c8cf62..b9d4e99b1db6dfd5b4525a8dad205085bc1ab2b8 100755 GIT binary patch delta 35396 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 G|Gxm@Vl(>y diff --git a/package.json b/package.json index cc5b2e9..ebfe864 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "eslint-config-prettier": "9.1.2", "eslint-plugin-svelte": "2.46.1", "husky": "^9.1.7", + "image-size": "^2.0.2", "jsdom": "^29.1.1", "lint-staged": "^17.0.8", "postcss": "^8.4.38", diff --git a/src/lib/helpers/projectsProvider.ts b/src/lib/helpers/projectsProvider.ts index a70ec9e..377976d 100644 --- a/src/lib/helpers/projectsProvider.ts +++ b/src/lib/helpers/projectsProvider.ts @@ -4,133 +4,7 @@ import Pen from 'svelte-material-icons/Pen.svelte'; import Web from 'svelte-material-icons/Web.svelte'; import Youtube from 'svelte-material-icons/Youtube.svelte'; import { FunProject, LinkWithIcon, ResearchProject } from '../types'; - -const imageDimensions: Record = { - 'images/NAPs.png': { - width: 1000, - height: 450 - }, - 'images/alphaevolve.png': { - width: 2043, - height: 1077 - }, - 'images/bert.png': { - width: 1926, - height: 830 - }, - 'images/breath.png': { - width: 1200, - height: 512 - }, - 'images/cgvc.png': { - width: 1600, - height: 1200 - }, - 'images/contagion.png': { - width: 1024, - height: 1024 - }, - 'images/dotfiles.png': { - width: 256, - height: 256 - }, - 'images/eot.png': { - width: 500, - height: 412 - }, - 'images/exploRNN.png': { - width: 1926, - height: 992 - }, - 'images/fibrils.png': { - width: 2866, - height: 1250 - }, - 'images/gemini.png': { - width: 3846, - height: 1624 - }, - 'images/hie.png': { - width: 1000, - height: 729 - }, - 'images/humboldt.png': { - width: 1292, - height: 625 - }, - 'images/image_quality.png': { - width: 923, - height: 477 - }, - 'images/luna.png': { - width: 1000, - height: 1000 - }, - 'images/midosa.png': { - width: 1114, - height: 1114 - }, - 'images/mint.png': { - width: 888, - height: 538 - }, - 'images/mySnow.png': { - width: 1024, - height: 1024 - }, - 'images/nPMI.png': { - width: 1596, - height: 774 - }, - 'images/net2vis.png': { - width: 1916, - height: 1046 - }, - 'images/npmiVIS.png': { - width: 4000, - height: 2240 - }, - 'images/openhands.png': { - width: 542, - height: 362 - }, - 'images/other_left.png': { - width: 678, - height: 424 - }, - 'images/pc-missing-data.png': { - width: 2500, - height: 850 - }, - 'images/preview.png': { - width: 1200, - height: 630 - }, - 'images/svelte-vega.png': { - width: 434, - height: 336 - }, - 'images/symphony.png': { - width: 291, - height: 296 - }, - 'images/tox.png': { - width: 357, - height: 260 - }, - 'images/vegaprof.png': { - width: 2100, - height: 688 - }, - 'images/zeno.png': { - width: 617, - height: 615 - }, - 'images/vispositions.svg': { - width: 1000, - height: 500 - } -}; +import imageDimensions from 'virtual:image-dimensions'; let cachedResearchProjects: ResearchProject[] | null = null; diff --git a/src/virtual-modules.d.ts b/src/virtual-modules.d.ts new file mode 100644 index 0000000..29b0b74 --- /dev/null +++ b/src/virtual-modules.d.ts @@ -0,0 +1,4 @@ +declare module 'virtual:image-dimensions' { + const dimensions: Record; + export default dimensions; +} diff --git a/vite-plugin-image-dimensions.ts b/vite-plugin-image-dimensions.ts new file mode 100644 index 0000000..ac51723 --- /dev/null +++ b/vite-plugin-image-dimensions.ts @@ -0,0 +1,56 @@ +import { readFileSync, readdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { imageSize } from 'image-size'; +import type { Plugin } from 'vite'; + +const VIRTUAL_ID = 'virtual:image-dimensions'; +const RESOLVED_ID = '\0' + VIRTUAL_ID; +const IMAGES_DIR = 'static/images'; + +/** + * Reads the intrinsic dimensions of every file in `static/images` at build time + * and exposes them as a virtual module keyed by their `imageSrc` path + * (e.g. `images/foo.png`). This lets components reserve an image's aspect ratio + * before it loads (avoiding layout shift) without hand-maintaining a dimensions + * map — new images are picked up automatically. + */ +function computeDimensions(): Record { + const dimensions: Record = {}; + for (const file of readdirSync(IMAGES_DIR)) { + try { + const { width, height } = imageSize(readFileSync(join(IMAGES_DIR, file))); + if (width && height) dimensions[`images/${file}`] = { width, height }; + } catch { + // Not an image / unsupported format — skip it. + } + } + return dimensions; +} + +export function imageDimensions(): Plugin { + return { + name: 'image-dimensions', + resolveId(id) { + if (id === VIRTUAL_ID) return RESOLVED_ID; + }, + load(id) { + if (id === RESOLVED_ID) { + return `export default ${JSON.stringify(computeDimensions())};`; + } + }, + configureServer(server) { + // Regenerate on image add/remove/change during dev. + const invalidate = (file: string) => { + if (!file.includes('static/images')) return; + const mod = server.moduleGraph.getModuleById(RESOLVED_ID); + if (mod) { + server.moduleGraph.invalidateModule(mod); + server.ws.send({ type: 'full-reload' }); + } + }; + server.watcher.on('add', invalidate); + server.watcher.on('unlink', invalidate); + server.watcher.on('change', invalidate); + } + }; +} diff --git a/vite.config.ts b/vite.config.ts index bbf8c7d..d758c29 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,7 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; +import { imageDimensions } from './vite-plugin-image-dimensions'; export default defineConfig({ - plugins: [sveltekit()] + plugins: [imageDimensions(), sveltekit()] }); From 7f815aaf132c33ca82f6705ebd9a826ecad3c7e5 Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 1 Aug 2026 09:47:46 +0000 Subject: [PATCH 4/6] fix: load imageDimensions plugin in vitest.config to resolve virtual module in tests --- bun.lockb | Bin 203105 -> 189718 bytes vite.config.ts | 2 +- vitest.config.ts | 3 ++- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bun.lockb b/bun.lockb index b9d4e99b1db6dfd5b4525a8dad205085bc1ab2b8..b898e46016bba31abaea3e1a8180ff743256d7c0 100755 GIT binary patch delta 44423 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 z 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 lnT4V_e{h{$vAn Date: Sat, 1 Aug 2026 09:53:44 +0000 Subject: [PATCH 5/6] chore: enable allowImportingTsExtensions in tsconfig.json --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index 8cceb79..88e588b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, + "allowImportingTsExtensions": true, "skipLibCheck": true, "sourceMap": true, "strict": true From 4ae9abe6c7ca83162cad4e994ae9117e0a3c0064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Ba=CC=88uerle?= Date: Sat, 1 Aug 2026 12:40:16 +0200 Subject: [PATCH 6/6] Fix images stuck invisible; stop gating visibility on JS load state The ImageLoader faded the image in only once a `loaded` flag flipped, but for cached/server-rendered images the `load` event fires before the listener attaches, so `loaded` stayed false and every publication thumbnail rendered at opacity 0 (invisible) despite loading fine. Stop gating the image's visibility on JS entirely: the image is always rendered, with the skeleton behind it as a best-effort placeholder that the image covers once it paints. This removes the fragile load-timing dependency (and the fade transition that relied on it). Co-Authored-By: Claude Opus 4.8 --- src/lib/components/ImageLoader.svelte | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/lib/components/ImageLoader.svelte b/src/lib/components/ImageLoader.svelte index 5e44a77..1307c2a 100644 --- a/src/lib/components/ImageLoader.svelte +++ b/src/lib/components/ImageLoader.svelte @@ -6,41 +6,41 @@ export let className: string = ''; export let imageClassName: string = ''; - // State + // Whether the image has finished loading — used only to hide the skeleton. + // The image itself is never gated on this, so it can't get stuck hidden. let loaded = false; - let error = false; // Normalize path so nested routes (e.g., /publications/paper-name) don't break relative paths $: normalizedSrc = src.startsWith('/') || src.startsWith('http') ? src : `/${src}`; - // Calculate aspect ratio string if dimensions exist + // Reserve the exact aspect ratio so the box holds its height before the image + // loads, eliminating layout shift. $: aspectRatio = dimensions ? `${dimensions.width} / ${dimensions.height}` : 'auto'; - function handleLoad() { + function markLoaded() { loaded = true; } - function handleError() { - error = true; - loaded = true; + // Cached or server-rendered images can finish loading before the `load` listener + // is attached, so reconcile the state on mount by inspecting the element directly. + function trackLoad(node: HTMLImageElement) { + if (node.complete) markLoaded(); }

- - {#if !loaded && !error} - + + {#if !loaded} + {/if} - +