add image support: eleventy-img plugin, hero images, responsive picture elements
All checks were successful
Deploy to S3 / deploy (push) Successful in 46s
All checks were successful
Deploy to S3 / deploy (push) Successful in 46s
This commit is contained in:
55
.eleventy.js
55
.eleventy.js
@@ -1,5 +1,60 @@
|
|||||||
|
const Image = require("@11ty/eleventy-img");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
function imageShortcode(src, alt, sizes = "100vw") {
|
||||||
|
const inputPath = path.join("img", src);
|
||||||
|
const options = {
|
||||||
|
widths: [480, 800, 1200],
|
||||||
|
formats: ["avif", "webp", "jpeg"],
|
||||||
|
outputDir: "_site/img",
|
||||||
|
urlPath: "/img/",
|
||||||
|
filenameFormat: function (id, src, width, format) {
|
||||||
|
const name = path.basename(src, path.extname(src));
|
||||||
|
return `${name}-${width}.${format}`;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
Image(inputPath, options);
|
||||||
|
const metadata = Image.statsSync(inputPath, options);
|
||||||
|
|
||||||
|
return Image.generateHTML(metadata, {
|
||||||
|
alt,
|
||||||
|
sizes,
|
||||||
|
loading: "lazy",
|
||||||
|
decoding: "async",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function heroImageShortcode(src, alt) {
|
||||||
|
const inputPath = path.join("img", src);
|
||||||
|
const options = {
|
||||||
|
widths: [800, 1200, 1600],
|
||||||
|
formats: ["avif", "webp", "jpeg"],
|
||||||
|
outputDir: "_site/img",
|
||||||
|
urlPath: "/img/",
|
||||||
|
filenameFormat: function (id, src, width, format) {
|
||||||
|
const name = path.basename(src, path.extname(src));
|
||||||
|
return `${name}-${width}.${format}`;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
Image(inputPath, options);
|
||||||
|
const metadata = Image.statsSync(inputPath, options);
|
||||||
|
|
||||||
|
return Image.generateHTML(metadata, {
|
||||||
|
alt,
|
||||||
|
sizes: "(max-width: 960px) 100vw, 960px",
|
||||||
|
loading: "eager",
|
||||||
|
decoding: "async",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = function (eleventyConfig) {
|
module.exports = function (eleventyConfig) {
|
||||||
eleventyConfig.addPassthroughCopy("css");
|
eleventyConfig.addPassthroughCopy("css");
|
||||||
|
eleventyConfig.addPassthroughCopy("img");
|
||||||
|
|
||||||
|
eleventyConfig.addShortcode("image", imageShortcode);
|
||||||
|
eleventyConfig.addShortcode("heroImage", heroImageShortcode);
|
||||||
|
|
||||||
eleventyConfig.addCollection("columns", function (collectionApi) {
|
eleventyConfig.addCollection("columns", function (collectionApi) {
|
||||||
return collectionApi
|
return collectionApi
|
||||||
|
|||||||
@@ -14,6 +14,11 @@
|
|||||||
<div class="site-layout">
|
<div class="site-layout">
|
||||||
<main class="content">
|
<main class="content">
|
||||||
<article class="column-entry">
|
<article class="column-entry">
|
||||||
|
{% if hero %}
|
||||||
|
<figure class="column-hero">
|
||||||
|
{% heroImage hero, heroAlt or title %}
|
||||||
|
</figure>
|
||||||
|
{% endif %}
|
||||||
<header class="column-header">
|
<header class="column-header">
|
||||||
<h1>{{ title }}</h1>
|
<h1>{{ title }}</h1>
|
||||||
<time datetime="{{ date | isoDate }}">{{ date | readableDate }}</time>
|
<time datetime="{{ date | isoDate }}">{{ date | readableDate }}</time>
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ tags: column
|
|||||||
permalink: /columns/2026/hello-world/
|
permalink: /columns/2026/hello-world/
|
||||||
---
|
---
|
||||||
|
|
||||||
This is the first entry.
|
This is the first entry. With an edit.
|
||||||
|
|||||||
@@ -80,6 +80,27 @@ a:hover {
|
|||||||
color: var(--color-muted);
|
color: var(--color-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* images */
|
||||||
|
|
||||||
|
.column-hero {
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column-hero picture,
|
||||||
|
.column-hero img {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column-body picture,
|
||||||
|
.column-body img {
|
||||||
|
display: block;
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
margin: 1.5rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
.column-body {
|
.column-body {
|
||||||
margin-top: 1.5rem;
|
margin-top: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|||||||
0
img/.gitkeep
Normal file
0
img/.gitkeep
Normal file
@@ -5,6 +5,11 @@ layout: base.njk
|
|||||||
{%- set latest = collections.columns | first -%}
|
{%- set latest = collections.columns | first -%}
|
||||||
{%- if latest %}
|
{%- if latest %}
|
||||||
<article class="column-entry">
|
<article class="column-entry">
|
||||||
|
{% if latest.data.hero %}
|
||||||
|
<figure class="column-hero">
|
||||||
|
{% heroImage latest.data.hero, latest.data.heroAlt or latest.data.title %}
|
||||||
|
</figure>
|
||||||
|
{% endif %}
|
||||||
<header class="column-header">
|
<header class="column-header">
|
||||||
<h1><a href="{{ latest.url }}">{{ latest.data.title }}</a></h1>
|
<h1><a href="{{ latest.url }}">{{ latest.data.title }}</a></h1>
|
||||||
<time datetime="{{ latest.date | isoDate }}">{{ latest.date | readableDate }}</time>
|
<time datetime="{{ latest.date | isoDate }}">{{ latest.date | readableDate }}</time>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
"dev": "eleventy --serve --watch"
|
"dev": "eleventy --serve --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@11ty/eleventy": "^3.0.0"
|
"@11ty/eleventy": "^3.0.0",
|
||||||
|
"@11ty/eleventy-img": "^5.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user