From 3c6d75b6bb10fd039b0901a32bb712038d4ea554 Mon Sep 17 00:00:00 2001 From: Timo Date: Mon, 19 Jan 2026 09:14:52 +0100 Subject: [PATCH] refactor: Cleaner landing page - focused hero & reduced animations **User Feedback:** - Hero Section: Too much going on, redundant generator - Animations: Too excessive throughout - Phone Mockup: Works great, keep it! **Hero Section - Major Cleanup:** - REMOVED: Interactive QR Generator (redundant with generator below) - NEW: QRTypesShowcase - 3x3 grid showing 9 QR code types - NEW: Auto-rotating phone mockup demonstrating each type - Shows variety instead of single interactive element - Much cleaner, more focused first impression **Animation Cleanup:** - FeatureCustomizationDemo: Cycles ONCE then stops - FeatureBulkDemo: Animates ONCE then stays static - Features.tsx: Removed all infinite animations (rotate, scale, etc.) - StatsCounter: Subtiler - smaller text, slower animation - No more animation overload! **Philosophy:** - CLEANER > overloaded - FOCUSED > excessive interaction - SUBTLE > flashy animations - Show variety > show everything **PhoneMockup Enhanced:** - Auto-rotates through 9 QR types every 5s - Shows scan animation for each type - Displays type name in notification - Clean demo of all capabilities **Components:** - NEW: QRTypesShowcase.tsx - Grid with 9 QR types - UPDATED: PhoneMockup.tsx - Auto-rotation logic - UPDATED: Hero.tsx - Uses showcase instead of generator - UPDATED: Features.tsx - Static icons, no infinite loops - UPDATED: StatsCounter.tsx - Subtiler appearance Result: Professional, clean, focused landing page without animation chaos! Co-Authored-By: Claude Sonnet 4.5 --- src/components/marketing/FeatureBulkDemo.tsx | 14 +- .../marketing/FeatureCustomizationDemo.tsx | 17 +- src/components/marketing/Features.tsx | 42 +---- src/components/marketing/Hero.tsx | 59 +++++-- src/components/marketing/PhoneMockup.tsx | 163 +++++++++--------- src/components/marketing/QRTypesShowcase.tsx | 143 +++++++++++++++ src/components/marketing/StatsCounter.tsx | 22 +-- 7 files changed, 311 insertions(+), 149 deletions(-) create mode 100644 src/components/marketing/QRTypesShowcase.tsx diff --git a/src/components/marketing/FeatureBulkDemo.tsx b/src/components/marketing/FeatureBulkDemo.tsx index 33b434a..73678bc 100644 --- a/src/components/marketing/FeatureBulkDemo.tsx +++ b/src/components/marketing/FeatureBulkDemo.tsx @@ -7,14 +7,18 @@ import { FileSpreadsheet, ArrowRight } from 'lucide-react'; export const FeatureBulkDemo: React.FC = () => { const [showQRs, setShowQRs] = useState(false); + const [hasAnimated, setHasAnimated] = useState(false); useEffect(() => { - const interval = setInterval(() => { - setShowQRs((prev) => !prev); - }, 4000); + if (hasAnimated) return; - return () => clearInterval(interval); - }, []); + const timer = setTimeout(() => { + setShowQRs(true); + setHasAnimated(true); + }, 500); + + return () => clearTimeout(timer); + }, [hasAnimated]); const qrCodes = [ { id: 1, url: 'product-1', delay: 0 }, diff --git a/src/components/marketing/FeatureCustomizationDemo.tsx b/src/components/marketing/FeatureCustomizationDemo.tsx index db20475..1211703 100644 --- a/src/components/marketing/FeatureCustomizationDemo.tsx +++ b/src/components/marketing/FeatureCustomizationDemo.tsx @@ -14,14 +14,25 @@ const colorPresets = [ export const FeatureCustomizationDemo: React.FC = () => { const [activeIndex, setActiveIndex] = useState(0); + const [hasAnimated, setHasAnimated] = useState(false); useEffect(() => { + if (hasAnimated) return; + const interval = setInterval(() => { - setActiveIndex((prev) => (prev + 1) % colorPresets.length); - }, 2500); + setActiveIndex((prev) => { + const next = prev + 1; + if (next >= colorPresets.length) { + clearInterval(interval); + setHasAnimated(true); + return 0; // Reset to first + } + return next; + }); + }, 1500); return () => clearInterval(interval); - }, []); + }, [hasAnimated]); const currentPreset = colorPresets[activeIndex]; diff --git a/src/components/marketing/Features.tsx b/src/components/marketing/Features.tsx index 1a779c5..f761144 100644 --- a/src/components/marketing/Features.tsx +++ b/src/components/marketing/Features.tsx @@ -61,19 +61,9 @@ export const Features: React.FC = ({ t }) => { {t.features.unlimited.description}
QR Code Scanned
{getDomain(url)}
{displayName}
{getDomain(displayUrl)}
- {isScanning ? 'Scanning...' : 'Point camera at QR code'} +
+ {isScanning ? 'Scanning...' : autoRotate ? 'Auto-scanning demo' : 'Point camera at QR code'}
+ {type.name} +
+ Support for all major QR code types +
{stat.label}