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> + ))}