From f2d59b97fd6d7291761c2137bf38993103466777 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:43 +0000 Subject: [PATCH 01/18] Update src/components/ecommerce/ProductDetailCard.tsx --- .../ecommerce/ProductDetailCard.tsx | 137 ------------------ 1 file changed, 137 deletions(-) diff --git a/src/components/ecommerce/ProductDetailCard.tsx b/src/components/ecommerce/ProductDetailCard.tsx index 11d866b..e69de29 100644 --- a/src/components/ecommerce/ProductDetailCard.tsx +++ b/src/components/ecommerce/ProductDetailCard.tsx @@ -1,137 +0,0 @@ -import { useState } from "react"; -import { Star } from "lucide-react"; -import { cls } from "@/lib/utils"; -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import Button from "@/components/ui/Button"; -import Transition from "@/components/ui/Transition"; - -type ProductVariant = { - label: string; - options: string[]; - selected: string; - onChange: (value: string) => void; -}; - -type ProductDetailCardProps = { - name: string; - price: string; - salePrice?: string; - images: string[]; - description?: string; - rating?: number; - ribbon?: string; - inventoryStatus?: "in-stock" | "out-of-stock"; - inventoryQuantity?: number; - sku?: string; - variants?: ProductVariant[]; - quantity?: ProductVariant; - onAddToCart?: () => void; - onBuyNow?: () => void; -}; - -const ProductDetailCard = ({ name, price, salePrice, images, description, rating = 0, ribbon, inventoryStatus, inventoryQuantity, sku, variants, quantity, onAddToCart, onBuyNow }: ProductDetailCardProps) => { - const [selectedImage, setSelectedImage] = useState(0); - - return ( -
-
-
- - - - {images.length > 1 && ( -
- {images.map((src, i) => ( - - ))} -
- )} -
- -
-
-

{name}

- {ribbon && {ribbon}} -
-
-
-

- {salePrice ? ( - <> - {price} - {salePrice} - - ) : ( - price - )} -

-
- {Array.from({ length: 5 }).map((_, i) => ( - - ))} -
-
- {(inventoryStatus || inventoryQuantity || sku) && ( -
- {inventoryStatus && ( - - {inventoryStatus === "in-stock" ? "In Stock" : "Out of Stock"} - - )} - {inventoryQuantity && ( - {inventoryQuantity} available - )} - {sku && SKU: {sku}} -
- )} - {description &&

{description}

} - {variants && variants.length > 0 && ( -
- {variants.map((variant) => ( -
- -
- -
-
- ))} -
- )} - {quantity && ( -
- -
- -
-
- )} -
-
-
-
-
- ); -}; - -export default ProductDetailCard; -export type { ProductVariant }; -- 2.49.1 From d7e14827cd039cddcb663dd09554299cd9e19cbc Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:43 +0000 Subject: [PATCH 02/18] Update src/components/sections/about/AboutFeaturesSplit.tsx --- .../sections/about/AboutFeaturesSplit.tsx | 90 ------------------- 1 file changed, 90 deletions(-) diff --git a/src/components/sections/about/AboutFeaturesSplit.tsx b/src/components/sections/about/AboutFeaturesSplit.tsx index 3d59abb..e69de29 100644 --- a/src/components/sections/about/AboutFeaturesSplit.tsx +++ b/src/components/sections/about/AboutFeaturesSplit.tsx @@ -1,90 +0,0 @@ -import type { LucideIcon } from "lucide-react"; -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import { resolveIcon } from "@/utils/resolve-icon"; - -type AboutFeaturesSplitProps = { - tag: string; - title: string; - description: string; - primaryButton?: { text: string; href: string }; - secondaryButton?: { text: string; href: string }; - items: { icon: string | LucideIcon; title: string; description: string }[]; -} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); - -const AboutFeaturesSplit = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - items, - imageSrc, - videoSrc, -}: AboutFeaturesSplitProps) => { - return ( -
-
-
-
-

{tag}

-
- - - - - - {(primaryButton || secondaryButton) && ( -
- {primaryButton &&
- )} -
- -
-
- {items.map((item, index) => { - const ItemIcon = resolveIcon(item.icon); - return ( -
-
-
- -
-

{item.title}

-

{item.description}

-
- {index < items.length - 1 && ( -
- )} -
- ); - })} -
- -
-
- -
-
-
-
-
- ); -}; - -export default AboutFeaturesSplit; -- 2.49.1 From 9b646ec80854cb9f99f3df6ff0af21bed4eaf798 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:44 +0000 Subject: [PATCH 03/18] Update src/components/sections/blog/BlogSimpleCards.tsx --- .../sections/blog/BlogSimpleCards.tsx | 159 ------------------ 1 file changed, 159 deletions(-) diff --git a/src/components/sections/blog/BlogSimpleCards.tsx b/src/components/sections/blog/BlogSimpleCards.tsx index e128c1e..e69de29 100644 --- a/src/components/sections/blog/BlogSimpleCards.tsx +++ b/src/components/sections/blog/BlogSimpleCards.tsx @@ -1,159 +0,0 @@ -import { ArrowUpRight, Loader2 } from "lucide-react"; -import ScrollReveal from "@/components/ui/ScrollReveal"; -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import GridOrCarousel from "@/components/ui/GridOrCarousel"; -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import { useButtonClick } from "@/hooks/useButtonClick"; -import useBlogPosts from "@/hooks/useBlogPosts"; - -type BlogItem = { - category: string; - title: string; - excerpt: string; - authorName: string; - authorImageSrc: string; - date: string; - imageSrc: string; - href?: string; - onClick?: () => void; -}; - -const BlogCardItem = ({ item }: { item: BlogItem }) => { - const handleClick = useButtonClick(item.href, item.onClick); - - return ( -
-
- -
- -
-
- -
-
-
-

{item.category}

-
-

{item.title}

-

{item.excerpt}

-
- -
- -
- {item.authorName} - {item.date} -
-
-
-
- ); -}; - -type BlogSimpleCardsProps = { - tag: string; - title: string; - description: string; - primaryButton?: { text: string; href: string }; - secondaryButton?: { text: string; href: string }; - items?: BlogItem[]; -}; - -const BlogSimpleCards = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - items: itemsProp, -}: BlogSimpleCardsProps) => { - const { posts, isLoading } = useBlogPosts(); - const isFromApi = posts.length > 0; - const items = isFromApi - ? posts.map((p) => ({ - category: p.category, - title: p.title, - excerpt: p.excerpt, - authorName: p.authorName, - authorImageSrc: p.authorAvatar, - date: p.date, - imageSrc: p.imageSrc, - onClick: p.onBlogClick, - })) - : itemsProp; - - if (isLoading && !itemsProp) { - return ( -
-
- -
-
- ); - } - - if (!items || items.length === 0) { - return null; - } - - return ( -
-
-
-
-

{tag}

-
- - - - - - {(primaryButton || secondaryButton) && ( -
- {primaryButton &&
- )} -
- - - - {items.map((item, index) => ( - - ))} - - -
-
- ); -}; - -export default BlogSimpleCards; -- 2.49.1 From 4bbbcfb66a65a3bcaa90cb2db9997fb333afae06 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:45 +0000 Subject: [PATCH 04/18] Update src/components/sections/features/FeaturesBento.tsx --- .../sections/features/FeaturesBento.tsx | 103 ------------------ 1 file changed, 103 deletions(-) diff --git a/src/components/sections/features/FeaturesBento.tsx b/src/components/sections/features/FeaturesBento.tsx index 0775b16..e69de29 100644 --- a/src/components/sections/features/FeaturesBento.tsx +++ b/src/components/sections/features/FeaturesBento.tsx @@ -1,103 +0,0 @@ -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import GridOrCarousel from "@/components/ui/GridOrCarousel"; -import ScrollReveal from "@/components/ui/ScrollReveal"; -import InfoCardMarquee from "@/components/ui/InfoCardMarquee"; -import TiltedStackCards from "@/components/ui/TiltedStackCards"; -import AnimatedBarChart from "@/components/ui/AnimatedBarChart"; -import OrbitingIcons from "@/components/ui/OrbitingIcons"; -import IconTextMarquee from "@/components/ui/IconTextMarquee"; -import ChatMarquee from "@/components/ui/ChatMarquee"; -import ChecklistTimeline from "@/components/ui/ChecklistTimeline"; -import MediaStack from "@/components/ui/MediaStack"; -import type { LucideIcon } from "lucide-react"; - -type IconInput = string | LucideIcon; - -type FeatureCard = { title: string; description: string } & ( - | { bentoComponent: "info-card-marquee"; infoCards: { icon: IconInput; label: string; value: string }[] } - | { bentoComponent: "tilted-stack-cards"; stackCards: [{ icon: IconInput; title: string; subtitle: string; detail: string }, { icon: IconInput; title: string; subtitle: string; detail: string }, { icon: IconInput; title: string; subtitle: string; detail: string }] } - | { bentoComponent: "animated-bar-chart" } - | { bentoComponent: "orbiting-icons"; centerIcon: IconInput; orbitIcons: IconInput[] } - | { bentoComponent: "icon-text-marquee"; centerIcon: IconInput; marqueeTexts: string[] } - | { bentoComponent: "chat-marquee"; aiIcon: IconInput; userIcon: IconInput; exchanges: { userMessage: string; aiResponse: string }[]; placeholder: string } - | { bentoComponent: "checklist-timeline"; heading: string; subheading: string; checklistItems: [{ label: string; detail: string }, { label: string; detail: string }, { label: string; detail: string }]; completedLabel: string } - | { bentoComponent: "media-stack"; mediaItems: [{ imageSrc?: string; videoSrc?: string }, { imageSrc?: string; videoSrc?: string }, { imageSrc?: string; videoSrc?: string }] } -); - -const getBentoComponent = (feature: FeatureCard) => { - switch (feature.bentoComponent) { - case "info-card-marquee": return ; - case "tilted-stack-cards": return ; - case "animated-bar-chart": return ; - case "orbiting-icons": return ; - case "icon-text-marquee": return ; - case "chat-marquee": return ; - case "checklist-timeline": return ; - case "media-stack": return ; - } -}; - -const FeaturesBento = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - features, -}: { - tag: string; - title: string; - description: string; - primaryButton?: { text: string; href: string }; - secondaryButton?: { text: string; href: string }; - features: FeatureCard[]; -}) => ( -
-
-
-
-

{tag}

-
- - - - - - {(primaryButton || secondaryButton) && ( -
- {primaryButton &&
- )} -
- - - {features.map((feature) => ( -
-
{getBentoComponent(feature)}
-
-

{feature.title}

-

{feature.description}

-
-
- ))} -
-
-
-
-); - -export default FeaturesBento; -- 2.49.1 From 6487a021e8a07ca775055b8622870c84562362c6 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:45 +0000 Subject: [PATCH 05/18] Update src/components/sections/features/FeaturesBentoGridCta.tsx --- .../features/FeaturesBentoGridCta.tsx | 112 ------------------ 1 file changed, 112 deletions(-) diff --git a/src/components/sections/features/FeaturesBentoGridCta.tsx b/src/components/sections/features/FeaturesBentoGridCta.tsx index a7cbc38..e69de29 100644 --- a/src/components/sections/features/FeaturesBentoGridCta.tsx +++ b/src/components/sections/features/FeaturesBentoGridCta.tsx @@ -1,112 +0,0 @@ -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import TextAnimation from "@/components/ui/TextAnimation"; -import ScrollReveal from "@/components/ui/ScrollReveal"; -import { cls } from "@/lib/utils"; - -type FeatureItem = { - title: string; - description: string; -} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); - -interface FeaturesBentoGridCtaProps { - tag: string; - title: string; - description: string; - features: [FeatureItem, FeatureItem, FeatureItem, FeatureItem]; - ctaButton?: { - text: string; - href: string; - avatarSrc?: string; - avatarLabel?: string; - }; -} - -const FeaturesBentoGridCta = ({ - tag, - title, - description, - features, - ctaButton, -}: FeaturesBentoGridCtaProps) => { - const colSpans = ["md:col-span-5", "md:col-span-7", "md:col-span-7", "md:col-span-5"]; - - return ( -
-
- - - -
- {features.map((feature, index) => ( -
-
- -
-
-

{feature.title}

-

{feature.description}

-
-
- ))} -
-
-
-
- ); -}; - -export default FeaturesBentoGridCta; -- 2.49.1 From f78a3b89e2b72d3e34e338fd03a56658c9aaf8a8 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:46 +0000 Subject: [PATCH 06/18] Update src/components/sections/footer/FooterBrandReveal.tsx --- .../sections/footer/FooterBrandReveal.tsx | 101 ------------------ 1 file changed, 101 deletions(-) diff --git a/src/components/sections/footer/FooterBrandReveal.tsx b/src/components/sections/footer/FooterBrandReveal.tsx index 6f0d18b..e69de29 100644 --- a/src/components/sections/footer/FooterBrandReveal.tsx +++ b/src/components/sections/footer/FooterBrandReveal.tsx @@ -1,101 +0,0 @@ -import { useRef, useEffect, useState } from "react"; -import { ChevronRight } from "lucide-react"; -import { useButtonClick } from "@/hooks/useButtonClick"; -import AutoFillText from "@/components/ui/AutoFillText"; -import { cls } from "@/lib/utils"; - -type FooterLink = { - label: string; - href?: string; - onClick?: () => void; -}; - -type FooterColumn = { - items: FooterLink[]; -}; - -const FooterLinkItem = ({ label, href, onClick }: FooterLink) => { - const handleClick = useButtonClick(href, onClick); - - return ( -
-
- ); -}; - -const FooterBrandReveal = ({ - brand, - columns, -}: { - brand: string; - columns: FooterColumn[]; -}) => { - const footerRef = useRef(null); - const [footerHeight, setFooterHeight] = useState(0); - - useEffect(() => { - const updateHeight = () => { - if (footerRef.current) { - setFooterHeight(footerRef.current.offsetHeight); - } - }; - - updateHeight(); - - const resizeObserver = new ResizeObserver(updateHeight); - if (footerRef.current) { - resizeObserver.observe(footerRef.current); - } - - return () => resizeObserver.disconnect(); - }, []); - - return ( -
-
-
-
- {brand} - -
- {columns.map((column, index) => ( -
- {column.items.map((item) => ( - - ))} -
- ))} -
-
-
-
-
- ); -}; - -export default FooterBrandReveal; -- 2.49.1 From 5f2c10d447a199715e59ad6bd78890113baba9a7 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:47 +0000 Subject: [PATCH 07/18] Update src/components/sections/hero/HeroBillboardFloatingCards.tsx --- .../hero/HeroBillboardFloatingCards.tsx | 180 ------------------ 1 file changed, 180 deletions(-) diff --git a/src/components/sections/hero/HeroBillboardFloatingCards.tsx b/src/components/sections/hero/HeroBillboardFloatingCards.tsx index a887516..e69de29 100644 --- a/src/components/sections/hero/HeroBillboardFloatingCards.tsx +++ b/src/components/sections/hero/HeroBillboardFloatingCards.tsx @@ -1,180 +0,0 @@ -import { useRef } from "react"; -import { useScroll, useTransform, motion } from "motion/react"; -import { Check } from "lucide-react"; -import { cls } from "@/lib/utils"; -import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot"; -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import AvatarGroup from "@/components/ui/AvatarGroup"; -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import ScrollReveal from "@/components/ui/ScrollReveal"; - -type FloatingCardPosition = "top-left" | "top-right" | "middle-left" | "middle-right"; - -type HeroBillboardFloatingCardsProps = { - avatarsSrc: string[]; - avatarsLabel: string; - title: string; - description: string; - primaryButton: { text: string; href: string }; - secondaryButton: { text: string; href: string }; - note?: string; - floatingCardsSrc: [string, string, string, string]; - logosSrc?: string[]; -} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); - -const POSITIONS: FloatingCardPosition[] = ["top-left", "top-right", "middle-left", "middle-right"]; - -const FLOATING_CARD_CONFIG: Record = { - "top-left": { - position: "top-8 left-0", - rotation: "-rotate-8", - size: "size-20 xl:size-22 2xl:size-24", - animation: { duration: 4, delay: 0, yOffset: -8, entryDelay: 0.3 }, - }, - "top-right": { - position: "top-4 right-4", - rotation: "rotate-10", - size: "size-18 xl:size-20 2xl:size-22", - animation: { duration: 5, delay: 1, yOffset: -10, entryDelay: 0.5 }, - }, - "middle-left": { - position: "top-1/2 left-2", - rotation: "rotate-6", - size: "size-18 xl:size-20 2xl:size-22", - animation: { duration: 4.5, delay: 0.5, yOffset: -9, entryDelay: 0.7 }, - }, - "middle-right": { - position: "top-1/2 right-0", - rotation: "-rotate-6", - size: "size-20 xl:size-22 2xl:size-24", - animation: { duration: 3.8, delay: 1.5, yOffset: -8, entryDelay: 0.9 }, - }, -}; - -const HeroBillboardFloatingCards = ({ - avatarsSrc, - avatarsLabel, - title, - description, - primaryButton, - secondaryButton, - note, - floatingCardsSrc, - logosSrc, - imageSrc, - videoSrc, -}: HeroBillboardFloatingCardsProps) => { - const containerRef = useRef(null); - const { scrollYProgress } = useScroll({ target: containerRef }); - - const rotate = useTransform(scrollYProgress, [0, 1], [20, 0]); - const scale = useTransform(scrollYProgress, [0, 1], [1.05, 1]); - - return ( -
- -
-
- {POSITIONS.map((position, index) => { - const config = FLOATING_CARD_CONFIG[position]; - const src = floatingCardsSrc[index]; - if (!src) return null; - return ( - - ); - })} - -
-
- -
- - - - - -
-
- - {note && ( - - -
- -
- {note} -
-
- )} -
-
- -
- -
- - - - - - {logosSrc && logosSrc.length > 0 && ( - -
- {[...logosSrc, ...logosSrc, ...logosSrc, ...logosSrc, ...logosSrc, ...logosSrc, ...logosSrc, ...logosSrc].map((logo, index) => ( -
- -
- ))} -
-
- )} -
-
- ); -}; - -export default HeroBillboardFloatingCards; -- 2.49.1 From a67b11b713804ef4605c3eb7713c240707b4e530 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:48 +0000 Subject: [PATCH 08/18] Update src/components/sections/hero/HeroSplitTestimonial.tsx --- .../sections/hero/HeroSplitTestimonial.tsx | 128 ------------------ 1 file changed, 128 deletions(-) diff --git a/src/components/sections/hero/HeroSplitTestimonial.tsx b/src/components/sections/hero/HeroSplitTestimonial.tsx index fc426e5..e69de29 100644 --- a/src/components/sections/hero/HeroSplitTestimonial.tsx +++ b/src/components/sections/hero/HeroSplitTestimonial.tsx @@ -1,128 +0,0 @@ -import { useEffect, useState } from "react"; -import { Star } from "lucide-react"; -import { motion, AnimatePresence } from "motion/react"; -import { cls } from "@/lib/utils"; -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 ScrollReveal from "@/components/ui/ScrollReveal"; - -type Testimonial = { - name: string; - handle: string; - text: string; - rating: number; -} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); - -type HeroSplitTestimonialProps = { - tag: string; - title: string; - description: string; - primaryButton: { text: string; href: string }; - secondaryButton: { text: string; href: string }; - testimonials: Testimonial[]; -} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); - -const INTERVAL = 5000; - -const HeroSplitTestimonial = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - imageSrc, - videoSrc, - testimonials, -}: HeroSplitTestimonialProps) => { - const [currentIndex, setCurrentIndex] = useState(0); - - useEffect(() => { - if (testimonials.length <= 1) return; - - const interval = setInterval(() => { - setCurrentIndex((prev) => (prev + 1) % testimonials.length); - }, INTERVAL); - return () => clearInterval(interval); - }, [currentIndex, testimonials.length]); - - const testimonial = testimonials[currentIndex]; - - return ( -
- -
-
-
-
-

{tag}

-
- - - - - -
-
-
-
- - - - - - -
- {Array.from({ length: 5 }).map((_, index) => ( - - ))} -
- -

{testimonial.text}

- -
- -
- {testimonial.name} - {testimonial.handle} -
-
-
-
-
-
-
- ); -}; - -export default HeroSplitTestimonial; -- 2.49.1 From d21ac95f9d6a5f3ba5944c54f7c483923a22b72d Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:48 +0000 Subject: [PATCH 09/18] Update src/components/sections/hero/HeroVideoExpand.tsx --- .../sections/hero/HeroVideoExpand.tsx | 146 ------------------ 1 file changed, 146 deletions(-) diff --git a/src/components/sections/hero/HeroVideoExpand.tsx b/src/components/sections/hero/HeroVideoExpand.tsx index e0e7f08..e69de29 100644 --- a/src/components/sections/hero/HeroVideoExpand.tsx +++ b/src/components/sections/hero/HeroVideoExpand.tsx @@ -1,146 +0,0 @@ -import { useEffect, useRef, useState } from "react"; -import { AnimatePresence, motion, useScroll, useTransform } from "motion/react"; -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import AutoFillText from "@/components/ui/AutoFillText"; -import { useButtonClick } from "@/hooks/useButtonClick"; - -const StaggerText = ({ text }: { text: string }) => ( - - {[...text].map((char, index) => ( - - {char} - - ))} - -); - -type HeroVideoExpandProps = { - title: string; - primaryButton: { text: string; href: string }; - secondaryButton: { text: string; href: string }; - onComplete?: () => void; -} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); - -const HeroVideoExpand = ({ - title, - videoSrc, - imageSrc, - primaryButton, - secondaryButton, - onComplete, -}: HeroVideoExpandProps) => { - const [showLoader, setShowLoader] = useState(true); - const [expanded, setExpanded] = useState(false); - const handlePrimaryClick = useButtonClick(primaryButton.href); - const handleSecondaryClick = useButtonClick(secondaryButton.href); - - const sectionRef = useRef(null); - const { scrollYProgress } = useScroll({ - target: sectionRef, - offset: ["start start", "end start"], - }); - const videoY = useTransform(scrollYProgress, [0, 1], ["0px", "150px"]); - const videoScale = useTransform(scrollYProgress, [0, 1], [1, 1.1]); - - useEffect(() => { - const expandTimer = setTimeout(() => setExpanded(true), 600); - const hideTimer = setTimeout(() => { - setShowLoader(false); - onComplete?.(); - }, 1500); - return () => { - clearTimeout(expandTimer); - clearTimeout(hideTimer); - }; - }, []); - - return ( - <> - - {showLoader && ( - - - - - - )} - - -
- - - - -
- -
-
- - {title} - - -
- - - - - - - - - - -
-
-
-
- - ); -}; - -export default HeroVideoExpand; -- 2.49.1 From 1bed2c0b0fe27920a636e40ecc7d1445c2d55c5e Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:49 +0000 Subject: [PATCH 10/18] Update src/components/sections/metrics/MetricsGradientCards.tsx --- .../sections/metrics/MetricsGradientCards.tsx | 92 ------------------- 1 file changed, 92 deletions(-) diff --git a/src/components/sections/metrics/MetricsGradientCards.tsx b/src/components/sections/metrics/MetricsGradientCards.tsx index ee189cd..e69de29 100644 --- a/src/components/sections/metrics/MetricsGradientCards.tsx +++ b/src/components/sections/metrics/MetricsGradientCards.tsx @@ -1,92 +0,0 @@ -import type { LucideIcon } from "lucide-react"; -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import GridOrCarousel from "@/components/ui/GridOrCarousel"; -import ScrollReveal from "@/components/ui/ScrollReveal"; -import { resolveIcon } from "@/utils/resolve-icon"; - -type Metric = { - value: string; - title: string; - description: string; - icon: string | LucideIcon; -}; - -const MetricsGradientCards = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - metrics, -}: { - tag: string; - title: string; - description: string; - primaryButton?: { text: string; href: string }; - secondaryButton?: { text: string; href: string }; - metrics: Metric[]; -}) => ( -
-
-
-
-

{tag}

-
- - - - - - {(primaryButton || secondaryButton) && ( -
- {primaryButton &&
- )} -
- - - - {metrics.map((metric) => { - const IconComponent = resolveIcon(metric.icon); - return ( -
- - {metric.value} - - {metric.title} -

{metric.description}

-
- -
-
- ); - })} -
-
-
-
-); - -export default MetricsGradientCards; -- 2.49.1 From cebb6ed9e38be951afbe76a9c9cc9fff84d53871 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:50 +0000 Subject: [PATCH 11/18] Update src/components/sections/metrics/MetricsSimpleCards.tsx --- .../sections/metrics/MetricsSimpleCards.tsx | 71 ------------------- 1 file changed, 71 deletions(-) diff --git a/src/components/sections/metrics/MetricsSimpleCards.tsx b/src/components/sections/metrics/MetricsSimpleCards.tsx index e0b75bd..e69de29 100644 --- a/src/components/sections/metrics/MetricsSimpleCards.tsx +++ b/src/components/sections/metrics/MetricsSimpleCards.tsx @@ -1,71 +0,0 @@ -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import GridOrCarousel from "@/components/ui/GridOrCarousel"; -import ScrollReveal from "@/components/ui/ScrollReveal"; - -type Metric = { - value: string; - description: string; -}; - -const MetricsSimpleCards = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - metrics, -}: { - tag: string; - title: string; - description: string; - primaryButton?: { text: string; href: string }; - secondaryButton?: { text: string; href: string }; - metrics: Metric[]; -}) => ( -
-
-
-
-

{tag}

-
- - - - - - {(primaryButton || secondaryButton) && ( -
- {primaryButton &&
- )} -
- - - - {metrics.map((metric) => ( -
- {metric.value} -

{metric.description}

-
- ))} -
-
-
-
-); - -export default MetricsSimpleCards; -- 2.49.1 From 70245d19039a1fb9b80e9031290768fdb7c5d7e1 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:50 +0000 Subject: [PATCH 12/18] Update src/components/sections/product/ProductMediaCards.tsx --- .../sections/product/ProductMediaCards.tsx | 119 ------------------ 1 file changed, 119 deletions(-) diff --git a/src/components/sections/product/ProductMediaCards.tsx b/src/components/sections/product/ProductMediaCards.tsx index 2131b7b..e69de29 100644 --- a/src/components/sections/product/ProductMediaCards.tsx +++ b/src/components/sections/product/ProductMediaCards.tsx @@ -1,119 +0,0 @@ -import { ArrowUpRight, Loader2 } from "lucide-react"; -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import GridOrCarousel from "@/components/ui/GridOrCarousel"; -import ScrollReveal from "@/components/ui/ScrollReveal"; -import useProducts from "@/hooks/useProducts"; - -type ProductMediaCardsProps = { - tag: string; - title: string; - description: string; - primaryButton?: { text: string; href: string }; - secondaryButton?: { text: string; href: string }; - products?: { - name: string; - price: string; - imageSrc: string; - onClick?: () => void; - }[]; -}; - -const ProductMediaCards = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - products: productsProp, -}: ProductMediaCardsProps) => { - const { products: fetchedProducts, isLoading } = useProducts(); - const isFromApi = fetchedProducts.length > 0; - const products = isFromApi - ? fetchedProducts.map((p) => ({ - name: p.name, - price: p.price, - imageSrc: p.imageSrc, - onClick: p.onProductClick, - })) - : productsProp; - - if (isLoading && !productsProp) { - return ( -
-
- -
-
- ); - } - - if (!products || products.length === 0) { - return null; - } - - return ( -
-
-
-
-

{tag}

-
- - - - - - {(primaryButton || secondaryButton) && ( -
- {primaryButton &&
- )} -
- - - - {products.map((product) => ( - - ))} - - -
-
- ); -}; - -export default ProductMediaCards; -- 2.49.1 From 485d90e1bcd2311e54f6dcbf5234085b3cf08019 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:51 +0000 Subject: [PATCH 13/18] Update src/components/sections/team/TeamGlassCards.tsx --- .../sections/team/TeamGlassCards.tsx | 82 ------------------- 1 file changed, 82 deletions(-) diff --git a/src/components/sections/team/TeamGlassCards.tsx b/src/components/sections/team/TeamGlassCards.tsx index 1245599..e69de29 100644 --- a/src/components/sections/team/TeamGlassCards.tsx +++ b/src/components/sections/team/TeamGlassCards.tsx @@ -1,82 +0,0 @@ -import Button from "@/components/ui/Button"; -import TextAnimation from "@/components/ui/TextAnimation"; -import ImageOrVideo from "@/components/ui/ImageOrVideo"; -import GridOrCarousel from "@/components/ui/GridOrCarousel"; -import ScrollReveal from "@/components/ui/ScrollReveal"; - -type TeamMember = { - name: string; - role: string; -} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); - -const TeamGlassCards = ({ - tag, - title, - description, - primaryButton, - secondaryButton, - members, -}: { - tag: string; - title: string; - description: string; - primaryButton?: { text: string; href: string }; - secondaryButton?: { text: string; href: string }; - members: TeamMember[]; -}) => ( -
-
-
-
-

{tag}

-
- - - - - - {(primaryButton || secondaryButton) && ( -
- {primaryButton &&
- )} -
- - - - {members.map((member) => ( -
- - - - ))} - - -
-
-); - -export default TeamGlassCards; -- 2.49.1 From 562fe1b5d542e9e3b42d3f30c48bf4ba6df0b9fd Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:52 +0000 Subject: [PATCH 14/18] Update src/components/ui/ButtonMagnetic.tsx --- src/components/ui/ButtonMagnetic.tsx | 69 ---------------------------- 1 file changed, 69 deletions(-) diff --git a/src/components/ui/ButtonMagnetic.tsx b/src/components/ui/ButtonMagnetic.tsx index 9d92e43..e69de29 100644 --- a/src/components/ui/ButtonMagnetic.tsx +++ b/src/components/ui/ButtonMagnetic.tsx @@ -1,69 +0,0 @@ -"use client"; - -import { useRef } from "react"; -import { motion, useMotionValue, useSpring } from "motion/react"; -import { useButtonClick } from "@/hooks/useButtonClick"; -import { cls } from "@/lib/utils"; - -interface ButtonMagneticProps { - text: string; - variant?: "primary" | "secondary"; - href?: string; - onClick?: () => void; - animate?: boolean; - animationDelay?: number; - className?: string; -} - -const ButtonMagnetic = ({ text, variant = "primary", href = "#", onClick, animate = true, animationDelay = 0, className = "" }: ButtonMagneticProps) => { - const handleClick = useButtonClick(href, onClick); - const ref = useRef(null); - - const x = useMotionValue(0); - const y = useMotionValue(0); - const springX = useSpring(x, { stiffness: 150, damping: 15 }); - const springY = useSpring(y, { stiffness: 150, damping: 15 }); - - const handleMouseMove = (e: React.MouseEvent) => { - if (!ref.current || window.innerWidth < 768) return; - const rect = ref.current.getBoundingClientRect(); - const offsetX = (e.clientX - rect.left - rect.width / 2) * 0.15; - const offsetY = (e.clientY - rect.top - rect.height / 2) * 0.15; - x.set(offsetX); - y.set(offsetY); - }; - - const handleMouseLeave = () => { - x.set(0); - y.set(0); - }; - - const button = ( - - {text} - - ); - - if (!animate) return button; - - return ( - - {button} - - ); -}; - -export default ButtonMagnetic; -- 2.49.1 From c110af779e4352aba667c0031d7fd059741d4026 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 10 Jun 2026 10:40:53 +0000 Subject: [PATCH 15/18] Update src/components/ui/HorizonGlowBackground.tsx --- src/components/ui/HorizonGlowBackground.tsx | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/components/ui/HorizonGlowBackground.tsx b/src/components/ui/HorizonGlowBackground.tsx index 126b82b..e69de29 100644 --- a/src/components/ui/HorizonGlowBackground.tsx +++ b/src/components/ui/HorizonGlowBackground.tsx @@ -1,19 +0,0 @@ -import { cls } from "@/lib/utils"; - -type HorizonGlowBackgroundProps = { - position: "fixed" | "absolute"; -}; - -const HorizonGlowBackground = ({ position }: HorizonGlowBackgroundProps) => { - return ( -