From bb528d6ef93593dc9bc900c280af2b121fc2f2a4 Mon Sep 17 00:00:00 2001 From: knuthtimo-lab Date: Fri, 10 Jul 2026 13:07:15 +0200 Subject: [PATCH] SEO --- .../(main)/(marketing)/MarketingLayout.tsx | 93 +++++++++++++++- src/components/marketing/HomePageClient.tsx | 38 ++++++- tmp-homepage.js | 50 +++++++++ tmp-nav.js | 101 ++++++++++++++++++ 4 files changed, 276 insertions(+), 6 deletions(-) create mode 100644 tmp-homepage.js create mode 100644 tmp-nav.js diff --git a/src/app/(main)/(marketing)/MarketingLayout.tsx b/src/app/(main)/(marketing)/MarketingLayout.tsx index cd86288..33ae362 100644 --- a/src/app/(main)/(marketing)/MarketingLayout.tsx +++ b/src/app/(main)/(marketing)/MarketingLayout.tsx @@ -5,7 +5,9 @@ import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { Button } from '@/components/ui/Button'; import { Footer } from '@/components/ui/Footer'; -import en from '@/i18n/en.json'; +import en from '@/i18n/en.json'; +import { allUseCases } from '@/lib/growth-pages'; +import { LayoutGrid } from 'lucide-react'; import { ChevronDown, BookOpen, Building2, Wifi, Contact, MessageCircle, Link2, Type, Mail, MessageSquare, Phone, Calendar, MapPin, Facebook, Instagram, Twitter, Youtube, Music, Bitcoin, CreditCard, Video, Users, Barcode as BarcodeIcon, Star } from 'lucide-react'; import { cn } from '@/lib/utils'; import { AnimatePresence, motion } from 'framer-motion'; @@ -18,9 +20,11 @@ export default function MarketingLayout({ }) { const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [scrolled, setScrolled] = useState(false); - const [toolsOpen, setToolsOpen] = useState(false); + const [toolsOpen, setToolsOpen] = useState(false); + const [useCasesOpen, setUseCasesOpen] = useState(false); const [resourcesOpen, setResourcesOpen] = useState(false); - const [mobileToolsOpen, setMobileToolsOpen] = useState(false); + const [mobileToolsOpen, setMobileToolsOpen] = useState(false); + const [mobileUseCasesOpen, setMobileUseCasesOpen] = useState(false); const [mobileResourcesOpen, setMobileResourcesOpen] = useState(false); const pathname = usePathname(); @@ -36,9 +40,11 @@ export default function MarketingLayout({ // Close simple menus when path changes useEffect(() => { setMobileMenuOpen(false); - setToolsOpen(false); + setToolsOpen(false); + setUseCasesOpen(false); setResourcesOpen(false); - setMobileToolsOpen(false); + setMobileToolsOpen(false); + setMobileUseCasesOpen(false); setMobileResourcesOpen(false); }, [pathname]); @@ -145,6 +151,50 @@ export default function MarketingLayout({ + {/* Use Cases Dropdown */} +
setUseCasesOpen(true)} + onMouseLeave={() => setUseCasesOpen(false)} + > + + + + {useCasesOpen && ( + +
+ {allUseCases.map((uc) => ( + +
+ +
+
+
{uc.title}
+
+ + ))} +
+
+ View All Use Cases → +
+
+ )} +
+
+ {/* Tools Dropdown */}
+ {/* Use Cases Accordion */} + + + + {mobileUseCasesOpen && ( + +
+ {allUseCases.map((uc) => ( + { setMobileMenuOpen(false); setMobileUseCasesOpen(false); }} + > + {uc.title} + + ))} +
+
+ )} +
+ {/* Free Tools Accordion */}
+ {/* Popular Use Cases Section */} +
+
+
+

+ Popular Use Cases +

+

+ Discover how businesses across different industries use dynamic QR codes to track offline engagement and simplify customer journeys. +

+
+
+ {allUseCases.slice(0, 8).map((item) => ( + +

+ {item.title} +

+

+ {item.summary} +

+ + ))} +
+
+ + + +
+
+
+ {/* Testimonials Carousel */} diff --git a/tmp-homepage.js b/tmp-homepage.js new file mode 100644 index 0000000..d7b8a73 --- /dev/null +++ b/tmp-homepage.js @@ -0,0 +1,50 @@ +const fs = require('fs'); +const file = 'src/components/marketing/HomePageClient.tsx'; +let content = fs.readFileSync(file, 'utf8'); + +if (!content.includes("import { allUseCases }")) { + content = content.replace("import en from '@/i18n/en.json';", "import en from '@/i18n/en.json';\nimport { allUseCases } from '@/lib/growth-pages';"); +} + +const section = ` {/* Popular Use Cases Section */} +
+
+
+

+ Popular Use Cases +

+

+ Discover how businesses across different industries use dynamic QR codes to track offline engagement and simplify customer journeys. +

+
+
+ {allUseCases.slice(0, 8).map((item) => ( + +

+ {item.title} +

+

+ {item.summary} +

+ + ))} +
+
+ + + +
+
+
+ + {/* Testimonials Carousel */}`; + +if (!content.includes("Popular Use Cases Section")) { + content = content.replace("{/* Testimonials Carousel */}", section); +} +fs.writeFileSync(file, content); +console.log("Updated HomePageClient.tsx"); diff --git a/tmp-nav.js b/tmp-nav.js new file mode 100644 index 0000000..907eb8c --- /dev/null +++ b/tmp-nav.js @@ -0,0 +1,101 @@ +const fs = require('fs'); +let code = fs.readFileSync('src/app/(main)/(marketing)/MarketingLayout.tsx', 'utf8'); + +if (!code.includes("import { allUseCases }")) { + code = code.replace("import en from '@/i18n/en.json';", "import en from '@/i18n/en.json';\nimport { allUseCases } from '@/lib/growth-pages';\nimport { LayoutGrid } from 'lucide-react';"); +} + +if (!code.includes("const [useCasesOpen")) { + code = code.replace("const [toolsOpen, setToolsOpen] = useState(false);", "const [toolsOpen, setToolsOpen] = useState(false);\n const [useCasesOpen, setUseCasesOpen] = useState(false);"); + code = code.replace("const [mobileToolsOpen, setMobileToolsOpen] = useState(false);", "const [mobileToolsOpen, setMobileToolsOpen] = useState(false);\n const [mobileUseCasesOpen, setMobileUseCasesOpen] = useState(false);"); + code = code.replace("setToolsOpen(false);", "setToolsOpen(false);\n setUseCasesOpen(false);"); + code = code.replace("setMobileToolsOpen(false);", "setMobileToolsOpen(false);\n setMobileUseCasesOpen(false);"); +} + +const useCasesDropdown = ` {/* Use Cases Dropdown */} +
setUseCasesOpen(true)} + onMouseLeave={() => setUseCasesOpen(false)} + > + + + + {useCasesOpen && ( + +
+ {allUseCases.map((uc) => ( + +
+ +
+
+
{uc.title}
+
+ + ))} +
+
+ View All Use Cases → +
+
+ )} +
+
`; + +if (!code.includes("Use Cases")) { + code = code.replace("{/* Tools Dropdown */}", useCasesDropdown + "\n\n {/* Tools Dropdown */}"); +} + +const mobileUseCasesAccordion = ` {/* Use Cases Accordion */} + + + + {mobileUseCasesOpen && ( + +
+ {allUseCases.map((uc) => ( + { setMobileMenuOpen(false); setMobileUseCasesOpen(false); }} + > + {uc.title} + + ))} +
+
+ )} +
`; + +if (!code.includes("{/* Use Cases Accordion */}")) { + code = code.replace("{/* Free Tools Accordion */}", mobileUseCasesAccordion + "\n\n {/* Free Tools Accordion */}"); +} + +fs.writeFileSync('src/app/(main)/(marketing)/MarketingLayout.tsx', code); +console.log("Updated MarketingLayout.tsx");