feat: add "coming soon" shop page with email signup

Create stylish placeholder page for MycoFi shop with branding and email form.

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
This commit is contained in:
v0 2025-10-07 00:02:35 +00:00
parent 4600517d80
commit d412dc2d05
2 changed files with 86 additions and 0 deletions

65
app/shop/page.tsx Normal file
View File

@ -0,0 +1,65 @@
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { ArrowLeft, ShoppingBag, Sparkles } from "lucide-react"
export default function ShopPage() {
return (
<div className="relative min-h-screen bg-background">
{/* Background Pattern */}
<div className="absolute inset-0 opacity-5">
<div className="absolute inset-0 bg-[radial-gradient(circle_at_50%_50%,_hsl(var(--primary))_1px,_transparent_1px)] bg-[size:24px_24px]" />
</div>
{/* Content */}
<div className="relative flex min-h-screen flex-col items-center justify-center px-4 py-16">
<Link
href="/"
className="absolute left-4 top-4 inline-flex items-center gap-2 text-sm text-muted-foreground transition-colors hover:text-foreground md:left-8 md:top-8"
>
<ArrowLeft className="h-4 w-4" />
Back to MycoFi
</Link>
<div className="mx-auto max-w-2xl text-center">
{/* Icon */}
<div className="mb-8 inline-flex items-center justify-center rounded-full bg-primary/10 p-6">
<ShoppingBag className="h-16 w-16 text-primary" />
</div>
{/* Title */}
<h1 className="mb-4 font-serif text-5xl font-bold text-foreground md:text-6xl">MycoFi Swag</h1>
<div className="mb-6 inline-flex items-center gap-2 rounded-full bg-secondary/20 px-4 py-2 text-sm font-medium text-secondary">
<Sparkles className="h-4 w-4" />
<span>Coming Soon</span>
</div>
{/* Description */}
<p className="mb-12 text-lg leading-relaxed text-muted-foreground">
We're cultivating something special. Soon you'll be able to wear the mycelial revolution with exclusive
MycoFi merchandise, books, and more.
</p>
{/* Email Signup */}
<div className="mx-auto max-w-md">
<form className="flex flex-col gap-3 sm:flex-row">
<Input type="email" placeholder="Enter your email" className="flex-1 bg-card" />
<Button type="submit" className="whitespace-nowrap">
Notify Me
</Button>
</form>
<p className="mt-3 text-xs text-muted-foreground">Be the first to know when the shop launches</p>
</div>
{/* Decorative Elements */}
<div className="mt-16 flex items-center justify-center gap-8 text-muted-foreground/30">
<div className="h-px w-16 bg-current" />
<span className="text-sm">Growing Soon</span>
<div className="h-px w-16 bg-current" />
</div>
</div>
</div>
</div>
)
}

21
components/ui/input.tsx Normal file
View File

@ -0,0 +1,21 @@
import * as React from 'react'
import { cn } from '@/lib/utils'
function Input({ className, type, ...props }: React.ComponentProps<'input'>) {
return (
<input
type={type}
data-slot="input"
className={cn(
'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',
'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
className,
)}
{...props}
/>
)
}
export { Input }