diff --git a/.eleventy.js b/.eleventy.js
index 9b45e65cc5..eab1146380 100644
--- a/.eleventy.js
+++ b/.eleventy.js
@@ -226,6 +226,13 @@ module.exports = function(eleventyConfig) {
eleventyConfig.addFilter("limit", (arr, limit) => arr.slice(0, limit ));
+ // Marketing image for a nav highlight card: the linked page's image front matter
+ eleventyConfig.addFilter("pageImageForUrl", (collection, url) => {
+ const normalized = url && !url.endsWith("/") ? `${url}/` : url;
+ const match = (collection || []).find((p) => p.url === normalized);
+ return (match && match.data && match.data.image) || null;
+ });
+
eleventyConfig.addFilter('console', function (value) {
const str = util.inspect(value, { showHidden: false, depth: null });
return `
${unescape(str)}
;`
@@ -973,11 +980,11 @@ module.exports = function(eleventyConfig) {
if (content) {
const chevronDown = loadSVG('chevron-down')
- return `${iconSvg}${label}${chevronDown}${content}`
+ return `${iconSvg}${label}${chevronDown}${content}`
} else if (link) {
- return `${iconSvg}${label}`
+ return `${iconSvg}${label}`
} else {
- return `${iconSvg}${label}`
+ return `${iconSvg}${label}`
}
});
diff --git a/.gitignore b/.gitignore
index d0ff276216..82a74429dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,4 +19,16 @@ src/blueprints/*
.netlify
-deno.lock
\ No newline at end of file
+deno.lock
+
+# In-repo npm cache and tooling config written by the dev container
+.npm/
+.config/
+
+# Claude Code local (personal) settings; shared .claude/ config stays tracked
+.claude/settings.local.json
+
+# Local-only dev container + tooling artifacts (not shared)
+.playwright-mcp/
+CLAUDE.local.md
+compose.yaml
\ No newline at end of file
diff --git a/lib/image-handler.js b/lib/image-handler.js
index ed5bb39690..da3ab85c7d 100644
--- a/lib/image-handler.js
+++ b/lib/image-handler.js
@@ -217,10 +217,22 @@ module.exports = function imageHandler(
// Instead it generates HTML picture tags are equivalent of how the pipeline would work
// But containing only one, non-converted, resized or compressed, image
if (DEV_MODE) {
- // Naive copy of the image to the output folder
+ // Naive copy of the image to the output folder.
+ // Disambiguate the output filename with a short hash of the resolved
+ // source path so two different source images that share a basename
+ // (e.g. a hero foreground "industries/food-beverage.jpg" and a hero
+ // video poster "industries/hero-video/food-beverage.jpg") don't
+ // overwrite each other at /img/. Production is unaffected:
+ // its pipeline already hashes by content via filenameFormat above.
+ const parsedName = path.parse(imgPath)
+ const srcHash = require("crypto")
+ .createHash("sha1")
+ .update(imgPath)
+ .digest("hex")
+ .slice(0, 8)
const imgOutputPath = path.join(
imgOpts.outputDir,
- path.basename(imgPath)
+ `${parsedName.name}-${srcHash}${parsedName.ext}`
)
const imgOutputURL = path.join(
"/",
diff --git a/nuxt/components/AppFooter.vue b/nuxt/components/AppFooter.vue
index 5ea34b2370..b9685d8f87 100644
--- a/nuxt/components/AppFooter.vue
+++ b/nuxt/components/AppFooter.vue
@@ -1,11 +1,114 @@
-