From 52d46f35842109747cf2a59d89a97eecfbbc5265 Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Fri, 23 Jan 2026 17:26:01 -0500 Subject: [PATCH] image component to handle loading and error states --- bun.lock | 4 +++ package.json | 4 ++- src/lib/components/BlogCard.svelte | 21 +++++++------ src/lib/components/Image.svelte | 48 +++++++++++++++++++++++------ src/routes/blog/+page.svelte | 3 +- src/routes/blog/[slug]/+page.svelte | 6 +++- 6 files changed, 64 insertions(+), 22 deletions(-) diff --git a/bun.lock b/bun.lock index bd56827..02f2163 100644 --- a/bun.lock +++ b/bun.lock @@ -7,9 +7,11 @@ "dependencies": { "@humanspeak/svelte-markdown": "^0.8.7", "@lucide/svelte": "^0.516.0", + "clsx": "^2.1.1", "dayjs": "^1.11.13", "nodemailer": "^6.10.1", "pino": "^9.6.0", + "tailwind-merge": "^3.4.0", }, "devDependencies": { "@eslint/compat": "^1.2.8", @@ -695,6 +697,8 @@ "svelte-eslint-parser": ["svelte-eslint-parser@1.1.3", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-DUc/z/vk+AFVoxGv54+BOBFqUrmUgNg2gSO2YqrE3OL6ro19/0azPmQj/4wN3s9RxuF5l7G0162q/Ddk4LJhZA=="], + "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], + "tailwindcss": ["tailwindcss@4.1.4", "", {}, "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A=="], "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], diff --git a/package.json b/package.json index 1d8801e..e6fc417 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,10 @@ "dependencies": { "@humanspeak/svelte-markdown": "^0.8.7", "@lucide/svelte": "^0.516.0", + "clsx": "^2.1.1", "dayjs": "^1.11.13", "nodemailer": "^6.10.1", - "pino": "^9.6.0" + "pino": "^9.6.0", + "tailwind-merge": "^3.4.0" } } diff --git a/src/lib/components/BlogCard.svelte b/src/lib/components/BlogCard.svelte index 6a41e8f..8b77cf4 100644 --- a/src/lib/components/BlogCard.svelte +++ b/src/lib/components/BlogCard.svelte @@ -1,17 +1,20 @@ @@ -23,14 +26,14 @@
{topic}
{/each} -
+
- - + {img.alt} diff --git a/src/lib/components/Image.svelte b/src/lib/components/Image.svelte index a86217a..ea362eb 100644 --- a/src/lib/components/Image.svelte +++ b/src/lib/components/Image.svelte @@ -1,16 +1,46 @@ -
- - {#if caption} -
{caption}
- {/if} -
+{#if loading} +
+{:else if failed} +
+ +
+{:else} + (loading = false)} /> +{/if} diff --git a/src/routes/blog/+page.svelte b/src/routes/blog/+page.svelte index 56c602c..9ec960f 100644 --- a/src/routes/blog/+page.svelte +++ b/src/routes/blog/+page.svelte @@ -14,8 +14,7 @@ {#each posts as post (post.slug)} {dayjs(data.meta.date).format('DD MMMM YYYY')}

{data.meta.title}

- {data.meta.image.alt} + {data.meta.image.alt}