From 4fadf8b61d4cf3a791f98c0a316830d90bd8aaba Mon Sep 17 00:00:00 2001
From: "planetrenox@protonmail.com"
Date: Wed, 30 Sep 2026 18:24:07 +0000
Subject: [PATCH] Add newsletter unsubscribe page
---
scripts/generate-pages.mjs | 5 ++--
scripts/lib/renderers.mjs | 55 +++++++++++++++++++++++++++++++++++++-
src/styles.css | 4 +++
3 files changed, 61 insertions(+), 3 deletions(-)
diff --git a/scripts/generate-pages.mjs b/scripts/generate-pages.mjs
index 02166f1..f2f80eb 100644
--- a/scripts/generate-pages.mjs
+++ b/scripts/generate-pages.mjs
@@ -6,7 +6,7 @@ import { marked } from "marked";
import markedKatex from "marked-katex-extension";
import { ARTICLES_GLOB, AUTHOR_PAGES, ROOT, SRC, UNLISTED_PATH } from "./lib/constants.mjs";
import { fixInternalLinks } from "./lib/utils.mjs";
-import { renderArticle, renderHome, renderWritePage, renderNewsletterPage, renderAuthorPage } from "./lib/renderers.mjs";
+import { renderArticle, renderHome, renderWritePage, renderNewsletterPage, renderUnsubscribePage, renderAuthorPage } from "./lib/renderers.mjs";
import { ensureCleanGenerated, writeDiscoveryFiles, writePage } from "./lib/io.mjs";
marked.use(markedKatex({ throwOnError: false, nonStandard: true }));
@@ -66,6 +66,7 @@ const run = async () => {
await writePage([SRC, "index.html"], renderHome(listedArticles));
await writePage([SRC, "write", "index.html"], renderWritePage());
await writePage([SRC, "newsletter", "index.html"], renderNewsletterPage());
+ await writePage([SRC, "unsubscribe", "index.html"], renderUnsubscribePage());
for (const author of AUTHOR_PAGES) {
await writePage([SRC, "author", author.slug, "index.html"], renderAuthorPage(author));
@@ -78,7 +79,7 @@ const run = async () => {
await writeDiscoveryFiles(listedArticles, AUTHOR_PAGES);
- console.log(`Generated ${articles.length} article pages (${listedArticles.length} listed) + home + write + newsletter + author pages + rss/sitemap/robots.`);
+ console.log(`Generated ${articles.length} article pages (${listedArticles.length} listed) + home + write + newsletter + unsubscribe + author pages + rss/sitemap/robots.`);
};
run().catch((err) => {
diff --git a/scripts/lib/renderers.mjs b/scripts/lib/renderers.mjs
index 745ec0f..473c56a 100644
--- a/scripts/lib/renderers.mjs
+++ b/scripts/lib/renderers.mjs
@@ -180,7 +180,7 @@ ${nav}
- Unsubscribe anytime. We never share your email.
+ Unsubscribe anytime. We never share your email.
@@ -196,6 +196,59 @@ ${nav}
${footer}
`;
+export const renderUnsubscribePage = () => `
+${shellHead({
+ title: "Unsubscribe — apophenia.news",
+ desc: "Unsubscribe from the apophenia.news newsletter.",
+ url: `${SITE_URL}/unsubscribe/`
+})}
+${nav}
+
+
+ Unsubscribe
+ Enter your email to stop receiving our newsletter.
+
+ Back to newsletter
+
+
+${footer}
+`;
+
export const renderWritePage = () => `
${shellHead({
title: "Become a writer for apophenia.news",
diff --git a/src/styles.css b/src/styles.css
index 27464a2..272a36a 100644
--- a/src/styles.css
+++ b/src/styles.css
@@ -9,6 +9,10 @@
@tailwind utilities;
@layer base {
+ [x-cloak] {
+ display: none !important;
+ }
+
:root {
color-scheme: light;
}