13 Commits

7 changed files with 72 additions and 44 deletions

View File

@@ -1,14 +1,9 @@
import type { Metadata } from "next";
import { Mulish } from "next/font/google";
import { Inter } from "next/font/google";
import "./globals.css";
import { ServiceWrapper } from "@/components/ServiceWrapper";
import Tag from "@/tag/Tag";
const mulish = Mulish({
variable: "--font-mulish", subsets: ["latin"],
});
const inter = Inter({
variable: "--font-inter", subsets: ["latin"],
});
@@ -26,7 +21,7 @@ export default function RootLayout({
<html lang="en" suppressHydrationWarning>
<ServiceWrapper>
<body
className={`${mulish.variable} ${inter.variable} antialiased`}
className={`${inter.variable} antialiased`}
>
<Tag />
{children}

View File

@@ -1,7 +1,7 @@
"use client"
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleFullscreen from '@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen';
import HeroOverlay from '@/components/sections/hero/HeroOverlay';
import HeroBillboard from '@/components/sections/hero/HeroBillboard';
import MediaAbout from '@/components/sections/about/MediaAbout';
import FeatureCardMedia from '@/components/sections/feature/FeatureCardMedia';
import ProductCardOne from '@/components/sections/product/ProductCardOne';
@@ -10,6 +10,7 @@ import FaqBase from '@/components/sections/faq/FaqBase';
import ContactSplitForm from '@/components/sections/contact/ContactSplitForm';
import FooterMedia from '@/components/sections/footer/FooterMedia';
import { Sparkles, Star, HelpCircle } from "lucide-react";
import HeroBillboardCarousel from '@/components/sections/hero/HeroBillboardCarousel';
export default function LandingPage() {
return (
@@ -43,22 +44,35 @@ export default function LandingPage() {
</div>
<div id="hero-section" data-section="hero-section">
<HeroOverlay
title="Artisan Baked Goods Delivered to Your Doorstep"
description="Experience the warmth of freshly baked breads, pastries, and desserts made with love using time-honored techniques and the finest ingredients."
<HeroBillboardCarousel
title="Artisanal Baked Goods"
description="Handcrafted with passion and premium ingredients for an unforgettable taste experience"
background={{ variant: "radial-gradient" }}
tag="Fresh Daily"
tagIcon={Sparkles}
tagAnimation="slide-up"
tagIcon={null}
tagAnimation="fade-in"
buttons={[
{ text: "View Our Menu", href: "#products-section" },
{ text: "Visit Us", href: "#contact-section" }
{ text: "View Our Menu", href: "#menu", dataWebildId: "btn-carousel-1" },
{ text: "Order Online", href: "#order", dataWebildId: "btn-carousel-2" }
]}
buttonAnimation="slide-up"
imageSrc="https://img.b2bpic.net/free-photo/view-delicious-baked-bread-pastry-shop_23-2150379551.jpg"
imageAlt="Warm and inviting bakery interior with fresh pastries on display"
textPosition="bottom-left"
showDimOverlay={true}
showBlur={true}
mediaItems={[
{ imageSrc: "https://img.b2bpic.net/free-photo/abstract-luxury-gradient-blue-background_53876-120942.jpg", imageAlt: "Fresh baked croissants" },
{ imageSrc: "https://img.b2bpic.net/free-photo/futuristic-moon-background_23-2150930890.jpg", imageAlt: "Artisan sourdough bread" },
{ imageSrc: "https://img.b2bpic.net/free-photo/futuristic-city-architecture_23-2151918947.jpg", imageAlt: "Delicious pastries display" },
{ imageSrc: "https://img.b2bpic.net/free-photo/beautiful-landscape-with-mountains_23-2151151078.jpg", imageAlt: "Warm & Crumb bakery interior" }
]}
ariaLabel="Welcome to Warm & Crumb Bakery"
className=""
containerClassName=""
textBoxClassName=""
titleClassName=""
descriptionClassName=""
tagClassName=""
buttonContainerClassName=""
buttonClassName=""
buttonTextClassName=""
mediaWrapperClassName=""
/>
</div>
@@ -70,8 +84,8 @@ export default function LandingPage() {
tagIcon={Sparkles}
tagAnimation="slide-up"
buttons={[
{ text: "Explore Our Products", href: "#products-section" },
{ text: "Visit Our Bakery", href: "#contact-section" }
{ text: "Explore Our Products", href: "products-section" },
{ text: "Visit Our Bakery", href: "contact-section" }
]}
buttonAnimation="slide-up"
imageSrc="https://img.b2bpic.net/free-photo/baker-forming-dough-sphere-wooden-board_74855-5658.jpg"
@@ -156,6 +170,14 @@ export default function LandingPage() {
/>
</div>
<div className="flex justify-center gap-4 py-8">
<span className="text-4xl"></span>
<span className="text-4xl"></span>
<span className="text-4xl"></span>
<span className="text-4xl"></span>
<span className="text-4xl"></span>
</div>
<div id="faq-section" data-section="faq-section">
<FaqBase
title="Frequently Asked Questions"
@@ -181,7 +203,7 @@ export default function LandingPage() {
tagIcon={HelpCircle}
tagAnimation="slide-up"
buttons={[
{ text: "Contact Us", href: "#contact-section" }
{ text: "Contact Us", href: "contact-section" }
]}
buttonAnimation="slide-up"
/>
@@ -216,16 +238,16 @@ export default function LandingPage() {
columns={[
{
title: "Explore", items: [
{ label: "Home", href: "#hero-section" },
{ label: "Our Story", href: "#about-section" },
{ label: "Menu", href: "#products-section" },
{ label: "Testimonials", href: "#testimonials-section" }
{ label: "Home", href: "hero-section" },
{ label: "Our Story", href: "about-section" },
{ label: "Menu", href: "products-section" },
{ label: "Testimonials", href: "testimonials-section" }
]
},
{
title: "Support", items: [
{ label: "FAQ", href: "#faq-section" },
{ label: "Contact Us", href: "#contact-section" },
{ label: "FAQ", href: "faq-section" },
{ label: "Contact Us", href: "contact-section" },
{ label: "Delivery Info", href: "#" },
{ label: "Returns Policy", href: "#" }
]

View File

@@ -24,5 +24,5 @@ h3,
h4,
h5,
h6 {
font-family: var(--font-mulish), sans-serif;
font-family: var(--font-inter), sans-serif;
}

View File

@@ -3,22 +3,22 @@
/* --vw is set by ThemeProvider */
/* --background: #f7f6f7;;
--card: #ffffff;;
--foreground: #0c1325;;
--primary-cta: #0b07ff;;
--secondary-cta: #ffffff;;
--accent: #93b7ff;;
--background-accent: #a8bae8;; */
--card: #1a1a1a;;
--foreground: #000000;;
--primary-cta: #ffcc00;;
--secondary-cta: #ffcc00;;
--accent: #ff9900;;
--background-accent: #333300;; */
--background: #f7f6f7;;
--card: #ffffff;;
--foreground: #0c1325;;
--primary-cta: #0b07ff;;
--background: #000000;;
--card: #1a1a1a;;
--foreground: #000000;;
--primary-cta: #ffcc00;;
--primary-cta-text: #f7f6f7;;
--secondary-cta: #ffffff;;
--secondary-cta: #ffcc00;;
--secondary-cta-text: #0c1325;;
--accent: #93b7ff;;
--background-accent: #a8bae8;;
--accent: #ff9900;;
--background-accent: #333300;;
/* text sizing - set by ThemeProvider */
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);

View File

@@ -9,6 +9,7 @@ import { useButtonAnimation } from "@/components/hooks/useButtonAnimation";
import type { LucideIcon } from "lucide-react";
import type { ButtonConfig, ButtonAnimationType } from "@/types/button";
import type { Avatar } from "@/components/shared/AvatarGroup";
import { useRef, useEffect } from "react";
type HeroBillboardBackgroundProps = Extract<
HeroBackgroundVariantProps,
@@ -67,9 +68,13 @@ interface HeroBillboardProps {
marqueeImageClassName?: string;
marqueeTextClassName?: string;
marqueeIconClassName?: string;
backgroundVideoSrc?: string;
backgroundVideoFallbackSrc?: string;
}
const HeroBillboard = ({
backgroundVideoSrc,
backgroundVideoFallbackSrc = "https://img.b2bpic.net/free-photo/abstract-luxury-gradient-blue-background_53876-120942.jpg",
title,
description,
background,

View File

@@ -82,7 +82,10 @@ const HeroBillboardCarousel = ({
const renderCarouselItem = (item: MediaItem, index: number) => (
<div
key={index}
className="w-full aspect-[4/5] overflow-hidden rounded-theme-capped card p-2 shadow-lg"
className={cls(
"w-full aspect-[4/5] overflow-hidden rounded-theme-capped card p-2 shadow-lg",
index % 2 === 0 && "border-2 border-green-500"
)}
>
<MediaContent
imageSrc={item.imageSrc}

View File

@@ -8,6 +8,7 @@ import ProductImage from "@/components/shared/ProductImage";
import { cls, shouldUseInvertedText } from "@/lib/utils";
import { useTheme } from "@/providers/themeProvider/ThemeProvider";
import { useProducts } from "@/hooks/useProducts";
import { useRef, useEffect } from "react";
import type { Product } from "@/lib/api/product";
import type { LucideIcon } from "lucide-react";
import type { ButtonConfig, GridVariant, CardAnimationType, TitleSegment, ButtonAnimationType } from "@/components/cardStack/types";
@@ -52,6 +53,8 @@ interface ProductCardOneProps {
textBoxButtonContainerClassName?: string;
textBoxButtonClassName?: string;
textBoxButtonTextClassName?: string;
backgroundVideoUrl?: string;
showBackgroundVideo?: boolean;
}
interface ProductCardItemProps {
@@ -72,7 +75,7 @@ const ProductCardItem = memo(({
cardPriceClassName = "",
}: ProductCardItemProps) => {
return (
<article
<article className="relative overflow-hidden"
className={cls("card group relative h-full flex flex-col gap-4 cursor-pointer p-4 rounded-theme-capped", cardClassName)}
onClick={product.onProductClick}
role="article"