7 Commits

Author SHA1 Message Date
bdc92eb660 Merge version_3_1781417558849 into main
Merge version_3_1781417558849 into main
2026-06-14 06:19:46 +00:00
kudinDmitriyUp
ccfd815a87 Bob AI: Added Google Maps widget to Contact section 2026-06-14 06:19:02 +00:00
18e9318687 Merge version_2_1781417421976 into main
Merge version_2_1781417421976 into main
2026-06-14 06:10:25 +00:00
7fd6d46002 Merge version_1_1781417170660 into main
Merge version_1_1781417170660 into main
2026-06-14 06:09:00 +00:00
62868a31cf Merge version_1_1781417170660 into main
Merge version_1_1781417170660 into main
2026-06-14 06:08:22 +00:00
87fe77d5b1 Merge version_1_1781417170660 into main
Merge version_1_1781417170660 into main
2026-06-14 06:07:31 +00:00
dcb9c4beb6 Merge version_1_1781417170660 into main
Merge version_1_1781417170660 into main
2026-06-14 06:06:37 +00:00
8 changed files with 280 additions and 149 deletions

View File

@@ -1,160 +1,33 @@
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqSimple from '@/components/sections/faq/FaqSimple';
import FeaturesBento from '@/components/sections/features/FeaturesBento';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import HeroOverlay from '@/components/sections/hero/HeroOverlay';
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
// AUTO-GENERATED shell by per-section-migrate.
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
// files directly. Non-block content (wrappers, non-inlinable sections) is
// preserved inline; extracted section blocks become <XSection/> refs.
export default function HomePage() {
import React from 'react';
import HeroSection from './HomePage/sections/Hero';
import AboutSection from './HomePage/sections/About';
import ProductsSection from './HomePage/sections/Products';
import FeaturesSection from './HomePage/sections/Features';
import TestimonialsSection from './HomePage/sections/Testimonials';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroOverlay
tag="Cashmere's Favorite Stop"
title="Great Coffee. Friendly Service. Worth Pulling Over For."
description="Whether you're heading to work, starting a road trip, or just need a quick pick-me-up, we're here with handcrafted coffee, delicious breakfast options, and the warmest service in Cashmere."
primaryButton={{
text: "Order Ahead", href: "#contact"}}
secondaryButton={{
text: "Call Now", href: "tel:5098880223"}}
imageSrc="http://img.b2bpic.net/free-photo/coffee-business-concept-handsome-bearded-man-apron-making-coffee-while-standing-cafe_1258-103897.jpg?_wi=1"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutMediaOverlay
tag="About Us"
title="A Community Coffee Experience"
description="At Pull Over Here Espresso, we believe great coffee should come with great service. We're a locally loved drive-thru coffee stand serving handcrafted espresso drinks, breakfast favorites, and friendly service every day. From morning commuters to travelers, we're here to make your day a little better."
imageSrc="http://img.b2bpic.net/free-photo/full-shot-woman-wearing-total-denim-outfit_23-2150105179.jpg"
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<FeaturesRevealCardsBento
tag="Our Favorites"
title="Crafted with Care"
description="Delicious coffee and breakfast items prepared fresh daily."
items={[
{
title: "Classic Espresso", description: "Rich, bold, and expertly extracted.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/cafe-smooth-shot-nice-drink_1172-478.jpg"},
{
title: "Signature Lattes", description: "Creamy, smooth, and perfectly balanced.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/latte-coffee-art-table_1232-2739.jpg"},
{
title: "Breakfast Burritos", description: "The perfect handheld morning meal.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-mexican-food-ready-be-served_23-2148614485.jpg"},
{
title: "Bagel Sandwiches", description: "Fresh bagels with savory fillings.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/closeup-croissant-with-greens-ham-vegetables-pub_7502-9265.jpg"},
{
title: "Iced Frappes", description: "Cool, sweet, and refreshing treats.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/frappe-drink-with-caramel-nuts-isolated-white-background-ai-generative_123827-24940.jpg"},
{
title: "Cold Brew", description: "Slow-steeped for ultimate smoothness.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/still-life-with-iced-coffee-beverage_23-2149648698.jpg"},
{
title: "Seasonal Specials", description: "Unique flavors for every season.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/towel-spoon-near-drink-spice_23-2147943843.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<ProductsSection />
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesBento
tag="Why Choose Us"
title="Coffee Worth Stopping For"
description="What keeps our community coming back every day."
features={[
{
title: "Fast Drive-Thru", description: "Get your favorite drink without leaving the car.", bentoComponent: "info-card-marquee", infoCards: [
{
icon: "Timer", label: "Speed", value: "Fast"},
{
icon: "Car", label: "Convenience", value: "Drive-Thru"},
],
},
{
title: "Locally Owned", description: "Proudly serving the Cashmere community.", bentoComponent: "media-stack", mediaItems: [
{
imageSrc: "http://img.b2bpic.net/free-photo/coffee-business-concept-handsome-bearded-man-apron-making-coffee-while-standing-cafe_1258-103897.jpg?_wi=2"},
{
imageSrc: "http://img.b2bpic.net/free-photo/roasted-coffee-beans-table-closeup_250435-1137.jpg"},
{
imageSrc: "http://img.b2bpic.net/free-photo/cocktail-wooden-table-restaurant_23-2147936121.jpg"},
],
},
{
title: "Friendly Service", description: "Always served with a smile.", bentoComponent: "chat-marquee", aiIcon: "Smile", userIcon: "User", exchanges: [
{
userMessage: "Good morning!", aiResponse: "Welcome to Pull Over Here!"},
],
placeholder: "Greeting"},
]}
/>
</SectionErrorBoundary>
</div>
<FeaturesSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="What People Say"
title="Loved by the Community"
description="Don't just take our word for it."
testimonials={[
{
name: "Sarah J.", role: "Local Resident", company: "Cashmere", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/vertical-shot-friendly-barista-girl-smiling-you-while-preparing-coffee-pouring-milk-making_1258-203425.jpg"},
{
name: "Mike D.", role: "Commuter", company: "Cashmere", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/woman-with-afro-hair-smile-broadly-dressed-beige-coat-strolls-city-sunny-autumn-day-uses-smartphone-with-delight-has-fun-texting-cellular-browses-web-pages_273609-55300.jpg"},
{
name: "Emily R.", role: "Traveler", company: "Visitor", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-overemotive-woman-yellow-anorak-headband-stretches-hands-with-unrecognizable-device_273609-25902.jpg"},
{
name: "David K.", role: "Local", company: "Cashmere", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-smiley-woman-taking-mask-off-outdoors_23-2149403784.jpg"},
{
name: "Anna P.", role: "Customer", company: "Commuter", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-woman-dressed-white-pajamas_158538-18366.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSimple
tag="FAQ"
title="Questions?"
description="Here is what you need to know."
items={[
{
question: "Where are you located?", answer: "407 Aplets Way, Cashmere, WA 98815."},
{
question: "What are your hours?", answer: "Mon-Fri: 6am-4pm, Sat-Sun: 8am-2pm."},
{
question: "Do you offer food?", answer: "Yes, breakfast burritos and bagel sandwiches."},
]}
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Contact Us"
text="Ready for your next coffee? Give us a call or visit today."
primaryButton={{
text: "Call Now", href: "tel:5098880223"}}
secondaryButton={{
text: "Get Directions", href: "https://maps.google.com"}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

View File

@@ -0,0 +1,21 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "about" section.
import React from 'react';
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutMediaOverlay
tag="About Us"
title="A Community Coffee Experience"
description="At Pull Over Here Espresso, we believe great coffee should come with great service. We're a locally loved drive-thru coffee stand serving handcrafted espresso drinks, breakfast favorites, and friendly service every day. From morning commuters to travelers, we're here to make your day a little better."
imageSrc="http://img.b2bpic.net/free-photo/full-shot-woman-wearing-total-denim-outfit_23-2150105179.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,65 @@
/* eslint-disable */
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
import ScrollReveal from "@/components/ui/ScrollReveal";
import TextAnimation from "@/components/ui/TextAnimation";
import Button from "@/components/ui/Button";
const primaryButton = {
text: "Call Now",
href: "tel:5098880223"
};
const secondaryButton = {
text: "Get Directions",
href: "https://maps.google.com"
};
const ContactInline = () => {
return (
<section aria-label="Contact section" className="py-20">
<div className="w-content-width mx-auto">
<ScrollReveal variant="slide-up">
<div className="flex flex-col items-center gap-8 md:gap-10 py-20 px-8 rounded card">
<div className="flex flex-col items-center gap-2">
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
<p>{"Contact Us"}</p>
</div>
<TextAnimation
text={"Ready for your next coffee? Give us a call or visit today."}
variant="fade"
gradientText={true}
tag="h2"
className="md:max-w-8/10 text-5xl 2xl:text-6xl leading-[1.15] font-semibold text-center text-balance"
/>
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
<Button text={primaryButton.text} href={primaryButton.href} variant="primary" />
<Button text={secondaryButton.text} href={secondaryButton.href} variant="secondary" animationDelay={0.1} />
</div>
<div className="w-full max-w-4xl mt-10 rounded-lg overflow-hidden shadow-sm">
<iframe
title="Google Maps Location"
width="100%"
height="400"
style={{ border: 0 }}
loading="lazy"
allowFullScreen
src="https://maps.google.com/maps?q=407%20Aplets%20Way,%20Cashmere,%20WA%2098815&t=&z=15&ie=UTF8&iwloc=&output=embed"
></iframe>
</div>
</div>
</div>
</ScrollReveal>
</div>
</section>
);
};
export default function ContactSection() {
return (
<div data-webild-section="contact" id="contact">
<ContactInline />
</div>
);
}

View File

@@ -0,0 +1,28 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "faq" section.
import React from 'react';
import FaqSimple from '@/components/sections/faq/FaqSimple';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSimple
tag="FAQ"
title="Questions?"
description="Here is what you need to know."
items={[
{
question: "Where are you located?", answer: "407 Aplets Way, Cashmere, WA 98815."},
{
question: "What are your hours?", answer: "Mon-Fri: 6am-4pm, Sat-Sun: 8am-2pm."},
{
question: "Do you offer food?", answer: "Yes, breakfast burritos and bagel sandwiches."},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,46 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "features" section.
import React from 'react';
import FeaturesBento from '@/components/sections/features/FeaturesBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FeaturesSection(): React.JSX.Element {
return (
<div id="features" data-section="features">
<SectionErrorBoundary name="features">
<FeaturesBento
tag="Why Choose Us"
title="Coffee Worth Stopping For"
description="What keeps our community coming back every day."
features={[
{
title: "Fast Drive-Thru", description: "Get your favorite drink without leaving the car.", bentoComponent: "info-card-marquee", infoCards: [
{
icon: "Timer", label: "Speed", value: "Fast"},
{
icon: "Car", label: "Convenience", value: "Drive-Thru"},
],
},
{
title: "Locally Owned", description: "Proudly serving the Cashmere community.", bentoComponent: "media-stack", mediaItems: [
{
imageSrc: "http://img.b2bpic.net/free-photo/coffee-business-concept-handsome-bearded-man-apron-making-coffee-while-standing-cafe_1258-103897.jpg?_wi=2"},
{
imageSrc: "http://img.b2bpic.net/free-photo/roasted-coffee-beans-table-closeup_250435-1137.jpg"},
{
imageSrc: "http://img.b2bpic.net/free-photo/cocktail-wooden-table-restaurant_23-2147936121.jpg"},
],
},
{
title: "Friendly Service", description: "Always served with a smile.", bentoComponent: "chat-marquee", aiIcon: "Smile", userIcon: "User", exchanges: [
{
userMessage: "Good morning!", aiResponse: "Welcome to Pull Over Here!"},
],
placeholder: "Greeting"},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,25 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "hero" section.
import React from 'react';
import HeroOverlay from '@/components/sections/hero/HeroOverlay';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroOverlay
tag="Cashmere's Favorite Stop"
title="Great Coffee. Friendly Service. Worth Pulling Over For."
description="Whether you're heading to work, starting a road trip, or just need a quick pick-me-up, we're here with handcrafted coffee, delicious breakfast options, and the warmest service in Cashmere."
primaryButton={{
text: "Order Ahead", href: "#contact"}}
secondaryButton={{
text: "Call Now", href: "tel:5098880223"}}
imageSrc="http://img.b2bpic.net/free-photo/coffee-business-concept-handsome-bearded-man-apron-making-coffee-while-standing-cafe_1258-103897.jpg?_wi=1"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,36 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "products" section.
import React from 'react';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ProductsSection(): React.JSX.Element {
return (
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<FeaturesRevealCardsBento
tag="Our Favorites"
title="Crafted with Care"
description="Delicious coffee and breakfast items prepared fresh daily."
items={[
{
title: "Classic Espresso", description: "Rich, bold, and expertly extracted.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/cafe-smooth-shot-nice-drink_1172-478.jpg"},
{
title: "Signature Lattes", description: "Creamy, smooth, and perfectly balanced.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/latte-coffee-art-table_1232-2739.jpg"},
{
title: "Breakfast Burritos", description: "The perfect handheld morning meal.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-mexican-food-ready-be-served_23-2148614485.jpg"},
{
title: "Bagel Sandwiches", description: "Fresh bagels with savory fillings.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/closeup-croissant-with-greens-ham-vegetables-pub_7502-9265.jpg"},
{
title: "Iced Frappes", description: "Cool, sweet, and refreshing treats.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/frappe-drink-with-caramel-nuts-isolated-white-background-ai-generative_123827-24940.jpg"},
{
title: "Cold Brew", description: "Slow-steeped for ultimate smoothness.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/still-life-with-iced-coffee-beverage_23-2149648698.jpg"},
{
title: "Seasonal Specials", description: "Unique flavors for every season.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/towel-spoon-near-drink-spice_23-2147943843.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,37 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "testimonials" section.
import React from 'react';
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TestimonialsSection(): React.JSX.Element {
return (
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="What People Say"
title="Loved by the Community"
description="Don't just take our word for it."
testimonials={[
{
name: "Sarah J.", role: "Local Resident", company: "Cashmere", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/vertical-shot-friendly-barista-girl-smiling-you-while-preparing-coffee-pouring-milk-making_1258-203425.jpg"},
{
name: "Mike D.", role: "Commuter", company: "Cashmere", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/woman-with-afro-hair-smile-broadly-dressed-beige-coat-strolls-city-sunny-autumn-day-uses-smartphone-with-delight-has-fun-texting-cellular-browses-web-pages_273609-55300.jpg"},
{
name: "Emily R.", role: "Traveler", company: "Visitor", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-overemotive-woman-yellow-anorak-headband-stretches-hands-with-unrecognizable-device_273609-25902.jpg"},
{
name: "David K.", role: "Local", company: "Cashmere", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-smiley-woman-taking-mask-off-outdoors_23-2149403784.jpg"},
{
name: "Anna P.", role: "Customer", company: "Commuter", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-woman-dressed-white-pajamas_158538-18366.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}