feat(admin): add demo mode toggle in admin dashboard and rewrite 404 page for missing routes
Some checks failed
Production Build & Deploy / build-and-deploy (push) Has been cancelled
Some checks failed
Production Build & Deploy / build-and-deploy (push) Has been cancelled
This commit is contained in:
@@ -73,8 +73,15 @@ const { title, description = "Professionelles Webdesign & moderne Websites." } =
|
||||
</script>
|
||||
</head>
|
||||
<body class="font-sans transition-colors duration-500 antialiased">
|
||||
{(siteConfig as any).is_demo_mode && (
|
||||
<div class="bg-gradient-to-r from-amber-600 via-amber-500 to-amber-600 text-slate-950 text-center py-2 px-4 text-xs font-bold font-mono tracking-wide shadow-md flex items-center justify-center gap-2">
|
||||
<span>🎭 DEMO-MODUS AKTIV</span>
|
||||
<span class="opacity-75 font-sans font-normal">— Dies ist eine interaktive Vorschau-Instanz der N&D WaaS Engine.</span>
|
||||
</div>
|
||||
)}
|
||||
<slot />
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
<style is:global>
|
||||
|
||||
@@ -71,11 +71,13 @@ let page = pages.find((p: any) => {
|
||||
return p.slug === currentSlug || p.slug === `/${currentSlug}`;
|
||||
});
|
||||
|
||||
// 5. Zero-Crash Fallback Guard: Wenn Seite fehlt oder unveröffentlicht ist
|
||||
if (!page || (page.is_published === false && import.meta.env.PROD)) {
|
||||
return Astro.redirect('/404');
|
||||
// 5. Zero-Crash Fallback Guard: Wenn Seite nicht existiert oder nicht veröffentlicht ist -> 404 Status
|
||||
if (!page || (page.is_published === false && !isDraft)) {
|
||||
Astro.response.status = 404;
|
||||
return Astro.rewrite('/404');
|
||||
}
|
||||
|
||||
|
||||
// 6. Dynamic Component Registry Mapping
|
||||
const ComponentRegistry: Record<string, any> = {
|
||||
hero: HeroSection,
|
||||
|
||||
@@ -71,6 +71,13 @@ const presets = Object.values(THEME_PRESETS);
|
||||
<label class="block text-xs font-bold text-slate-400 mb-1">Meta Beschreibung (SEO)</label>
|
||||
<textarea id="metaDescription" rows="2" class="w-full glass-panel bg-slate-950/60 rounded-xl p-3 text-xs text-white focus:outline-none focus:border-sky-400 resize-none">{siteConfig.metaDescription}</textarea>
|
||||
</div>
|
||||
<label class="flex items-center gap-3 pt-2 p-3 bg-amber-500/10 border border-amber-500/20 rounded-xl cursor-pointer">
|
||||
<input type="checkbox" id="isDemoMode" checked={(siteConfig as any).is_demo_mode ?? false} class="rounded text-amber-400 focus:ring-0 h-4 w-4" />
|
||||
<div>
|
||||
<span class="text-xs text-amber-400 font-bold block">🎭 Demo-Modus aktivieren</span>
|
||||
<span class="text-[10px] text-slate-400">Zeigt einen festen Demo-Hinweis für Interessenten auf der Live-Website</span>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<h3 class="text-xs font-bold text-slate-400 uppercase tracking-wider pt-2 border-t border-white/10">Unternehmens-Stammdaten (Dynamic Data Binding)</h3>
|
||||
@@ -179,6 +186,7 @@ const presets = Object.values(THEME_PRESETS);
|
||||
siteConfig: {
|
||||
siteName: getVal('siteName'),
|
||||
metaDescription: getVal('metaDescription'),
|
||||
is_demo_mode: getBool('isDemoMode'),
|
||||
site_info: {
|
||||
title: getVal('infoTitle'),
|
||||
email: getVal('infoEmail'),
|
||||
@@ -186,6 +194,7 @@ const presets = Object.values(THEME_PRESETS);
|
||||
address: getVal('infoAddress')
|
||||
}
|
||||
},
|
||||
|
||||
themeConfig: {
|
||||
activePreset: selectedPreset
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user