astro-sanity-picture
Version:
An Astro component for rendering a responsive <picture> element for an image fetched from Sanity
112 lines (101 loc) • 3.03 kB
text/typescript
/// <reference types="astro/astro-jsx" />
import type { ImageUrlBuilder } from "@sanity/image-url/lib/types/builder";
import type {
ImageUrlBuilderOptionsWithAliases,
SanityImageDimensions,
SanityImageSource,
SanityImageWithAssetStub,
} from "@sanity/image-url/lib/types/types";
/**
* Default properties for all components in the app
*/
export interface SanityPictureDefaults {
autoWidths: AutoWidths;
withWebp: boolean;
style: Record<string, any>;
img: Omit<ImgAttributes, "src">;
lqip: Lqip;
imageUrlBuilder?: ImageUrlBuilder;
}
/**
* Settings for auto-generating the widths of our element
*/
export interface AutoWidths {
//The highest width image to generate when dimensions are not provided
maxWidth: number;
//The width to jump by each source, unless we would exceed maxDivisions
step: number;
}
/**
* Settings for using low quality placeholder image
*/
export type Lqip =
| {
enabled: false;
}
| {
enabled: true;
//Transition to loaded image time in ms
transitionDuration: number;
};
/**
* An image asset from sanity which has fetched dimension metadata
*/
export type SanityDimensionedImage = SanityImageWithAssetStub & {
asset: {
metadata: { dimensions: SanityImageDimensions };
};
};
/**
* An image asset from sanity which has fetched dimension metadata
*/
export type SanityImageWithLqip = SanityImageWithAssetStub & {
asset: {
metadata: { lqip: string };
};
};
/**
* Type for our component's props
*/
export type SanityPictureProps = {
/**
* An instance of sanity image url builder to use. If default is set, may be omitted
*/
imageUrlBuilder?: ImageUrlBuilder;
/**
* The image to display, as a property from a `groq` query
*/
src: SanityImageSource;
/**
* Specifies sizes attribute to apply to each source by default
*/
sizes: string;
/**
* Each `PictureSource` object in the list informs the generation of a `<source />` element for each of the widths generated by the `widths` property.
*/
sources?: PictureSource[];
/**
* Specifies how to calculate widths for `<source />` elements. You may either specify a list of widths to use, or a an `AutoWidths` type which declares how to automatically determine the widths.
*/
widths?: number[] | AutoWidths;
/**
* Attributes to apply to the base `<img />` element in the picture
*/
img?: Omit<ImgAttributes, "src">;
lqip?: Lqip;
loading?: ImgAttributes["loading"];
} & PictureAttributes;
/**
* Options for a single <source /> in a <picture />
*/
export type PictureSource = {
options?: Partial<ImageUrlBuilderOptionsWithAliases>;
withWebp?: boolean;
} & Omit<SourceAttributes, "srcset">;
export type SourceAttributes = astroHTML.JSX.DefinedIntrinsicElements["source"];
export type PictureAttributes =
astroHTML.JSX.DefinedIntrinsicElements["picture"];
export type ImgAttributes = astroHTML.JSX.DefinedIntrinsicElements["img"];
declare global {
var sanityPictureDefaults: SanityPictureDefaults;
}