Final
This commit is contained in:
parent
beed961eef
commit
111575aeda
|
|
@ -0,0 +1,4 @@
|
||||||
|
Contact: mailto:security@qrmaster.net
|
||||||
|
Expires: 2027-01-01T00:00:00.000Z
|
||||||
|
Strategies: https://www.qrmaster.net/.well-known/security.txt
|
||||||
|
Preferred-Languages: en, de
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
/* TEAM */
|
||||||
|
Founder: Timo Knuth
|
||||||
|
Site: https://qrmaster.net
|
||||||
|
Twitter: @qrmaster
|
||||||
|
|
||||||
|
/* THANKS */
|
||||||
|
Thanks to: Next.js, Vercel, Tailwind CSS, Stripe, Supabase
|
||||||
|
|
||||||
|
/* SITE */
|
||||||
|
Last update: 2026/01/12
|
||||||
|
Language: English, German
|
||||||
|
Doctype: HTML5
|
||||||
|
IDE: VS Code
|
||||||
|
|
@ -3,6 +3,8 @@ import type { Metadata } from 'next';
|
||||||
import SeoJsonLd from '@/components/SeoJsonLd';
|
import SeoJsonLd from '@/components/SeoJsonLd';
|
||||||
import { organizationSchema, websiteSchema } from '@/lib/schema';
|
import { organizationSchema, websiteSchema } from '@/lib/schema';
|
||||||
import HomePageClient from '@/components/marketing/HomePageClient';
|
import HomePageClient from '@/components/marketing/HomePageClient';
|
||||||
|
import { generateFaqSchema } from '@/lib/schema-utils';
|
||||||
|
import en from '@/i18n/en.json'; // Import English translations for schema generation
|
||||||
|
|
||||||
function truncateAtWord(text: string, maxLength: number): string {
|
function truncateAtWord(text: string, maxLength: number): string {
|
||||||
if (text.length <= maxLength) return text;
|
if (text.length <= maxLength) return text;
|
||||||
|
|
@ -45,7 +47,7 @@ export async function generateMetadata(): Promise<Metadata> {
|
||||||
export default function HomePage() {
|
export default function HomePage() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<SeoJsonLd data={[organizationSchema(), websiteSchema()]} />
|
<SeoJsonLd data={[organizationSchema(), websiteSchema(), generateFaqSchema(en.faq.questions)]} />
|
||||||
|
|
||||||
{/* Server-rendered SEO content for crawlers */}
|
{/* Server-rendered SEO content for crawlers */}
|
||||||
<div className="sr-only" aria-hidden="false">
|
<div className="sr-only" aria-hidden="false">
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import React from 'react';
|
||||||
import type { Metadata } from 'next';
|
import type { Metadata } from 'next';
|
||||||
import SeoJsonLd from '@/components/SeoJsonLd';
|
import SeoJsonLd from '@/components/SeoJsonLd';
|
||||||
import { organizationSchema, websiteSchema } from '@/lib/schema';
|
import { organizationSchema, websiteSchema } from '@/lib/schema';
|
||||||
|
import { generateFaqSchema } from '@/lib/schema-utils';
|
||||||
import { Hero } from '@/components/marketing/Hero';
|
import { Hero } from '@/components/marketing/Hero';
|
||||||
import { InstantGenerator } from '@/components/marketing/InstantGenerator';
|
import { InstantGenerator } from '@/components/marketing/InstantGenerator';
|
||||||
import { StaticVsDynamic } from '@/components/marketing/StaticVsDynamic';
|
import { StaticVsDynamic } from '@/components/marketing/StaticVsDynamic';
|
||||||
|
|
@ -66,7 +67,7 @@ export default function QRCodeErstellenPage() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<SeoJsonLd data={[organizationSchema(), websiteSchema()]} />
|
<SeoJsonLd data={[organizationSchema(), websiteSchema(), generateFaqSchema(t.faq.questions)]} />
|
||||||
|
|
||||||
{/* Server-rendered SEO content for crawlers - GERMAN */}
|
{/* Server-rendered SEO content for crawlers - GERMAN */}
|
||||||
<div className="sr-only" aria-hidden="false">
|
<div className="sr-only" aria-hidden="false">
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
export function generateFaqSchema(questions: Record<string, { question: string; answer: string }>) {
|
||||||
|
return {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'FAQPage',
|
||||||
|
mainEntity: Object.values(questions).map((item) => ({
|
||||||
|
'@type': 'Question',
|
||||||
|
name: item.question,
|
||||||
|
acceptedAnswer: {
|
||||||
|
'@type': 'Answer',
|
||||||
|
text: item.answer,
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue