feat(image): enhance image handling with new properties and responsive support
Deploy / verify (push) Successful in 41s
Deploy / deploy (push) Successful in 1m2s

- Updated PostEntry type to include _rawImageUrl and _imageFocal for improved image management.
- Refactored image handling in various components to utilize the new properties, ensuring better focal point support and responsive image rendering.
- Introduced warmResponsiveImage function for pre-fetching image variants to optimize loading performance.
- Replaced CmsImage component with RustyImage in multiple blocks for consistent image processing.
This commit is contained in:
Peter Meier
2026-04-18 08:43:17 +02:00
parent 3c6ff773ae
commit a2f2d5bfb0
14 changed files with 297 additions and 162 deletions
+24 -1
View File
@@ -143,7 +143,7 @@ export interface ResponsiveImageOptions {
}
const DEFAULT_WIDTHS = [640, 960, 1280, 1600, 1920, 2400];
const DEFAULT_FORMATS: Array<'avif' | 'webp' | 'jpeg'> = ['avif', 'webp', 'jpeg'];
const DEFAULT_FORMATS: Array<'avif' | 'webp' | 'jpeg'> = ['webp', 'jpeg'];
const MIME_FOR_FORMAT: Record<'avif' | 'webp' | 'jpeg', string> = {
avif: 'image/avif',
webp: 'image/webp',
@@ -232,3 +232,26 @@ export async function buildResponsiveImage(
...(lqip ? { lqip } : {}),
};
}
/**
* Fire-and-forget Cache-Warmup: alle srcset-Varianten + Fallback parallel anrequesten.
* Nutzt SvelteKit's `event.fetch` für Self-Calls (keine echten HTTP-Roundtrips in Prod-SSR).
* Blockiert den Response NICHT — läuft im Hintergrund weiter.
*/
export function warmResponsiveImage(
responsive: ResponsiveImage | null,
fetchFn: typeof fetch,
): void {
if (!responsive) return;
const urls = new Set<string>();
urls.add(responsive.fallback);
for (const s of responsive.sources) {
for (const entry of s.srcset.split(',')) {
const url = entry.trim().split(/\s+/)[0];
if (url) urls.add(url);
}
}
for (const u of urls) {
void fetchFn(u).catch(() => {});
}
}