Modern responsive image management for projects using the Roots Acorn framework.
- PHP ^8.4
- WordPress 6.7+
- Roots Acorn ^6.2
Install via Composer:
composer require webkinder/sproutsetAcorn auto-discovers the service provider (declared under extra.acorn.providers), so no manual registration is needed. To customize the defaults, publish the config file:
wp acorn vendor:publish --tag=sproutset-configThis writes config/sproutset.php, read throughout via config('sproutset.*').
config/sproutset.php has three blocks.
image_sizes is the complete roster Sproutset registers with WordPress on every request. Each size takes:
width— target width in pixels.height— target height in pixels (0= proportional).crop—truefor a hard crop,falseto scale within the box.srcset— optional list of multipliers; each adds an@Nxvariant (e.g.large@2x).
The package ships thumbnail, medium, medium_large, and large. The four WordPress core sizes are driven from this config, and their fields are locked on Settings → Media so they can't drift.
'image_sizes' => [
'large' => [
'width' => 1024,
'height' => 1024,
'crop' => false,
'srcset' => [0.5, 2],
],
],avif opts into AVIF delivery for images rendered through the component. Disabled is a guaranteed no-op.
'avif' => [
'enabled' => false, // opt-in
'quality' => 50, // 0–100
],focal_point (default true) enables per-image focal points set in the Media Library. Set it to false to disable the picker, metadata honoring, and cropping.
'focal_point' => true,Render an attachment with the <x-sproutset-image> Blade component:
<x-sproutset-image :attachment-id="$id" size-name="large" />If the attachment can't be resolved, the component renders nothing.
| Attribute | Default | Notes |
|---|---|---|
attachment-id |
0 |
Attachment ID (int or numeric string). |
size-name |
large |
A registered size name. |
sizes |
null |
Explicit sizes attribute; overrides auto sizes. |
alt |
null |
Alt text. |
width / height |
null |
Override the rendered box. |
class |
null |
Merged with the element's classes. |
loading |
lazy |
lazy or eager. |
decoding |
async |
async, sync, or auto. |
use-auto-sizes |
true |
Resolve sizes="auto" for lazy images when no explicit sizes is given. |
focal-point |
false |
Enable per-call focal positioning. |
focal-point-x / focal-point-y |
null |
Focal coordinates, 0–100. |
Any other attribute (id, data-*, aria-*, title, …) passes through onto the <img>.
When use-auto-sizes is on and no explicit sizes is set, lazy-loaded images resolve sizes="auto"; eager images omit it (sizes="auto" is only valid for lazy images).
With avif.enabled set, Sproutset layers an AVIF <source> over the original <img> inside a <picture>:
<picture>
<source type="image/avif" srcset="…">
<img src="…" …>
</picture>It is additive — the original <img> is always the fallback — and never touches WordPress's global image pipeline, so favicons, og:image, and admin thumbnails are unaffected. The one CSS caveat: a direct-child selector like .gallery > img becomes .gallery > picture > img.
Set a focal point once per image in the Media Library and it is honored everywhere <x-sproutset-image> renders it — hard-crop sizes are re-cropped around the point, and cover contexts get object-position. A center (50/50) point is a no-op. Override a single placement with the component's attributes:
<x-sproutset-image :attachment-id="$id" size-name="large" focal-point focal-point-x="30" focal-point-y="70" />Contributions are welcome. Please read CONTRIBUTING.md before opening a pull request.
Sproutset is open-source software licensed under the GNU General Public License v3.0.