feat: comprehensive SEO system with keywords and schema markup

- Add 4-locale keyword configurations (SR, EN, DE, FR)
- Create schema generators (Product, Organization, Breadcrumb)
- Add React components for JSON-LD rendering
- Implement caching for keyword performance
- Abstract all SEO logic for maintainability
This commit is contained in:
Unchained
2026-03-30 11:22:44 +02:00
parent 767afac606
commit 234b1f1739
17 changed files with 1957 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
import { Locale, LocaleKeywords } from '../types';
/**
* Keyword Strategy Configuration
* Defines how keywords should be used across the site
*/
export const keywordStrategy = {
density: {
min: 0.5, // 0.5% minimum keyword density
max: 2.5, // 2.5% maximum (avoid keyword stuffing)
optimal: 1.5 // 1.5% optimal density
},
placement: {
title: true, // Include keyword in page title
h1: true, // Include keyword in H1
h2: true, // Include in at least one H2
firstParagraph: true, // Include in first 100 words
metaDescription: true, // Include in meta description
altText: true // Include in image alt text where relevant
},
variations: true, // Use keyword variations/synonyms
// Meta title/descriptions character limits
metaLimits: {
titleMin: 30,
titleMax: 60,
descriptionMin: 120,
descriptionMax: 160
}
};
/**
* Get keyword usage recommendations for a page
*/
export function getKeywordRecommendations(
pageType: keyof LocaleKeywords['pages'],
locale: Locale
): { primary: string[]; secondary: string[]; recommendations: string[] } {
const recommendations: string[] = [
`Use primary keywords within first 100 words`,
`Include at least one primary keyword in H1`,
`Meta title should be ${keywordStrategy.metaLimits.titleMin}-${keywordStrategy.metaLimits.titleMax} characters`,
`Meta description should be ${keywordStrategy.metaLimits.descriptionMin}-${keywordStrategy.metaLimits.descriptionMax} characters`,
`Maintain ${keywordStrategy.density.optimal}% keyword density`,
`Use keyword variations naturally throughout content`
];
return {
primary: [], // Will be populated by getKeywords
secondary: [], // Will be populated by getKeywords
recommendations
};
}
export default keywordStrategy;