From 20a6656ebcd9ba68f710048a33280ed73720149b Mon Sep 17 00:00:00 2001 From: Benjoe Date: Mon, 11 May 2026 09:39:18 -1000 Subject: [PATCH] =?UTF-8?q?Add=20newsletter=20signup,=20update=20contact?= =?UTF-8?q?=E2=86=92fatkiss@,=20Turnstile,=20Listmonk=20integration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/js/newsletter.js | 46 +++++++++++++++++++++++++ data/site/contact.yaml | 2 +- data/site/home.yaml | 5 +++ data/site/settings.yaml | 1 + hugo.toml | 2 +- layouts/_default/baseof.html | 3 ++ layouts/contact/single.html | 5 +++ layouts/index.html | 7 ++++ layouts/partials/newsletter-signup.html | 19 ++++++++++ static/admin/config.yml | 11 ++++++ 10 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 assets/js/newsletter.js create mode 100644 layouts/partials/newsletter-signup.html diff --git a/assets/js/newsletter.js b/assets/js/newsletter.js new file mode 100644 index 0000000..fc69bf1 --- /dev/null +++ b/assets/js/newsletter.js @@ -0,0 +1,46 @@ +document.addEventListener('DOMContentLoaded', () => { + const form = document.getElementById('newsletterForm'); + if (!form) return; + + form.addEventListener('submit', async (e) => { + e.preventDefault(); + const btn = document.getElementById('nlSubmitBtn'); + const msg = document.getElementById('nlMessage'); + btn.disabled = true; + btn.textContent = 'Subscribing…'; + + try { + const fd = new FormData(form); + if (fd.get('website')) { btn.disabled = false; btn.textContent = 'Subscribe'; return; } + + const res = await fetch('https://newsletter.getfatkiss.com/api/subscribers', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Basic ' + btoa('fatkiss:fk-api-token-2026-safe') + }, + body: JSON.stringify({ + email: fd.get('email'), + name: fd.get('name') || '', + status: 'enabled', + lists: [17], + preconfirm_subscriptions: true + }) + }); + const data = await res.json(); + + if (res.ok && data.data) { + msg.innerHTML = '
You are in. Welcome to the Kiss.
'; + form.reset(); + if (typeof turnstile !== 'undefined') turnstile.reset(); + } else { + msg.innerHTML = '
Something did not go through. Please try again.
'; + } + } catch (err) { + msg.innerHTML = '
Something did not go through. Please try again.
'; + } + + btn.disabled = false; + btn.textContent = 'Subscribe'; + }); +}); diff --git a/data/site/contact.yaml b/data/site/contact.yaml index 91068b8..ecb1493 100644 --- a/data/site/contact.yaml +++ b/data/site/contact.yaml @@ -1,5 +1,5 @@ public_aliases: - general: hello@getfatkiss.com + general: fatkiss@getfatkiss.com orders: orders@getfatkiss.com press: press@getfatkiss.com diff --git a/data/site/home.yaml b/data/site/home.yaml index bf50b48..83f2641 100644 --- a/data/site/home.yaml +++ b/data/site/home.yaml @@ -51,3 +51,8 @@ waitlist: body: "" cta_label: "" cta_url: "" + +newsletter: + enabled: true + title: "Stay in the Kiss" + body: "Notes from the studio. New balms. Seasonal rituals. No spam — just Amber when there is something worth saying." diff --git a/data/site/settings.yaml b/data/site/settings.yaml index 8b855ad..66012c7 100644 --- a/data/site/settings.yaml +++ b/data/site/settings.yaml @@ -17,3 +17,4 @@ enable_contact_form: true noindex_admin: true analytics_provider: "" analytics_id: "" +enable_newsletter: true diff --git a/hugo.toml b/hugo.toml index a9bc992..8f7f58b 100644 --- a/hugo.toml +++ b/hugo.toml @@ -9,7 +9,7 @@ title = "Fat Kiss — Natural Ritual Skincare" [params] description = "Fat Kiss — rich, natural balm rituals for skin that lives, works, glows, and keeps going. Everybody Wants One." author = "Fat Kiss" - email = "hello@getfatkiss.com" + email = "fatkiss@getfatkiss.com" slogan = "Everybody Wants One." ogImage = "/uploads/og-fatkiss.jpg" favicon = "/favicon.svg" diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index ead5554..b64bdfc 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -13,5 +13,8 @@ {{ partial "footer.html" . }} {{ $js := resources.Get "js/main.js" | minify | fingerprint }} + {{ $nl := resources.Get "js/newsletter.js" | minify | fingerprint }} + + diff --git a/layouts/contact/single.html b/layouts/contact/single.html index debec7d..f03939e 100644 --- a/layouts/contact/single.html +++ b/layouts/contact/single.html @@ -15,4 +15,9 @@ +
+
+ {{ partial "newsletter-signup.html" . }} +
+
{{ end }} diff --git a/layouts/index.html b/layouts/index.html index f8f45a1..2ff89eb 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -114,6 +114,13 @@ {{ end }} +{{ if and $home.newsletter.enabled (ne .Site.Data.site.settings.enable_newsletter false) }} +
+
+ {{ partial "newsletter-signup.html" . }} +
+
+{{ end }} {{ if $home.waitlist.enabled }}
diff --git a/layouts/partials/newsletter-signup.html b/layouts/partials/newsletter-signup.html new file mode 100644 index 0000000..84f684a --- /dev/null +++ b/layouts/partials/newsletter-signup.html @@ -0,0 +1,19 @@ + diff --git a/static/admin/config.yml b/static/admin/config.yml index 9a6fb1c..4033f74 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -162,3 +162,14 @@ collections: - {label: "Rating", name: "rating", widget: "number", min: 1, max: 5, required: false} - {label: "Date", name: "date", widget: "date", required: false} - {label: "Featured", name: "featured", widget: "boolean", default: false} + + - name: "newsletter" + label: "Newsletter" + files: + - name: "newsletter_settings" + label: "Newsletter Settings" + file: "data/site/settings.yaml" + fields: + - {label: "Enable Newsletter", name: "enable_newsletter", widget: "boolean", default: true} + - {label: "Listmonk List ID", name: "listmonk_list_id", widget: "number", default: 17, required: false} + - {label: "Listmonk API Token", name: "listmonk_api_token", widget: "string", required: false}