Merge version_1 into main

Merge version_1 into main
This commit was merged in pull request #2.
This commit is contained in:
2026-03-13 06:05:07 +00:00
2 changed files with 51 additions and 59 deletions

View File

@@ -18,7 +18,7 @@ export default function LandingPage() {
borderRadius="rounded"
contentWidth="small"
sizing="large"
background="fluid"
background="circleGradient"
cardStyle="soft-shadow"
primaryButtonStyle="radial-glow"
secondaryButtonStyle="solid"
@@ -44,18 +44,18 @@ export default function LandingPage() {
description="Experience the art of classic barbering meets modern style. At Millennium Barber Shop, we deliver precision cuts, expert styling, and timeless craftsmanship that makes every visit memorable."
tag="Est. 2010"
tagAnimation="slide-up"
background={{ variant: "fluid" }}
background={{ variant: "plain" }}
leftCarouselItems={[
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=5c9jyl&_wi=1", imageAlt: "Modern fade haircut" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=c5fwxv&_wi=1", imageAlt: "Classic gentleman style" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v81zqo&_wi=1", imageAlt: "Contemporary undercut" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=qvo4nm&_wi=1", imageAlt: "Textured crop style" }
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=5c9jyl", imageAlt: "Modern fade haircut" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=c5fwxv", imageAlt: "Classic gentleman style" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v81zqo", imageAlt: "Contemporary undercut" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=qvo4nm", imageAlt: "Textured crop style" }
]}
rightCarouselItems={[
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=1cqpn2", imageAlt: "Barber shop interior" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v00jax&_wi=1", imageAlt: "Professional haircut" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=x1r0ry&_wi=1", imageAlt: "Beard trim service" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=mv1e4w&_wi=1", imageAlt: "Classic shave service" }
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v00jax", imageAlt: "Professional haircut" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=x1r0ry", imageAlt: "Beard trim service" },
{ imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=mv1e4w", imageAlt: "Classic shave service" }
]}
buttons={[
{ text: "Book Now", href: "contact" },
@@ -79,6 +79,7 @@ export default function LandingPage() {
imageAlt="Master barber at work"
useInvertedBackground={false}
mediaAnimation="slide-up"
metricsAnimation="slide-up"
/>
</div>
@@ -93,13 +94,13 @@ export default function LandingPage() {
useInvertedBackground={false}
features={[
{
title: "Classic Haircuts", description: "Expert scissor work and precision cutting tailored to your style and face shape.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v00jax&_wi=2", imageAlt: "Professional haircut service"
title: "Classic Haircuts", description: "Expert scissor work and precision cutting tailored to your style and face shape.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v00jax", imageAlt: "Professional haircut service"
},
{
title: "Beard Grooming", description: "Complete beard styling, trimming, and shaping with premium beard products.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=x1r0ry&_wi=2", imageAlt: "Professional beard trim"
title: "Beard Grooming", description: "Complete beard styling, trimming, and shaping with premium beard products.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=x1r0ry", imageAlt: "Professional beard trim"
},
{
title: "Traditional Shaving", description: "Luxurious straight razor shaves with hot towel treatments and premium aftercare.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=mv1e4w&_wi=2", imageAlt: "Classic barber shave experience"
title: "Traditional Shaving", description: "Luxurious straight razor shaves with hot towel treatments and premium aftercare.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=mv1e4w", imageAlt: "Classic barber shave experience"
}
]}
/>
@@ -117,19 +118,19 @@ export default function LandingPage() {
products={[
{
id: "cut-1", brand: "Modern Style", name: "Sharp Fade Cut", price: "Starting at $35", rating: 5,
reviewCount: "2.3k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=5c9jyl&_wi=2", imageAlt: "Sharp fade haircut"
reviewCount: "2.3k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=5c9jyl", imageAlt: "Sharp fade haircut"
},
{
id: "cut-2", brand: "Classic Look", name: "Gentleman's Cut", price: "Starting at $40", rating: 5,
reviewCount: "1.9k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=c5fwxv&_wi=2", imageAlt: "Classic gentleman haircut"
reviewCount: "1.9k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=c5fwxv", imageAlt: "Classic gentleman haircut"
},
{
id: "cut-3", brand: "Contemporary", name: "Modern Undercut", price: "Starting at $40", rating: 5,
reviewCount: "2.1k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v81zqo&_wi=2", imageAlt: "Contemporary undercut style"
reviewCount: "2.1k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=v81zqo", imageAlt: "Contemporary undercut style"
},
{
id: "cut-4", brand: "Textured", name: "Crop Cut", price: "Starting at $35", rating: 5,
reviewCount: "1.8k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=qvo4nm&_wi=2", imageAlt: "Textured crop haircut"
reviewCount: "1.8k", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/default/no-image.jpg?id=qvo4nm", imageAlt: "Textured crop haircut"
}
]}
/>
@@ -182,7 +183,7 @@ export default function LandingPage() {
tag="Stay Connected"
title="Get Exclusive Grooming Tips & Offers"
description="Subscribe to our newsletter for the latest trends in men's grooming, special promotions, and insider tips from our expert barbers."
background={{ variant: "fluid" }}
background={{ variant: "plain" }}
useInvertedBackground={false}
inputPlaceholder="Enter your email"
buttonText="Subscribe"

View File

@@ -1,50 +1,41 @@
"use client";
import React, { SVGProps } from "react";
import { memo } from "react";
import useSvgTextLogo from "./useSvgTextLogo";
import { cls } from "@/lib/utils";
interface SvgTextLogoProps {
logoText: string;
adjustHeightFactor?: number;
verticalAlign?: "top" | "center";
export interface SvgTextLogoProps extends SVGProps<SVGSVGElement> {
text?: string;
className?: string;
}
const SvgTextLogo = memo<SvgTextLogoProps>(function SvgTextLogo({
logoText,
adjustHeightFactor,
verticalAlign = "top",
className = "",
}) {
const { svgRef, textRef, viewBox, aspectRatio } = useSvgTextLogo(logoText, false, adjustHeightFactor);
return (
<svg
ref={svgRef}
viewBox={viewBox}
className={cls("w-full", className)}
style={{ aspectRatio: aspectRatio }}
preserveAspectRatio="none"
role="img"
aria-label={`${logoText} logo`}
>
<text
ref={textRef}
x="0"
y={verticalAlign === "center" ? "50%" : "0"}
className="font-bold fill-current"
style={{
fontSize: "20px",
letterSpacing: "-0.02em",
dominantBaseline: verticalAlign === "center" ? "middle" : "text-before-edge"
}}
const SvgTextLogo = React.forwardRef<SVGSVGElement, SvgTextLogoProps>(
({ text = "Logo", className = "", ...props }, ref) => {
return (
<svg
ref={ref}
viewBox="0 0 200 100"
className={className}
{...props}
>
{logoText}
</text>
</svg>
);
});
<defs>
<linearGradient id="logoGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stopColor="#3b82f6" />
<stop offset="100%" stopColor="#1e40af" />
</linearGradient>
</defs>
<text
x="50%"
y="50%"
textAnchor="middle"
dominantBaseline="central"
fontSize="48"
fontWeight="bold"
fill="url(#logoGradient)"
fontFamily="system-ui, -apple-system, sans-serif"
>
{text}
</text>
</svg>
);
}
);
SvgTextLogo.displayName = "SvgTextLogo";