11 Commits

Author SHA1 Message Date
5d4bc734a3 Merge version_3_1777459733825 into main
Merge version_3_1777459733825 into main
2026-04-29 10:55:02 +00:00
vitalijmulika
56c81c5e87 Bob AI: Update the routing configuration to include the new About an 2026-04-29 13:54:57 +03:00
vitalijmulika
d525c5e6ee Bob AI: Create the Menu page file and define its basic content struc 2026-04-29 13:51:41 +03:00
vitalijmulika
6a2deb101a Bob AI: Create the About page file and define its basic content stru 2026-04-29 13:50:22 +03:00
76f40e1ad4 Merge version_2_1777459321829 into main
Merge version_2_1777459321829 into main
2026-04-29 10:47:39 +00:00
vitalijmulika
df238ffb67 Bob AI: Create the 'Policy' and 'Terms' pages and update the navigat 2026-04-29 13:47:35 +03:00
vitalijmulika
869d90549d Bob AI: fix build errors (attempt 1) 2026-04-29 13:46:47 +03:00
vitalijmulika
936024ec7c Bob AI: Create the 'Contact Us' page file and add basic content. 2026-04-29 13:46:17 +03:00
vitalijmulika
5a90a57c3a Bob AI: fix build errors (attempt 1) 2026-04-29 13:45:23 +03:00
vitalijmulika
6854599796 Bob AI: Create the 'Menu' page file and add basic content. 2026-04-29 13:44:55 +03:00
vitalijmulika
b799daeed2 Bob AI: Create the 'About' page file and add basic content. 2026-04-29 13:43:33 +03:00
6 changed files with 172 additions and 1 deletions

View File

@@ -1,12 +1,22 @@
import { Routes, Route } from 'react-router-dom'; import { Routes, Route } from 'react-router-dom';
import Layout from './components/Layout'; import Layout from './components/Layout';
import HomePage from './pages/HomePage'; import HomePage from './pages/HomePage';
import Contact from './pages/Contact';
import Policy from './pages/Policy';
import Terms from './pages/Terms';
import About from './pages/About';
import Menu from './pages/Menu';
export default function App() { export default function App() {
return ( return (
<Routes> <Routes>
<Route element={<Layout />}> <Route element={<Layout />}>
<Route path="/" element={<HomePage />} /> <Route path="/" element={<HomePage />} />
<Route path="/about" element={<About />} />
<Route path="/menu" element={<Menu />} />
<Route path="/contact" element={<Contact />} />
<Route path="/policy" element={<Policy />} />
<Route path="/terms" element={<Terms />} />
</Route> </Route>
</Routes> </Routes>
); );

View File

@@ -0,0 +1,43 @@
"use client";
import Card from "@/components/ui/Card";
import TextAnimation from "@/components/ui/TextAnimation";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
export default function MenuSection() {
const items = [
{ title: "Espresso", description: "Rich, bold, and smooth.", price: "$3.50", imageSrc: "/espresso.jpg" },
{ title: "Cappuccino", description: "Perfectly steamed milk.", price: "$4.50", imageSrc: "/cappuccino.jpg" },
{ title: "Latte", description: "Creamy and comforting.", price: "$4.75", imageSrc: "/latte.jpg" },
{ title: "Mocha", description: "Decadent chocolate blend.", price: "$5.00", imageSrc: "/mocha.jpg" },
{ title: "Americano", description: "Espresso with hot water.", price: "$3.75", imageSrc: "/americano.jpg" },
{ title: "Flat White", description: "Velvety microfoam finish.", price: "$4.25", imageSrc: "/flat-white.jpg" },
];
return (
<section id="menu" className="py-24 bg-background">
<div className="max-w-6xl mx-auto px-6">
<TextAnimation
tag="h2"
text="Our Menu"
variant="fade-blur"
className="text-5xl font-bold text-foreground mb-16 text-center luxury-serif"
/>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-12">
{items.map((item, i) => (
<Card key={i} className="p-8 flex flex-col gap-6 hover:-translate-y-2 transition-transform duration-300">
<div className="h-64 overflow-hidden rounded-lg">
<ImageOrVideo imageSrc={item.imageSrc} className="w-full h-full object-cover" />
</div>
<div className="flex flex-col gap-2">
<h3 className="text-2xl font-bold text-foreground luxury-serif">{item.title}</h3>
<p className="text-muted-foreground text-lg">{item.description}</p>
<span className="text-xl font-bold text-primary-cta mt-2">{item.price}</span>
</div>
</Card>
))}
</div>
</div>
</section>
);
}

22
src/pages/About.tsx Normal file
View File

@@ -0,0 +1,22 @@
"use client";
import AboutFeaturesSplit from "@/components/sections/about/AboutFeaturesSplit";
import { Coffee, Users, Award } from "lucide-react";
export default function About() {
return (
<main className="bg-background min-h-screen py-24">
<AboutFeaturesSplit
tag="Our Story"
title="Crafting Excellence in Every Cup"
description="At Bean & Bloom, we believe that great coffee is more than just a drink—it's an experience. From ethically sourced beans to our artisanal roasting process, every step is taken with care."
items={[
{ icon: Coffee, title: "Ethical Sourcing", description: "We work directly with farmers to ensure fair wages and sustainable practices." },
{ icon: Users, title: "Community Focused", description: "Our cafes are designed to be a welcoming space for everyone to connect." },
{ icon: Award, title: "Artisanal Quality", description: "Small-batch roasting ensures the freshest, most flavorful coffee possible." }
]}
imageSrc="https://images.unsplash.com/photo-1509042239860-f550ce710b93?q=80&w=1000&auto=format&fit=crop"
/>
</main>
);
}

35
src/pages/Contact.tsx Normal file
View File

@@ -0,0 +1,35 @@
import Card from "@/components/ui/Card";
import Input from "@/components/ui/Input";
import Textarea from "@/components/ui/Textarea";
import Button from "@/components/ui/Button";
import Label from "@/components/ui/Label";
import GridLinesBackground from "@/components/ui/GridLinesBackground";
import TextAnimation from "@/components/ui/TextAnimation";
export default function Contact() {
return (
<div className="relative min-h-screen pt-24 pb-24">
<GridLinesBackground position="absolute" />
<div className="max-w-2xl mx-auto px-6">
<Card className="p-8 md:p-12">
<TextAnimation text="Contact Us" variant="fade-blur" tag="h1" className="text-4xl font-bold mb-8" />
<form className="space-y-6">
<div className="space-y-2">
<Label htmlFor="name">Name</Label>
<Input id="name" placeholder="Your name" />
</div>
<div className="space-y-2">
<Label htmlFor="email">Email</Label>
<Input id="email" type="email" placeholder="Your email" />
</div>
<div className="space-y-2">
<Label htmlFor="message">Message</Label>
<Textarea id="message" placeholder="How can we help?" rows={4} />
</div>
<Button text="Send Message" variant="primary" className="w-full" />
</form>
</Card>
</div>
</div>
);
}

31
src/pages/Policy.tsx Normal file
View File

@@ -0,0 +1,31 @@
import PolicyContent from "@/components/sections/legal/PolicyContent";
import ScrollReveal from "@/components/ui/ScrollReveal";
export default function Policy() {
return (
<div className="min-h-screen bg-background py-24">
<ScrollReveal>
<PolicyContent
title="Privacy Policy"
subtitle="Last updated: October 2024"
sections={[
{
heading: "Information We Collect",
content: [
{ type: "paragraph", text: "We collect information you provide directly to us, such as when you create an account, make a purchase, or contact us for support." },
{ type: "list", items: ["Name and contact information", "Payment details", "Order history"] }
]
},
{
heading: "How We Use Your Information",
content: [
{ type: "paragraph", text: "We use the information we collect to provide, maintain, and improve our services, process transactions, and communicate with you." },
{ type: "numbered-list", items: ["To process your orders", "To send you updates and marketing communications", "To improve our website and services"] }
]
}
]}
/>
</ScrollReveal>
</div>
);
}

30
src/pages/Terms.tsx Normal file
View File

@@ -0,0 +1,30 @@
import PolicyContent from "@/components/sections/legal/PolicyContent";
import ScrollReveal from "@/components/ui/ScrollReveal";
export default function Terms() {
return (
<div className="min-h-screen bg-background py-24">
<ScrollReveal>
<PolicyContent
title="Terms of Service"
subtitle="Last updated: October 2024"
sections={[
{
heading: "Acceptance of Terms",
content: [
{ type: "paragraph", text: "By accessing or using our website, you agree to be bound by these Terms of Service and all applicable laws and regulations." }
]
},
{
heading: "Use License",
content: [
{ type: "paragraph", text: "Permission is granted to temporarily download one copy of the materials on our website for personal, non-commercial transitory viewing only." },
{ type: "list", items: ["Do not modify or copy the materials", "Do not use the materials for any commercial purpose", "Do not attempt to decompile or reverse engineer any software"] }
]
}
]}
/>
</ScrollReveal>
</div>
);
}