This commit is contained in:
Timo Knuth
2025-10-17 13:45:33 +02:00
parent cd3ee5fc8f
commit 254e6490b8
36 changed files with 1712 additions and 917 deletions

View File

@@ -1,77 +1,51 @@
'use client';
import React from 'react';
import { Hero } from '@/components/marketing/Hero';
import { StatsStrip } from '@/components/marketing/StatsStrip';
import { TemplateCards } from '@/components/marketing/TemplateCards';
import { InstantGenerator } from '@/components/marketing/InstantGenerator';
import { StaticVsDynamic } from '@/components/marketing/StaticVsDynamic';
import { Features } from '@/components/marketing/Features';
import { Pricing } from '@/components/marketing/Pricing';
import { FAQ } from '@/components/marketing/FAQ';
import { Button } from '@/components/ui/Button';
import { useTranslation } from '@/hooks/useTranslation';
import type { Metadata } from 'next';
import SeoJsonLd from '@/components/SeoJsonLd';
import { organizationSchema, websiteSchema } from '@/lib/schema';
import HomePageClient from '@/components/marketing/HomePageClient';
function truncateAtWord(text: string, maxLength: number): string {
if (text.length <= maxLength) return text;
const truncated = text.slice(0, maxLength);
const lastSpace = truncated.lastIndexOf(' ');
return lastSpace > 0 ? truncated.slice(0, lastSpace) : truncated;
}
export async function generateMetadata(): Promise<Metadata> {
const title = truncateAtWord('QR Master: Dynamic QR Generator', 60);
const description = truncateAtWord(
'Dynamic QR, branding, bulk generation & analytics for all campaigns.',
160
);
return {
title,
description,
alternates: {
canonical: 'https://www.qrmaster.com/',
languages: {
'x-default': 'https://www.qrmaster.com/',
en: 'https://www.qrmaster.com/',
},
},
openGraph: {
title,
description,
url: 'https://www.qrmaster.com/',
type: 'website',
},
twitter: {
title,
description,
},
};
}
export default function HomePage() {
const { t } = useTranslation();
const industries = [
'Restaurant Chain',
'Tech Startup',
'Real Estate',
'Event Agency',
'Retail Store',
'Healthcare',
];
return (
<>
<Hero t={t} />
<StatsStrip t={t} />
{/* Industry Buttons */}
<section className="py-8">
<div className="container mx-auto px-4">
<div className="flex flex-wrap justify-center gap-3">
{industries.map((industry) => (
<Button key={industry} variant="outline" size="sm">
{industry}
</Button>
))}
</div>
</div>
</section>
<TemplateCards t={t} />
<InstantGenerator t={t} />
<StaticVsDynamic t={t} />
<Features t={t} />
{/* Pricing Teaser */}
<section className="py-16 bg-primary-50">
<div className="container mx-auto px-4 text-center">
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Ready to get started?
</h2>
<p className="text-xl text-gray-600 mb-8">
Choose the perfect plan for your needs
</p>
<Button size="lg">View Pricing Plans</Button>
</div>
</section>
{/* FAQ Teaser */}
<section className="py-16">
<div className="container mx-auto px-4 text-center">
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Have questions?
</h2>
<p className="text-xl text-gray-600 mb-8">
Check out our frequently asked questions
</p>
<Button variant="outline" size="lg">View FAQ</Button>
</div>
</section>
<SeoJsonLd data={[organizationSchema(), websiteSchema()]} />
<HomePageClient />
</>
);
}
}