// Screen designs for Demenskalender Family-app // ── Sidebar (desktop + mobile drawer) ────────────────────────────── const Sidebar = ({ active = 'dashboard' }) => { const [open, setOpen] = React.useState(false); const items = [ { id: 'dashboard', label: 'Hjem', icon: 'home' }, { id: 'edit', label: 'Rediger indhold',icon: 'edit' }, { id: 'docs', label: 'Dokumenter', icon: 'folder' }, ]; // close drawer on resize to desktop React.useEffect(() => { const onResize = () => { if (window.innerWidth > 760) setOpen(false); }; window.addEventListener('resize', onResize); return () => window.removeEventListener('resize', onResize); }, []); return ( {/* Mobile burger button (top-left, fixed) */} {/* Backdrop (mobile only when open) */} {open &&
setOpen(false)} className="app-sidebar-backdrop" style={{ position: 'fixed', inset: 0, background: 'rgba(20,30,50,0.45)', zIndex: 50, }} />} ); }; // ── Top bar ───────────────────────────────────────────────────────── const CITIZEN_NAME = "Hos Jette Madsen"; const TopBar = ({ title, subtitle, actions }) => (
{CITIZEN_NAME}
{subtitle && subtitle !== CITIZEN_NAME && (
{subtitle}
)}

{title}

{actions &&
{actions}
}
); // ── Screen Preview (kompakt tekst-version af storskærmen) ───────── const ScreenPreview = ({ compact, onEdit }) => (
Storskærmen viser nu
{TODAY.weekday}
{TODAY.date}
09:42
{/* Aftaler */}
Aftaler i dag {TODAY.appointments.map(a => (
{a.time}
{a.title}
))}
{/* Huskeseddel */}
Huskeseddel {TODAY.notes.slice(0, compact ? 2 : 3).map(n => (
{n.text}
))}
Fødselsdag
Morten fylder 32 om 4 dage
); const SectionLabel = ({ children }) => (
{children}
); // ── DASHBOARD ─────────────────────────────────────────────────────── const DashboardScreen = () => (
Start videoopkald, ]} />
{/* Main column */}
{/* Quick stats */}
{/* Daily routines (faste opgaver) */}
Tilføj} />
{TODAY.routines.map((r, i) => { const tone = r.type === 'pille' ? 'rose' : r.type === 'pleje' ? 'olive' : 'teal'; const icon = r.type === 'pille' ? 'pill' : r.type === 'pleje' ? 'nurse' : 'droplet'; const toneBg = tone === 'rose' ? '#EDD3CE' : tone === 'olive' ? '#DCE2C7' : '#D8E7E9'; const toneFg = tone === 'rose' ? '#7A3F37' : tone === 'olive' ? '#5C6638' : '#2F5C61'; return (
{r.time}
{r.title}
{r.who}
); })}
{/* Today's appointments */}
Tilføj} />
{TODAY.appointments.map((a, i) => (
{a.time}
{a.title}
{a.who}
{a.tone === 'primary' ? 'Besøg' : 'Aftale'}
))}
{/* Notes */}
Tilføj note} />
{TODAY.notes.map((n, i) => (
{n.text}
{n.by} · {n.when}
))}
{/* Right rail */}
window.__APP_NAV__ && (location.href = window.__APP_NAV__.edit)} />
{ACTIVITY.slice(0, 4).map((a, i) => (
{a.who.split(' ')[0]}{' '} {a.action}
{a.detail}
{a.when}
))}
); const StatCard = ({ icon, label, value, hint }) => (
{label}
{value}
{hint}
); const CardHeader = ({ title, subtitle, action, small }) => (

{title}

{subtitle &&
{subtitle}
}
{action}
); // ── CALENDAR ──────────────────────────────────────────────────────── const CalendarScreen = () => { const days = ['Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør', 'Søn']; const weekDays = [ { d: 5, day: 'Man', date: '5 maj' }, { d: 6, day: 'Tir', date: '6 maj' }, { d: 7, day: 'Ons', date: '7 maj' }, { d: 8, day: 'Tor', date: '8 maj', today: true }, { d: 9, day: 'Fre', date: '9 maj' }, { d: 10, day: 'Lør', date: '10 maj' }, { d: 11, day: 'Søn', date: '11 maj' }, ]; const events = [ { day: 8, time: '10:00', dur: 1.5, title: 'Lene på besøg', tone: 'primary' }, { day: 8, time: '14:30', dur: 1, title: 'Øjenlæge', tone: 'accent' }, { day: 9, time: '11:00', dur: 1, title: 'Hjemmeplejen', tone: 'olive' }, { day: 10, time: '13:00', dur: 2, title: 'Kaffe m. Anna', tone: 'primary' }, { day: 12, time: '12:00', dur: 1.5, title: 'Mortens fødselsdag', tone: 'accent' }, ]; return (
{null}, , , ]} />
{/* Week grid */}
{/* Week header */}
{weekDays.map(w => (
{w.day}
{w.d}
))}
{/* Hours */}
{[8, 9, 10, 11, 12, 13, 14, 15, 16, 17].map((h, idx) => (
{h}:00
{weekDays.map(w => (
{events.filter(e => e.day === w.d && parseInt(e.time) === h).map((e, i) => { const tones = { primary: { bg: TOKENS.primarySoft, fg: TOKENS.primaryHover, bar: TOKENS.primary }, accent: { bg: TOKENS.accentSoft, fg: '#7A5418', bar: TOKENS.accent }, olive: { bg: '#E5EAD7', fg: '#5C6638', bar: '#7A8A4E' }, }; const t = tones[e.tone]; return (
{e.title}
{e.time}
); })}
))}
))}
{/* Right: edit panel */}

Ny aftale