SEO optimizations

This commit is contained in:
2026-05-06 18:12:37 +02:00 Verified
parent bf49aa7ac2
commit 140c94337e
6 changed files with 145 additions and 25 deletions
+2 -2
View File
@@ -61,7 +61,7 @@ export default function BeachClientPage({ config, turnstileSiteKey }: { config:
<Image
className="w-full max-w-62.5 md:max-w-75 relative drop-shadow-2xl transform hover:scale-105 transition-transform duration-500"
src={matsommar}
alt="Mat- & Sommarfesten"
alt="Mat- och Sommarfesten Höganäs Logo"
/>
</div>
@@ -123,7 +123,7 @@ export default function BeachClientPage({ config, turnstileSiteKey }: { config:
<p className="font-bold">{timeInfo.dateStr}</p>
<p>{timeInfo.matchStr}</p>
<p className="text-sm italic pt-3 border-t border-blue-100 mt-2">
Samtidigt som <a target="_blank" rel="noreferrer" className="text-[#39979f] hover:underline" href={config.beachPage.festivalLink}>Höganäs Mat- & Sommarfest</a>
Samtidigt som <a target="_blank" rel="noopener noreferrer" className="text-[#39979f] hover:underline" href={config.beachPage.festivalLink}>Höganäs Mat- & Sommarfest</a>
</p>
</div>
</div>
+77 -6
View File
@@ -1,17 +1,88 @@
// app/beach/page.tsx
import { Metadata } from 'next';
import { getConfig } from '../lib/config';
import BeachClientPage from './BeachClientPage';
export const dynamic = 'force-dynamic';
export const metadata = {
title: 'Beachturnering',
};
export async function generateMetadata(): Promise<Metadata> {
const config = await getConfig();
const matchDate = new Date(config.beachPage.matchStart);
const year = matchDate.getFullYear();
const dateFormatted = matchDate.toLocaleDateString('sv-SE', { day: 'numeric', month: 'long' });
const isClosed = config.beachPage.isClosedOverride;
const title = isClosed
? `Höganäs Beach Open ${year} (Fulltecknat)`
: `Anmälan: Höganäs Beach Open ${year} - ${dateFormatted}`;
const description = isClosed
? `Turneringen den ${dateFormatted} är nu fullbokad. Välkommen ner till Kvickbadet för att titta på beachvolleyboll i toppklass!`
: `Välkommen till Höganäs Beach Open den ${dateFormatted}! Turneringsinfo, regler och anmälan för beachvolleyboll vid Kvickbadet.`;
return {
title: title,
description: description,
openGraph: {
title: title,
description: description,
url: 'https://lerbergetsvolleyboll.se/beach',
siteName: 'Lerbergets Volleybollsällskap',
locale: 'sv_SE',
type: 'website',
images: [
{
url: '/images/beach-tournament.webp',
width: 1200,
height: 630,
alt: `Höganäs Beach Open ${year}`,
},
],
},
twitter: {
card: 'summary_large_image',
title: title,
description: description,
images: ['/images/beach-tournament.webp'],
},
};
}
export default async function BeachPage() {
const config = await getConfig();
const turnstileSiteKey = process.env.TURNSTILE_SITE_KEY || '';
return <BeachClientPage config={config} turnstileSiteKey={turnstileSiteKey} />;
}
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Event',
'name': 'Höganäs Beach Open',
'startDate': config.beachPage.matchStart,
'location': {
'@type': 'Place',
'name': 'Kvickbadet',
'address': {
'@type': 'PostalAddress',
'addressLocality': 'Höganäs',
'addressCountry': 'SE',
},
},
'eventStatus': config.beachPage.isClosedOverride
? 'https://schema.org/EventScheduled'
: 'https://schema.org/EventScheduled',
'organizer': {
'@type': 'Organization',
'name': 'Lerbergets Volleybollsällskap',
'url': 'https://lerbergetsvolleyboll.se'
}
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<BeachClientPage config={config} turnstileSiteKey={turnstileSiteKey} />
</>
);
}