Better ResponsiveGraphic utility.

This commit is contained in:
wires 2026-05-11 22:48:20 -04:00
parent 1ea3d2dfd6
commit 93e9d68b4e
5 changed files with 34 additions and 8 deletions

View file

@ -2,6 +2,7 @@
<script lang="ts">
import { onMount } from 'svelte';
import type { ContainerWidth } from '../@types/global';
import { getResponsiveSizes } from '../../utils/propValidators';
import Block from '../Block/Block.svelte';
import PaddingReset from '../PaddingReset/PaddingReset.svelte';
@ -115,7 +116,7 @@
aria-label="media"
class="w-full flex flex-col relative"
>
<img class="w-full my-0" {src} {srcset} alt={altText} loading={lazy ? 'lazy' : 'eager'} />
<img class="w-full my-0" {src} {srcset} sizes={getResponsiveSizes(width)} alt={altText} loading={lazy ? 'lazy' : 'eager'} />
{#if caption}
<PaddingReset containerIsFluid={width === 'fluid'}>
<Block width={textWidth} class="notes w-full fmy-0">

View file

@ -14,12 +14,11 @@ import AiMap1 from './ai-scroller-1.svelte';
import AiMap2 from './ai-scroller-2.svelte';
import AiMap3 from './ai-scroller-3.svelte';
//photos
// Import graphics.
import photoOne from './Photo-4439.jpg';
// Await the optimized response. (You may need to cast it or update getResponsiveGraphic's type to accept ImageMetadata)
// Await the optimized graphics.
const optimizedPhotoOne = await getResponsiveGraphic(photoOne as any);
const photos = {
'Photo-4439.jpg': {
src: optimizedPhotoOne.src,

View file

@ -2,7 +2,7 @@
[blocks]
type: photo
width: normal
width: wide
src: Photo-4439.jpg
altText: Boom
caption: Peerless

View file

@ -4,6 +4,6 @@ export async function getResponsiveGraphic(src: ImageMetadata, format = 'jpeg')
return await getImage({
src,
format,
widths: [330, 510, 660, 930, 1200, 1600],
widths: [330, 510, 660, 930, 1200, 1600, 2000],
});
}

View file

@ -1,3 +1,5 @@
import type { ContainerWidth } from '../../components/@types/global';
/**
* Coeerce a string to a valid container width.
*
@ -15,12 +17,36 @@ export const containerWidth = (width: string) => {
case 'wider':
case 'widest':
case 'fluid':
return width;
return width as ContainerWidth;
default:
return 'normal'; // Default value if invalid
return 'normal' as ContainerWidth; // Default value if invalid
}
};
/**
* Container widths converted to pixels for `sizes` attributes
*/
export const containerWidths: Record<ContainerWidth, number> = {
narrower: 330,
narrow: 510,
normal: 660,
wide: 930,
wider: 1200,
widest: 100, // Used to trigger 100vw
fluid: 100 // Used to trigger 100vw
};
/**
* Helper to generate an HTML sizes attribute string based on a ContainerWidth
* @param width The container width
* @returns An HTML sizes attribute string
*/
export const getResponsiveSizes = (width: ContainerWidth): string => {
return width === 'widest' || width === 'fluid'
? '100vw'
: `(max-width: ${containerWidths[width]}px) 100vw, ${containerWidths[width]}px`;
};
/**
* Validate inline ad number prop
* @param n string