4 Commits

Author SHA1 Message Date
kudinDmitriyUp
1d9c6377e5 Bob AI: Replaced contact CTA with a contact form 2026-06-03 03:58:57 +00:00
9b910659c8 Merge version_3_1780456645084 into main
Merge version_3_1780456645084 into main
2026-06-03 03:19:12 +00:00
kudinDmitriyUp
f49e25e232 Bob AI: Added images and purchase buttons to menu items 2026-06-03 03:18:26 +00:00
a1c6d7e302 Merge version_2_1780442569226 into main
Merge version_2_1780442569226 into main
2026-06-02 23:24:36 +00:00
2 changed files with 104 additions and 48 deletions

View File

@@ -4,24 +4,72 @@
import React from 'react'; import React from 'react';
import ContactCta from '@/components/sections/contact/ContactCta'; import ContactCta from '@/components/sections/contact/ContactCta';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary"; import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import Tag from "@/components/ui/Tag";
export default function ContactSection(): React.JSX.Element { export default function ContactSection(): React.JSX.Element {
return ( return (
<div id="contact" data-section="contact"> <div id="contact" data-webild-section="contact" className="py-24 bg-background">
<SectionErrorBoundary name="contact"> <SectionErrorBoundary name="contact">
<ContactCta <div className="container mx-auto px-4 max-w-3xl">
tag="Connect With Us" <div className="text-center mb-12">
text="Ready for your perfect cup or want to learn more? Visit Joes Coffee and experience the difference, or reach out to our friendly team." <Tag text="Get in Touch" className="mb-4" />
primaryButton={{ <h2 className="text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4">Contact Us</h2>
text: "Get Directions", <p className="text-lg text-muted-foreground">
href: "https://www.google.com/maps/search/joes+coffee", Have a question or want to learn more? Fill out the form below and our team will get back to you as soon as possible.
}} </p>
secondaryButton={{ </div>
text: "Call Us Now",
href: "tel:+1234567890", <form className="space-y-6 bg-card p-8 rounded-2xl border border-border shadow-sm" onSubmit={(e) => e.preventDefault()}>
}} <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
/> <div className="space-y-2">
</SectionErrorBoundary> <label htmlFor="firstName" className="text-sm font-medium text-foreground">First Name</label>
</div> <input
type="text"
id="firstName"
className="w-full px-4 py-3 rounded-lg border border-border bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground/20 transition-colors"
placeholder="John"
/>
</div>
<div className="space-y-2">
<label htmlFor="lastName" className="text-sm font-medium text-foreground">Last Name</label>
<input
type="text"
id="lastName"
className="w-full px-4 py-3 rounded-lg border border-border bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground/20 transition-colors"
placeholder="Doe"
/>
</div>
</div>
<div className="space-y-2">
<label htmlFor="email" className="text-sm font-medium text-foreground">Email Address</label>
<input
type="email"
id="email"
className="w-full px-4 py-3 rounded-lg border border-border bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground/20 transition-colors"
placeholder="john@example.com"
/>
</div>
<div className="space-y-2">
<label htmlFor="message" className="text-sm font-medium text-foreground">Message</label>
<textarea
id="message"
rows={5}
className="w-full px-4 py-3 rounded-lg border border-border bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground/20 transition-colors resize-none"
placeholder="How can we help you?"
></textarea>
</div>
<button
type="submit"
className="w-full py-4 px-6 rounded-full bg-foreground text-background font-medium hover:opacity-90 transition-opacity"
>
Send Message
</button>
</form>
</div>
</SectionErrorBoundary>
</div>
); );
} }

View File

@@ -5,42 +5,50 @@ import React from 'react';
import Tag from "@/components/ui/Tag"; import Tag from "@/components/ui/Tag";
import ScrollReveal from "@/components/ui/ScrollReveal"; import ScrollReveal from "@/components/ui/ScrollReveal";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary"; import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import Button from "@/components/ui/Button";
export default function MenuSection(): React.JSX.Element { export default function MenuSection(): React.JSX.Element {
return ( return (
<div id="menu" data-webild-section="menu" className="py-24 bg-background"> <div id="menu" data-webild-section="menu" className="py-24 bg-background">
<div className="container mx-auto px-4 max-w-4xl"> <div className="container mx-auto px-4 max-w-6xl">
<div className="text-center mb-16"> <div className="text-center mb-16">
<Tag text="Our Menu" className="mb-4" /> <Tag text="Our Menu" className="mb-4" />
<h2 className="text-4xl md:text-5xl font-bold text-foreground mb-6">Crafted for You</h2> <h2 className="text-4xl md:text-5xl font-bold text-foreground mb-6">Crafted for You</h2>
<p className="text-muted-foreground text-lg max-w-2xl mx-auto"> <p className="text-muted-foreground text-lg max-w-2xl mx-auto">
Explore our carefully curated selection of coffees, teas, and fresh pastries. Every item is prepared with passion and the finest ingredients. Explore our carefully curated selection of coffees, teas, and fresh pastries. Every item is prepared with passion and the finest ingredients.
</p> </p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{[
{ name: "Classic Espresso", description: "Rich, concentrated shot of pure coffee essence.", price: "$3.00", imageSrc: "https://images.unsplash.com/photo-1510591509098-f4fdc6d0ff04?auto=format&fit=crop&q=80&w=800" },
{ name: "Vanilla Bean Latte", description: "Smooth espresso blended with steamed milk and real vanilla bean syrup.", price: "$4.50", imageSrc: "https://images.unsplash.com/photo-1572442388796-11668a67e53d?auto=format&fit=crop&q=80&w=800" },
{ name: "Caramel Macchiato", description: "Steamed milk with vanilla-flavored syrup, marked with espresso and caramel drizzle.", price: "$4.75", imageSrc: "https://images.unsplash.com/photo-1485808191679-5f86510681a2?auto=format&fit=crop&q=80&w=800" },
{ name: "Mocha Frappuccino", description: "Coffee blended with mocha sauce, milk, and ice, topped with whipped cream.", price: "$5.00", imageSrc: "https://images.unsplash.com/photo-1572490122747-3968b75cc699?auto=format&fit=crop&q=80&w=800" },
{ name: "Nitro Cold Brew", description: "Our signature cold brew infused with nitrogen for a sweet flavor and velvety crema.", price: "$4.25", imageSrc: "https://images.unsplash.com/photo-1461023058943-07fcbe16d735?auto=format&fit=crop&q=80&w=800" },
{ name: "Iced Americano", description: "Espresso shots topped with cold water produce a light layer of crema, then served over ice.", price: "$3.50", imageSrc: "https://images.unsplash.com/photo-1517701550927-30cf4ba1dba5?auto=format&fit=crop&q=80&w=800" },
{ name: "Matcha Green Tea Latte", description: "Smooth and creamy matcha lightly sweetened and served with steamed milk.", price: "$4.50", imageSrc: "https://images.unsplash.com/photo-1536514072410-5019a3c69182?auto=format&fit=crop&q=80&w=800" },
{ name: "Chai Tea Latte", description: "Black tea infused with cinnamon, clove, and other warming spices, combined with steamed milk.", price: "$4.25", imageSrc: "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&q=80&w=800" },
{ name: "Artisan Butter Croissant", description: "Flaky, buttery, and baked fresh daily.", price: "$3.25", imageSrc: "https://images.unsplash.com/photo-1555507036-ab1f4038808a?auto=format&fit=crop&q=80&w=800" },
{ name: "Blueberry Muffin", description: "Moist muffin bursting with fresh blueberries and topped with a crumbly streusel.", price: "$3.50", imageSrc: "https://images.unsplash.com/photo-1607958996333-41aef7caefaa?auto=format&fit=crop&q=80&w=800" }
].map((item, index) => (
<ScrollReveal key={index} variant="slide-up" className="flex flex-col bg-card rounded-xl overflow-hidden border border-border">
<div className="h-48 w-full relative">
<ImageOrVideo imageSrc={item.imageSrc} className="w-full h-full object-cover" />
</div>
<div className="p-6 flex flex-col flex-grow">
<div className="flex justify-between items-start mb-2">
<h3 className="text-xl font-semibold text-foreground pr-4">{item.name}</h3>
<span className="text-lg font-bold text-foreground whitespace-nowrap">{item.price}</span>
</div>
<p className="text-muted-foreground text-sm mb-6 flex-grow">{item.description}</p>
<Button text="Purchase" variant="primary" className="w-full justify-center" />
</div>
</ScrollReveal>
))}
</div>
</div>
</div> </div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-12 gap-y-8">
{[
{ name: "Classic Espresso", description: "Rich, concentrated shot of pure coffee essence.", price: "$3.00" },
{ name: "Vanilla Bean Latte", description: "Smooth espresso blended with steamed milk and real vanilla bean syrup.", price: "$4.50" },
{ name: "Caramel Macchiato", description: "Steamed milk with vanilla-flavored syrup, marked with espresso and caramel drizzle.", price: "$4.75" },
{ name: "Mocha Frappuccino", description: "Coffee blended with mocha sauce, milk, and ice, topped with whipped cream.", price: "$5.00" },
{ name: "Nitro Cold Brew", description: "Our signature cold brew infused with nitrogen for a sweet flavor and velvety crema.", price: "$4.25" },
{ name: "Iced Americano", description: "Espresso shots topped with cold water produce a light layer of crema, then served over ice.", price: "$3.50" },
{ name: "Matcha Green Tea Latte", description: "Smooth and creamy matcha lightly sweetened and served with steamed milk.", price: "$4.50" },
{ name: "Chai Tea Latte", description: "Black tea infused with cinnamon, clove, and other warming spices, combined with steamed milk.", price: "$4.25" },
{ name: "Artisan Butter Croissant", description: "Flaky, buttery, and baked fresh daily.", price: "$3.25" },
{ name: "Blueberry Muffin", description: "Moist muffin bursting with fresh blueberries and topped with a crumbly streusel.", price: "$3.50" }
].map((item, index) => (
<ScrollReveal key={index} variant="slide-up" className="flex flex-col border-b border-border pb-4">
<div className="flex justify-between items-baseline mb-2">
<h3 className="text-xl font-semibold text-foreground">{item.name}</h3>
<span className="text-lg font-medium text-foreground">{item.price}</span>
</div>
<p className="text-muted-foreground text-sm">{item.description}</p>
</ScrollReveal>
))}
</div>
</div>
</div>
); );
} }