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.

+
+ + + +

You're unsubscribed from the Apophenia 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; }