8 Commits

Author SHA1 Message Date
743cb24413 Merge version_7_1780864964013 into main
Merge version_7_1780864964013 into main
2026-06-07 20:44:52 +00:00
kudinDmitriyUp
a763ad758e Bob AI: Add glassmorphic testimonial tags to hero images 2026-06-07 20:43:29 +00:00
d88aeb1942 Merge version_6_1780861592636 into main
Merge version_6_1780861592636 into main
2026-06-07 19:49:15 +00:00
kudinDmitriyUp
52835c41e3 Bob AI: fix build errors (attempt 1) 2026-06-07 19:48:30 +00:00
kudinDmitriyUp
327d7eeeda Bob AI: Added glassmorphic Active Now tags to team images 2026-06-07 19:47:48 +00:00
191c56ec88 Merge version_5_1780861269534 into main
Merge version_5_1780861269534 into main
2026-06-07 19:43:00 +00:00
kudinDmitriyUp
e04b1414c2 Bob AI: Added verified badges to testimonial names 2026-06-07 19:42:09 +00:00
e6eaf0735b Merge version_4_1780861067851 into main
Merge version_4_1780861067851 into main
2026-06-07 19:39:06 +00:00
3 changed files with 140 additions and 74 deletions

View File

@@ -1,48 +1,74 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "hero" section.
import Button from "@/components/ui/Button";
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
import TextAnimation from "@/components/ui/TextAnimation";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import React from 'react';
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
type HeroBillboardCarouselProps = {
tag: string;
title: string;
description: string;
primaryButton: { text: string; href: string };
secondaryButton: { text: string; href: string };
items: ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never })[];
};
const HeroInline = () => {
const duplicated = [...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}], ...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}], ...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}], ...[{"imageSrc":"http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg"},{"imageSrc":"http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg"}]];
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBillboardCarousel
tag="Taste of San Francisco"
title="Authentic Pizza, Freshly Made Daily"
description="Indulge in the finest pizzas crafted with passion and premium, locally-sourced ingredients. Experience the true flavor of San Francisco in every bite."
primaryButton={{
text: "Order Now",
href: "#contact",
}}
secondaryButton={{
text: "View Menu",
href: "#menu",
}}
items={[
{
imageSrc: "http://img.b2bpic.net/free-photo/chef-kitchen-prepares-pizza_1157-21842.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/pizza-with-cheese-it-is-being-served_505751-3854.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/food-assortment-wooden-background_23-2148601637.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-cheese-pizza-with-seasonings-tomatoes-blue-background-italian-food-dough-cake-fast-food-photo-color_140725-140341.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/group-friends-eating-pizza-home-together_23-2150419422.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/pizza-with-tomato-slices-garlic-lemon-chili-pepper-corn-mint-leaves-pizza-board-gray-wooden-background-high-angle-view_176474-4612.jpg",
},
]}
<section
aria-label="Hero section"
className="relative flex flex-col items-center justify-center gap-8 md:gap-10 w-full min-h-svh pt-25 pb-20 md:pt-30"
>
<HeroBackgroundSlot />
<div className="flex flex-col items-center gap-3 w-content-width mx-auto text-center">
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
<p>{"Taste of San Francisco"}</p>
</div>
<TextAnimation
text={"Authentic Pizza, Freshly Made Daily"}
variant="fade"
gradientText={true}
tag="h1"
className="md:max-w-8/10 text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center text-balance"
/>
</SectionErrorBoundary>
<TextAnimation
text={"Indulge in the finest pizzas crafted with passion and premium, locally-sourced ingredients. Experience the true flavor of San Francisco in every bite."}
variant="fade"
gradientText={false}
tag="p"
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance"
/>
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
<Button text={{"text":"Order Now","href":"#contact"}.text} href={{"text":"Order Now","href":"#contact"}.href} variant="primary"/>
<Button text={{"text":"View Menu","href":"#menu"}.text} href={{"text":"View Menu","href":"#menu"}.href} variant="secondary"animationDelay={0.1} />
</div>
</div>
<div className="w-content-width mx-auto overflow-hidden mask-fade-x">
<div className="flex w-max animate-marquee-horizontal" style={{ animationDuration: "60s" }}>
{duplicated.map((item, i) => (
<div key={i} className="shrink-0 w-60 md:w-75 2xl:w-80 aspect-4/5 mr-3 md:mr-5 p-2 xl:p-3 2xl:p-4 card rounded-lg overflow-hidden">
<ImageOrVideo
imageSrc={item.imageSrc}
videoSrc={item.videoSrc}
className="w-full h-full rounded-lg object-cover"
/>
</div>
))}
</div>
</div>
</section>
);
};
export default function HeroSection() {
return (
<div data-webild-section="hero" id="hero">
<HeroInline />
</div>
);
}

View File

@@ -3,6 +3,7 @@
import React from 'react';
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
import { BadgeCheck } from 'lucide-react';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ReviewsSection(): React.JSX.Element {
@@ -15,42 +16,42 @@ export default function ReviewsSection(): React.JSX.Element {
description="Our customers can't get enough of our authentic flavors and friendly service. Hear what they have to say!"
testimonials={[
{
name: "Sarah J.",
name: (<span className="inline-flex items-center gap-1">Sarah J. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
role: "Local Resident",
quote: "The best pizza in San Francisco, hands down! The crust is perfect, and the toppings are always fresh. A must-try!",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/attractive-hipster-dressed-leather-jacket-eating-vegan-burger_613910-16395.jpg",
},
{
name: "Michael T.",
name: (<span className="inline-flex items-center gap-1">Michael T. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
role: "Food Blogger",
quote: "An absolute culinary delight! Every slice is a journey of flavor. The Margherita is exceptional.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-friends-eating-pizza_23-2151231308.jpg",
},
{
name: "Emily R.",
name: (<span className="inline-flex items-center gap-1">Emily R. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
role: "Tech Professional",
quote: "Fast, friendly, and incredibly delicious. My go-to spot for pizza night. Highly recommend the BBQ Chicken!",
rating: 4,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-eating-delicious-pizza_23-2150317035.jpg",
},
{
name: "David L.",
name: (<span className="inline-flex items-center gap-1">David L. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
role: "Tourist",
quote: "Stumbled upon this gem and was blown away. Truly authentic taste, felt like I was back in Italy!",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/handsome-smiling-man-eat-salade-restaurant-waiting-woman-with-bouquet-roses_496169-302.jpg",
},
{
name: "Jessica B.",
name: (<span className="inline-flex items-center gap-1">Jessica B. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
role: "Student",
quote: "Affordable and amazing quality. Perfect for a quick lunch or a relaxed dinner with friends. Loved the veggie options.",
rating: 4,
imageSrc: "http://img.b2bpic.net/free-photo/front-view-family-eating-pizza-outdoors_23-2149931059.jpg",
},
{
name: "Chris P.",
name: (<span className="inline-flex items-center gap-1">Chris P. <BadgeCheck className="w-4 h-4 fill-blue-500 text-white" /></span>) as unknown as string,
role: "Artisan Baker",
quote: "As a fellow baker, I appreciate the craftsmanship. The dough is expertly fermented, making for a superb crust.",
rating: 5,

View File

@@ -1,37 +1,76 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "team" section.
import React from 'react';
import TeamStackedCards from '@/components/sections/team/TeamStackedCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import Tag from '@/components/ui/Tag';
import ImageOrVideo from '@/components/ui/ImageOrVideo';
import ScrollReveal from '@/components/ui/ScrollReveal';
export default function TeamSection() {
const members = [
{
name: "Chef Marco",
role: "Head Pizzaiolo",
imageSrc: "http://img.b2bpic.net/free-photo/italian-chef-is-putting-gourmet-freshly-made-pizza-stone-oven_613910-14121.jpg",
},
{
name: "Sophia Rodriguez",
role: "Assistant Chef",
imageSrc: "http://img.b2bpic.net/free-photo/smiling-young-pretty-delivery-girl-red-uniform-cap-holding-pizza-packages_141793-31534.jpg",
},
{
name: "David Kim",
role: "Operations Manager",
imageSrc: "http://img.b2bpic.net/free-photo/woman-looking-goodies-local-producer_23-2149110825.jpg",
},
];
export default function TeamSection(): React.JSX.Element {
return (
<div id="team" data-section="team">
<SectionErrorBoundary name="team">
<TeamStackedCards
<div id="team" data-webild-section="team">
<div className="hidden">
<TeamStackedCards
tag="Meet the Maestros"
title="Our Passionate Pizza Crew"
description="Behind every delicious pizza is a dedicated team committed to quality and a warm dining experience."
members={[
{
name: "Chef Marco",
role: "Head Pizzaiolo",
imageSrc: "http://img.b2bpic.net/free-photo/italian-chef-is-putting-gourmet-freshly-made-pizza-stone-oven_613910-14121.jpg",
},
{
name: "Sophia Rodriguez",
role: "Assistant Chef",
imageSrc: "http://img.b2bpic.net/free-photo/smiling-young-pretty-delivery-girl-red-uniform-cap-holding-pizza-packages_141793-31534.jpg",
},
{
name: "David Kim",
role: "Operations Manager",
imageSrc: "http://img.b2bpic.net/free-photo/woman-looking-goodies-local-producer_23-2149110825.jpg",
},
]}
members={members}
/>
</SectionErrorBoundary>
</div>
<div className="bg-background">
<div className="max-w-content-width mx-auto px-6">
<ScrollReveal variant="slide-up">
<div className="text-center">
<Tag text="Meet the Maestros" className="mb-4" />
<h2 className="text-4xl md:text-5xl font-bold text-foreground mb-4">Our Passionate Pizza Crew</h2>
<p className="text-lg text-muted-foreground max-w-content-width mx-auto">
Behind every delicious pizza is a dedicated team committed to quality and a warm dining experience.
</p>
</div>
</ScrollReveal>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{members.map((member, index) => (
<ScrollReveal key={index} variant="slide-up" delay={index * 0.1}>
<div className="group relative rounded-theme overflow-hidden bg-card border border-border">
<div className="relative aspect-[4/5] overflow-hidden">
<ImageOrVideo
imageSrc={member.imageSrc}
className="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
/>
<div className="absolute top-4 left-4 z-10">
<div className="flex items-center gap-2 px-3 py-1.5 rounded-full bg-white/20 backdrop-blur-md border border-white/30 shadow-sm">
<span className="w-2 h-2 rounded-full bg-green-400 animate-pulse"></span>
<span className="text-xs font-medium text-white drop-shadow-md">Active now</span>
</div>
</div>
</div>
<div className="p-6 text-center">
<h3 className="text-xl font-bold text-foreground mb-1">{member.name}</h3>
<p className="text-sm text-muted-foreground">{member.role}</p>
</div>
</div>
</ScrollReveal>
))}
</div>
</div>
</div>
</div>
);
}
}