diff --git a/src/components/blog/blog-image.tsx b/src/components/blog/blog-image.tsx
new file mode 100644
index 0000000..49c3213
--- /dev/null
+++ b/src/components/blog/blog-image.tsx
@@ -0,0 +1,40 @@
+'use client';
+
+import { Skeleton } from '@/components/ui/skeleton';
+import Image from 'next/image';
+import { useState } from 'react';
+
+interface BlogImageProps {
+ src: string;
+ alt: string;
+ title?: string;
+}
+
+export default function BlogImage({ src, alt, title }: BlogImageProps) {
+ const [imageLoading, setImageLoading] = useState(true);
+
+ const handleImageLoad = () => {
+ setImageLoading(false);
+ };
+
+ return (
+
+ {/* loading skeleton */}
+ {imageLoading && (
+
+ )}
+
+ {/* actual image */}
+
+
+ );
+}
diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index 856a240..b6abc30 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -2,9 +2,3 @@
* in next 30 days for credits expiration
*/
export const CREDITS_EXPIRATION_DAYS = 30;
-
-/**
- * placeholder image for blog post card
- */
-export const PLACEHOLDER_IMAGE =
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAoJJREFUWEfFl4lu4zAMRO3cx/9/au6reMaOdkxTTl0grQFCRoqaT+SQotq2bV9N8rRt28xms87m83l553eZ/9vr9Wpkz+ezkT0ej+6dv1X81AFw7M4FBACPVn2c1Z3zLgDeJwHgeLFYdAARYioAEAKJEG2WAjl3gCwNYymQQ9b7/V4spmIAwO6Wy2VnAMikBWlDURBELf8CuN1uHQSrPwMAHK5WqwFELQ01AIXdAa7XawfAb3p6AOwK5+v1ugAoEq4FRSFLgavfQ49jAGQpAE5wjgGCeRrGdBArwHOPcwFcLpcGU1X0IsBuN5tNgYhaiFFwHTiAwq8I+O5xfj6fOz38K+X/fYAdb7fbAgFAjIJ6Aav3AYlQ6nfnDoDz0+lUxNiLALvf7XaDNGQ6GANQBKR85V27B4D3QQRw7hGIYlQKWGM79hSweyCUe1blXhEAogfABwHAXAcqSYkxCtHLUK3XBajSc4Dj8dilAeiSAgD2+30BAEKV4GKcAuDqB4TdYwBgPQByCgApUBoE4EJUGvxUjF3Q69/zLw3g/HA45ABKgdIQu+JPIyDnisCfAxAFNFM0EFNQ64gfS0EUoQP8ighrZSjn3oziZEQpauyKbfjbZchHUL/3AS/Dd30gAkxuRACgfO+EWQW8qwI1o+wseNuKcQiESjALvwNoMI0TcRzD4lFcPYwIM+JTF5x6HOs8yI7jeB5oKhpMRFH9UwaSCDB2Jmg4rc6E2TT0biIaG0rQhNqyhpHBcayTTSXH6vcDL7/sdqRK8LkwTsU499E8vRcAojHcZ4AxABdilgrp4lsXk8oVqgwh7+6H3phqd8J0Kk4vbx/+sZqCD/vNLya/5dT9fAH8g1WdNGgwbQAAAABJRU5ErkJggg==';