/** * Kalender & Freigaben — Plane, manage und genehmige Content über alle Plattformen * Referenz: docs/design-references/screen-kalender.png */ import { useState } from 'react'; import { ChevronLeft, ChevronRight, Plus, Filter, MoreHorizontal } from 'lucide-react'; const CHANNELS = [ { name: 'TikTok', icon: '🎵', color: '#00d4ff', count: 5 }, { name: 'Instagram', icon: '📸', color: '#e1306c', count: 5 }, { name: 'LinkedIn', icon: '💼', color: '#0077b5', count: 4 }, { name: 'X (Twitter)', icon: '✗', color: '#94a3b8', count: 5 }, { name: 'YouTube Shorts', icon: '▶', color: '#ff0000', count: 5 }, ]; const DAYS = ['Mo 26. Mai', 'Di 27. Mai', 'Mi 28. Mai', 'Do 29. Mai', 'Fr 30. Mai', 'Sa 31. Mai', 'So 1. Jun']; const STATUS_COLORS: Record = { Review: { bg: 'oklch(0.75 0.15 75 / 0.2)', text: '#f59e0b' }, Geplant: { bg: 'oklch(0.82 0.18 210 / 0.15)', text: '#00d4ff' }, Freigegeben: { bg: 'oklch(0.65 0.15 165 / 0.2)', text: '#10b981' }, Veröffentlicht: { bg: 'oklch(0.65 0.15 165 / 0.1)', text: '#10b981' }, }; const CALENDAR_DATA: Record>> = { TikTok: { 'Mo 26. Mai': [{ time: '09:00', title: 'Shelly Plug S Gen3', status: 'Review' }], 'Di 27. Mai': [{ time: '18:30', title: 'Kitchen Trends 2025', status: 'Geplant' }], 'Mi 28. Mai': [{ time: '12:00', title: 'Energy Saving Tip', status: 'Freigegeben' }], 'Do 29. Mai': [{ time: '19:15', title: 'Automation Hack', status: 'Review' }], 'Fr 30. Mai': [{ time: '17:45', title: 'Weekend Setup', status: 'Freigegeben' }], 'Sa 31. Mai': [{ time: '11:30', title: 'Smart Home Tour', status: 'Veröffentlicht' }], }, Instagram: { 'Mo 26. Mai': [{ time: '10:30', title: 'New Collection', status: 'Geplant' }], 'Di 27. Mai': [{ time: '15:00', title: 'Behind the Scenes', status: 'Review' }], 'Mi 28. Mai': [{ time: '11:00', title: 'Customer Favorite', status: 'Freigegeben' }], 'Do 29. Mai': [{ time: '16:30', title: 'Giveaway Alert', status: 'Geplant' }], 'Fr 30. Mai': [{ time: '12:15', title: 'Lifestyle Post', status: 'Veröffentlicht' }], 'Sa 31. Mai': [{ time: '10:00', title: 'Story Series', status: 'Veröffentlicht' }], }, LinkedIn: { 'Mo 26. Mai': [{ time: '08:30', title: 'Industry Insights', status: 'Geplant' }], 'Di 27. Mai': [{ time: '12:00', title: 'Product Launch', status: 'Freigegeben' }], 'Mi 28. Mai': [{ time: '09:15', title: 'Case Study', status: 'Freigegeben' }], 'Do 29. Mai': [{ time: '13:00', title: 'Market Update', status: 'Geplant' }], 'Fr 30. Mai': [{ time: '09:30', title: 'Thought Leadership', status: 'Freigegeben' }], }, 'X (Twitter)': { 'Mo 26. Mai': [{ time: '09:45', title: 'Quick Tip', status: 'Geplant' }], 'Di 27. Mai': [{ time: '14:20', title: 'Tech Update', status: 'Geplant' }], 'Mi 28. Mai': [{ time: '11:15', title: 'Poll', status: 'Review' }], 'Do 29. Mai': [{ time: '08:50', title: 'Thread', status: 'Geplant' }], 'Fr 30. Mai': [{ time: '16:00', title: 'News Flash', status: 'Freigegeben' }], }, 'YouTube Shorts': { 'Mo 26. Mai': [{ time: '17:00', title: 'Unboxing', status: 'Geplant' }], 'Di 27. Mai': [{ time: '18:00', title: 'Top 3 Features', status: 'Review' }], 'Mi 28. Mai': [{ time: '17:30', title: 'How-To', status: 'Freigegeben' }], 'Do 29. Mai': [{ time: '18:30', title: 'Comparison', status: 'Geplant' }], 'Fr 30. Mai': [{ time: '09:00', title: 'User Story', status: 'Freigegeben' }], 'Sa 31. Mai': [{ time: '12:00', title: 'Quick Hack', status: 'Veröffentlicht' }], }, }; const APPROVAL_QUEUE = [ { priority: 'Hoch', title: 'Automation Hack in 60 Sekunden', platform: 'TikTok', product: 'Shelly Plus 2PM', affiliate: true, scheduled: '29. Mai, 19:15', by: 'Lena M.', status: 'Review' }, { priority: 'Hoch', title: 'Behind the Scenes – Studio Tour', platform: 'Instagram', product: 'Shelly Wall Display', affiliate: true, scheduled: '27. Mai, 15:00', by: 'Tim S.', status: 'Review' }, { priority: 'Mittel', title: 'Case Study: Energie sparen', platform: 'LinkedIn', product: 'Shelly Plug S Gen3', affiliate: false, scheduled: '28. Mai, 09:15', by: 'Anna K.', status: 'Review' }, { priority: 'Mittel', title: 'Top 3 Features – Shelly Pro 4PM', platform: 'YouTube Shorts', product: 'Shelly Pro 4PM', affiliate: true, scheduled: '27. Mai, 18:00', by: 'Mark D.', status: 'Review' }, { priority: 'Niedrig', title: 'Quick Tip: Szene erstellen', platform: 'X (Twitter)', product: 'Shelly App', affiliate: false, scheduled: '28. Mai, 11:15', by: 'Sarah L.', status: 'Review' }, { priority: 'Niedrig', title: 'Giveaway: Smart Home Bundle', platform: 'Instagram', product: 'Bundle Pack', affiliate: true, scheduled: '29. Mai, 16:30', by: 'Tim S.', status: 'Geplant' }, { priority: 'Niedrig', title: 'Market Update Q2/2025', platform: 'LinkedIn', product: '—', affiliate: false, scheduled: '29. Mai, 13:00', by: 'Anna K.', status: 'Geplant' }, ]; const PRIORITY_COLORS: Record = { Hoch: { bg: 'oklch(0.62 0.22 25 / 0.15)', text: '#ef4444' }, Mittel: { bg: 'oklch(0.75 0.15 75 / 0.15)', text: '#f59e0b' }, Niedrig: { bg: 'oklch(0.82 0.18 210 / 0.1)', text: '#64748b' }, }; const PLATFORM_ICONS: Record = { TikTok: '🎵', Instagram: '📸', LinkedIn: '💼', 'X (Twitter)': '✗', 'YouTube Shorts': '▶', }; export default function Calendar() { const [view, setView] = useState<'Woche' | 'Monat'>('Woche'); return (
{/* Header */}

Kalender & Freigaben

Plane, manage und genehmige Content über alle Plattformen.

26. Mai – 1. Jun
{(['Woche', 'Monat'] as const).map(v => ( ))}
{/* KPI Bar */}
{[ { label: 'Geplante Beiträge', value: '24', trend: '↑ 14% vs. letzte Woche', color: '#60a5fa' }, { label: 'Ausstehende Freigaben', value: '7', trend: '↑ 2 vs. letzte Woche', color: '#a78bfa' }, { label: 'Ø Veröffentlichungszeit', value: '14:32', trend: 'Beste Zeit: 18:00', color: '#10b981' }, { label: 'Proj. Affiliate-Umsatz', value: '€12.430', trend: '↑ 24% vs. letzte Woche', color: '#00d4ff' }, ].map((kpi, i) => (
{kpi.label}
{kpi.value}
{kpi.trend}
))}
{/* Content Kalender */}

Content Kalender

{DAYS.map(day => ( ))} {CHANNELS.map((channel, ci) => ( {DAYS.map(day => { const items = CALENDAR_DATA[channel.name]?.[day] || []; return ( ); })} ))}
Kanal {day}
{channel.icon}
{channel.name}
{channel.count} Beiträge
{items.map((item, ii) => (
{item.time}
{item.title}
{item.status}
))} {items.length === 0 && (
)}
{/* Freigaben Queue */}

Freigaben-Queue ({APPROVAL_QUEUE.length})

{['Priorität', 'Vorschau', 'Titel', 'Plattform', 'Produkt', 'Affiliate', 'Geplant für', 'Erstellt von', 'Status', 'Aktionen'].map(h => ( ))} {APPROVAL_QUEUE.map((item, i) => ( ))}
{h}
{item.priority}
{item.title} {PLATFORM_ICONS[item.platform]} {item.platform} {item.product} {item.affiliate ? 'Ja' : 'Nein'} {item.scheduled} {item.by} {item.status}
); }