Improve website content and fix navigation issues
Update website meta tags, SEO information, and fix a banner overlay bug to ensure all interactive elements are clickable. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 60ed045f-57e0-4c65-bc71-4205e0064bbb Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/aNXfGlM Replit-Helium-Checkpoint-Created: true
This commit is contained in:
parent
6c99a3fd4b
commit
b320d8b601
BIN
attached_assets/image_1772898100931.png
Normal file
BIN
attached_assets/image_1772898100931.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
@ -3,11 +3,11 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
|
||||||
<title>Volksmusik & Schlager | Folx Music Television</title>
|
<title>Volksmusik & Schlager TV | FOLX Music Television – Nachrichten, Videos & mehr</title>
|
||||||
<meta name="description" content="FOLX TV – Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows, Interviews und aktuelle Nachrichten aus der Welt der volkstümlichen Musik. Jetzt einschalten!" />
|
<meta name="description" content="FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik. Jetzt einschalten!" />
|
||||||
<meta name="keywords" content="Volksmusik, Schlager, Volksmusik TV, Schlager TV, Folx TV, volkstümliche Musik, Musiksender, Alpenmusik, Volksmusik Nachrichten, Schlager News, Musikvideos, Live Shows" />
|
<meta name="keywords" content="Volksmusik, Schlager, Volksmusik TV, Schlager TV, Folx TV, FOLX Music Television, volkstümliche Musik, Musiksender, Alpenmusik, Volksmusik Nachrichten, Schlager News, Musikvideos, Live Shows, Volksmusik Künstler, Schlager Stars, Oberkrainer, Volksmusik Sender, Schlager Hits, volkstümliche Schlager" />
|
||||||
<meta property="og:title" content="Volksmusik & Schlager | Folx Music Television" />
|
<meta property="og:title" content="Volksmusik & Schlager TV | FOLX Music Television" />
|
||||||
<meta property="og:description" content="FOLX TV – Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows und aktuelle Nachrichten aus der volkstümlichen Musikszene." />
|
<meta property="og:description" content="FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts und Live-Shows." />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:site_name" content="Folx Music Television" />
|
<meta property="og:site_name" content="Folx Music Television" />
|
||||||
<meta property="og:url" content="https://folx.tv/" />
|
<meta property="og:url" content="https://folx.tv/" />
|
||||||
@ -19,8 +19,8 @@
|
|||||||
<meta property="og:image:alt" content="FOLX Network - Volksmusik & Schlager TV" />
|
<meta property="og:image:alt" content="FOLX Network - Volksmusik & Schlager TV" />
|
||||||
<meta property="og:locale" content="de_DE" />
|
<meta property="og:locale" content="de_DE" />
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
<meta name="twitter:title" content="Volksmusik & Schlager | Folx Music Television" />
|
<meta name="twitter:title" content="Volksmusik & Schlager TV | FOLX Music Television" />
|
||||||
<meta name="twitter:description" content="FOLX TV – Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows und aktuelle Nachrichten." />
|
<meta name="twitter:description" content="FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos und Live-Shows." />
|
||||||
<meta name="twitter:image" content="https://folx.tv/og-image.jpg" />
|
<meta name="twitter:image" content="https://folx.tv/og-image.jpg" />
|
||||||
<meta property="fb:pages" content="1428520781492675" />
|
<meta property="fb:pages" content="1428520781492675" />
|
||||||
<meta name="facebook-domain-verification" content="b4y482htm54uybm563tfr1ucb1n46w" />
|
<meta name="facebook-domain-verification" content="b4y482htm54uybm563tfr1ucb1n46w" />
|
||||||
|
|||||||
@ -16,8 +16,8 @@ export default function Footer() {
|
|||||||
<div>
|
<div>
|
||||||
<h3 className="font-bold text-card-foreground text-lg mb-3">Folx Music Television</h3>
|
<h3 className="font-bold text-card-foreground text-lg mb-3">Folx Music Television</h3>
|
||||||
<p className="text-muted-foreground text-sm leading-relaxed mb-4">
|
<p className="text-muted-foreground text-sm leading-relaxed mb-4">
|
||||||
Folx Music Television. Aktuelle Nachrichten, Interviews und
|
FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten,
|
||||||
Hintergrundberichte aus der Welt der Volksmusik und des Schlagers.
|
Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex gap-3">
|
<div className="flex gap-3">
|
||||||
{SOCIAL_LINKS.map((s) => (
|
{SOCIAL_LINKS.map((s) => (
|
||||||
|
|||||||
@ -45,7 +45,7 @@ export default function Header() {
|
|||||||
<div className="flex items-center justify-between gap-4 h-16">
|
<div className="flex items-center justify-between gap-4 h-16">
|
||||||
<Link href="/">
|
<Link href="/">
|
||||||
<div className="flex items-center gap-2 cursor-pointer" data-testid="link-logo">
|
<div className="flex items-center gap-2 cursor-pointer" data-testid="link-logo">
|
||||||
<img src={folxLogo} alt="Folx TV" className="h-32 w-auto object-contain py-1" />
|
<img src={folxLogo} alt="FOLX TV – Volksmusik & Schlager Fernsehsender" className="h-32 w-auto object-contain py-1" />
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
|
|||||||
@ -49,8 +49,8 @@ export default function PushPromptBanner() {
|
|||||||
if (!visible) return null;
|
if (!visible) return null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="fixed bottom-4 left-4 right-4 md:left-auto md:right-6 md:max-w-sm z-50 animate-in slide-in-from-bottom-4 fade-in duration-500" data-testid="push-prompt-banner">
|
<div className="fixed bottom-4 right-4 md:right-6 max-w-sm z-50 animate-in slide-in-from-bottom-4 fade-in duration-500 pointer-events-none" data-testid="push-prompt-banner">
|
||||||
<div className="bg-card border border-card-border rounded-xl shadow-2xl p-4">
|
<div className="bg-card border border-card-border rounded-xl shadow-2xl p-4 pointer-events-auto">
|
||||||
<div className="flex items-start gap-3">
|
<div className="flex items-start gap-3">
|
||||||
<div className="flex-shrink-0 w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center">
|
<div className="flex-shrink-0 w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center">
|
||||||
<Bell className="w-5 h-5 text-primary" />
|
<Bell className="w-5 h-5 text-primary" />
|
||||||
|
|||||||
@ -31,11 +31,24 @@ function removeMetaTag(selector: string) {
|
|||||||
if (el) el.remove();
|
if (el) el.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEFAULT_TITLE = "Volksmusik & Schlager | Folx Music Television";
|
const DEFAULT_TITLE = "Volksmusik & Schlager TV | FOLX Music Television – Nachrichten, Videos & mehr";
|
||||||
const DEFAULT_DESC = "FOLX TV – Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows, Interviews und aktuelle Nachrichten aus der Welt der volkstümlichen Musik. Jetzt einschalten!";
|
const DEFAULT_DESC = "FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik. Jetzt einschalten!";
|
||||||
const DEFAULT_OG_TITLE = "Volksmusik & Schlager | Folx Music Television";
|
const DEFAULT_OG_TITLE = "Volksmusik & Schlager TV | FOLX Music Television";
|
||||||
const DEFAULT_OG_DESC = "FOLX TV – Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows und aktuelle Nachrichten aus der volkstümlichen Musikszene.";
|
const DEFAULT_OG_DESC = "FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts und Live-Shows.";
|
||||||
const DEFAULT_OG_IMAGE = "https://folx.tv/og-image.jpg";
|
const DEFAULT_OG_IMAGE = "https://folx.tv/og-image.jpg";
|
||||||
|
const CANONICAL_BASE = "https://folx.tv";
|
||||||
|
|
||||||
|
function setCanonical(href: string) {
|
||||||
|
let link = document.querySelector('link[rel="canonical"]') as HTMLLinkElement;
|
||||||
|
if (link) {
|
||||||
|
link.href = href;
|
||||||
|
} else {
|
||||||
|
link = document.createElement("link");
|
||||||
|
link.rel = "canonical";
|
||||||
|
link.href = href;
|
||||||
|
document.head.appendChild(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function usePageMeta(title: string, description?: string, og?: OgMeta) {
|
export function usePageMeta(title: string, description?: string, og?: OgMeta) {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -44,6 +57,12 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
|
|||||||
if (description) {
|
if (description) {
|
||||||
setMetaTag('meta[name="description"]', description);
|
setMetaTag('meta[name="description"]', description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const canonicalPath = og?.ogUrl || `${CANONICAL_BASE}${window.location.pathname}`;
|
||||||
|
const canonicalUrl = canonicalPath.startsWith("http") ? canonicalPath : `${CANONICAL_BASE}${canonicalPath}`;
|
||||||
|
setCanonical(canonicalUrl);
|
||||||
|
setMetaTag('meta[property="og:url"]', canonicalUrl);
|
||||||
|
|
||||||
if (og) {
|
if (og) {
|
||||||
if (og.ogTitle) setMetaTag('meta[property="og:title"]', og.ogTitle);
|
if (og.ogTitle) setMetaTag('meta[property="og:title"]', og.ogTitle);
|
||||||
if (og.ogDescription) setMetaTag('meta[property="og:description"]', og.ogDescription);
|
if (og.ogDescription) setMetaTag('meta[property="og:description"]', og.ogDescription);
|
||||||
@ -53,9 +72,6 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
|
|||||||
setMetaTag('meta[name="twitter:image"]', og.ogImage);
|
setMetaTag('meta[name="twitter:image"]', og.ogImage);
|
||||||
}
|
}
|
||||||
if (og.ogType) setMetaTag('meta[property="og:type"]', og.ogType);
|
if (og.ogType) setMetaTag('meta[property="og:type"]', og.ogType);
|
||||||
if (og.ogUrl) {
|
|
||||||
setMetaTag('meta[property="og:url"]', og.ogUrl);
|
|
||||||
}
|
|
||||||
setMetaTag('meta[name="twitter:title"]', og.ogTitle || title + suffix);
|
setMetaTag('meta[name="twitter:title"]', og.ogTitle || title + suffix);
|
||||||
setMetaTag('meta[name="twitter:description"]', og.ogDescription || description || DEFAULT_OG_DESC);
|
setMetaTag('meta[name="twitter:description"]', og.ogDescription || description || DEFAULT_OG_DESC);
|
||||||
|
|
||||||
@ -82,6 +98,7 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
|
|||||||
setMetaTag('meta[name="twitter:image"]', DEFAULT_OG_IMAGE);
|
setMetaTag('meta[name="twitter:image"]', DEFAULT_OG_IMAGE);
|
||||||
setMetaTag('meta[property="og:type"]', "website");
|
setMetaTag('meta[property="og:type"]', "website");
|
||||||
setMetaTag('meta[property="og:url"]', "https://folx.tv/");
|
setMetaTag('meta[property="og:url"]', "https://folx.tv/");
|
||||||
|
setCanonical("https://folx.tv/");
|
||||||
removeMetaTag('meta[property="article:published_time"]');
|
removeMetaTag('meta[property="article:published_time"]');
|
||||||
removeMetaTag('meta[property="article:modified_time"]');
|
removeMetaTag('meta[property="article:modified_time"]');
|
||||||
removeMetaTag('meta[property="article:author"]');
|
removeMetaTag('meta[property="article:author"]');
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
|
|||||||
import { PageSideAds } from "@/components/adsense";
|
import { PageSideAds } from "@/components/adsense";
|
||||||
|
|
||||||
export default function AboutPage() {
|
export default function AboutPage() {
|
||||||
usePageMeta("Über FOLX TV - Volksmusik & Schlager Fernsehsender", "Alles über FOLX TV – Ihren Fernsehsender für Volksmusik und Schlager seit 2013.");
|
usePageMeta("Über FOLX TV - Volksmusik & Schlager Fernsehsender", "Alles über FOLX TV – Ihren Volksmusik & Schlager Fernsehsender seit 2013. Programm, Geschichte und das Team hinter dem Volksmusik-Sender.");
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
<Header />
|
<Header />
|
||||||
|
|||||||
@ -150,12 +150,22 @@ export default function ArticlePage() {
|
|||||||
"@id": articleUrl
|
"@id": articleUrl
|
||||||
},
|
},
|
||||||
"articleSection": article.category || "News",
|
"articleSection": article.category || "News",
|
||||||
"inLanguage": "de"
|
"inLanguage": "de",
|
||||||
|
"keywords": `Volksmusik, Schlager, ${article.category || "News"}, ${article.title}`
|
||||||
|
};
|
||||||
|
const breadcrumbLd = {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "BreadcrumbList",
|
||||||
|
"itemListElement": [
|
||||||
|
{ "@type": "ListItem", "position": 1, "name": "FOLX TV", "item": "https://folx.tv" },
|
||||||
|
{ "@type": "ListItem", "position": 2, "name": article.category || "News", "item": `https://folx.tv/category/${encodeURIComponent(article.category || "News")}` },
|
||||||
|
{ "@type": "ListItem", "position": 3, "name": article.title, "item": articleUrl }
|
||||||
|
]
|
||||||
};
|
};
|
||||||
const script = document.createElement("script");
|
const script = document.createElement("script");
|
||||||
script.type = "application/ld+json";
|
script.type = "application/ld+json";
|
||||||
script.id = "article-jsonld";
|
script.id = "article-jsonld";
|
||||||
script.textContent = JSON.stringify(jsonLd);
|
script.textContent = JSON.stringify([jsonLd, breadcrumbLd]);
|
||||||
const existing = document.getElementById("article-jsonld");
|
const existing = document.getElementById("article-jsonld");
|
||||||
if (existing) existing.remove();
|
if (existing) existing.remove();
|
||||||
document.head.appendChild(script);
|
document.head.appendChild(script);
|
||||||
|
|||||||
@ -30,7 +30,7 @@ export default function CategoryPage() {
|
|||||||
|
|
||||||
usePageMeta(
|
usePageMeta(
|
||||||
`${category}${currentPage > 1 ? ` – Seite ${currentPage}` : ""} - Volksmusik & Schlager`,
|
`${category}${currentPage > 1 ? ` – Seite ${currentPage}` : ""} - Volksmusik & Schlager`,
|
||||||
`Aktuelle ${category}-Beiträge aus der Volksmusik- und Schlagerszene bei FOLX TV.`
|
`Aktuelle ${category}-Beiträge und Nachrichten aus der Volksmusik- und Schlagerszene. Neueste Volksmusik-Meldungen bei FOLX TV.`
|
||||||
);
|
);
|
||||||
|
|
||||||
const { data, isLoading } = useQuery<PaginatedResponse>({
|
const { data, isLoading } = useQuery<PaginatedResponse>({
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
|
|||||||
import { PageSideAds } from "@/components/adsense";
|
import { PageSideAds } from "@/components/adsense";
|
||||||
|
|
||||||
export default function DatenschutzPage() {
|
export default function DatenschutzPage() {
|
||||||
usePageMeta("Datenschutz - FOLX TV", "Datenschutzerklärung von FOLX TV – Ihr Volksmusik & Schlager Fernsehsender.");
|
usePageMeta("Datenschutz - FOLX TV Volksmusik Sender", "Datenschutzerklärung von FOLX TV – Ihrem Volksmusik & Schlager Fernsehsender.");
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
<Header />
|
<Header />
|
||||||
|
|||||||
@ -34,7 +34,7 @@ const COUNTRIES = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
export default function EmpfangPage() {
|
export default function EmpfangPage() {
|
||||||
usePageMeta("Empfang FOLX TV - Volksmusik & Schlager Sender empfangen", "So empfangen Sie FOLX TV – Ihren Volksmusik & Schlager Sender in Deutschland, Österreich und der Schweiz.");
|
usePageMeta("Empfang FOLX TV - Volksmusik & Schlager Sender empfangen", "So empfangen Sie FOLX TV – den Volksmusik & Schlager Sender in Deutschland, Österreich und der Schweiz. Kabel, Satellit und Streaming-Optionen.");
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
<Header />
|
<Header />
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
|
|||||||
import { InArticleAd, PageSideAds } from "@/components/adsense";
|
import { InArticleAd, PageSideAds } from "@/components/adsense";
|
||||||
|
|
||||||
export default function GalleryPageWrapper() {
|
export default function GalleryPageWrapper() {
|
||||||
usePageMeta("Fotogalerie - Volksmusik & Schlager Bilder", "Fotos und Bilder von Volksmusik- und Schlager-Stars bei FOLX TV.");
|
usePageMeta("Fotogalerie - Volksmusik & Schlager Bilder", "Exklusive Fotos und Bilder von Volksmusik- und Schlager-Stars, Konzerten und Events. Die Volksmusik-Fotogalerie von FOLX TV.");
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
<Header />
|
<Header />
|
||||||
|
|||||||
@ -511,16 +511,16 @@ function BentoSkeleton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
usePageMeta("Volksmusik & Schlager", "FOLX TV – Aktuelle Nachrichten, Musikvideos und Interviews aus der Welt der Volksmusik und des Schlagers.");
|
usePageMeta("Volksmusik & Schlager TV", "FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik.");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const jsonLd = {
|
const jsonLd = {
|
||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "WebSite",
|
"@type": "WebSite",
|
||||||
"name": "Folx Music Television",
|
"name": "Folx Music Television",
|
||||||
"alternateName": "FOLX TV",
|
"alternateName": ["FOLX TV", "Volksmusik TV"],
|
||||||
"url": "https://folx.tv",
|
"url": "https://folx.tv",
|
||||||
"description": "FOLX TV – Aktuelle Nachrichten, Musikvideos und Interviews aus der Welt der Volksmusik und des Schlagers.",
|
"description": "FOLX TV – Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik.",
|
||||||
"publisher": {
|
"publisher": {
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
"name": "Folx Music Television",
|
"name": "Folx Music Television",
|
||||||
@ -528,7 +528,18 @@ export default function Home() {
|
|||||||
"logo": {
|
"logo": {
|
||||||
"@type": "ImageObject",
|
"@type": "ImageObject",
|
||||||
"url": `${window.location.origin}/favicon.png`
|
"url": `${window.location.origin}/favicon.png`
|
||||||
}
|
},
|
||||||
|
"sameAs": [
|
||||||
|
"https://www.facebook.com/folxtvmusic",
|
||||||
|
"https://www.instagram.com/folxtv",
|
||||||
|
"https://www.youtube.com/@FolxTV",
|
||||||
|
"https://www.tiktok.com/@folx.tv"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"potentialAction": {
|
||||||
|
"@type": "SearchAction",
|
||||||
|
"target": "https://folx.tv/search?q={search_term_string}",
|
||||||
|
"query-input": "required name=search_term_string"
|
||||||
},
|
},
|
||||||
"inLanguage": "de"
|
"inLanguage": "de"
|
||||||
};
|
};
|
||||||
@ -692,6 +703,7 @@ export default function Home() {
|
|||||||
<Header />
|
<Header />
|
||||||
<PageSideAds />
|
<PageSideAds />
|
||||||
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 space-y-4">
|
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 space-y-4">
|
||||||
|
<h1 className="sr-only">FOLX TV – Volksmusik & Schlager Fernsehsender: Nachrichten, Videos und Live-Shows</h1>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-4 gap-4">
|
<div className="grid grid-cols-1 lg:grid-cols-4 gap-4">
|
||||||
<div className="lg:col-span-3 space-y-4">
|
<div className="lg:col-span-3 space-y-4">
|
||||||
|
|||||||
@ -369,7 +369,7 @@ function SignDetail({ signIndex, onNavigate, aiHoroscopes }: { signIndex: number
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function HoroscopePage() {
|
export default function HoroscopePage() {
|
||||||
usePageMeta("Horoskop - Volksmusik & Schlager", "Tägliches Horoskop für Volksmusik- und Schlager-Fans bei FOLX TV.");
|
usePageMeta("Horoskop - Volksmusik & Schlager", "Tägliches Horoskop für alle Sternzeichen. Ihr persönliches Tageshoroskop bei FOLX TV – dem Volksmusik & Schlager Sender.");
|
||||||
const params = useParams<{ sign?: string }>();
|
const params = useParams<{ sign?: string }>();
|
||||||
const [selected, setSelected] = useState<number | null>(null);
|
const [selected, setSelected] = useState<number | null>(null);
|
||||||
const detailRef = useRef<HTMLDivElement>(null);
|
const detailRef = useRef<HTMLDivElement>(null);
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
|
|||||||
import { PageSideAds } from "@/components/adsense";
|
import { PageSideAds } from "@/components/adsense";
|
||||||
|
|
||||||
export default function ImpressumPage() {
|
export default function ImpressumPage() {
|
||||||
usePageMeta("Impressum - FOLX TV", "Impressum und rechtliche Informationen zu FOLX TV – Volksmusik & Schlager Fernsehsender.");
|
usePageMeta("Impressum - FOLX TV Volksmusik Sender", "Impressum und rechtliche Informationen zu FOLX TV – Ihrem Volksmusik & Schlager Fernsehsender.");
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
<Header />
|
<Header />
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import { PageSideAds } from "@/components/adsense";
|
|||||||
import { apiRequest } from "@/lib/queryClient";
|
import { apiRequest } from "@/lib/queryClient";
|
||||||
|
|
||||||
export default function KontaktPage() {
|
export default function KontaktPage() {
|
||||||
usePageMeta("Kontakt - FOLX TV", "Kontaktieren Sie FOLX TV – Ihr Fernsehsender für Volksmusik und Schlager.");
|
usePageMeta("Kontakt - FOLX TV Volksmusik Sender", "Kontaktieren Sie FOLX TV – Ihren Fernsehsender Nr. 1 für Volksmusik und Schlager. Wir freuen uns auf Ihre Nachricht.");
|
||||||
|
|
||||||
const [formData, setFormData] = useState({ name: "", email: "", subject: "", message: "" });
|
const [formData, setFormData] = useState({ name: "", email: "", subject: "", message: "" });
|
||||||
const [status, setStatus] = useState<"idle" | "sending" | "success" | "error">("idle");
|
const [status, setStatus] = useState<"idle" | "sending" | "success" | "error">("idle");
|
||||||
|
|||||||
@ -296,7 +296,7 @@ function RecipeModal({ recipe, onClose }: { recipe: Recipe; onClose: () => void
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function RecipesPage() {
|
export default function RecipesPage() {
|
||||||
usePageMeta("Rezepte - Alpenküche & Schlager", "Traditionelle Rezepte aus der Alpenküche bei FOLX TV – kochen wie die Volksmusik-Stars.");
|
usePageMeta("Rezepte - Alpenküche & Volksmusik", "Traditionelle Rezepte aus der Alpenküche und österreichische Hausmannskost. Kochen wie die Volksmusik-Stars bei FOLX TV.");
|
||||||
const [selectedRecipe, setSelectedRecipe] = useState<Recipe | null>(null);
|
const [selectedRecipe, setSelectedRecipe] = useState<Recipe | null>(null);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -27,7 +27,7 @@ interface SearchResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function SearchPage() {
|
export default function SearchPage() {
|
||||||
usePageMeta("Suche - Volksmusik & Schlager", "Durchsuchen Sie FOLX TV nach Volksmusik- und Schlager-Inhalten.");
|
usePageMeta("Suche - Volksmusik & Schlager", "Durchsuchen Sie FOLX TV nach Volksmusik- und Schlager-Nachrichten, Künstlern, Videos und mehr.");
|
||||||
const searchString = useSearch();
|
const searchString = useSearch();
|
||||||
const initialQuery = new URLSearchParams(searchString).get("q") || "";
|
const initialQuery = new URLSearchParams(searchString).get("q") || "";
|
||||||
const [query, setQuery] = useState(initialQuery);
|
const [query, setQuery] = useState(initialQuery);
|
||||||
|
|||||||
@ -72,7 +72,7 @@ function VideoCardSkeleton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function VideosPage() {
|
export default function VideosPage() {
|
||||||
usePageMeta("Volksmusik & Schlager Videos", "Musikvideos und Live-Auftritte aus der Volksmusik- und Schlagerszene bei FOLX TV.");
|
usePageMeta("Volksmusik & Schlager Videos", "Volksmusik und Schlager Musikvideos, Live-Auftritte und Konzertmitschnitte bei FOLX TV. Die besten volkstümlichen Hits und Schlager-Stars im Video.");
|
||||||
|
|
||||||
const searchString = useSearch();
|
const searchString = useSearch();
|
||||||
const [, setLocation] = useLocation();
|
const [, setLocation] = useLocation();
|
||||||
|
|||||||
11
replit.md
11
replit.md
@ -3,6 +3,17 @@
|
|||||||
## Overview
|
## Overview
|
||||||
The official website for Folx Music Television (folx.tv). Dark-themed bento grid layout with content for folk music (Volksmusik/Schlager) fans. Features articles, videos, photo gallery, horoscope widget + subpage, recipe widget + subpage, Google News feed, and integrated AdSense ads. All content is hardcoded in seed for production deployments.
|
The official website for Folx Music Television (folx.tv). Dark-themed bento grid layout with content for folk music (Volksmusik/Schlager) fans. Features articles, videos, photo gallery, horoscope widget + subpage, recipe widget + subpage, Google News feed, and integrated AdSense ads. All content is hardcoded in seed for production deployments.
|
||||||
|
|
||||||
|
## SEO
|
||||||
|
- Primary keyword: "Volksmusik" — used across all page titles, meta descriptions, OG tags, and structured data
|
||||||
|
- Dynamic canonical URLs via `usePageMeta` hook (updates `<link rel="canonical">` per page)
|
||||||
|
- SSR article pages: server-side meta tags (OG, Twitter, description, keywords, canonical) in both `server/vite.ts` (dev) and `server/static.ts` (prod)
|
||||||
|
- `stripExistingMeta()` removes duplicate meta/canonical from base HTML before injecting article-specific ones
|
||||||
|
- JSON-LD structured data: WebSite (home) with SearchAction, NewsArticle + BreadcrumbList (articles)
|
||||||
|
- Sitemap at `/sitemap.xml` — includes all static pages, categories, horoscope signs, and articles
|
||||||
|
- robots.txt disallows `/api/`, `/search`, `/admin/`
|
||||||
|
- H1 tag on home page (sr-only): "FOLX TV – Volksmusik & Schlager Fernsehsender"
|
||||||
|
- Logo alt text includes "Volksmusik & Schlager Fernsehsender"
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
- **Frontend**: React + Vite + TailwindCSS + shadcn/ui (dark mode)
|
- **Frontend**: React + Vite + TailwindCSS + shadcn/ui (dark mode)
|
||||||
- **Backend**: Express.js + Node.js
|
- **Backend**: Express.js + Node.js
|
||||||
|
|||||||
@ -821,6 +821,7 @@ export async function registerRoutes(
|
|||||||
{ loc: "/gallery", priority: "0.7", changefreq: "weekly" },
|
{ loc: "/gallery", priority: "0.7", changefreq: "weekly" },
|
||||||
{ loc: "/horoskop", priority: "0.7", changefreq: "daily" },
|
{ loc: "/horoskop", priority: "0.7", changefreq: "daily" },
|
||||||
{ loc: "/rezepte", priority: "0.6", changefreq: "monthly" },
|
{ loc: "/rezepte", priority: "0.6", changefreq: "monthly" },
|
||||||
|
{ loc: "/kontakt", priority: "0.5", changefreq: "yearly" },
|
||||||
{ loc: "/empfang-folx-tv", priority: "0.5", changefreq: "monthly" },
|
{ loc: "/empfang-folx-tv", priority: "0.5", changefreq: "monthly" },
|
||||||
{ loc: "/ueber-uns", priority: "0.4", changefreq: "yearly" },
|
{ loc: "/ueber-uns", priority: "0.4", changefreq: "yearly" },
|
||||||
{ loc: "/impressum", priority: "0.3", changefreq: "yearly" },
|
{ loc: "/impressum", priority: "0.3", changefreq: "yearly" },
|
||||||
@ -888,6 +889,7 @@ export async function registerRoutes(
|
|||||||
Allow: /
|
Allow: /
|
||||||
Disallow: /api/
|
Disallow: /api/
|
||||||
Disallow: /search
|
Disallow: /search
|
||||||
|
Disallow: /admin/
|
||||||
|
|
||||||
Sitemap: https://folx.tv/sitemap.xml
|
Sitemap: https://folx.tv/sitemap.xml
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -21,6 +21,7 @@ function stripExistingMeta(html: string): string {
|
|||||||
html = html.replace(/<meta\s+name="twitter:[^"]*"[^>]*>\s*/gi, "");
|
html = html.replace(/<meta\s+name="twitter:[^"]*"[^>]*>\s*/gi, "");
|
||||||
html = html.replace(/<meta\s+name="description"[^>]*>\s*/gi, "");
|
html = html.replace(/<meta\s+name="description"[^>]*>\s*/gi, "");
|
||||||
html = html.replace(/<meta\s+name="keywords"[^>]*>\s*/gi, "");
|
html = html.replace(/<meta\s+name="keywords"[^>]*>\s*/gi, "");
|
||||||
|
html = html.replace(/<link\s+rel="canonical"[^>]*>\s*/gi, "");
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +81,9 @@ export function serveStatic(app: Express) {
|
|||||||
`<meta name="twitter:description" content="${escapeHtml(article.excerpt)}" />`,
|
`<meta name="twitter:description" content="${escapeHtml(article.excerpt)}" />`,
|
||||||
`<meta name="twitter:image" content="${escapeHtml(finalImage)}" />`,
|
`<meta name="twitter:image" content="${escapeHtml(finalImage)}" />`,
|
||||||
`<meta name="description" content="${escapeHtml(article.excerpt)}" />`,
|
`<meta name="description" content="${escapeHtml(article.excerpt)}" />`,
|
||||||
`<title>${escapeHtml(article.title)} - Folx Music Television</title>`,
|
`<meta name="keywords" content="Volksmusik, Schlager, ${escapeHtml(article.title)}, ${escapeHtml(article.category || 'News')}, FOLX TV" />`,
|
||||||
|
`<link rel="canonical" href="${escapeHtml(articleUrl)}" />`,
|
||||||
|
`<title>${escapeHtml(article.title)} - Volksmusik & Schlager | Folx Music Television</title>`,
|
||||||
].join("\n ");
|
].join("\n ");
|
||||||
|
|
||||||
template = template.replace(/<title>[^<]*<\/title>/, ogTags);
|
template = template.replace(/<title>[^<]*<\/title>/, ogTags);
|
||||||
|
|||||||
@ -27,6 +27,7 @@ function stripExistingMeta(html: string): string {
|
|||||||
html = html.replace(/<meta\s+name="twitter:[^"]*"[^>]*>\s*/gi, "");
|
html = html.replace(/<meta\s+name="twitter:[^"]*"[^>]*>\s*/gi, "");
|
||||||
html = html.replace(/<meta\s+name="description"[^>]*>\s*/gi, "");
|
html = html.replace(/<meta\s+name="description"[^>]*>\s*/gi, "");
|
||||||
html = html.replace(/<meta\s+name="keywords"[^>]*>\s*/gi, "");
|
html = html.replace(/<meta\s+name="keywords"[^>]*>\s*/gi, "");
|
||||||
|
html = html.replace(/<link\s+rel="canonical"[^>]*>\s*/gi, "");
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +102,9 @@ export async function setupVite(server: Server, app: Express) {
|
|||||||
`<meta name="twitter:description" content="${escapeHtml(article.excerpt)}" />`,
|
`<meta name="twitter:description" content="${escapeHtml(article.excerpt)}" />`,
|
||||||
`<meta name="twitter:image" content="${escapeHtml(finalImage)}" />`,
|
`<meta name="twitter:image" content="${escapeHtml(finalImage)}" />`,
|
||||||
`<meta name="description" content="${escapeHtml(article.excerpt)}" />`,
|
`<meta name="description" content="${escapeHtml(article.excerpt)}" />`,
|
||||||
`<title>${escapeHtml(article.title)} - Folx Music Television</title>`,
|
`<meta name="keywords" content="Volksmusik, Schlager, ${escapeHtml(article.title)}, ${escapeHtml(article.category || 'News')}, FOLX TV" />`,
|
||||||
|
`<link rel="canonical" href="${escapeHtml(articleUrl)}" />`,
|
||||||
|
`<title>${escapeHtml(article.title)} - Volksmusik & Schlager | Folx Music Television</title>`,
|
||||||
].join("\n ");
|
].join("\n ");
|
||||||
|
|
||||||
template = template.replace(/<title>[^<]*<\/title>/, ogTags);
|
template = template.replace(/<title>[^<]*<\/title>/, ogTags);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user