From 0854746e65400ed6c3a9eab3c009bd8d7a9fd055 Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 15:32:37 -0400
Subject: [PATCH 1/8] feat: add legal text + fix analytics
---
components/Footer/index.jsx | 98 +++++++++++++++++++++++++++++++++++++
components/Layout/index.jsx | 9 ++--
2 files changed, 102 insertions(+), 5 deletions(-)
create mode 100644 components/Footer/index.jsx
diff --git a/components/Footer/index.jsx b/components/Footer/index.jsx
new file mode 100644
index 0000000..1af43c6
--- /dev/null
+++ b/components/Footer/index.jsx
@@ -0,0 +1,98 @@
+import Footer from '@node-core/ui-components/Containers/Footer';
+import NavItem from '@node-core/ui-components/Containers/NavBar/NavItem';
+
+const SOCIAL_LINKS = [
+ { icon: 'github', link: 'https://github.com/nodejs/node', alt: 'GitHub' },
+ { icon: 'discord', link: 'https://discord.gg/nodejs', alt: 'Discord' },
+ { icon: 'mastodon', link: 'https://social.lfx.dev/@nodejs', alt: 'Mastodon' },
+ {
+ icon: 'bluesky',
+ link: 'https://bsky.app/profile/nodejs.org',
+ alt: 'Bluesky',
+ },
+ { icon: 'twitter', link: 'https://twitter.com/nodejs', alt: 'Twitter' },
+ { icon: 'slack', link: 'https://slack-invite.openjsf.org/', alt: 'Slack' },
+ {
+ icon: 'linkedin',
+ link: 'https://www.linkedin.com/company/node-js',
+ alt: 'LinkedIn',
+ },
+];
+
+const FOOTER_LINKS = [
+ {
+ link: 'https://openjsf.org/',
+ text: 'OpenJS Foundation',
+ },
+ {
+ link: 'https://terms-of-use.openjsf.org/',
+ text: 'Terms of Use',
+ },
+ {
+ link: 'https://privacy-policy.openjsf.org/',
+ text: 'Privacy Policy',
+ },
+ {
+ link: 'https://bylaws.openjsf.org/',
+ text: 'Bylaws',
+ },
+ {
+ link: 'https://github.com/openjs-foundation/cross-project-council/blob/main/CODE_OF_CONDUCT.md',
+ text: 'Code of Conduct',
+ },
+ {
+ link: 'https://trademark-policy.openjsf.org/',
+ text: 'Trademark Policy',
+ },
+ {
+ link: 'https://trademark-list.openjsf.org/',
+ text: 'Trademark List',
+ },
+ {
+ link: 'https://www.linuxfoundation.org/cookies/',
+ text: 'Cookie Policy',
+ },
+ {
+ link: 'https://github.com/nodejs/node/security/policy',
+ text: 'Security Policy',
+ },
+];
+
+// The Node.js Project is legally obligated to include the following text.
+// It should not be modified unless explicitly requested by OpenJS staff.
+const LegalSlot = (
+ <>
+
+ Copyright OpenJS Foundation and Node.js
+ contributors. All rights reserved. The{' '}
+ OpenJS Foundation has registered
+ trademarks and uses trademarks. For a list of trademarks of the{' '}
+ OpenJS Foundation, please see our{' '}
+ Trademark Policy and{' '}
+ Trademark List.
+ Trademarks and logos not indicated on the{' '}
+
+ list of OpenJS Foundation trademarks
+ {' '}
+ are trademarks™ or registered® trademarks of their respective holders. Use
+ of them does not imply any affiliation with or endorsement by them.
+
+
+ {FOOTER_LINKS.map(({ link, text }) => (
+
+ {text}
+
+ ))}
+ >
+);
+
+/**
+ * Footer component for MDX documentation pages
+ */
+export default ({ metadata }) => (
+
+);
diff --git a/components/Layout/index.jsx b/components/Layout/index.jsx
index 21295cc..d6f241e 100644
--- a/components/Layout/index.jsx
+++ b/components/Layout/index.jsx
@@ -6,8 +6,7 @@ import { SpeedInsights } from '@vercel/speed-insights/react';
import NavBar from '../Navigation';
import MetaBar from '../Metabar';
import SideBar from '../Sidebar';
-
-import Footer from '#theme/Footer';
+import Footer from '../Footer';
/**
* @typedef {Object} Props
@@ -22,8 +21,8 @@ import Footer from '#theme/Footer';
*/
export default ({ metadata, headings, readingTime, children }) => (
<>
-
-
+
+
@@ -40,6 +39,6 @@ export default ({ metadata, headings, readingTime, children }) => (
/>
-
+
>
);
From f93652504aa0c452d0aa69790ace0e37feeb637d Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 15:36:24 -0400
Subject: [PATCH 2/8] feat: add legal text + fix analytics
---
components/Footer/index.jsx | 12 +++++++-----
components/Layout/index.jsx | 4 ++--
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/components/Footer/index.jsx b/components/Footer/index.jsx
index 1af43c6..ca9356a 100644
--- a/components/Footer/index.jsx
+++ b/components/Footer/index.jsx
@@ -78,11 +78,13 @@ const LegalSlot = (
of them does not imply any affiliation with or endorsement by them.
- {FOOTER_LINKS.map(({ link, text }) => (
-
- {text}
-
- ))}
+
+ {FOOTER_LINKS.map(({ link, text }) => (
+
+ {text}
+
+ ))}
+
>
);
diff --git a/components/Layout/index.jsx b/components/Layout/index.jsx
index d6f241e..9601d93 100644
--- a/components/Layout/index.jsx
+++ b/components/Layout/index.jsx
@@ -21,8 +21,8 @@ import Footer from '../Footer';
*/
export default ({ metadata, headings, readingTime, children }) => (
<>
-
-
+
+
From 177c5f993fea94af4f73e7313709678a65e95c4d Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 15:39:26 -0400
Subject: [PATCH 3/8] feat: add legal text + fix analytics
---
components/Layout/index.jsx | 4 ++--
vercel.json | 6 ++++++
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/components/Layout/index.jsx b/components/Layout/index.jsx
index 9601d93..9c48efa 100644
--- a/components/Layout/index.jsx
+++ b/components/Layout/index.jsx
@@ -21,8 +21,8 @@ import Footer from '../Footer';
*/
export default ({ metadata, headings, readingTime, children }) => (
<>
-
-
+
+
diff --git a/vercel.json b/vercel.json
index bc5f010..458bf6f 100644
--- a/vercel.json
+++ b/vercel.json
@@ -18,5 +18,11 @@
"destination": "/learn/$1",
"permanent": true
}
+ ],
+ "rewrites": [
+ {
+ "source": "/learn/_vercel/(.*)",
+ "destination": "/_vercel/$1"
+ }
]
}
From 709e2449c22dfd4300b7fe4a534ca1e6475b2448 Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 15:48:52 -0400
Subject: [PATCH 4/8] feat: add legal text + fix analytics
---
components/Layout/index.jsx | 4 ++--
vercel.json | 6 ------
2 files changed, 2 insertions(+), 8 deletions(-)
diff --git a/components/Layout/index.jsx b/components/Layout/index.jsx
index 9c48efa..3a33fce 100644
--- a/components/Layout/index.jsx
+++ b/components/Layout/index.jsx
@@ -21,8 +21,8 @@ import Footer from '../Footer';
*/
export default ({ metadata, headings, readingTime, children }) => (
<>
-
-
+
+
diff --git a/vercel.json b/vercel.json
index 458bf6f..bc5f010 100644
--- a/vercel.json
+++ b/vercel.json
@@ -18,11 +18,5 @@
"destination": "/learn/$1",
"permanent": true
}
- ],
- "rewrites": [
- {
- "source": "/learn/_vercel/(.*)",
- "destination": "/_vercel/$1"
- }
]
}
From 5a9095ba14ee500c64a65307cc338c2b7f6522a6 Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 15:55:46 -0400
Subject: [PATCH 5/8] fixup!
---
components/Layout/index.jsx | 2 +-
vercel.json | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/components/Layout/index.jsx b/components/Layout/index.jsx
index 3a33fce..8f10a40 100644
--- a/components/Layout/index.jsx
+++ b/components/Layout/index.jsx
@@ -21,7 +21,7 @@ import Footer from '../Footer';
*/
export default ({ metadata, headings, readingTime, children }) => (
<>
-
+
diff --git a/vercel.json b/vercel.json
index bc5f010..588d5e0 100644
--- a/vercel.json
+++ b/vercel.json
@@ -18,5 +18,11 @@
"destination": "/learn/$1",
"permanent": true
}
+ ],
+ "rewrites": [
+ {
+ "source": "/learn/_vercel/(.*)",
+ "destination": "https://node-learn-pages.vercel.app/_vercel/$1"
+ }
]
}
From 47d9cd8cd6a2da720afcf4a3b26f6ca931c21649 Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 15:59:41 -0400
Subject: [PATCH 6/8] fixup!
Signed-off-by: Aviv Keller
---
components/Layout/index.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/components/Layout/index.jsx b/components/Layout/index.jsx
index 8f10a40..9c48efa 100644
--- a/components/Layout/index.jsx
+++ b/components/Layout/index.jsx
@@ -22,7 +22,7 @@ import Footer from '../Footer';
export default ({ metadata, headings, readingTime, children }) => (
<>
-
+
From d1a4922162a7253091a89120459d9b93d03491bf Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 16:46:30 -0400
Subject: [PATCH 7/8] fixup!
---
components/Footer/footer.json | 22 +++++++++++++
components/Footer/index.jsx | 61 ++---------------------------------
2 files changed, 25 insertions(+), 58 deletions(-)
create mode 100644 components/Footer/footer.json
diff --git a/components/Footer/footer.json b/components/Footer/footer.json
new file mode 100644
index 0000000..22d9ae4
--- /dev/null
+++ b/components/Footer/footer.json
@@ -0,0 +1,22 @@
+{
+ "socialLinks": [
+ { "icon": "github", "link": "https://github.com/nodejs/node", "alt": "GitHub" },
+ { "icon": "discord", "link": "https://discord.gg/nodejs", "alt": "Discord" },
+ { "icon": "mastodon", "link": "https://social.lfx.dev/@nodejs", "alt": "Mastodon" },
+ { "icon": "bluesky", "link": "https://bsky.app/profile/nodejs.org", "alt": "Bluesky" },
+ { "icon": "twitter", "link": "https://twitter.com/nodejs", "alt": "Twitter" },
+ { "icon": "slack", "link": "https://slack-invite.openjsf.org/", "alt": "Slack" },
+ { "icon": "linkedin", "link": "https://www.linkedin.com/company/node-js", "alt": "LinkedIn" }
+ ],
+ "footerLinks": [
+ { "link": "https://openjsf.org/", "text": "OpenJS Foundation" },
+ { "link": "https://terms-of-use.openjsf.org/", "text": "Terms of Use" },
+ { "link": "https://privacy-policy.openjsf.org/", "text": "Privacy Policy" },
+ { "link": "https://bylaws.openjsf.org/", "text": "Bylaws" },
+ { "link": "https://github.com/openjs-foundation/cross-project-council/blob/main/CODE_OF_CONDUCT.md", "text": "Code of Conduct" },
+ { "link": "https://trademark-policy.openjsf.org/", "text": "Trademark Policy" },
+ { "link": "https://trademark-list.openjsf.org/", "text": "Trademark List" },
+ { "link": "https://www.linuxfoundation.org/cookies/", "text": "Cookie Policy" },
+ { "link": "https://github.com/nodejs/node/security/policy", "text": "Security Policy" }
+ ]
+}
diff --git a/components/Footer/index.jsx b/components/Footer/index.jsx
index ca9356a..f27d37a 100644
--- a/components/Footer/index.jsx
+++ b/components/Footer/index.jsx
@@ -1,62 +1,7 @@
import Footer from '@node-core/ui-components/Containers/Footer';
import NavItem from '@node-core/ui-components/Containers/NavBar/NavItem';
-const SOCIAL_LINKS = [
- { icon: 'github', link: 'https://github.com/nodejs/node', alt: 'GitHub' },
- { icon: 'discord', link: 'https://discord.gg/nodejs', alt: 'Discord' },
- { icon: 'mastodon', link: 'https://social.lfx.dev/@nodejs', alt: 'Mastodon' },
- {
- icon: 'bluesky',
- link: 'https://bsky.app/profile/nodejs.org',
- alt: 'Bluesky',
- },
- { icon: 'twitter', link: 'https://twitter.com/nodejs', alt: 'Twitter' },
- { icon: 'slack', link: 'https://slack-invite.openjsf.org/', alt: 'Slack' },
- {
- icon: 'linkedin',
- link: 'https://www.linkedin.com/company/node-js',
- alt: 'LinkedIn',
- },
-];
-
-const FOOTER_LINKS = [
- {
- link: 'https://openjsf.org/',
- text: 'OpenJS Foundation',
- },
- {
- link: 'https://terms-of-use.openjsf.org/',
- text: 'Terms of Use',
- },
- {
- link: 'https://privacy-policy.openjsf.org/',
- text: 'Privacy Policy',
- },
- {
- link: 'https://bylaws.openjsf.org/',
- text: 'Bylaws',
- },
- {
- link: 'https://github.com/openjs-foundation/cross-project-council/blob/main/CODE_OF_CONDUCT.md',
- text: 'Code of Conduct',
- },
- {
- link: 'https://trademark-policy.openjsf.org/',
- text: 'Trademark Policy',
- },
- {
- link: 'https://trademark-list.openjsf.org/',
- text: 'Trademark List',
- },
- {
- link: 'https://www.linuxfoundation.org/cookies/',
- text: 'Cookie Policy',
- },
- {
- link: 'https://github.com/nodejs/node/security/policy',
- text: 'Security Policy',
- },
-];
+import { socialLinks, footerLinks } from './footer.json';
// The Node.js Project is legally obligated to include the following text.
// It should not be modified unless explicitly requested by OpenJS staff.
@@ -79,7 +24,7 @@ const LegalSlot = (
- {FOOTER_LINKS.map(({ link, text }) => (
+ {footerLinks.map(({ link, text }) => (
{text}
@@ -94,7 +39,7 @@ const LegalSlot = (
export default ({ metadata }) => (
);
From 1930417b550b293db044c9f4553401b45ac74ab8 Mon Sep 17 00:00:00 2001
From: Aviv Keller
Date: Thu, 2 Apr 2026 16:47:41 -0400
Subject: [PATCH 8/8] fixup!
---
components/Footer/footer.json | 62 ++++++++++++++++++++++++++++-------
1 file changed, 51 insertions(+), 11 deletions(-)
diff --git a/components/Footer/footer.json b/components/Footer/footer.json
index 22d9ae4..cc1cfa6 100644
--- a/components/Footer/footer.json
+++ b/components/Footer/footer.json
@@ -1,22 +1,62 @@
{
"socialLinks": [
- { "icon": "github", "link": "https://github.com/nodejs/node", "alt": "GitHub" },
- { "icon": "discord", "link": "https://discord.gg/nodejs", "alt": "Discord" },
- { "icon": "mastodon", "link": "https://social.lfx.dev/@nodejs", "alt": "Mastodon" },
- { "icon": "bluesky", "link": "https://bsky.app/profile/nodejs.org", "alt": "Bluesky" },
- { "icon": "twitter", "link": "https://twitter.com/nodejs", "alt": "Twitter" },
- { "icon": "slack", "link": "https://slack-invite.openjsf.org/", "alt": "Slack" },
- { "icon": "linkedin", "link": "https://www.linkedin.com/company/node-js", "alt": "LinkedIn" }
+ {
+ "icon": "github",
+ "link": "https://github.com/nodejs/node",
+ "alt": "GitHub"
+ },
+ {
+ "icon": "discord",
+ "link": "https://discord.gg/nodejs",
+ "alt": "Discord"
+ },
+ {
+ "icon": "mastodon",
+ "link": "https://social.lfx.dev/@nodejs",
+ "alt": "Mastodon"
+ },
+ {
+ "icon": "bluesky",
+ "link": "https://bsky.app/profile/nodejs.org",
+ "alt": "Bluesky"
+ },
+ {
+ "icon": "twitter",
+ "link": "https://twitter.com/nodejs",
+ "alt": "Twitter"
+ },
+ {
+ "icon": "slack",
+ "link": "https://slack-invite.openjsf.org/",
+ "alt": "Slack"
+ },
+ {
+ "icon": "linkedin",
+ "link": "https://www.linkedin.com/company/node-js",
+ "alt": "LinkedIn"
+ }
],
"footerLinks": [
{ "link": "https://openjsf.org/", "text": "OpenJS Foundation" },
{ "link": "https://terms-of-use.openjsf.org/", "text": "Terms of Use" },
{ "link": "https://privacy-policy.openjsf.org/", "text": "Privacy Policy" },
{ "link": "https://bylaws.openjsf.org/", "text": "Bylaws" },
- { "link": "https://github.com/openjs-foundation/cross-project-council/blob/main/CODE_OF_CONDUCT.md", "text": "Code of Conduct" },
- { "link": "https://trademark-policy.openjsf.org/", "text": "Trademark Policy" },
+ {
+ "link": "https://github.com/openjs-foundation/cross-project-council/blob/main/CODE_OF_CONDUCT.md",
+ "text": "Code of Conduct"
+ },
+ {
+ "link": "https://trademark-policy.openjsf.org/",
+ "text": "Trademark Policy"
+ },
{ "link": "https://trademark-list.openjsf.org/", "text": "Trademark List" },
- { "link": "https://www.linuxfoundation.org/cookies/", "text": "Cookie Policy" },
- { "link": "https://github.com/nodejs/node/security/policy", "text": "Security Policy" }
+ {
+ "link": "https://www.linuxfoundation.org/cookies/",
+ "text": "Cookie Policy"
+ },
+ {
+ "link": "https://github.com/nodejs/node/security/policy",
+ "text": "Security Policy"
+ }
]
}