feat: configure Next.js for static export to CloudFlare Pages

Enable static site generation and set output directory to /out

#VERCEL_SKIP

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
This commit is contained in:
v0 2025-11-02 19:29:23 +00:00
parent 2a9dad0fe9
commit fcbfd55b8c
8 changed files with 146 additions and 37 deletions

View File

@ -7,7 +7,7 @@ import Link from "next/link"
export const metadata = { export const metadata = {
title: "About | Soul Speaks Soil", title: "About | Soul Speaks Soil",
description: "Learn about Sammy Davis and the Soul Speaks Soil podcast", description: "Learn about Sammy Davies and the Soul Speaks Soil podcast",
} }
export default function AboutPage() { export default function AboutPage() {
@ -24,26 +24,40 @@ export default function AboutPage() {
<div> <div>
<div className="aspect-square rounded-xl overflow-hidden bg-primary/5 shadow-lg"> <div className="aspect-square rounded-xl overflow-hidden bg-primary/5 shadow-lg">
<img <img
src="/sammy-davis-in-garden-with-plants-and-soil.jpg" src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/IMG_20251102_112209_994-Qtj9Sw0JJKHHgRB19y63rB4gvU3rBS.jpg"
alt="Sammy Davis in her garden" alt="Sammy Davies in moss-covered forest with composting structure"
className="w-full h-full object-cover" className="w-full h-full object-cover"
/> />
</div> </div>
</div> </div>
<div> <div>
<h1 className="text-4xl sm:text-5xl font-bold text-foreground mb-6 text-balance">Meet Sammy Davis</h1> <h1 className="text-4xl sm:text-5xl font-bold text-foreground mb-6 text-balance">
Meet Sammy Davies
</h1>
<div className="space-y-4 text-muted-foreground leading-relaxed"> <div className="space-y-4 text-muted-foreground leading-relaxed">
<p> <p>
Sammy Davis is a passionate advocate for sustainable living, regenerative agriculture, and the Sammy Davies is the Director of Sustainability and Brand at EcoSafe Zero Waste, based in Surrey,
profound connection between human consciousness and the natural world. British Columbia. She is also an MBA Candidate in Sustainable Innovation at the Schulich School of
Business, York University, where she continues to deepen her expertise in circular economy and
regenerative business models.
</p> </p>
<p> <p>
With a background in environmental science and a deep love for storytelling, Sammy created Soul With a diverse career spanning sustainability, social media, and entrepreneurship, Sammy has held
Speaks Soil to bridge the gap between ancient wisdom and modern sustainability practices. roles including Manager of Sustainability Programs at EcoSafe Zero Waste, Manager of Social Media
at Open Ocean Robotics, and Co-Founder of OneLoop.appa venture focused on circular economy
solutions. Her professional journey also includes experience at Aurora Cannabis, XE.com, Long
Point Eco-Adventures, and the Grand River Conservation Authority.
</p> </p>
<p> <p>
Through authentic conversations with farmers, activists, artists, and thought leaders, Sammy Sammy holds a Bachelor of Arts from Wilfrid Laurier University, a certificate from BrainStation,
explores how we can cultivate a more harmonious relationship with the earth and each other. and has completed advanced training at Bear Waters Gathering. Her work focuses on soil health
advocacy, composting education, systems thinking, and regenerative storytellingtranslating
sustainability goals into actionable business development while building trust across the
composting and circular bioeconomy ecosystem.
</p>
<p>
Through Soul Speaks Soil, Sammy shares her passion for building models that align policy, circular
economy, and community resiliencerooted in place and designed for lasting impact.
</p> </p>
</div> </div>
<div className="flex gap-4 mt-8"> <div className="flex gap-4 mt-8">
@ -63,8 +77,33 @@ export default function AboutPage() {
</div> </div>
</section> </section>
{/* About the Podcast Section */}
<section className="px-4 sm:px-6 lg:px-8 py-16 bg-muted/30 organic-texture"> <section className="px-4 sm:px-6 lg:px-8 py-16 bg-muted/30 organic-texture">
<div className="container mx-auto">
<div className="max-w-5xl mx-auto">
<div className="aspect-video rounded-xl overflow-hidden bg-primary/5 shadow-lg mb-8">
<img
src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/IMG_20251102_112203_809-qlO7ndE3aT5sOPWioTlv9j69EyUiRF.jpg"
alt="Sammy Davies working in her garden with composting systems and sustainable infrastructure"
className="w-full h-full object-cover"
/>
</div>
<div className="text-center max-w-3xl mx-auto">
<h2 className="text-2xl sm:text-3xl font-bold text-foreground mb-4 text-balance">
Living the Practice
</h2>
<p className="text-muted-foreground leading-relaxed text-pretty">
Sammy doesn't just talk about sustainabilityshe lives it. Her homestead in Greater Victoria serves as
a living laboratory for composting, regenerative practices, and circular systems. From hands-on
composting education to building resilient food systems, Sammy bridges the gap between theory and
practice.
</p>
</div>
</div>
</div>
</section>
{/* About the Podcast Section */}
<section className="px-4 sm:px-6 lg:px-8 py-16 mycelial-pattern">
<div className="container mx-auto"> <div className="container mx-auto">
<div className="max-w-5xl mx-auto"> <div className="max-w-5xl mx-auto">
<div className="text-center mb-12"> <div className="text-center mb-12">
@ -147,7 +186,7 @@ export default function AboutPage() {
</section> </section>
{/* Consulting Section */} {/* Consulting Section */}
<section className="px-4 sm:px-6 lg:px-8 py-16 mycelial-pattern"> <section className="px-4 sm:px-6 lg:px-8 py-16 bg-muted/30 organic-texture">
<div className="container mx-auto"> <div className="container mx-auto">
<div className="max-w-3xl mx-auto text-center"> <div className="max-w-3xl mx-auto text-center">
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4 text-balance">Work with Sammy</h2> <h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4 text-balance">Work with Sammy</h2>

View File

@ -6,7 +6,7 @@ import { Mail, Instagram, Music, MessageSquare } from "lucide-react"
export const metadata = { export const metadata = {
title: "Contact | Soul Speaks Soil", title: "Contact | Soul Speaks Soil",
description: "Get in touch with Sammy Davis for consulting, podcast collaborations, and more", description: "Get in touch with Sammy Davies for consulting, podcast collaborations, and more",
} }
export default function ContactPage() { export default function ContactPage() {

View File

@ -86,6 +86,20 @@ export default function EpisodesPage() {
<Navigation /> <Navigation />
<main className="flex-1 pt-24 pb-16"> <main className="flex-1 pt-24 pb-16">
<section className="px-4 sm:px-6 lg:px-8 pt-12 pb-8">
<div className="container mx-auto">
<div className="max-w-4xl mx-auto">
<div className="aspect-video rounded-xl overflow-hidden bg-primary/5 shadow-lg mb-8">
<img
src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/IMG_20251102_112213_925-XnDB5Tj5KFyS6c2Wr6RZVmZfqeQ1FG.jpg"
alt="Stone sculpture with moss crown - where soul speaks soil"
className="w-full h-full object-cover"
/>
</div>
</div>
</div>
</section>
{/* Header Section with organic texture */} {/* Header Section with organic texture */}
<section className="px-4 sm:px-6 lg:px-8 py-12 bg-muted/30 organic-texture"> <section className="px-4 sm:px-6 lg:px-8 py-12 bg-muted/30 organic-texture">
<div className="container mx-auto"> <div className="container mx-auto">

View File

@ -77,8 +77,11 @@
} }
@theme inline { @theme inline {
--font-sans: "Geist", "Geist Fallback"; /* Updated font variables for stylized, organic typography */
--font-mono: "Geist Mono", "Geist Mono Fallback"; --font-display: "Playfair Display", "Playfair Display Fallback", serif;
--font-body: "Crimson Text", "Crimson Text Fallback", serif;
--font-serif: "Libre Baskerville", "Libre Baskerville Fallback", serif;
--font-sans: var(--font-body);
--color-background: var(--background); --color-background: var(--background);
--color-foreground: var(--foreground); --color-foreground: var(--foreground);
--color-card: var(--card); --color-card: var(--card);

View File

@ -1,14 +1,29 @@
import type React from "react" import type React from "react"
import type { Metadata } from "next" import type { Metadata } from "next"
import { Geist, Geist_Mono } from "next/font/google" import { Crimson_Text, Libre_Baskerville, Playfair_Display } from "next/font/google"
import { Analytics } from "@vercel/analytics/next" import { Analytics } from "@vercel/analytics/next"
import "./globals.css" import "./globals.css"
const _geist = Geist({ subsets: ["latin"] }) const playfair = Playfair_Display({
const _geistMono = Geist_Mono({ subsets: ["latin"] }) subsets: ["latin"],
weight: ["400", "500", "600", "700", "800", "900"],
variable: "--font-display",
})
const crimson = Crimson_Text({
subsets: ["latin"],
weight: ["400", "600", "700"],
variable: "--font-body",
})
const libre = Libre_Baskerville({
subsets: ["latin"],
weight: ["400", "700"],
variable: "--font-serif",
})
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Soul Speaks Soil | A Podcast by Sammy Davis", title: "Soul Speaks Soil | A Podcast by Sammy Davies",
description: "Exploring the connection between soul and soil through meaningful conversations", description: "Exploring the connection between soul and soil through meaningful conversations",
generator: "v0.app", generator: "v0.app",
} }
@ -20,7 +35,7 @@ export default function RootLayout({
}>) { }>) {
return ( return (
<html lang="en"> <html lang="en">
<body className={`font-sans antialiased`}> <body className={`${playfair.variable} ${crimson.variable} ${libre.variable} font-body antialiased`}>
{children} {children}
<Analytics /> <Analytics />
</body> </body>

View File

@ -18,12 +18,12 @@ export default function HomePage() {
<Sprout className="h-4 w-4" /> <Sprout className="h-4 w-4" />
<span>Where Soul Meets Soil</span> <span>Where Soul Meets Soil</span>
</div> </div>
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-bold text-foreground mb-6 text-balance"> <h1 className="text-5xl sm:text-6xl lg:text-7xl font-display font-bold text-foreground mb-6 text-balance tracking-tight">
Soul Speaks Soil Soul Speaks Soil
</h1> </h1>
<p className="text-xl text-muted-foreground mb-8 leading-relaxed text-pretty"> <p className="text-xl text-muted-foreground mb-8 leading-relaxed text-pretty">
Join host Sammy Davis for deep conversations exploring the profound connection between our inner world and Join host Sammy Davies for deep conversations exploring the profound connection between our inner world
the earth beneath our feet. and the earth beneath our feet.
</p> </p>
<div className="flex flex-col sm:flex-row gap-4 justify-center"> <div className="flex flex-col sm:flex-row gap-4 justify-center">
<Button asChild size="lg" className="text-lg"> <Button asChild size="lg" className="text-lg">
@ -40,23 +40,59 @@ export default function HomePage() {
</div> </div>
</section> </section>
{/* Featured Image Section with soil and moss imagery */}
<section className="py-12 px-4 sm:px-6 lg:px-8 bg-muted/30 organic-texture"> <section className="py-12 px-4 sm:px-6 lg:px-8 bg-muted/30 organic-texture">
<div className="container mx-auto"> <div className="container mx-auto">
<div className="max-w-5xl mx-auto"> <div className="max-w-3xl mx-auto">
<div className="aspect-video rounded-xl overflow-hidden bg-primary/5 shadow-lg"> <div className="flex flex-col md:flex-row gap-8 items-center">
<img <div className="w-48 h-48 rounded-full overflow-hidden bg-primary/5 shadow-lg flex-shrink-0">
src="/close-up-of-rich-dark-soil-with-green-moss-and-f.jpg" <img
alt="Rich soil with moss and ferns - Soul Speaks Soil Podcast" src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/images%20%281%29-olhoH5SYKWP3oh7CsSHrhNrGws8GFU.jpeg"
className="w-full h-full object-cover" alt="Sammy Davies - Host of Soul Speaks Soil"
/> className="w-full h-full object-cover"
/>
</div>
<div className="text-center md:text-left">
<h2 className="text-2xl sm:text-3xl font-display font-bold text-foreground mb-3 text-balance">
Hosted by Sammy Davies
</h2>
<p className="text-muted-foreground leading-relaxed text-pretty">
Director of Sustainability & Brand at EcoSafe Zero Waste, MBA Candidate in Sustainable Innovation, and
passionate advocate for soil health, composting education, and regenerative storytelling.
</p>
<Button asChild variant="outline" className="mt-4 bg-transparent">
<Link href="/about">Learn More About Sammy</Link>
</Button>
</div>
</div>
</div>
</div>
</section>
<section className="py-16 px-4 sm:px-6 lg:px-8 mycelial-pattern">
<div className="container mx-auto">
<div className="max-w-6xl mx-auto">
<div className="grid md:grid-cols-2 gap-6">
<div className="aspect-square rounded-xl overflow-hidden bg-primary/5 shadow-lg">
<img
src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/IMG_20251102_112213_925-XnDB5Tj5KFyS6c2Wr6RZVmZfqeQ1FG.jpg"
alt="Stone sculpture with moss crown - embodying the soul speaks soil philosophy"
className="w-full h-full object-cover"
/>
</div>
<div className="aspect-square rounded-xl overflow-hidden bg-primary/5 shadow-lg">
<img
src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/IMG_20251102_112207_223-IXghjBiGqE5Eu3b7U3lVXN1spTvTgn.jpg"
alt="Vibrant green moss growing on decaying wood - the cycle of life and soil"
className="w-full h-full object-cover"
/>
</div>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
{/* About Preview Section with organic texture background */} {/* About Preview Section with organic texture background */}
<section className="py-16 px-4 sm:px-6 lg:px-8 mycelial-pattern"> <section className="py-16 px-4 sm:px-6 lg:px-8 bg-muted/30 organic-texture">
<div className="container mx-auto"> <div className="container mx-auto">
<div className="max-w-4xl mx-auto"> <div className="max-w-4xl mx-auto">
<div className="grid md:grid-cols-3 gap-8"> <div className="grid md:grid-cols-3 gap-8">
@ -66,7 +102,7 @@ export default function HomePage() {
<div className="h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center mb-4"> <div className="h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center mb-4">
<Heart className="h-6 w-6 text-primary" /> <Heart className="h-6 w-6 text-primary" />
</div> </div>
<h3 className="text-lg font-semibold text-foreground mb-2">Authentic Conversations</h3> <h3 className="text-lg font-display font-semibold text-foreground mb-2">Authentic Conversations</h3>
<p className="text-muted-foreground leading-relaxed"> <p className="text-muted-foreground leading-relaxed">
Real, unfiltered discussions about sustainability, growth, and connection. Real, unfiltered discussions about sustainability, growth, and connection.
</p> </p>
@ -80,7 +116,7 @@ export default function HomePage() {
<div className="h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center mb-4"> <div className="h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center mb-4">
<Users className="h-6 w-6 text-primary" /> <Users className="h-6 w-6 text-primary" />
</div> </div>
<h3 className="text-lg font-semibold text-foreground mb-2">Diverse Guests</h3> <h3 className="text-lg font-display font-semibold text-foreground mb-2">Diverse Guests</h3>
<p className="text-muted-foreground leading-relaxed"> <p className="text-muted-foreground leading-relaxed">
Featuring farmers, activists, artists, and thought leaders. Featuring farmers, activists, artists, and thought leaders.
</p> </p>
@ -94,7 +130,7 @@ export default function HomePage() {
<div className="h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center mb-4"> <div className="h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center mb-4">
<Sprout className="h-6 w-6 text-primary" /> <Sprout className="h-6 w-6 text-primary" />
</div> </div>
<h3 className="text-lg font-semibold text-foreground mb-2">Rooted in Nature</h3> <h3 className="text-lg font-display font-semibold text-foreground mb-2">Rooted in Nature</h3>
<p className="text-muted-foreground leading-relaxed"> <p className="text-muted-foreground leading-relaxed">
Exploring our relationship with the earth and each other. Exploring our relationship with the earth and each other.
</p> </p>
@ -121,7 +157,7 @@ export default function HomePage() {
</div> </div>
<div className="container mx-auto relative z-10"> <div className="container mx-auto relative z-10">
<div className="max-w-3xl mx-auto text-center"> <div className="max-w-3xl mx-auto text-center">
<h2 className="text-3xl sm:text-4xl font-bold mb-4 text-balance">Join the Conversation</h2> <h2 className="text-3xl sm:text-4xl font-display font-bold mb-4 text-balance">Join the Conversation</h2>
<p className="text-lg mb-8 opacity-90 leading-relaxed text-pretty"> <p className="text-lg mb-8 opacity-90 leading-relaxed text-pretty">
Follow us on Instagram for behind-the-scenes content, episode updates, and community discussions. Follow us on Instagram for behind-the-scenes content, episode updates, and community discussions.
</p> </p>

View File

@ -12,7 +12,7 @@ export function Navigation() {
<nav className="fixed top-0 left-0 right-0 z-50 bg-background/85 backdrop-blur-lg border-b border-border"> <nav className="fixed top-0 left-0 right-0 z-50 bg-background/85 backdrop-blur-lg border-b border-border">
<div className="container mx-auto px-4 sm:px-6 lg:px-8"> <div className="container mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex items-center justify-between h-16"> <div className="flex items-center justify-between h-16">
<Link href="/" className="text-xl font-bold text-foreground"> <Link href="/" className="text-xl sm:text-2xl font-display font-bold text-foreground tracking-tight">
Soul Speaks Soil Soul Speaks Soil
</Link> </Link>

View File

@ -1,5 +1,7 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
output: 'export',
distDir: 'out',
eslint: { eslint: {
ignoreDuringBuilds: true, ignoreDuringBuilds: true,
}, },