Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bffa247ac | |||
| 9d54164392 | |||
| fe728c129f | |||
| 58c0e016b7 | |||
| 0f84616d2d | |||
| 9efac29bb7 | |||
| e0760e8bd0 | |||
| 6edd5ea507 | |||
| c168e80ffe |
@@ -9,6 +9,7 @@ import TestimonialCardOne from '@/components/sections/testimonial/TestimonialCar
|
|||||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||||
import ContactCenter from '@/components/sections/contact/ContactCenter';
|
import ContactCenter from '@/components/sections/contact/ContactCenter';
|
||||||
import FooterSimple from '@/components/sections/footer/FooterSimple';
|
import FooterSimple from '@/components/sections/footer/FooterSimple';
|
||||||
|
import NavbarStyleApple from "@/components/navbar/NavbarStyleApple/NavbarStyleApple";
|
||||||
|
|
||||||
export default function LandingPage() {
|
export default function LandingPage() {
|
||||||
return (
|
return (
|
||||||
@@ -25,7 +26,7 @@ export default function LandingPage() {
|
|||||||
headingFontWeight="semibold"
|
headingFontWeight="semibold"
|
||||||
>
|
>
|
||||||
<div id="nav" data-section="nav">
|
<div id="nav" data-section="nav">
|
||||||
<NavbarStyleFullscreen
|
<NavbarStyleApple
|
||||||
navItems={[
|
navItems={[
|
||||||
{ name: "Home", id: "#hero" },
|
{ name: "Home", id: "#hero" },
|
||||||
{ name: "About", id: "#about" },
|
{ name: "About", id: "#about" },
|
||||||
@@ -34,8 +35,6 @@ export default function LandingPage() {
|
|||||||
{ name: "Contact", id: "#contact" },
|
{ name: "Contact", id: "#contact" },
|
||||||
]}
|
]}
|
||||||
brandName="Sweet Delights"
|
brandName="Sweet Delights"
|
||||||
bottomLeftText="Baked with Love"
|
|
||||||
bottomRightText="hello@sweetdelights.com"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div id="hero" data-section="hero">
|
<div id="hero" data-section="hero">
|
||||||
|
|||||||
@@ -3,22 +3,22 @@
|
|||||||
/* --vw is set by ThemeProvider */
|
/* --vw is set by ThemeProvider */
|
||||||
|
|
||||||
/* --background: #f7f6f7;;
|
/* --background: #f7f6f7;;
|
||||||
--card: #ffffff;;
|
--card: #faf9fb;;
|
||||||
--foreground: #0c1325;;
|
--foreground: #2d3e52;;
|
||||||
--primary-cta: #0798ff;;
|
--primary-cta: #6b9fd9;;
|
||||||
--secondary-cta: #ffffff;;
|
--secondary-cta: #f5f3f7;;
|
||||||
--accent: #93c7ff;;
|
--accent: #b8d9f0;;
|
||||||
--background-accent: #a8cde8;; */
|
--background-accent: #d4e4f0;; */
|
||||||
|
|
||||||
--background: #f7f6f7;;
|
--background: #faf8fb;;
|
||||||
--card: #ffffff;;
|
--card: #faf9fb;;
|
||||||
--foreground: #0c1325;;
|
--foreground: #2d3e52;;
|
||||||
--primary-cta: #0798ff;;
|
--primary-cta: #6b9fd9;;
|
||||||
--primary-cta-text: #f7f6f7;;
|
--primary-cta-text: #f7f6f7;;
|
||||||
--secondary-cta: #ffffff;;
|
--secondary-cta: #f5f3f7;;
|
||||||
--secondary-cta-text: #0c1325;;
|
--secondary-cta-text: #0c1325;;
|
||||||
--accent: #93c7ff;;
|
--accent: #b8d9f0;;
|
||||||
--background-accent: #a8cde8;;
|
--background-accent: #d4e4f0;;
|
||||||
|
|
||||||
/* text sizing - set by ThemeProvider */
|
/* text sizing - set by ThemeProvider */
|
||||||
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);
|
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { memo } from "react";
|
import { memo, useState } from "react";
|
||||||
import CardStack from "@/components/cardStack/CardStack";
|
import CardStack from "@/components/cardStack/CardStack";
|
||||||
import MediaContent from "@/components/shared/MediaContent";
|
import MediaContent from "@/components/shared/MediaContent";
|
||||||
import { cls } from "@/lib/utils";
|
import { cls } from "@/lib/utils";
|
||||||
import { Star } from "lucide-react";
|
import { Star, Heart } from "lucide-react";
|
||||||
import type { LucideIcon } from "lucide-react";
|
import type { LucideIcon } from "lucide-react";
|
||||||
import type { ButtonConfig, ButtonAnimationType, CardAnimationTypeWith3D, GridVariant, TitleSegment, TextboxLayout, InvertedBackground } from "@/components/cardStack/types";
|
import type { ButtonConfig, ButtonAnimationType, CardAnimationTypeWith3D, GridVariant, TitleSegment, TextboxLayout, InvertedBackground } from "@/components/cardStack/types";
|
||||||
|
|
||||||
@@ -18,6 +18,8 @@ type Testimonial = {
|
|||||||
videoSrc?: string;
|
videoSrc?: string;
|
||||||
imageAlt?: string;
|
imageAlt?: string;
|
||||||
videoAriaLabel?: string;
|
videoAriaLabel?: string;
|
||||||
|
backText?: string;
|
||||||
|
testimonialText?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
interface TestimonialCardOneProps {
|
interface TestimonialCardOneProps {
|
||||||
@@ -69,6 +71,7 @@ interface TestimonialCardProps {
|
|||||||
nameClassName?: string;
|
nameClassName?: string;
|
||||||
roleClassName?: string;
|
roleClassName?: string;
|
||||||
companyClassName?: string;
|
companyClassName?: string;
|
||||||
|
backTextClassName?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TestimonialCard = memo(({
|
const TestimonialCard = memo(({
|
||||||
@@ -80,41 +83,84 @@ const TestimonialCard = memo(({
|
|||||||
nameClassName = "",
|
nameClassName = "",
|
||||||
roleClassName = "",
|
roleClassName = "",
|
||||||
companyClassName = "",
|
companyClassName = "",
|
||||||
|
backTextClassName = "",
|
||||||
}: TestimonialCardProps) => {
|
}: TestimonialCardProps) => {
|
||||||
return (
|
const [isFlipped, setIsFlipped] = useState(false);
|
||||||
<div className={cls("relative h-full rounded-theme-capped overflow-hidden group", cardClassName)}>
|
|
||||||
<MediaContent
|
|
||||||
imageSrc={testimonial.imageSrc}
|
|
||||||
videoSrc={testimonial.videoSrc}
|
|
||||||
imageAlt={testimonial.imageAlt || testimonial.name}
|
|
||||||
videoAriaLabel={testimonial.videoAriaLabel || testimonial.name}
|
|
||||||
imageClassName={cls("relative z-1 w-full h-full object-cover!", imageClassName)}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className={cls("!absolute z-1 bottom-6 left-6 right-6 card backdrop-blur-xs p-6 flex flex-col gap-3 rounded-theme-capped", overlayClassName)}>
|
return (
|
||||||
<div className={cls("relative z-1 flex gap-1", ratingClassName)}>
|
<div
|
||||||
{Array.from({ length: 5 }).map((_, index) => (
|
className={cls("relative h-full rounded-theme-capped overflow-hidden group cursor-pointer", cardClassName)}
|
||||||
<Star
|
style={{
|
||||||
key={index}
|
perspective: "1000px",
|
||||||
className={cls(
|
}}
|
||||||
"h-5 w-auto text-accent",
|
onMouseEnter={() => setIsFlipped(true)}
|
||||||
index < testimonial.rating ? "fill-accent" : "fill-transparent"
|
onMouseLeave={() => setIsFlipped(false)}
|
||||||
)}
|
>
|
||||||
strokeWidth={1.5}
|
<div
|
||||||
/>
|
style={{
|
||||||
))}
|
transformStyle: "preserve-3d",
|
||||||
|
transform: isFlipped ? "rotateY(180deg)" : "rotateY(0deg)",
|
||||||
|
transition: "transform 0.6s ease-in-out",
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Front side */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
backfaceVisibility: "hidden",
|
||||||
|
WebkitBackfaceVisibility: "hidden",
|
||||||
|
}}
|
||||||
|
className="w-full h-full"
|
||||||
|
>
|
||||||
|
<MediaContent
|
||||||
|
imageSrc={testimonial.imageSrc}
|
||||||
|
videoSrc={testimonial.videoSrc}
|
||||||
|
imageAlt={testimonial.imageAlt || testimonial.name}
|
||||||
|
videoAriaLabel={testimonial.videoAriaLabel || testimonial.name}
|
||||||
|
imageClassName={cls("relative z-1 w-full h-full object-cover!", imageClassName)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div className={cls("!absolute z-1 bottom-6 left-6 right-6 card backdrop-blur-xs p-6 flex flex-col gap-3 rounded-theme-capped", overlayClassName)}>
|
||||||
|
<div className={cls("relative z-1 flex gap-1", ratingClassName)}>
|
||||||
|
{Array.from({ length: 5 }).map((_, index) => (
|
||||||
|
<Star
|
||||||
|
key={index}
|
||||||
|
className={cls(
|
||||||
|
"h-5 w-auto text-accent",
|
||||||
|
index < testimonial.rating ? "fill-accent" : "fill-transparent"
|
||||||
|
)}
|
||||||
|
strokeWidth={1.5}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 className={cls("relative z-1 text-2xl font-medium text-foreground leading-[1.1] mt-1", nameClassName)}>
|
||||||
|
{testimonial.name}
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<div className="relative z-1 flex flex-col gap-1">
|
||||||
|
<p className={cls("text-base text-foreground leading-[1.1]", roleClassName)}>
|
||||||
|
{testimonial.role}
|
||||||
|
</p>
|
||||||
|
<p className={cls("text-base text-foreground leading-[1.1]", companyClassName)}>
|
||||||
|
{testimonial.company}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 className={cls("relative z-1 text-2xl font-medium text-foreground leading-[1.1] mt-1", nameClassName)}>
|
{/* Back side */}
|
||||||
{testimonial.name}
|
<div
|
||||||
</h3>
|
style={{
|
||||||
|
backfaceVisibility: "hidden",
|
||||||
<div className="relative z-1 flex flex-col gap-1">
|
WebkitBackfaceVisibility: "hidden",
|
||||||
<p className={cls("text-base text-foreground leading-[1.1]", roleClassName)}>
|
transform: "rotateY(180deg)",
|
||||||
{testimonial.role}
|
}}
|
||||||
</p>
|
className={cls("absolute inset-0 w-full h-full card backdrop-blur-xs p-6 flex flex-col gap-3 rounded-theme-capped justify-center items-center", backTextClassName)}
|
||||||
<p className={cls("text-base text-foreground leading-[1.1]", companyClassName)}>
|
>
|
||||||
{testimonial.company}
|
<p className="text-base text-foreground leading-relaxed text-center">
|
||||||
|
{testimonial.backText || "Hover to see more"}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -164,7 +210,22 @@ const TestimonialCardOne = ({
|
|||||||
textBoxButtonTextClassName = "",
|
textBoxButtonTextClassName = "",
|
||||||
}: TestimonialCardOneProps) => {
|
}: TestimonialCardOneProps) => {
|
||||||
return (
|
return (
|
||||||
<CardStack
|
<div className="relative">
|
||||||
|
{/* Decorative hearts around section */}
|
||||||
|
<div className="absolute -top-8 left-1/4 text-red-500 opacity-60 animate-pulse">
|
||||||
|
<Heart size={24} fill="currentColor" />
|
||||||
|
</div>
|
||||||
|
<div className="absolute -top-6 right-1/4 text-red-500 opacity-50 animate-pulse" style={{ animationDelay: "0.5s" }}>
|
||||||
|
<Heart size={20} fill="currentColor" />
|
||||||
|
</div>
|
||||||
|
<div className="absolute -bottom-8 left-1/3 text-red-500 opacity-60 animate-pulse" style={{ animationDelay: "1s" }}>
|
||||||
|
<Heart size={22} fill="currentColor" />
|
||||||
|
</div>
|
||||||
|
<div className="absolute -bottom-6 right-1/3 text-red-500 opacity-50 animate-pulse" style={{ animationDelay: "0.3s" }}>
|
||||||
|
<Heart size={18} fill="currentColor" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<CardStack
|
||||||
mode={carouselMode}
|
mode={carouselMode}
|
||||||
gridVariant={gridVariant}
|
gridVariant={gridVariant}
|
||||||
uniformGridCustomHeightClasses={uniformGridCustomHeightClasses}
|
uniformGridCustomHeightClasses={uniformGridCustomHeightClasses}
|
||||||
@@ -208,9 +269,11 @@ const TestimonialCardOne = ({
|
|||||||
nameClassName={nameClassName}
|
nameClassName={nameClassName}
|
||||||
roleClassName={roleClassName}
|
roleClassName={roleClassName}
|
||||||
companyClassName={companyClassName}
|
companyClassName={companyClassName}
|
||||||
|
backTextClassName=""
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</CardStack>
|
</CardStack>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user