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 = {
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() {
@ -24,26 +24,40 @@ export default function AboutPage() {
<div>
<div className="aspect-square rounded-xl overflow-hidden bg-primary/5 shadow-lg">
<img
src="/sammy-davis-in-garden-with-plants-and-soil.jpg"
alt="Sammy Davis in her garden"
src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/IMG_20251102_112209_994-Qtj9Sw0JJKHHgRB19y63rB4gvU3rBS.jpg"
alt="Sammy Davies in moss-covered forest with composting structure"
className="w-full h-full object-cover"
/>
</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">
<p>
Sammy Davis is a passionate advocate for sustainable living, regenerative agriculture, and the
profound connection between human consciousness and the natural world.
Sammy Davies is the Director of Sustainability and Brand at EcoSafe Zero Waste, based in Surrey,
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>
With a background in environmental science and a deep love for storytelling, Sammy created Soul
Speaks Soil to bridge the gap between ancient wisdom and modern sustainability practices.
With a diverse career spanning sustainability, social media, and entrepreneurship, Sammy has held
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>
Through authentic conversations with farmers, activists, artists, and thought leaders, Sammy
explores how we can cultivate a more harmonious relationship with the earth and each other.
Sammy holds a Bachelor of Arts from Wilfrid Laurier University, a certificate from BrainStation,
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>
</div>
<div className="flex gap-4 mt-8">
@ -63,8 +77,33 @@ export default function AboutPage() {
</div>
</section>
{/* About the Podcast Section */}
<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="max-w-5xl mx-auto">
<div className="text-center mb-12">
@ -147,7 +186,7 @@ export default function AboutPage() {
</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="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>

View File

@ -6,7 +6,7 @@ import { Mail, Instagram, Music, MessageSquare } from "lucide-react"
export const metadata = {
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() {

View File

@ -86,6 +86,20 @@ export default function EpisodesPage() {
<Navigation />
<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 */}
<section className="px-4 sm:px-6 lg:px-8 py-12 bg-muted/30 organic-texture">
<div className="container mx-auto">

View File

@ -77,8 +77,11 @@
}
@theme inline {
--font-sans: "Geist", "Geist Fallback";
--font-mono: "Geist Mono", "Geist Mono Fallback";
/* Updated font variables for stylized, organic typography */
--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-foreground: var(--foreground);
--color-card: var(--card);

View File

@ -1,14 +1,29 @@
import type React from "react"
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 "./globals.css"
const _geist = Geist({ subsets: ["latin"] })
const _geistMono = Geist_Mono({ subsets: ["latin"] })
const playfair = Playfair_Display({
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 = {
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",
generator: "v0.app",
}
@ -20,7 +35,7 @@ export default function RootLayout({
}>) {
return (
<html lang="en">
<body className={`font-sans antialiased`}>
<body className={`${playfair.variable} ${crimson.variable} ${libre.variable} font-body antialiased`}>
{children}
<Analytics />
</body>

View File

@ -18,12 +18,12 @@ export default function HomePage() {
<Sprout className="h-4 w-4" />
<span>Where Soul Meets Soil</span>
</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
</h1>
<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
the earth beneath our feet.
Join host Sammy Davies for deep conversations exploring the profound connection between our inner world
and the earth beneath our feet.
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<Button asChild size="lg" className="text-lg">
@ -40,23 +40,59 @@ export default function HomePage() {
</div>
</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">
<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">
<img
src="/close-up-of-rich-dark-soil-with-green-moss-and-f.jpg"
alt="Rich soil with moss and ferns - Soul Speaks Soil Podcast"
className="w-full h-full object-cover"
/>
<div className="max-w-3xl mx-auto">
<div className="flex flex-col md:flex-row gap-8 items-center">
<div className="w-48 h-48 rounded-full overflow-hidden bg-primary/5 shadow-lg flex-shrink-0">
<img
src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/images%20%281%29-olhoH5SYKWP3oh7CsSHrhNrGws8GFU.jpeg"
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>
</section>
{/* 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="max-w-4xl mx-auto">
<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">
<Heart className="h-6 w-6 text-primary" />
</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">
Real, unfiltered discussions about sustainability, growth, and connection.
</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">
<Users className="h-6 w-6 text-primary" />
</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">
Featuring farmers, activists, artists, and thought leaders.
</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">
<Sprout className="h-6 w-6 text-primary" />
</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">
Exploring our relationship with the earth and each other.
</p>
@ -121,7 +157,7 @@ export default function HomePage() {
</div>
<div className="container mx-auto relative z-10">
<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">
Follow us on Instagram for behind-the-scenes content, episode updates, and community discussions.
</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">
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
<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
</Link>

View File

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