11 Commits

Author SHA1 Message Date
04bfcbbaf2 Merge version_5_1782032344359 into main
Merge version_5_1782032344359 into main
2026-06-21 09:00:46 +00:00
67ad171b14 Update src/pages/HomePage/sections/Products.tsx 2026-06-21 09:00:43 +00:00
592ddda4f1 Update src/pages/HomePage/sections/Hero.tsx 2026-06-21 09:00:42 +00:00
a80a11af3b Merge version_5_1782032344359 into main
Merge version_5_1782032344359 into main
2026-06-21 09:00:36 +00:00
kudinDmitriyUp
b777ac3d25 Bob AI: Update product gallery with new bag color variations 2026-06-21 08:59:55 +00:00
bb5b2ac198 Merge version_4_1782032136860 into main
Merge version_4_1782032136860 into main
2026-06-21 08:57:54 +00:00
kudinDmitriyUp
b46797ae70 Bob AI: Update hero and product gallery with the provided bag image 2026-06-21 08:57:14 +00:00
a935675358 Merge version_3_1782031993553 into main
Merge version_3_1782031993553 into main
2026-06-21 08:54:41 +00:00
kudinDmitriyUp
8d0a625e54 Bob AI: Added newsletter signup section before footer 2026-06-21 08:54:01 +00:00
82eede9fcb Merge version_2_1782031844612 into main
Merge version_2_1782031844612 into main
2026-06-21 08:52:33 +00:00
kudinDmitriyUp
cb04fb953e Bob AI: Added certifications section with Ethically Sourced and Arti 2026-06-21 08:51:54 +00:00
9 changed files with 447 additions and 172 deletions

View File

@@ -1,182 +1,34 @@
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqSimple from '@/components/sections/faq/FaqSimple';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import HeroSplit from '@/components/sections/hero/HeroSplit';
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 TestimonialsSection from './HomePage/sections/Testimonials';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
import CertificationsSection from './HomePage/sections/Certifications';
import NewsletterSection from './HomePage/sections/Newsletter';export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroSplit
tag="Luxury Defined"
title="Timeless Elegance in Every Stitch"
description="Discover the art of refined luxury with our exclusive collection of premium leather bags, handcrafted for the modern connoisseur."
primaryButton={{
text: "Explore Collection",
href: "#products",
}}
secondaryButton={{
text: "Contact Us",
href: "#contact",
}}
imageSrc="http://img.b2bpic.net/free-photo/top-view-desk-concept-with-copy-space_23-2148459663.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<CertificationsSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutMediaOverlay
tag="Our Story"
title="Legacy of Craftsmanship"
description="At Mukmhal, we believe in the harmony of tradition and innovation. Every bag is a testament to our commitment to quality, sourcing the finest materials to create accessories that stand the test of time."
imageSrc="http://img.b2bpic.net/free-photo/close-up-bootmaker-working-with-leather-textile_171337-12307.jpg"
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<FeaturesImageBento
tag="The Collection"
title="Signature Pieces"
description="Exquisitely designed bags that define your presence."
items={[
{
title: "Classic Tote",
description: "The ultimate everyday statement.",
imageSrc: "http://img.b2bpic.net/free-photo/fashion-portrait-two-stylish-caucasian-woman-blazers-french-cap-classic-white-hat-stand_343596-2175.jpg",
},
{
title: "Crossbody Chic",
description: "Hands-free luxury refined.",
imageSrc: "http://img.b2bpic.net/free-photo/women-s-day-still-life-with-makeup-jewelry_23-2149263158.jpg",
},
{
title: "Evening Clutch",
description: "Sophistication for every occasion.",
imageSrc: "http://img.b2bpic.net/free-photo/view-women-s-bag-with-mediterranean-tiles-aesthetics_23-2150916702.jpg",
},
{
title: "Satchel Elegance",
description: "Timeless structure and style.",
imageSrc: "http://img.b2bpic.net/free-photo/front-view-brown-bow-with-black-bow-dark-surface-darkness-pin-measure-photo-color_179666-24409.jpg",
},
{
title: "Modern Bucket",
description: "Contemporary design reinvented.",
imageSrc: "http://img.b2bpic.net/free-photo/small-purse-studio-still-life_23-2151046495.jpg",
},
{
title: "Signature Hobo",
description: "Relaxed and utterly refined.",
imageSrc: "http://img.b2bpic.net/free-photo/happy-father-s-day-composition-father-s-day-top-view_185193-109772.jpg",
},
{
title: "Deluxe Portfolio",
description: "Function meets luxury design.",
imageSrc: "http://img.b2bpic.net/free-photo/closeup-black-fabric-texture-outdoor-setting-sunlight-background-blurred-product-shot_272375-26448.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<ProductsSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="Client Stories"
title="Voices of Elegance"
description="Discover why our clients choose Mukmhal for their accessory essentials."
testimonials={[
{
name: "Sophia Martinez",
role: "Fashion Stylist",
company: "Elite Fashion",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/selfconfident-curly-woman-silk-black-stylish-home-suit-sits-carpet-floor-leans-lea_197531-33664.jpg",
},
{
name: "Liam Anderson",
role: "Director",
company: "Design Lab",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/positive-carefree-teenage-girl-with-bun-hairstyle-looks-happily-away-wears-stylish-green-costume-white-boots-blue-eyeliner-feels-good-poses-against-grey-concrete-wall-urban-lifestyle-concept_273609-57790.jpg",
},
{
name: "Chloe Bennett",
role: "Creative Lead",
company: "Artisan Group",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-stylish-young-woman_158538-4138.jpg",
},
{
name: "Jordan Smith",
role: "Consultant",
company: "Vogue Insights",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/attractive-young-woman-with-cutlery-restaurant_169016-21627.jpg",
},
{
name: "Elena Rossi",
role: "Curator",
company: "Gallery Noir",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/girl-with-white-manicure-covers-her-mouth-with-her-hand-looks-camera-coquettishly-snapshot-brunette-red-knitted-jacket_197531-26531.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSimple
tag="Support"
title="Frequently Asked Questions"
description="Everything you need to know about our luxury collection and ordering process."
items={[
{
question: "What materials do you use?",
answer: "We exclusively use ethically sourced, high-grade full-grain Italian leather.",
},
{
question: "Do you offer international shipping?",
answer: "Yes, we ship globally to ensure luxury reaches you wherever you are.",
},
{
question: "How do I care for my bag?",
answer: "Each purchase comes with a comprehensive care guide to maintain the leather's natural beauty.",
},
{
question: "Is there a warranty?",
answer: "All Mukmhal pieces are covered by a two-year artisan quality guarantee.",
},
]}
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Concierge"
text="Ready to own your piece of timeless luxury? Contact our concierge team for custom inquiries or bespoke service."
primaryButton={{
text: "Contact Us",
href: "mailto:concierge@mukmhal.com",
}}
secondaryButton={{
text: "Follow on Instagram",
href: "https://instagram.com/mukmhal_co",
}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
<NewsletterSection />
</>
);
}

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="Our Story"
title="Legacy of Craftsmanship"
description="At Mukmhal, we believe in the harmony of tradition and innovation. Every bag is a testament to our commitment to quality, sourcing the finest materials to create accessories that stand the test of time."
imageSrc="http://img.b2bpic.net/free-photo/close-up-bootmaker-working-with-leather-textile_171337-12307.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,43 @@
import { Leaf, Scissors, ShieldCheck } from "lucide-react";
import ScrollReveal from "@/components/ui/ScrollReveal";
export default function Certifications() {
const certs = [
{
icon: Leaf,
title: "Ethically Sourced",
description: "We partner with suppliers who share our commitment to sustainable and ethical practices."
},
{
icon: Scissors,
title: "Artisan Crafted",
description: "Meticulously handcrafted by master artisans with decades of experience."
},
{
icon: ShieldCheck,
title: "Guaranteed Authenticity",
description: "Each product comes with a certificate of authenticity and lifetime warranty."
}
];
return (
<section data-webild-section="certifications" id="certifications" className="relative w-full py-16 bg-background border-b border-white/5">
<div className="w-content-width mx-auto">
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 md:gap-12">
{certs.map((cert, idx) => {
const Icon = cert.icon;
return (
<ScrollReveal variant="fade" key={idx} delay={idx * 0.1} className="flex flex-col items-center text-center">
<div className="mb-4 text-accent">
<Icon className="w-8 h-8" strokeWidth={1.5} />
</div>
<h3 className="text-lg font-medium text-foreground mb-2 uppercase tracking-widest">{cert.title}</h3>
<p className="text-sm text-accent leading-relaxed">{cert.description}</p>
</ScrollReveal>
);
})}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,27 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "contact" section.
import React from 'react';
import ContactCta from '@/components/sections/contact/ContactCta';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ContactSection(): React.JSX.Element {
return (
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Concierge"
text="Ready to own your piece of timeless luxury? Contact our concierge team for custom inquiries or bespoke service."
primaryButton={{
text: "Contact Us",
href: "mailto:concierge@mukmhal.com",
}}
secondaryButton={{
text: "Follow on Instagram",
href: "https://instagram.com/mukmhal_co",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,38 @@
// 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="Support"
title="Frequently Asked Questions"
description="Everything you need to know about our luxury collection and ordering process."
items={[
{
question: "What materials do you use?",
answer: "We exclusively use ethically sourced, high-grade full-grain Italian leather.",
},
{
question: "Do you offer international shipping?",
answer: "Yes, we ship globally to ensure luxury reaches you wherever you are.",
},
{
question: "How do I care for my bag?",
answer: "Each purchase comes with a comprehensive care guide to maintain the leather's natural beauty.",
},
{
question: "Is there a warranty?",
answer: "All Mukmhal pieces are covered by a two-year artisan quality guarantee.",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,29 @@
// 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 HeroSplit from '@/components/sections/hero/HeroSplit';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroSplit
tag="Luxury Defined"
title="Timeless Elegance in Every Stitch"
description="Discover the art of refined luxury with our exclusive collection of premium leather bags, handcrafted for the modern connoisseur."
primaryButton={{
text: "Explore Collection",
href: "#products",
}}
secondaryButton={{
text: "Contact Us",
href: "#contact",
}}
imageSrc="https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032135946-bapcaypw.png?_wi=1"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,50 @@
import { useState } from "react";
import { motion } from "motion/react";
import Tag from "@/components/ui/Tag";
import TextAnimation from "@/components/ui/TextAnimation";
import ScrollReveal from "@/components/ui/ScrollReveal";
import Input from "@/components/ui/Input";
import Button from "@/components/ui/Button";
export default function NewsletterSection() {
const [email, setEmail] = useState("");
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
console.log("Subscribed:", email);
setEmail("");
};
return (
<section data-webild-section="newsletter" id="newsletter" className="relative w-full py-24 bg-background">
<div className="w-content-width mx-auto">
<ScrollReveal variant="fade">
<div className="card p-8 md:p-12 flex flex-col items-center text-center">
<Tag text="Newsletter" className="mb-6" />
<TextAnimation
text="Join the Exclusive Circle"
variant="fade-blur"
tag="h2"
className="text-3xl md:text-5xl font-bold text-foreground mb-4"
gradientText={false}
/>
<p className="text-lg text-accent max-w-2xl mb-8">
Subscribe to receive early access to new collections, private sales, and insider news from Mukmhal.
</p>
<form onSubmit={handleSubmit} className="flex flex-col sm:flex-row gap-4 w-full max-w-md">
<Input
type="email"
placeholder="Enter your email address"
value={email}
onChange={(e) => setEmail(e.target.value)}
required
className="flex-1"
/>
<Button text="Subscribe" variant="primary" />
</form>
</div>
</ScrollReveal>
</div>
</section>
);
}

View File

@@ -0,0 +1,158 @@
/* eslint-disable */
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
import Button from "@/components/ui/Button";
import TextAnimation from "@/components/ui/TextAnimation";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import ScrollReveal from "@/components/ui/ScrollReveal";
import { cls } from "@/lib/utils";
const items = [
{
title: "Classic Tote",
description: "The ultimate everyday statement.",
imageSrc: "https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032135946-bapcaypw.png?_wi=2"
},
{
title: "Crossbody Chic",
description: "Hands-free luxury refined.",
imageSrc: "https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032343425-ptuhoama.png?_wi=1"
},
{
title: "Evening Clutch",
description: "Sophistication for every occasion.",
imageSrc: "https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032343428-nbdvxo47.png"
},
{
title: "Satchel Elegance",
description: "Timeless structure and style.",
imageSrc: "https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032343430-h9m2pm0m.jpg"
},
{
title: "Modern Bucket",
description: "Contemporary design reinvented.",
imageSrc: "https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032343430-mvl5k58d.jpg"
},
{
title: "Signature Hobo",
description: "Relaxed and utterly refined.",
imageSrc: "https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032135946-bapcaypw.png?_wi=3"
},
{
title: "Deluxe Portfolio",
description: "Function meets luxury design.",
imageSrc: "https://storage.googleapis.com/webild/users/user_3FRI9hSVlKawL1T7Ct3lwyvoctg/uploaded-1782032343425-ptuhoama.png?_wi=2"
}
];
type FeatureItem = {
title: string;
description: string;
href?: string;
} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never });
interface FeaturesImageBentoProps {
tag: string;
title: string;
description: string;
primaryButton?: { text: string; href: string };
secondaryButton?: { text: string; href: string };
items: [FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem];
}
const ProductsInline = () => {
const gridClasses = [
"md:col-span-2",
"md:col-span-4",
"md:col-span-3",
"md:col-span-3",
"md:col-span-2",
"md:col-span-2",
"md:col-span-2",
];
const staggerDelays = [
0,
0.1,
0,
0.1,
0,
0.1,
0.2,
];
return (
<section aria-label="Features image bento section" className="py-20">
<div className="flex flex-col gap-8 md:gap-10">
<div className="flex flex-col items-center w-content-width mx-auto gap-2">
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
<p>{"The Collection"}</p>
</div>
<TextAnimation
text={"Signature Pieces"}
variant="slide-up"
gradientText={true}
tag="h2"
className="md:max-w-8/10 text-6xl 2xl:text-7xl leading-[1.15] font-semibold text-center text-balance"
/>
<TextAnimation
text={"Exquisitely designed bags that define your presence."}
variant="slide-up"
gradientText={false}
tag="p"
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-center text-balance"
/>
{(undefined || undefined) && (
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
{undefined && <Button text={undefined.text} href={undefined.href} variant="primary"/>}
{undefined && <Button text={undefined.text} href={undefined.href} variant="secondary" animationDelay={0.1} />}
</div>
)}
</div>
<div className="w-content-width mx-auto grid grid-cols-1 md:grid-cols-6 gap-3">
{items.map((item, index) => {
const content = (
<div className="relative h-80 xl:h-100 2xl:h-120 overflow-hidden">
<ImageOrVideo
imageSrc={item.imageSrc}
videoSrc={item.videoSrc}
className="rounded group-hover:scale-105 transition-transform duration-500"
/>
<div className="absolute inset-x-5 bottom-5 xl:inset-x-6 xl:bottom-6 2xl:inset-x-7 2xl:bottom-7 flex flex-col text-background">
<span className="text-2xl font-semibold leading-snug truncate">{item.title}</span>
<span className="text-base leading-snug truncate">{item.description}</span>
</div>
</div>
);
return (
<ScrollReveal key={index} variant="slide-up" delay={staggerDelays[index]} className={cls("col-span-1 group", gridClasses[index])}>
{item.href ? (
<a href={item.href} className="block overflow-hidden rounded">
{content}
</a>
) : (
<div className="overflow-hidden rounded">
{content}
</div>
)}
</ScrollReveal>
);
})}
</div>
</div>
</section>
);
};
export default function ProductsSection() {
return (
<div data-webild-section="products" id="products">
<ProductsInline />
</div>
);
}

View File

@@ -0,0 +1,57 @@
// 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="Client Stories"
title="Voices of Elegance"
description="Discover why our clients choose Mukmhal for their accessory essentials."
testimonials={[
{
name: "Sophia Martinez",
role: "Fashion Stylist",
company: "Elite Fashion",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/selfconfident-curly-woman-silk-black-stylish-home-suit-sits-carpet-floor-leans-lea_197531-33664.jpg",
},
{
name: "Liam Anderson",
role: "Director",
company: "Design Lab",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/positive-carefree-teenage-girl-with-bun-hairstyle-looks-happily-away-wears-stylish-green-costume-white-boots-blue-eyeliner-feels-good-poses-against-grey-concrete-wall-urban-lifestyle-concept_273609-57790.jpg",
},
{
name: "Chloe Bennett",
role: "Creative Lead",
company: "Artisan Group",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-stylish-young-woman_158538-4138.jpg",
},
{
name: "Jordan Smith",
role: "Consultant",
company: "Vogue Insights",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/attractive-young-woman-with-cutlery-restaurant_169016-21627.jpg",
},
{
name: "Elena Rossi",
role: "Curator",
company: "Gallery Noir",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/girl-with-white-manicure-covers-her-mouth-with-her-hand-looks-camera-coquettishly-snapshot-brunette-red-knitted-jacket_197531-26531.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}