From c95a6ef79530c7a30847e8231b8d854b77739983 Mon Sep 17 00:00:00 2001
From: Mohammad Zeeshan Ansari
Date: Wed, 8 Apr 2026 17:40:03 +0530
Subject: [PATCH 1/5] feat: add AI Coding Assistants Policy link to footer
---
src/components/Footer/Footer.jsx | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/components/Footer/Footer.jsx b/src/components/Footer/Footer.jsx
index d0550f6579d1..67b7413059a7 100644
--- a/src/components/Footer/Footer.jsx
+++ b/src/components/Footer/Footer.jsx
@@ -38,6 +38,9 @@ const Footer = () => (
The OpenJS Foundation |{" "}
+
+ AI Coding Assistants Policy
+ |{" "}
Terms of Use |{" "}
Privacy Policy |{" "}
Bylaws |{" "}
From fd0be54649964a379b8b9d9cb4c3bb0bdfaf0714 Mon Sep 17 00:00:00 2001
From: Mohammad Zeeshan Ansari
Date: Wed, 8 Apr 2026 20:10:07 +0530
Subject: [PATCH 2/5] feat: add fetch-footer utility to automate OpenJS footer
links
---
src/utilities/fetch-footer.mjs | 56 ++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
create mode 100644 src/utilities/fetch-footer.mjs
diff --git a/src/utilities/fetch-footer.mjs b/src/utilities/fetch-footer.mjs
new file mode 100644
index 000000000000..6c02d51156a7
--- /dev/null
+++ b/src/utilities/fetch-footer.mjs
@@ -0,0 +1,56 @@
+import { writeFile, mkdir } from 'fs/promises';
+import path from 'path';
+
+const ARTWORK_README_URL =
+ 'https://raw.githubusercontent.com/openjs-foundation/artwork/main/README.md';
+const OUTPUT_PATH = path.resolve(
+ 'src/components/Footer/_footer-legal.json'
+ );
+
+async function fetchFooter() {
+ console.log('Fetching OpenJS Foundation footer template...');
+
+const response = await fetch(ARTWORK_README_URL);
+ if (!response.ok) {
+ throw new Error(`Failed to fetch artwork README: ${response.status}`);
+ }
+ const readme = await response.text();
+
+// Extract the HTML block under "### HTML"
+const htmlSectionMatch = readme.match(
+ /### HTML\s*\n+```html\s*\n([\s\S]*?)\n```/
+ );
+
+if (!htmlSectionMatch) {
+ throw new Error(
+ 'Could not find HTML footer template in artwork README'
+ );
+}
+
+const html = htmlSectionMatch[1].trim();
+
+// Parse links from the footer HTML
+const linkRegex = /([^<]+)<\/a>/g;
+ const paragraphs = html.split('
');
+
+// Second paragraph contains the links bar
+const linksSection = paragraphs.length > 1 ? paragraphs[1] : '';
+ const links = [];
+ let match;
+ while ((match = linkRegex.exec(linksSection)) !== null) {
+ links.push({ url: match[1], label: match[2] });
+ }
+
+const data = { links };
+
+await mkdir(path.dirname(OUTPUT_PATH), { recursive: true });
+ await writeFile(OUTPUT_PATH, JSON.stringify(data, null, 2));
+
+console.log(`Footer data written to ${OUTPUT_PATH}`);
+ console.log(`Found ${links.length} footer links`);
+}
+
+fetchFooter().catch((err) => {
+ console.error('Error fetching footer:', err);
+ process.exit(1);
+});
From 95644c70f95d63d85f4d9929ffb3ce55cf26065d Mon Sep 17 00:00:00 2001
From: Mohammad Zeeshan Ansari
Date: Wed, 8 Apr 2026 20:18:42 +0530
Subject: [PATCH 3/5] feat: dynamically render footer links from fetched OpenJS
template
---
src/components/Footer/Footer.jsx | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/src/components/Footer/Footer.jsx b/src/components/Footer/Footer.jsx
index 67b7413059a7..c447a51a380f 100644
--- a/src/components/Footer/Footer.jsx
+++ b/src/components/Footer/Footer.jsx
@@ -4,6 +4,7 @@ import Icon from "../../assets/icon-square-small.svg";
import OpenJSLogo from "../../assets/openjs-logo.png";
import Container from "../Container/Container.jsx";
import Link from "../Link/Link.jsx";
+import footerLegal from './_footer-legal.json';
const footerLinkClasses =
"text-[11px] uppercase text-[#777676] dark:text-[#cccccc] hover:text-[#333333] dark:hover:text-[#ffffff]";
@@ -36,19 +37,14 @@ const Footer = () => (
holders. Use of them does not imply any affiliation with or endorsement
by them.
-
- The OpenJS Foundation |{" "}
-
- AI Coding Assistants Policy
- |{" "}
- Terms of Use |{" "}
- Privacy Policy |{" "}
- Bylaws |{" "}
- Code of Conduct |{" "}
- Trademark Policy |{" "}
- Trademark List |{" "}
- Cookie Policy
-
+
+ {footerLegal.links.map((link, i) => (
+
+ {i > 0 && ' | '}
+ {link.label}a>
+ span>
+ ))}
+
Date: Wed, 8 Apr 2026 20:20:34 +0530
Subject: [PATCH 4/5] feat: add fetch:footer script to package.json
---
package.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/package.json b/package.json
index 51f986bf840f..eef15ab7635d 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
"fetch": "run-p fetch:*",
"fetch:readmes": "node src/utilities/fetch-package-readmes.mjs",
"fetch:supporters": "node src/utilities/fetch-supporters.mjs",
+ "fetch:footer": "node src/utilities/fetch-footer.mjs",
"fetch:governance": "node src/utilities/fetch-governance.mjs",
"fetch-all": "run-s fetch-repos fetch",
"prebuild": "npm run clean",
From 06d6ed869cb3abee512cb5136d65a682e8423de2 Mon Sep 17 00:00:00 2001
From: Mohammad Zeeshan Ansari
Date: Wed, 8 Apr 2026 20:22:40 +0530
Subject: [PATCH 5/5] fix: remove extra span tag in footer links rendering
---
src/components/Footer/Footer.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/Footer/Footer.jsx b/src/components/Footer/Footer.jsx
index c447a51a380f..66ffb6fb25fe 100644
--- a/src/components/Footer/Footer.jsx
+++ b/src/components/Footer/Footer.jsx
@@ -42,7 +42,7 @@ const Footer = () => (
{i > 0 && ' | '}
{link.label}a>
- span>
+
))}