diff --git a/src/app/page.tsx b/src/app/page.tsx index fafe753..3067cd4 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -2,15 +2,17 @@ import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider"; import NavbarLayoutFloatingOverlay from '@/components/navbar/NavbarLayoutFloatingOverlay/NavbarLayoutFloatingOverlay'; -import HeroBillboard from '@/components/sections/hero/HeroBillboard'; -import TextSplitAbout from '@/components/sections/about/TextSplitAbout'; -import FeatureCardTwentyFive from '@/components/sections/feature/FeatureCardTwentyFive'; -import MetricCardOne from '@/components/sections/metrics/MetricCardOne'; -import TestimonialCardOne from '@/components/sections/testimonial/TestimonialCardOne'; +import { HeroCarouselLogo } from '@/components/sections/hero/HeroCarouselLogo'; +import { TextImageAbout } from '@/components/sections/about/TextImageAbout'; +import { FeatureCardTwenty } from '@/components/sections/feature/FeatureCardTwenty'; +import MetricCardTwo from '@/components/sections/metrics/MetricCardTwo'; +import TestimonialCardTwo from '@/components/sections/testimonial/TestimonialCardTwo'; import ContactSplitForm from '@/components/sections/contact/ContactSplitForm'; import FooterSimple from '@/components/sections/footer/FooterSimple'; import Link from 'next/link'; import { Sparkles, CheckCircle, ArrowRight, Brain, Code, BookOpen, Users, Trophy, TrendingUp, Shield } from 'lucide-react'; +import TestimonialCardOne from "@/components/sections/testimonial/TestimonialCardOne"; +import HeroLogo from '@/components/sections/hero/HeroLogo'; export default function HomePage() { return ( @@ -44,23 +46,23 @@ export default function HomePage() {
-
-
-
- { + switch (buttonAnimation) { + case "slide-up": + return "animate-slide-up"; + case "fade-in": + return "animate-fade-in"; + default: + return ""; + } + }; + + return ( +
+
+
+ {/* Text Content */} +
+
+

+ {title} +

+
+ {description.map((paragraph, index) => ( +

+ {paragraph} +

+ ))} +
+
+ + {/* Buttons */} +
+ {buttons.map((button, index) => ( + + {button.text} + + ))} +
+
+ + {/* Image */} +
+
+
+ {imageAlt} +
+
+
+
+ + +
+ ); +} \ No newline at end of file diff --git a/src/components/sections/feature/FeatureCardTwenty.tsx b/src/components/sections/feature/FeatureCardTwenty.tsx new file mode 100644 index 0000000..5e0f57f --- /dev/null +++ b/src/components/sections/feature/FeatureCardTwenty.tsx @@ -0,0 +1,207 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import { LucideIcon } from 'lucide-react'; + +interface MediaItem { + imageSrc: string; + imageAlt: string; +} + +interface Feature { + title: string; + description: string; + icon: LucideIcon; + mediaItems: MediaItem[]; +} + +interface FeatureCardTwentyProps { + title: string; + description: string; + animationType?: 'slide-up' | 'fade-in' | 'slide-left'; + textboxLayout?: 'default' | 'centered' | 'compact'; + useInvertedBackground?: boolean; + features: Feature[]; +} + +export function FeatureCardTwenty({ + title, + description, + animationType = 'slide-up', + textboxLayout = 'default', + useInvertedBackground = false, + features, +}: FeatureCardTwentyProps) { + const [activeFeatureIndex, setActiveFeatureIndex] = useState(0); + const [isVisible, setIsVisible] = useState(false); + + useEffect(() => { + setIsVisible(true); + }, []); + + const getAnimationClass = () => { + if (!isVisible) { + switch (animationType) { + case 'slide-up': + return 'opacity-0 translate-y-8'; + case 'slide-left': + return 'opacity-0 -translate-x-8'; + case 'fade-in': + default: + return 'opacity-0'; + } + } + + switch (animationType) { + case 'slide-up': + return 'opacity-100 translate-y-0 transition-all duration-700 ease-out'; + case 'slide-left': + return 'opacity-100 translate-x-0 transition-all duration-700 ease-out'; + case 'fade-in': + default: + return 'opacity-100 transition-opacity duration-700 ease-out'; + } + }; + + const getTextboxLayoutClass = () => { + switch (textboxLayout) { + case 'centered': + return 'text-center'; + case 'compact': + return 'text-left max-w-2xl'; + case 'default': + default: + return 'text-left'; + } + }; + + const bgClass = useInvertedBackground ? 'bg-slate-900 text-white' : 'bg-white text-slate-900'; + const activeFeature = features[activeFeatureIndex]; + const IconComponent = activeFeature.icon; + + return ( +
+
+ {/* Header Section */} +
+

+ {title} +

+

+ {description} +

+
+ + {/* Features Grid and Detail View */} +
+ {/* Feature Cards */} +
+ {features.map((feature, index) => { + const CardIcon = feature.icon; + const isActive = index === activeFeatureIndex; + + return ( + + ); + })} +
+ + {/* Active Feature Detail */} +
+
+ {/* Feature Header */} +
+
+ +
+
+

+ {activeFeature.title} +

+

+ {activeFeature.description} +

+
+
+ + {/* Media Gallery */} +
+ {activeFeature.mediaItems.map((media, index) => ( +
+ {media.imageAlt} +
+ ))} +
+ + {/* Indicator Dots */} +
+ {features.map((_, index) => ( +
+
+
+
+
+ + +
+ ); +} \ No newline at end of file