Membership: newsletter opt-in at signup and on the profile

An unticked checkbox on registration subscribes the verified address to
the listmonk list (preconfirmed) once the account exists. The profile
page gets a subscribe/unsubscribe toggle, and verified email changes
follow through to listmonk. Newsletter outages never block accounts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-06 20:27:40 -05:00
co-authored by Claude Opus 5.5
parent 5954ec1061
commit 98e09627ed
10 changed files with 463 additions and 5 deletions
+3
View File
@@ -41,6 +41,9 @@ button.button { cursor: pointer; font-size: inherit; line-height: inherit; }
.form-panel h1 { font-size: clamp(2rem, 5vw, 3rem); }
.form-panel label { display: block; margin-bottom: .3rem; font-weight: 600; }
.form-panel input { width: 100%; padding: .8rem 1rem; border-radius: .6rem; border: 1px solid var(--border); background: var(--page-deep); color: var(--text); font: inherit; }
.form-panel p:has(> input[type="checkbox"]) { display: flex; flex-direction: row-reverse; justify-content: flex-end; align-items: flex-start; gap: .6rem; }
.form-panel p:has(> input[type="checkbox"]) label { margin: 0; font-weight: 500; }
.form-panel input[type="checkbox"] { flex: none; width: 1.2rem; height: 1.2rem; margin-top: .2rem; padding: 0; accent-color: var(--accent); }
.form-panel input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.form-panel .helptext { display: block; color: var(--muted); font-size: .85rem; margin-top: .4rem; }
.errorlist { color: var(--red); }