PhxMediaLibrary.ResponsiveImages (PhxMediaLibrary v0.6.1)

Copy Markdown View Source

Generates responsive image variants for optimal loading across devices.

Responsive images are generated at multiple widths, allowing browsers to select the most appropriate size based on the viewport and device pixel ratio.

How It Works

When responsive images are enabled for a media item:

  1. The original image dimensions are analyzed
  2. Multiple smaller versions are generated at configured breakpoints
  3. A tiny placeholder (32px wide) is generated for progressive loading
  4. All variant information is stored in the responsive_images field

Configuration

config :phx_media_library,
  responsive_images: [
    enabled: true,
    widths: [320, 640, 960, 1280, 1920],
    tiny_placeholder: true
  ]

Usage in Templates

# Get srcset for use in img tag
srcset = PhxMediaLibrary.srcset(media)

# In HEEx template
<img
  src={PhxMediaLibrary.url(media)}
  srcset={PhxMediaLibrary.srcset(media)}
  sizes="(max-width: 768px) 100vw, 50vw"
  alt="Description"
/>

Summary

Functions

Build a srcset string from responsive image data.

Generate responsive image variants for a media item.

Generate responsive variants for all conversions of a media item.

Get the tiny placeholder data URI for progressive loading.

Get placeholder dimensions for proper aspect ratio.

Types

responsive_data()

@type responsive_data() :: %{
  required(String.t()) => [
    %{width: pos_integer(), height: pos_integer(), path: String.t()}
  ]
}

Functions

build_srcset(media, conversion \\ nil)

@spec build_srcset(PhxMediaLibrary.Media.t(), atom() | nil) :: String.t() | nil

Build a srcset string from responsive image data.

generate(media, conversion \\ nil)

@spec generate(PhxMediaLibrary.Media.t(), atom() | nil) ::
  {:ok, responsive_data()} | {:error, term()}

Generate responsive image variants for a media item.

Returns updated responsive_images data to be stored on the media record.

generate_all(media)

@spec generate_all(PhxMediaLibrary.Media.t()) ::
  {:ok, responsive_data()} | {:error, term()}

Generate responsive variants for all conversions of a media item.

placeholder(media, conversion \\ nil)

@spec placeholder(PhxMediaLibrary.Media.t(), atom() | nil) :: String.t() | nil

Get the tiny placeholder data URI for progressive loading.

placeholder_dimensions(media, conversion \\ nil)

@spec placeholder_dimensions(PhxMediaLibrary.Media.t(), atom() | nil) ::
  {integer(), integer()} | nil

Get placeholder dimensions for proper aspect ratio.