From c48fb7cb55b9d99c21fbf92b16f5570521d2dafd Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Sun, 30 Nov 2025 22:18:47 -0800 Subject: [PATCH] =?UTF-8?q?Add=20=F0=9F=94=AE=20emoji=20favicon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/layout.tsx | 3 + app/page.tsx | 2 + components/newsletter-signup.tsx | 95 ++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 components/newsletter-signup.tsx diff --git a/app/layout.tsx b/app/layout.tsx index 42ce443..b9bac46 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -17,6 +17,9 @@ export const metadata: Metadata = { description: "Exploring mycoeconomics and post-capitalist alternatives to neoliberalism", type: "website", }, + icons: { + icon: "data:image/svg+xml,🔮", + }, } export default function RootLayout({ diff --git a/app/page.tsx b/app/page.tsx index 9b9908a..2c34b21 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -4,6 +4,7 @@ import { AlternativesSection } from "@/components/alternatives-section" import { CritiqueSection } from "@/components/critique-section" import { PostAppitalismSection } from "@/components/post-appitalism-section" import { ActionSection } from "@/components/action-section" +import { NewsletterSignup } from "@/components/newsletter-signup" import { Navigation } from "@/components/navigation" export default function HomePage() { @@ -16,6 +17,7 @@ export default function HomePage() { + ) } diff --git a/components/newsletter-signup.tsx b/components/newsletter-signup.tsx new file mode 100644 index 0000000..d6f9692 --- /dev/null +++ b/components/newsletter-signup.tsx @@ -0,0 +1,95 @@ +"use client" + +import { useState } from "react" + +const LISTMONK_URL = "https://newsletter.jeffemmett.com" +const LIST_UUID = "df598d1a-4bed-4a8b-8c36-a5a6346febf0" // Trippin list + +export function NewsletterSignup() { + const [email, setEmail] = useState("") + const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle") + const [message, setMessage] = useState("") + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + + if (!email) return + + setStatus("loading") + + try { + const response = await fetch(`${LISTMONK_URL}/subscription/form`, { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + email: email, + list: LIST_UUID, + name: "", + }), + }) + + if (response.ok) { + setStatus("success") + setMessage("Check your email to confirm your subscription!") + setEmail("") + } else { + throw new Error("Subscription failed") + } + } catch { + setStatus("error") + setMessage("Something went wrong. Please try again.") + } + } + + return ( +
+
+
+
+

+ Keep Trippin' +

+

+ Subscribe for updates on psychedelic exploration + and consciousness expansion. +

+
+ + {status === "success" ? ( +
+ {message} +
+ ) : ( +
+ setEmail(e.target.value)} + required + className="flex-1 px-4 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary/50" + /> + +
+ )} + + {status === "error" && ( +

{message}

+ )} + +

+ No spam, unsubscribe anytime. We respect your privacy. +

+
+
+
+ ) +}