Files
familienarchiv/docs/specs/calendar-view-spec.html
2026-05-05 12:39:20 +02:00

733 lines
59 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kalenderansicht · Spec #386 · Familienarchiv</title>
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Helvetica Neue',Arial,sans-serif;background:#ECEAE4;color:#1A1A1A;line-height:1.5}
.page{max-width:1360px;margin:0 auto;padding:48px 32px}
.mh{padding-bottom:24px;border-bottom:3px solid #012851;margin-bottom:48px}
.mh h1{font-size:22px;font-weight:900;color:#012851;letter-spacing:-.4px}
.mh p{font-size:12.5px;color:#555;max-width:680px;line-height:1.7;margin-top:6px}
.mh .byline{font-size:9px;color:#AAA;font-weight:700;letter-spacing:1.5px;text-transform:uppercase;margin-top:8px}
.sh{margin:56px 0 28px;padding-bottom:12px;border-bottom:2px solid #E0DDD6}
.sh h2{font-size:16px;font-weight:900;color:#012851}
.sh p{font-size:12px;color:#666;margin-top:4px;max-width:700px;line-height:1.6}
.grid{display:flex;gap:20px;flex-wrap:wrap;margin-bottom:32px;align-items:flex-start}
.col{display:flex;flex-direction:column;gap:6px}
.lbl{font-size:8px;font-weight:800;text-transform:uppercase;letter-spacing:1.2px;color:#888;display:flex;align-items:center;gap:5px;margin-bottom:4px}
.tag{background:#E4E0DA;color:#666;padding:1px 5px;border-radius:2px;font-size:7px;font-weight:700}
.cap{font-size:9.5px;color:#999;font-style:italic;line-height:1.55;max-width:580px;margin-top:4px}
.chrome{background:#F0EFE9;border:1.5px solid #C4C0BA;border-radius:7px;overflow:hidden;box-shadow:0 3px 14px rgba(0,0,0,.09)}
.chrome.dk{background:#060C12;border-color:#0A1520}
.cbar{height:20px;background:#E0DDD6;border-bottom:1px solid #C4C0BA;display:flex;align-items:center;padding:0 7px;gap:3px}
.chrome.dk .cbar{background:#0A1218;border-bottom-color:#0A1520}
.dot{width:5px;height:5px;border-radius:50%;background:#BDB8B1}
.chrome.dk .dot{background:#1A2A3A}
.url{flex:1;height:8px;background:#CCC8C2;border-radius:5px;margin-left:4px}
.chrome.dk .url{background:#1A2A3A}
.nav{height:32px;background:#012851;display:flex;align-items:center;padding:0 12px;gap:8px}
.chrome.dk .nav{background:#060C12}
.nav-logo{font-size:7px;font-weight:900;color:#fff;letter-spacing:.8px;border-bottom:2px solid #A1DCD8;padding-bottom:1px}
.nav-link{font-size:5.5px;color:rgba(255,255,255,.4);font-weight:700;text-transform:uppercase}
.nav-link.on{color:#fff;border-bottom:1.5px solid #A1DCD8;padding-bottom:1px}
.nav-r{margin-left:auto;display:flex;gap:5px;align-items:center}
.nav-av{width:16px;height:16px;background:rgba(255,255,255,.1);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:5px;font-weight:800;color:rgba(255,255,255,.5)}
.pb{background:#E8E7E2;padding:8px 10px;display:flex;flex-direction:column;gap:6px}
.pb.dk{background:#090F16}
/* SearchFilterBar */
.sfb{background:#fff;border:1.5px solid #D8D6CF;border-radius:3px;padding:5px 7px;display:flex;align-items:center;gap:4px;box-shadow:0 1px 3px rgba(0,0,0,.06)}
.sfb.dk{background:#0A1218;border-color:#1E2D3D}
.sfb-input{flex:1;height:17px;background:#F5F4EF;border:1px solid #D8D6CF;border-radius:2px;padding:0 5px;font-size:5.5px;color:#999;display:flex;align-items:center}
.sfb-input.dk{background:#060C12;border-color:#1E2D3D;color:#3E5065}
.sfb-btn{height:17px;padding:0 5px;border:1.5px solid #D8D6CF;border-radius:2px;font-size:5px;font-weight:700;text-transform:uppercase;color:#666;display:flex;align-items:center;gap:2px;white-space:nowrap;background:#F5F4EF}
.sfb-btn.dk{border-color:#1E2D3D;color:#4E6070;background:#0A1218}
/* View toggle */
.vtgl{display:flex;gap:0;border:1.5px solid #D8D6CF;border-radius:2px;overflow:hidden}
.vtgl.dk{border-color:#1E2D3D}
.vtgl-list{padding:3px 5px;display:flex;align-items:center;background:#012851}
.vtgl-list.off{background:#F5F4EF}
.vtgl-list.dk-off{background:#0A1218}
.vtgl-cal{padding:3px 5px;display:flex;align-items:center;background:#F5F4EF}
.vtgl-cal.on{background:#012851}
.vtgl-cal.dk-on{background:#A1DCD8}
/* Calendar month nav header */
.cal-nav{background:#fff;border:1.5px solid #D8D6CF;border-radius:3px 3px 0 0;border-bottom:1px solid #E8E6E0;display:flex;align-items:center;justify-content:space-between;padding:5px 8px;box-shadow:0 1px 3px rgba(0,0,0,.04)}
.cal-nav.dk{background:#0A1218;border-color:#1E2D3D;border-bottom-color:#1A2830}
.cal-nav-btn{width:18px;height:18px;display:flex;align-items:center;justify-content:center;border:1.5px solid #D8D6CF;border-radius:2px;background:#F5F4EF;color:#555;font-size:8px;cursor:pointer}
.cal-nav-btn.dk{border-color:#1E2D3D;background:#060C12;color:#4E6070}
.cal-nav-title{font-size:7px;font-weight:800;color:#012851;letter-spacing:.3px;cursor:pointer}
.cal-nav-title.dk{color:#A1DCD8}
.cal-nav-sub{font-size:5px;color:#AAA;margin-top:1px;text-align:center}
.cal-nav-sub.dk{color:#2A3A4A}
/* Calendar grid */
.cal-grid{background:#fff;border:1.5px solid #D8D6CF;border-top:none;border-radius:0 0 3px 3px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.04)}
.cal-grid.dk{background:#0A1218;border-color:#1E2D3D}
.cal-dow{display:grid;grid-template-columns:repeat(7,1fr);background:#F5F4EF;border-bottom:1px solid #E8E6E0}
.cal-dow.dk{background:#060C12;border-bottom-color:#1A2830}
.cal-dow-cell{padding:3px 0;text-align:center;font-size:4.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:#888}
.cal-dow-cell.dk{color:#2E4050}
.cal-week{display:grid;grid-template-columns:repeat(7,1fr)}
.cal-cell{border-right:1px solid #F0EEE8;border-bottom:1px solid #F0EEE8;min-height:50px;padding:3px 3px 2px;position:relative}
.cal-cell.dk{border-right-color:#1A2830;border-bottom-color:#1A2830}
.cal-cell.empty{background:#FAFAF8}
.cal-cell.empty.dk{background:#070E14}
.cal-cell.prev-month .cal-day-num,.cal-cell.next-month .cal-day-num{color:#D0CEC8}
.cal-cell.prev-month,.cal-cell.next-month{background:#FAFAF8}
.cal-cell.prev-month.dk,.cal-cell.next-month.dk{background:#070E14}
.cal-cell:last-child,.cal-week:last-child .cal-cell{border-bottom:none}
.cal-cell:nth-child(7n){border-right:none}
.cal-day-num{text-align:right;font-size:5.5px;font-weight:700;color:#444;margin-bottom:2px;line-height:1}
.cal-day-num.dk{color:#3E5065}
.doc-entry{font-size:4.5px;color:#012851;padding:1.5px 3px;background:#EFF8F7;border-left:2px solid #A1DCD8;margin-bottom:1px;border-radius:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;display:block;transition:background .1s}
.doc-entry:hover{background:#D4EDE9}
.doc-entry.dk{color:#A1DCD8;background:#0A2030;border-left-color:#1E5060}
.doc-entry.dk:hover{background:#0E2535}
.doc-overflow{font-size:4px;color:#888;font-style:italic;padding:1px 3px;cursor:pointer}
.doc-overflow:hover{text-decoration:underline}
.doc-overflow.dk{color:#3E5065}
/* Hover card */
.hover-card{position:absolute;z-index:50;background:#fff;border:1.5px solid #D8D6CF;border-radius:4px;box-shadow:0 8px 24px rgba(0,0,0,.14);padding:8px 10px;min-width:140px;font-family:'Helvetica Neue',sans-serif}
.hover-card.dk{background:#0F1923;border-color:#1E2D3D}
/* Tables */
.rules{background:#fff;border:1px solid #E0DDD6;border-radius:6px;overflow:hidden;margin-top:28px}
.rules table{width:100%;border-collapse:collapse}
.rules th{background:#F4F2EC;font-size:8px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;color:#888;padding:8px 12px;text-align:left;border-bottom:1px solid #E0DDD6}
.rules td{font-size:11px;color:#444;padding:8px 12px;border-bottom:1px solid #F0EEE8;vertical-align:top;line-height:1.55}
.rules tr:last-child td{border-bottom:none}
.rules td:first-child{font-size:9px;font-weight:700;color:#012851;white-space:nowrap;width:150px}
.rules td code{font-size:9px;background:#F0EFE9;padding:1px 4px;border-radius:2px;color:#555}
.impl-ref{background:#fff;border:1px solid #E0DDD6;border-radius:6px;overflow:hidden;margin-top:28px}
.impl-ref table{width:100%;border-collapse:collapse}
.impl-ref th{background:#012851;color:#fff;padding:7px 12px;text-align:left;font-size:8px;font-weight:800;letter-spacing:.6px;text-transform:uppercase}
.impl-ref td{padding:7px 12px;border-bottom:1px solid #F0EEE8;vertical-align:top;font-size:11px;color:#444;line-height:1.55}
.impl-ref tr:nth-child(even) td{background:#FAFAF7}
.impl-ref td:first-child{font-size:9px;font-weight:700;color:#012851;white-space:nowrap;width:180px}
.impl-ref td code{font-size:9px;background:#F0EFE9;padding:1px 4px;border-radius:2px;font-family:'Courier New',monospace;color:#333}
.callout{padding:12px 16px;border-radius:4px;font-size:11.5px;line-height:1.6;margin-bottom:16px}
.callout.navy{background:rgba(1,40,81,.06);border-left:3px solid #012851;color:#333}
.callout.orange{background:#FEF3E2;border-left:3px solid #C26A00;color:#333}
.callout.green{background:#EAF5EA;border-left:3px solid #2E6E39;color:#333}
.callout strong{font-weight:700}
hr{border:none;border-top:2px dashed #C8C4BE;margin:60px 0}
</style>
</head>
<body>
<div class="page">
<!-- ══════════════════════════════════════════
MASTHEAD
══════════════════════════════════════════ -->
<div class="mh">
<h1>Kalenderansicht · Spec #386</h1>
<p>Monatliches Kalenderraster auf <code>/documents</code> als Alternative zur Listenansicht. Jeder Tag mit Dokumenten zeigt kompakte Eintragszeilen; Hover öffnet eine Vorschaukarte; Klick navigiert zu <code>/documents/{id}</code>. Aktive Personen- und Tag-Filter bleiben bei der Monatsnavigation erhalten.</p>
<div class="byline">Familienarchiv · 2026-05-03 · Leonie Voss, UX Lead · Issue #386</div>
</div>
<!-- ══════════════════════════════════════════
SECTION 1 — ANATOMY
══════════════════════════════════════════ -->
<div class="sh"><h2>1 · Anatomy</h2><p>Acht benannte Zonen der Kalenderansicht.</p></div>
<div style="background:#fff;border:1.5px solid #E0DDD6;border-radius:6px;padding:24px;margin-bottom:24px">
<div style="display:grid;grid-template-columns:1fr 1fr;gap:24px">
<div>
<div style="background:#F9F8F5;border:1.5px solid #D8D6CF;border-radius:4px;overflow:hidden">
<!-- Nav bar annotation -->
<div style="background:#012851;height:22px;display:flex;align-items:center;padding:0 10px;gap:6px">
<span style="font-size:6px;font-weight:900;color:#fff;border-bottom:1.5px solid #A1DCD8;padding-bottom:1px">Familienarchiv</span>
<span style="font-size:5px;color:rgba(255,255,255,.9);font-weight:700;margin-left:4px">Dokumente</span>
<span style="margin-left:auto;font-size:5px;color:#A1DCD8;font-weight:700">① Ansichts-Toggle</span>
<div style="display:flex;gap:1px;border:1px solid #1E4060;border-radius:2px;overflow:hidden">
<div style="padding:2px 4px;background:#0E2840;opacity:.6"><svg width="7" height="7" viewBox="0 0 16 16" fill="#A1DCD8"><rect x="0" y="0" width="16" height="3"/><rect x="0" y="6" width="16" height="3"/><rect x="0" y="12" width="16" height="3"/></svg></div>
<div style="padding:2px 4px;background:#A1DCD8"><svg width="7" height="7" viewBox="0 0 16 16" fill="#012851"><rect x="1" y="2" width="14" height="13" rx="1" fill="none" stroke="#012851" stroke-width="2"/><line x1="5" y1="0" x2="5" y2="5" stroke="#012851" stroke-width="2"/><line x1="11" y1="0" x2="11" y2="5" stroke="#012851" stroke-width="2"/><line x1="1" y1="7" x2="15" y2="7" stroke="#012851" stroke-width="1.5"/></svg></div>
</div>
</div>
<!-- SearchFilterBar -->
<div style="background:#F5F4EF;border-bottom:1px solid #E0DDD6;padding:5px 8px;display:flex;align-items:center;gap:4px">
<div style="flex:1;height:15px;background:#fff;border:1px solid #D8D6CF;border-radius:2px;padding:0 4px;font-size:5px;color:#999;display:flex;align-items:center">Dokumente durchsuchen …</div>
<div style="font-size:5px;color:#AAA;font-weight:700;white-space:nowrap">② SearchFilterBar (Timeline ausgeblendet)</div>
</div>
<!-- Month nav header -->
<div style="background:#fff;border-bottom:1px solid #E8E6E0;display:flex;align-items:center;justify-content:space-between;padding:5px 8px">
<div style="width:16px;height:16px;border:1.5px solid #D8D6CF;border-radius:2px;background:#F5F4EF;display:flex;align-items:center;justify-content:center;font-size:8px;color:#555"></div>
<div style="text-align:center">
<div style="font-size:7px;font-weight:800;color:#012851">Oktober 1912</div>
<div style="font-size:4px;color:#AAA">③ Monats-Navigation</div>
</div>
<div style="width:16px;height:16px;border:1.5px solid #D8D6CF;border-radius:2px;background:#F5F4EF;display:flex;align-items:center;justify-content:center;font-size:8px;color:#555"></div>
</div>
<!-- DOW header -->
<div style="display:grid;grid-template-columns:repeat(7,1fr);background:#F5F4EF;border-bottom:1px solid #E8E6E0">
<div style="padding:2px 0;text-align:center;font-size:4px;font-weight:800;color:#888;text-transform:uppercase">Mo</div>
<div style="padding:2px 0;text-align:center;font-size:4px;font-weight:800;color:#888;text-transform:uppercase">Di</div>
<div style="padding:2px 0;text-align:center;font-size:4px;font-weight:800;color:#888;text-transform:uppercase">Mi</div>
<div style="padding:2px 0;text-align:center;font-size:4px;font-weight:800;color:#888;text-transform:uppercase">Do</div>
<div style="padding:2px 0;text-align:center;font-size:4px;font-weight:800;color:#888;text-transform:uppercase">Fr</div>
<div style="padding:2px 0;text-align:center;font-size:4px;font-weight:800;color:#888;text-transform:uppercase">Sa</div>
<div style="padding:2px 0;text-align:center;font-size:4px;font-weight:800;color:#888;text-transform:uppercase">So</div>
</div>
<!-- Week rows (2 shown) -->
<div style="display:grid;grid-template-columns:repeat(7,1fr)">
<!-- Sep 30 (prev) -->
<div style="border-right:1px solid #F0EEE8;border-bottom:1px solid #F0EEE8;min-height:38px;padding:2px;background:#FAFAF8">
<div style="text-align:right;font-size:4.5px;font-weight:700;color:#D0CEC8">30</div>
</div>
<!-- Oct 1: with doc -->
<div style="border-right:1px solid #F0EEE8;border-bottom:1px solid #F0EEE8;min-height:38px;padding:2px">
<div style="text-align:right;font-size:4.5px;font-weight:700;color:#444;margin-bottom:1px">1</div>
<div style="font-size:3.5px;color:#012851;padding:1px 2px;background:#EFF8F7;border-left:1.5px solid #A1DCD8;border-radius:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:1px">Brief — Herbsternte</div>
<div style="font-size:3px;color:#AAA;padding:0 2px;font-style:italic">⑤ Dokumentzeile</div>
</div>
<!-- Oct 2 -->
<div style="border-right:1px solid #F0EEE8;border-bottom:1px solid #F0EEE8;min-height:38px;padding:2px"><div style="text-align:right;font-size:4.5px;font-weight:700;color:#444">2</div></div>
<!-- Oct 3 -->
<div style="border-right:1px solid #F0EEE8;border-bottom:1px solid #F0EEE8;min-height:38px;padding:2px"><div style="text-align:right;font-size:4.5px;font-weight:700;color:#444">3</div></div>
<!-- Oct 4 -->
<div style="border-right:1px solid #F0EEE8;border-bottom:1px solid #F0EEE8;min-height:38px;padding:2px"><div style="text-align:right;font-size:4.5px;font-weight:700;color:#444">4</div></div>
<!-- Oct 5: with doc -->
<div style="border-right:1px solid #F0EEE8;border-bottom:1px solid #F0EEE8;min-height:38px;padding:2px">
<div style="text-align:right;font-size:4.5px;font-weight:700;color:#444;margin-bottom:1px">5</div>
<div style="font-size:3.5px;color:#012851;padding:1px 2px;background:#EFF8F7;border-left:1.5px solid #A1DCD8;border-radius:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">Postkarte Hamburg</div>
</div>
<!-- Oct 6 -->
<div style="border-right:none;border-bottom:1px solid #F0EEE8;min-height:38px;padding:2px"><div style="text-align:right;font-size:4.5px;font-weight:700;color:#444">6</div></div>
</div>
<!-- Annotation row -->
<div style="padding:4px 8px;background:#FFF8E6;border-top:1px dashed #E8C060;font-size:5px;color:#888">
④ Tageszelle · ⑥ Überlauf "+N weitere" · ⑦ Hover-Karte (Overlay) · ⑧ Leere Zelle
</div>
</div>
</div>
<div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div style="font-size:11px;color:#444;line-height:1.65"><span style="font-weight:700;color:#012851">① Toggle</span> — Rechts in der SearchFilterBar. List | Kalender. Aktive Ansicht: navy-Hintergrund.</div>
<div style="font-size:11px;color:#444;line-height:1.65"><span style="font-weight:700;color:#012851">② Timeline</span> — Timeline-Widget (#385) wird in Kalender-Mode <em>ausgeblendet</em>. Eine aktive Auswahl wird im State behalten und bei Rückwechsel wiederhergestellt.</div>
<div style="font-size:11px;color:#444;line-height:1.65"><span style="font-weight:700;color:#012851">③ Monats-Nav</span> / für Prev/Next. Klick auf Monatstitel öffnet Year/Month-Picker. Feld zeigt „Monat Jahr" (deutsch).</div>
<div style="font-size:11px;color:#444;line-height:1.65"><span style="font-weight:700;color:#012851">④ Tageszelle</span> — Tagesnummer oben rechts. Unter 4 Dokumente: alle als Zeilen. Ab 4: erste 3 + „+N weitere"-Link.</div>
<div style="font-size:11px;color:#444;line-height:1.65"><span style="font-weight:700;color:#012851">⑤ Dokumentzeile</span> — Einzeilig: Kurzform des Titels. Linker Mint-Balken als Farb-Akzent. Klick → <code>/documents/{id}</code>.</div>
<div style="font-size:11px;color:#444;line-height:1.65"><span style="font-weight:700;color:#012851">⑦ Hover-Karte</span> — Erscheint beim Hovern über eine Dokumentzeile. Zeigt Titel, Datum, Absender → Empfänger, optionalen Thumbnail-Stub. Verschwindet on-mouseout.</div>
</div>
</div>
</div>
</div>
<!-- ══════════════════════════════════════════
SECTION 2 — DESIGN TOKENS
══════════════════════════════════════════ -->
<div class="sh"><h2>2 · Design-Tokens</h2></div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:40px">
<div style="background:#fff;border:1px solid #E0DDD6;border-radius:6px;overflow:hidden">
<div style="background:#F4F2EC;padding:8px 14px;font-size:8px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;color:#888;border-bottom:1px solid #E0DDD6">Light theme</div>
<table style="width:100%;border-collapse:collapse;font-size:11px">
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700;width:190px">cal-surface</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#fff;border:1px solid #DDD;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#FFFFFF — Kalender-Hintergrund</td></tr>
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">cal-header-bg</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#F5F4EF;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#F5F4EF — DOW-Kopfzeile, Monat-Nav</td></tr>
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">cal-line</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#F0EEE8;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#F0EEE8 — Zellrahmen intern</td></tr>
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">cal-outer-line</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#D8D6CF;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#D8D6CF — Widget-Außenrahmen</td></tr>
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">doc-entry-bg</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#EFF8F7;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#EFF8F7 — Dokumentzeile Hintergrund</td></tr>
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">doc-entry-accent</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#A1DCD8;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#A1DCD8 — Linker Balken der Dokumentzeile (brand-mint)</td></tr>
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">doc-entry-text</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#012851;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#012851 — Titel in Dokumentzeile (navy)</td></tr>
<tr style="border-bottom:1px solid #F0EEE8"><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">inactive-day-bg</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#FAFAF8;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#FAFAF8 — Zellen des Vor-/Nachmonats</td></tr>
<tr><td style="padding:6px 14px;color:#888;font-size:9px;font-weight:700">inactive-day-num</td><td style="padding:6px 14px"><span style="display:inline-block;width:12px;height:12px;background:#D0CEC8;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#D0CEC8 — Tagesnummer Vor-/Nachmonat</td></tr>
</table>
</div>
<div style="background:#0F1923;border:1px solid #1E2D3D;border-radius:6px;overflow:hidden">
<div style="background:#0A1218;padding:8px 14px;font-size:8px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;color:#4E6070;border-bottom:1px solid #1E2D3D">Dark theme</div>
<table style="width:100%;border-collapse:collapse;font-size:11px">
<tr style="border-bottom:1px solid #1A2830"><td style="padding:6px 14px;color:#4E6070;font-size:9px;font-weight:700;width:190px">cal-surface</td><td style="padding:6px 14px;color:#8AAABB"><span style="display:inline-block;width:12px;height:12px;background:#0A1218;border:1px solid #1E2D3D;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#0A1218</td></tr>
<tr style="border-bottom:1px solid #1A2830"><td style="padding:6px 14px;color:#4E6070;font-size:9px;font-weight:700">cal-header-bg</td><td style="padding:6px 14px;color:#8AAABB"><span style="display:inline-block;width:12px;height:12px;background:#060C12;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#060C12</td></tr>
<tr style="border-bottom:1px solid #1A2830"><td style="padding:6px 14px;color:#4E6070;font-size:9px;font-weight:700">cal-line</td><td style="padding:6px 14px;color:#8AAABB"><span style="display:inline-block;width:12px;height:12px;background:#1A2830;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#1A2830</td></tr>
<tr style="border-bottom:1px solid #1A2830"><td style="padding:6px 14px;color:#4E6070;font-size:9px;font-weight:700">doc-entry-bg</td><td style="padding:6px 14px;color:#8AAABB"><span style="display:inline-block;width:12px;height:12px;background:#0A2030;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#0A2030</td></tr>
<tr style="border-bottom:1px solid #1A2830"><td style="padding:6px 14px;color:#4E6070;font-size:9px;font-weight:700">doc-entry-accent</td><td style="padding:6px 14px;color:#8AAABB"><span style="display:inline-block;width:12px;height:12px;background:#1E5060;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#1E5060 — gedämpftes Teal</td></tr>
<tr style="border-bottom:1px solid #1A2830"><td style="padding:6px 14px;color:#4E6070;font-size:9px;font-weight:700">doc-entry-text</td><td style="padding:6px 14px;color:#8AAABB"><span style="display:inline-block;width:12px;height:12px;background:#A1DCD8;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#A1DCD8 — Mint statt Navy</td></tr>
<tr><td style="padding:6px 14px;color:#4E6070;font-size:9px;font-weight:700">inactive-day</td><td style="padding:6px 14px;color:#8AAABB"><span style="display:inline-block;width:12px;height:12px;background:#070E14;border-radius:2px;vertical-align:middle;margin-right:6px"></span>#070E14</td></tr>
</table>
</div>
</div>
<!-- ══════════════════════════════════════════
SECTION 3 — FULL CALENDAR MOCKUP (LIGHT)
══════════════════════════════════════════ -->
<div class="sh"><h2>3 · Vollständiger Kalender — Oktober 1912 · Light</h2><p>7 Dokumente verteilt auf den Monat. Zeigt alle Zell-Varianten: leer, 1 Dokument, mehrere Dokumente, und Überlauf.</p></div>
<div class="col">
<div class="lbl"><span class="tag">Desktop · 1440px · ~55% Skalierung</span>Light mode</div>
<div class="chrome" style="width:720px">
<div class="cbar"><div class="dot"></div><div class="dot"></div><div class="dot"></div><div class="url"></div><div style="font-size:5px;color:#AAA;margin-left:4px">familienarchiv.local/documents</div></div>
<div class="nav">
<div class="nav-logo">Familienarchiv</div>
<div class="nav-link" style="margin-left:8px">Dokumente</div>
<div class="nav-link" style="margin-left:4px">Personen</div>
<div class="nav-link" style="margin-left:4px">Chronik</div>
<div class="nav-r"><div class="nav-av">KR</div></div>
</div>
<div class="pb">
<!-- SearchFilterBar with Calendar toggle active -->
<div class="sfb">
<div class="sfb-input"><span>Dokumente durchsuchen …</span></div>
<div class="sfb-btn">Sortierung ▾</div>
<div class="sfb-btn">▾ Filter</div>
<!-- View toggle: calendar active -->
<div class="vtgl">
<div class="vtgl-list off" title="Listenansicht"><svg width="9" height="9" viewBox="0 0 16 16" fill="#888"><rect x="0" y="0" width="16" height="3"/><rect x="0" y="6" width="16" height="3"/><rect x="0" y="12" width="16" height="3"/></svg></div>
<div class="vtgl-cal on" title="Kalenderansicht (aktiv)"><svg width="9" height="9" viewBox="0 0 16 16" fill="#A1DCD8"><rect x="1" y="2" width="14" height="13" rx="1" fill="none" stroke="#A1DCD8" stroke-width="2"/><line x1="5" y1="0" x2="5" y2="5" stroke="#A1DCD8" stroke-width="2"/><line x1="11" y1="0" x2="11" y2="5" stroke="#A1DCD8" stroke-width="2"/><line x1="1" y1="7" x2="15" y2="7" stroke="#A1DCD8" stroke-width="1.5"/></svg></div>
</div>
</div>
<!-- Month nav header -->
<div class="cal-nav">
<div class="cal-nav-btn"></div>
<div style="text-align:center">
<div class="cal-nav-title" title="Klicken für Year/Month-Picker">Oktober 1912</div>
<div class="cal-nav-sub">7 Dokumente in diesem Monat</div>
</div>
<div class="cal-nav-btn"></div>
</div>
<!-- DOW header -->
<div class="cal-grid">
<div class="cal-dow">
<div class="cal-dow-cell">Mo</div>
<div class="cal-dow-cell">Di</div>
<div class="cal-dow-cell">Mi</div>
<div class="cal-dow-cell">Do</div>
<div class="cal-dow-cell">Fr</div>
<div class="cal-dow-cell">Sa</div>
<div class="cal-dow-cell">So</div>
</div>
<!-- WEEK 1: Mo 30 Sep (prev) → So 6 Okt -->
<div class="cal-week">
<!-- Sep 30 — prev month -->
<div class="cal-cell prev-month"><div class="cal-day-num" style="color:#D0CEC8">30</div></div>
<!-- Oct 1 — 1 doc: Brief über Herbsternte -->
<div class="cal-cell" style="position:relative">
<div class="cal-day-num">1</div>
<a class="doc-entry" title="Brief über die Herbsternte · Karl Raddatz → Elfriede Raddatz">Brief — Herbsternte</a>
</div>
<!-- Oct 2 — leer -->
<div class="cal-cell"><div class="cal-day-num">2</div></div>
<!-- Oct 3 — leer -->
<div class="cal-cell"><div class="cal-day-num">3</div></div>
<!-- Oct 4 — leer -->
<div class="cal-cell"><div class="cal-day-num">4</div></div>
<!-- Oct 5 — 1 doc: Postkarte Hamburg -->
<div class="cal-cell">
<div class="cal-day-num">5</div>
<a class="doc-entry">Postkarte aus Hamburg</a>
</div>
<!-- Oct 6 — leer -->
<div class="cal-cell"><div class="cal-day-num">6</div></div>
</div>
<!-- WEEK 2: 713 Okt -->
<div class="cal-week">
<!-- Oct 7 — leer -->
<div class="cal-cell"><div class="cal-day-num">7</div></div>
<!-- Oct 8 — 2 docs -->
<div class="cal-cell">
<div class="cal-day-num">8</div>
<a class="doc-entry">Nachrichten v. Gut</a>
<a class="doc-entry">Grüße aus Posen</a>
</div>
<!-- Oct 9 — leer -->
<div class="cal-cell"><div class="cal-day-num">9</div></div>
<!-- Oct 10 — leer -->
<div class="cal-cell"><div class="cal-day-num">10</div></div>
<!-- Oct 11 — leer -->
<div class="cal-cell"><div class="cal-day-num">11</div></div>
<!-- Oct 12 — 1 doc: Erbschaftssachen -->
<div class="cal-cell">
<div class="cal-day-num">12</div>
<a class="doc-entry">Brief — Erbschaftssachen</a>
</div>
<!-- Oct 13 — leer -->
<div class="cal-cell"><div class="cal-day-num">13</div></div>
</div>
<!-- WEEK 3: 1420 Okt -->
<div class="cal-week">
<!-- Oct 14 — leer -->
<div class="cal-cell"><div class="cal-day-num">14</div></div>
<!-- Oct 15 — 1 doc: Antwort auf Elfriedes Brief -->
<div class="cal-cell">
<div class="cal-day-num">15</div>
<a class="doc-entry">Antwort a. Elfriedes Brief</a>
</div>
<!-- Oct 16 — leer -->
<div class="cal-cell"><div class="cal-day-num">16</div></div>
<!-- Oct 17 — leer -->
<div class="cal-cell"><div class="cal-day-num">17</div></div>
<!-- Oct 18 — leer -->
<div class="cal-cell"><div class="cal-day-num">18</div></div>
<!-- Oct 19 — 1 doc: Reisebericht Berlin + HOVER CARD demo -->
<div class="cal-cell" style="position:relative">
<div class="cal-day-num">19</div>
<a class="doc-entry" style="background:#D4EDE9">Reisebericht aus Berlin</a>
<!-- HOVER CARD appears here -->
<div class="hover-card" style="top:0;right:calc(100% + 4px);width:140px">
<div style="font-size:6px;font-weight:800;color:#012851;margin-bottom:3px;line-height:1.3">Reisebericht aus Berlin</div>
<div style="font-size:5px;color:#AAA;margin-bottom:4px">19. Oktober 1912</div>
<div style="display:flex;align-items:flex-start;gap:3px;margin-bottom:4px">
<div style="width:24px;height:32px;background:#E8E6DF;border-radius:1px;flex-shrink:0"></div>
<div>
<div style="font-size:5px;color:#888;margin-bottom:1px"><span style="font-weight:700;text-transform:uppercase;letter-spacing:.3px">Von</span> Hans Raddatz</div>
<div style="font-size:5px;color:#888"><span style="font-weight:700;text-transform:uppercase;letter-spacing:.3px">An</span> Elfriede Raddatz</div>
</div>
</div>
<div style="font-size:5px;color:#012851;font-weight:700;text-transform:uppercase;letter-spacing:.4px;padding-top:3px;border-top:1px solid #E8E6E0">Zum Dokument →</div>
</div>
</div>
<!-- Oct 20 — leer -->
<div class="cal-cell"><div class="cal-day-num">20</div></div>
</div>
<!-- WEEK 4: 2127 Okt -->
<div class="cal-week">
<!-- Oct 21 — leer -->
<div class="cal-cell"><div class="cal-day-num">21</div></div>
<!-- Oct 22 — leer -->
<div class="cal-cell"><div class="cal-day-num">22</div></div>
<!-- Oct 23 — 1 doc: Weihnachtspläne -->
<div class="cal-cell">
<div class="cal-day-num">23</div>
<a class="doc-entry">Weihnachtspläne 1912</a>
</div>
<!-- Oct 24 — leer -->
<div class="cal-cell"><div class="cal-day-num">24</div></div>
<!-- Oct 25 — leer -->
<div class="cal-cell"><div class="cal-day-num">25</div></div>
<!-- Oct 26 — leer -->
<div class="cal-cell"><div class="cal-day-num">26</div></div>
<!-- Oct 27 — leer -->
<div class="cal-cell"><div class="cal-day-num">27</div></div>
</div>
<!-- WEEK 5: 28 Okt 3 Nov -->
<div class="cal-week" style="border-bottom:none">
<!-- Oct 28 — 1 doc: Namenstag -->
<div class="cal-cell" style="border-bottom:none">
<div class="cal-day-num">28</div>
<a class="doc-entry">Grüße z. Namenstag</a>
</div>
<!-- Oct 29 -->
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">29</div></div>
<!-- Oct 30 -->
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">30</div></div>
<!-- Oct 31 -->
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">31</div></div>
<!-- Nov 1 — next month -->
<div class="cal-cell next-month" style="border-bottom:none;background:#FAFAF8"><div class="cal-day-num" style="color:#D0CEC8">1</div></div>
<!-- Nov 2 -->
<div class="cal-cell next-month" style="border-bottom:none;background:#FAFAF8"><div class="cal-day-num" style="color:#D0CEC8">2</div></div>
<!-- Nov 3 -->
<div class="cal-cell next-month" style="border-bottom:none;background:#FAFAF8;border-right:none"><div class="cal-day-num" style="color:#D0CEC8">3</div></div>
</div>
</div><!-- /cal-grid -->
</div>
</div>
</div>
<!-- ══════════════════════════════════════════
SECTION 4 — DAY CELL VARIANTS
══════════════════════════════════════════ -->
<div class="sh"><h2>4 · Tageszellen-Varianten</h2><p>Alle möglichen Zustände einer Tageszelle im Detail.</p></div>
<div class="grid">
<!-- Empty -->
<div class="col">
<div class="lbl"><span class="tag">Variant A</span>Leere Zelle</div>
<div style="background:#fff;border:1.5px solid #D8D6CF;border-radius:3px;min-height:70px;padding:5px;width:100px">
<div style="text-align:right;font-size:7px;font-weight:700;color:#444">14</div>
</div>
<div class="cap">Nur Tagesnummer. Kein Cursor-Pointer. Kein Hover-Effekt.</div>
</div>
<!-- 1 doc -->
<div class="col">
<div class="lbl"><span class="tag">Variant B</span>1 Dokument</div>
<div style="background:#fff;border:1.5px solid #D8D6CF;border-radius:3px;min-height:70px;padding:5px;width:160px">
<div style="text-align:right;font-size:7px;font-weight:700;color:#444;margin-bottom:3px">1</div>
<div style="font-size:7px;color:#012851;padding:2px 4px;background:#EFF8F7;border-left:2.5px solid #A1DCD8;border-radius:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer">Brief über die Herbsternte</div>
</div>
<div class="cap">Titel wird auf eine Zeile begrenzt. Klick → <code>/documents/{id}</code>.</div>
</div>
<!-- 3 docs -->
<div class="col">
<div class="lbl"><span class="tag">Variant C</span>3 Dokumente</div>
<div style="background:#fff;border:1.5px solid #D8D6CF;border-radius:3px;min-height:70px;padding:5px;width:160px">
<div style="text-align:right;font-size:7px;font-weight:700;color:#444;margin-bottom:3px">8</div>
<div style="font-size:7px;color:#012851;padding:2px 4px;background:#EFF8F7;border-left:2.5px solid #A1DCD8;border-radius:1px;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer">Nachrichten v. Gut</div>
<div style="font-size:7px;color:#012851;padding:2px 4px;background:#EFF8F7;border-left:2.5px solid #A1DCD8;border-radius:1px;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer">Grüße aus Posen</div>
<div style="font-size:7px;color:#012851;padding:2px 4px;background:#EFF8F7;border-left:2.5px solid #A1DCD8;border-radius:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer">Brief a. Elfriede</div>
</div>
<div class="cap">Bis zu 3 Einträge vollständig sichtbar.</div>
</div>
<!-- Overflow: 5 docs -->
<div class="col">
<div class="lbl"><span class="tag">Variant D</span>5 Dokumente — Überlauf</div>
<div style="background:#fff;border:1.5px solid #D8D6CF;border-radius:3px;min-height:70px;padding:5px;width:160px">
<div style="text-align:right;font-size:7px;font-weight:700;color:#444;margin-bottom:3px">15</div>
<div style="font-size:7px;color:#012851;padding:2px 4px;background:#EFF8F7;border-left:2.5px solid #A1DCD8;border-radius:1px;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer">Antwort a. Elfriedes Brief</div>
<div style="font-size:7px;color:#012851;padding:2px 4px;background:#EFF8F7;border-left:2.5px solid #A1DCD8;border-radius:1px;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer">Feldpost Nr. 12</div>
<div style="font-size:7px;color:#012851;padding:2px 4px;background:#EFF8F7;border-left:2.5px solid #A1DCD8;border-radius:1px;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer">Kurzbrief Sonntag</div>
<div style="font-size:6.5px;color:#888;font-style:italic;padding:2px 4px;cursor:pointer;text-decoration:underline">+2 weitere</div>
</div>
<div class="cap">Ab 4 Docs: erste 3 anzeigen, Rest als „+N weitere". Klick auf Link → Tages-Ansicht oder Modal (OQ-4, Entscheidung: Modal).</div>
</div>
<!-- Prev/next month cell -->
<div class="col">
<div class="lbl"><span class="tag">Variant E</span>Vor-/Nachmonat</div>
<div style="background:#FAFAF8;border:1.5px solid #D8D6CF;border-radius:3px;min-height:70px;padding:5px;width:100px">
<div style="text-align:right;font-size:7px;font-weight:700;color:#D0CEC8">30</div>
</div>
<div class="cap">Gedimmte Tagesnummer. Kein Dokument-Eintrag (Dokumente des Vormonats erscheinen nicht im aktuellen Raster). Kein klickbarer Inhalt.</div>
</div>
</div>
<!-- ══════════════════════════════════════════
SECTION 5 — DARK MODE
══════════════════════════════════════════ -->
<div class="sh"><h2>5 · Dark Mode — Kalender Oktober 1912</h2></div>
<div class="col">
<div class="lbl"><span class="tag">Dark</span>Kalender · aktiver Monat</div>
<div class="chrome dk" style="width:560px">
<div class="cbar"><div class="dot"></div><div class="dot"></div><div class="dot"></div><div class="url"></div></div>
<div class="nav" style="background:#060C12"><div class="nav-logo">Familienarchiv</div><div class="nav-link on" style="margin-left:8px">Dokumente</div><div class="nav-r"><div class="nav-av">KR</div></div></div>
<div class="pb dk">
<!-- SearchFilterBar dark -->
<div class="sfb dk">
<div class="sfb-input dk">Dokumente durchsuchen …</div>
<div class="sfb-btn dk">▾ Filter</div>
<div class="vtgl dk">
<div style="padding:3px 5px;background:#0A1218"><svg width="9" height="9" viewBox="0 0 16 16" fill="#4E6070"><rect x="0" y="0" width="16" height="3"/><rect x="0" y="6" width="16" height="3"/><rect x="0" y="12" width="16" height="3"/></svg></div>
<div style="padding:3px 5px;background:#A1DCD8"><svg width="9" height="9" viewBox="0 0 16 16" fill="#012851"><rect x="1" y="2" width="14" height="13" rx="1" fill="none" stroke="#012851" stroke-width="2"/><line x1="5" y1="0" x2="5" y2="5" stroke="#012851" stroke-width="2"/><line x1="11" y1="0" x2="11" y2="5" stroke="#012851" stroke-width="2"/><line x1="1" y1="7" x2="15" y2="7" stroke="#012851" stroke-width="1.5"/></svg></div>
</div>
</div>
<!-- Month nav dark -->
<div class="cal-nav dk">
<div class="cal-nav-btn dk"></div>
<div style="text-align:center">
<div class="cal-nav-title dk">Oktober 1912</div>
<div class="cal-nav-sub dk">7 Dokumente in diesem Monat</div>
</div>
<div class="cal-nav-btn dk"></div>
</div>
<!-- Calendar grid dark -->
<div class="cal-grid dk">
<div class="cal-dow dk">
<div class="cal-dow-cell dk">Mo</div><div class="cal-dow-cell dk">Di</div><div class="cal-dow-cell dk">Mi</div><div class="cal-dow-cell dk">Do</div><div class="cal-dow-cell dk">Fr</div><div class="cal-dow-cell dk">Sa</div><div class="cal-dow-cell dk">So</div>
</div>
<div class="cal-week">
<div class="cal-cell dk prev-month" style="background:#070E14"><div class="cal-day-num dk" style="color:#1E2D3D">30</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">1</div><a class="doc-entry dk">Brief — Herbsternte</a></div>
<div class="cal-cell dk"><div class="cal-day-num dk">2</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">3</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">4</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">5</div><a class="doc-entry dk">Postkarte Hamburg</a></div>
<div class="cal-cell dk"><div class="cal-day-num dk">6</div></div>
</div>
<div class="cal-week">
<div class="cal-cell dk"><div class="cal-day-num dk">7</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">8</div><a class="doc-entry dk">Nachrichten v. Gut</a><a class="doc-entry dk">Grüße aus Posen</a></div>
<div class="cal-cell dk"><div class="cal-day-num dk">9</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">10</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">11</div></div>
<div class="cal-cell dk"><div class="cal-day-num dk">12</div><a class="doc-entry dk">Brief — Erbschaft</a></div>
<div class="cal-cell dk"><div class="cal-day-num dk">13</div></div>
</div>
<div class="cal-week" style="border-bottom:none">
<div class="cal-cell dk" style="border-bottom:none"><div class="cal-day-num dk">14</div></div>
<div class="cal-cell dk" style="border-bottom:none"><div class="cal-day-num dk">15</div><a class="doc-entry dk">Antwort a. Elfriede</a></div>
<div class="cal-cell dk" style="border-bottom:none"><div class="cal-day-num dk">16</div></div>
<div class="cal-cell dk" style="border-bottom:none"><div class="cal-day-num dk">17</div></div>
<div class="cal-cell dk" style="border-bottom:none"><div class="cal-day-num dk">18</div></div>
<div class="cal-cell dk" style="border-bottom:none"><div class="cal-day-num dk">19</div><a class="doc-entry dk">Reisebericht Berlin</a></div>
<div class="cal-cell dk" style="border-bottom:none"><div class="cal-day-num dk">20</div></div>
</div>
</div>
</div>
</div>
<div class="cap">Dark mode: Dokumentzeilen Mint-Text auf sehr dunklem Hintergrund. Balken-Akzent gedämpftes Teal. Monatstitel Mint.</div>
</div>
<!-- ══════════════════════════════════════════
SECTION 6 — FILTER INTEGRATION
══════════════════════════════════════════ -->
<div class="sh"><h2>6 · Filter-Integration</h2><p>Aktive Personen- und Tag-Filter aus der SearchFilterBar bleiben bei Kalender-Navigation erhalten.</p></div>
<div class="grid">
<div class="col">
<div class="lbl"><span class="tag">Filter aktiv</span>Nur Briefe von Karl Raddatz</div>
<div class="chrome" style="width:440px">
<div class="cbar"><div class="dot"></div><div class="dot"></div><div class="dot"></div><div class="url"></div></div>
<div class="nav"><div class="nav-logo">Familienarchiv</div><div class="nav-r"><div class="nav-av">KR</div></div></div>
<div class="pb">
<div class="sfb">
<div class="sfb-input"><span>Dokumente durchsuchen …</span></div>
<!-- Active filter chip: person -->
<div style="display:flex;align-items:center;gap:2px;background:#F0EFE9;border:1.5px solid #A1DCD8;border-radius:10px;padding:2px 6px 2px 3px">
<div style="width:12px;height:12px;border-radius:50%;background:#012851;display:flex;align-items:center;justify-content:center;font-size:4px;font-weight:800;color:#A1DCD8">KR</div>
<span style="font-size:5px;font-weight:600;color:#333">Karl Raddatz</span>
<span style="font-size:7px;color:#999;margin-left:1px;cursor:pointer">×</span>
</div>
<div class="vtgl">
<div style="padding:3px 5px;background:#F5F4EF"><svg width="9" height="9" viewBox="0 0 16 16" fill="#888"><rect x="0" y="0" width="16" height="3"/><rect x="0" y="6" width="16" height="3"/><rect x="0" y="12" width="16" height="3"/></svg></div>
<div style="padding:3px 5px;background:#012851"><svg width="9" height="9" viewBox="0 0 16 16" fill="#A1DCD8"><rect x="1" y="2" width="14" height="13" rx="1" fill="none" stroke="#A1DCD8" stroke-width="2"/><line x1="5" y1="0" x2="5" y2="5" stroke="#A1DCD8" stroke-width="2"/><line x1="11" y1="0" x2="11" y2="5" stroke="#A1DCD8" stroke-width="2"/><line x1="1" y1="7" x2="15" y2="7" stroke="#A1DCD8" stroke-width="1.5"/></svg></div>
</div>
</div>
<div class="cal-nav">
<div class="cal-nav-btn"></div>
<div style="text-align:center">
<div class="cal-nav-title">Oktober 1912</div>
<div class="cal-nav-sub" style="color:#C26A00;font-weight:700">3 von 7 Dokumente sichtbar (Filter aktiv)</div>
</div>
<div class="cal-nav-btn"></div>
</div>
<div class="cal-grid">
<div class="cal-dow">
<div class="cal-dow-cell">Mo</div><div class="cal-dow-cell">Di</div><div class="cal-dow-cell">Mi</div><div class="cal-dow-cell">Do</div><div class="cal-dow-cell">Fr</div><div class="cal-dow-cell">Sa</div><div class="cal-dow-cell">So</div>
</div>
<div class="cal-week">
<div class="cal-cell prev-month"><div class="cal-day-num" style="color:#D0CEC8">30</div></div>
<!-- Oct 1: Karl's brief shown -->
<div class="cal-cell"><div class="cal-day-num">1</div><a class="doc-entry">Brief — Herbsternte</a></div>
<div class="cal-cell"><div class="cal-day-num">2</div></div>
<div class="cal-cell"><div class="cal-day-num">3</div></div>
<div class="cal-cell"><div class="cal-day-num">4</div></div>
<!-- Oct 5: Postkarte Hamburg — sent by Hans, NOT shown -->
<div class="cal-cell"><div class="cal-day-num">5</div></div>
<div class="cal-cell"><div class="cal-day-num">6</div></div>
</div>
<div class="cal-week">
<div class="cal-cell"><div class="cal-day-num">7</div></div>
<!-- Oct 8: Nachrichten v. Gut — Karl's; Grüße aus Posen — not Karl's -->
<div class="cal-cell"><div class="cal-day-num">8</div><a class="doc-entry">Nachrichten v. Gut</a></div>
<div class="cal-cell"><div class="cal-day-num">9</div></div>
<div class="cal-cell"><div class="cal-day-num">10</div></div>
<div class="cal-cell"><div class="cal-day-num">11</div></div>
<!-- Oct 12: Elfriede schreibt — not Karl's -->
<div class="cal-cell"><div class="cal-day-num">12</div></div>
<div class="cal-cell"><div class="cal-day-num">13</div></div>
</div>
<div class="cal-week" style="border-bottom:none">
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">14</div></div>
<!-- Oct 15: Karl's reply shown -->
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">15</div><a class="doc-entry">Antwort a. Elfriedes Brief</a></div>
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">16</div></div>
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">17</div></div>
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">18</div></div>
<!-- Oct 19: Hans's Reisebericht — not Karl's -->
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">19</div></div>
<div class="cal-cell" style="border-bottom:none"><div class="cal-day-num">20</div></div>
</div>
</div>
</div>
</div>
<div class="cap">Person-Filter „Karl Raddatz" ist aktiv. Monat-Nav zeigt „3 von 7 Dokumente sichtbar (Filter aktiv)". Tage ohne Karl-Dokumente sind leer, auch wenn der Originalmonat dort Briefe anderer Personen hat.</div>
</div>
</div>
<!-- ══════════════════════════════════════════
SECTION 7 — BEHAVIOUR RULES
══════════════════════════════════════════ -->
<div class="sh"><h2>7 · Verhaltensregeln</h2></div>
<div class="rules">
<table>
<tr><th>Szenario</th><th>Verhalten</th></tr>
<tr><td>Ansichts-Toggle</td><td>Klick auf Kalender-Icon → URL wechselt zu <code>?view=calendar</code>. Listenansicht und Timeline werden per <code>display:none</code> ausgeblendet. State (Filter, Auswahl) bleibt erhalten.</td></tr>
<tr><td>Startmonat (OQ-3)</td><td><strong>Entscheidung: Monat des aktuellsten Dokuments.</strong> Wenn Timeline-Filter aktiv ist, zeigt Kalender den ersten Monat des Filterbereichs. Ohne Filter: Monat des neuesten Dokuments im Archiv.</td></tr>
<tr><td>Monats-Navigation Prev/Next</td><td>Button / lädt Dokumente des Nachbarmonats via <code>GET /api/documents?year=1912&amp;month=11</code>. Vorherige und nachfolgende Monate werden prefetched (SvelteKit prefetch).</td></tr>
<tr><td>Year/Month-Picker</td><td>Klick auf Monatstitel öffnet ein kompaktes Dropdown mit Jahres-Liste (scrollen) und Monatsgitter (12 Felder). Bestätigung mit Enter oder Klick auf Monat.</td></tr>
<tr><td>Dokumentzeilen-Hover</td><td>Hover-Karte erscheint nach 400 ms Verzögerung neben der Zelle (kein sofortiges Aufpoppen). Karte verschwindet wenn Maus die Zelle verlässt. Kein Hover auf Touch-Geräten.</td></tr>
<tr><td>Klick auf Dokumentzeile</td><td>Navigation zu <code>/documents/{id}</code>.</td></tr>
<tr><td>Überlauf-Link „+N weitere" (OQ-4)</td><td><strong>Entscheidung: Modal</strong> mit vollständiger Liste der Dokumente des Tages. Kein In-Cell-Scroll. Modal zeigt Datum als Titel + alle Dokumente als DocumentRow.</td></tr>
<tr><td>Kein documentDate</td><td>Dokument erscheint nicht im Kalender. Timeline-Widget und Listenansicht zeigen es weiterhin.</td></tr>
<tr><td>Monat ohne Dokumente</td><td>Leeres Raster (alle Zellen ohne Einträge). Monat-Nav zeigt „0 Dokumente in diesem Monat".</td></tr>
<tr><td>Aktive Filter + Kalender</td><td>AND-Semantik. Nur Dokumente, die alle aktiven Filter (Person, Tag, Zeitachse) erfüllen, erscheinen im Kalender.</td></tr>
<tr><td>Mobile (&lt;640 px)</td><td>Kalenderansicht wechselt zu Wochen-View (1 Woche sichtbar, horizontal scrollbar). Toggle zwischen List/Kalender bleibt verfügbar.</td></tr>
<tr><td>Keyboard-Navigation</td><td>Tab auf Monatsnavigation: / per Enter/Space. Pfeiltasten bewegen Fokus von Zelle zu Zelle. Enter auf Dokumentzeile: Navigation zu Dokument.</td></tr>
<tr><td>ARIA</td><td><code>role="grid"</code> auf Kalender-Container. <code>role="gridcell"</code> auf jede Tageszelle. <code>aria-label="15. Oktober 1912, 3 Dokumente"</code> auf belegte Zellen. <code>aria-label="Vorheriger Monat"</code> auf -Button.</td></tr>
</table>
</div>
<!-- ══════════════════════════════════════════
SECTION 8 — OPEN QUESTIONS ANSWERED
══════════════════════════════════════════ -->
<div class="sh"><h2>8 · Offene Fragen — Entscheidungen</h2></div>
<div class="callout navy"><strong>OQ-3: Welcher Monat wird zuerst angezeigt?</strong> Monat des aktuellsten Dokuments (nach <code>documentDate</code>). Begründung: Neue Uploads werden zuerst erschlossen. Wenn ein Zeitachsen-Filter aktiv ist, zeigt der Kalender den ersten Monat des Filterbereichs.</div>
<div class="callout navy"><strong>OQ-4: Zell-Überlauf bei 4+ Dokumenten.</strong> Erste 3 sichtbar + „+N weitere"-Link → öffnet Modal. Kein In-Cell-Scroll (schlechte Touch-Zugänglichkeit). Das Modal zeigt den Tagestitel als Heading + eine vollständige DocumentRow-Liste.</div>
<div class="callout green"><strong>Backend-Anforderung.</strong> Neuer Endpoint <code>GET /api/documents?year=1912&amp;month=10</code> ohne Paginierung — gibt alle Dokumente des Monats zurück (max. ~100, keine Offset-Pages). Alternativ: bestehender Endpoint mit <code>dateFrom=1912-10-01&amp;dateTo=1912-10-31</code>. Der View-Toggle-State wird als URL-Parameter <code>?view=calendar</code> gespeichert und von SvelteKit per <code>url.searchParams</code> gelesen.</div>
<!-- ══════════════════════════════════════════
SECTION 9 — IMPL-REF TABLE
══════════════════════════════════════════ -->
<div class="sh"><h2>9 · Implementation Reference</h2></div>
<div class="impl-ref">
<table>
<tr><th>Element</th><th>Tailwind-Klassen</th><th>Pixelwert</th><th>Anmerkung</th></tr>
<tr><td>Ansichts-Toggle Container</td><td><code>flex border border-line rounded-sm overflow-hidden</code></td><td></td><td>Sitzt ganz rechts in der SearchFilterBar-Zeile</td></tr>
<tr><td>Toggle-Button (inaktiv)</td><td><code>p-1.5 bg-muted flex items-center justify-center</code></td><td>6px padding</td><td>Icon: 16px × 16px SVG</td></tr>
<tr><td>Toggle-Button (aktiv)</td><td><code>p-1.5 bg-primary flex items-center justify-center</code></td><td>6px padding</td><td>Icon fill: <code>#A1DCD8</code></td></tr>
<tr><td>Monat-Nav Container</td><td><code>bg-surface border border-line rounded-t-sm flex items-center justify-between px-4 py-2.5</code></td><td>padding 16px / 10px</td><td>Oberer Radius; Kalender-Grid hat unteren Radius</td></tr>
<tr><td>Prev/Next Button</td><td><code>w-8 h-8 flex items-center justify-center border border-line rounded-sm bg-muted text-ink-2 hover:bg-line transition-colors</code></td><td>32px / 32px</td><td>Touch target ≥ 44px durch unsichtbares Padding auf Wrapper</td></tr>
<tr><td>Monatstitel</td><td><code>text-sm font-bold text-primary cursor-pointer hover:underline</code></td><td>14px / 700</td><td>Klick → Year/Month-Picker Dropdown</td></tr>
<tr><td>Monat-Subtext</td><td><code>text-[10px] text-ink-3 text-center mt-0.5</code></td><td>10px</td><td>Orange + fett wenn Filter aktiv: <code>text-orange-600 font-bold</code></td></tr>
<tr><td>DOW-Kopfzeile</td><td><code>grid grid-cols-7 bg-muted border-b border-line</code></td><td></td><td></td></tr>
<tr><td>DOW-Zelle</td><td><code>py-1.5 text-center text-[9px] font-bold uppercase tracking-widest text-ink-3</code></td><td>9px / 700</td><td>Kein Klick-Handler</td></tr>
<tr><td>Kalender-Grid</td><td><code>bg-surface border border-line border-t-0 rounded-b-sm</code> + <code>role="grid"</code></td><td></td><td>Border-top entfernt wegen Monat-Nav-Header</td></tr>
<tr><td>Wochen-Reihe</td><td><code>grid grid-cols-7</code></td><td></td><td></td></tr>
<tr><td>Tageszelle (aktiver Monat)</td><td><code>border-r border-b border-line min-h-[80px] p-1.5 relative</code></td><td>min 80px hoch</td><td><code>role="gridcell"</code> + <code>aria-label</code></td></tr>
<tr><td>Tageszelle (Vor/Nachmonat)</td><td><code>border-r border-b border-line min-h-[80px] p-1.5 bg-muted/40</code></td><td></td><td>Kein Dokument-Inhalt</td></tr>
<tr><td>Tagesnummer (aktiv)</td><td><code>text-right text-[11px] font-bold text-ink mb-1 leading-none</code></td><td>11px / 700</td><td></td></tr>
<tr><td>Tagesnummer (inaktiv)</td><td><code>text-right text-[11px] font-bold text-ink-3/40 mb-1 leading-none</code></td><td>11px</td><td>Stark gedimmt</td></tr>
<tr><td>Dokumentzeile</td><td><code>block text-[10px] text-primary truncate px-1.5 py-0.5 bg-[#EFF8F7] border-l-2 border-mint rounded-[2px] mb-0.5 cursor-pointer hover:bg-mint/20 transition-colors</code></td><td>10px</td><td><code>role="link"</code> + <code>aria-label</code> mit Volltitel</td></tr>
<tr><td>Überlauf-Link</td><td><code>text-[9px] text-ink-3 italic px-1.5 py-0.5 hover:underline cursor-pointer</code></td><td>9px</td><td>Öffnet Modal via <code>onclick</code></td></tr>
<tr><td>Hover-Karte</td><td><code>absolute z-50 bg-surface border border-line rounded-sm shadow-lg p-3 min-w-[180px] pointer-events-none</code></td><td></td><td>Positioniert per JS (verhindert Viewport-Overflow). <code>pointer-events-none</code> damit sie Hover nicht blockiert.</td></tr>
<tr><td>Hover-Karte Titel</td><td><code>text-[11px] font-bold text-ink mb-1 leading-snug</code></td><td>11px / 700</td><td>Mehrzeilig erlaubt</td></tr>
<tr><td>Hover-Karte Datum</td><td><code>text-[9px] text-ink-3 mb-2</code></td><td>9px</td><td>Format: „19. Oktober 1912"</td></tr>
<tr><td>Hover-Karte Von/An</td><td><code>text-[9px] text-ink-2</code> mit <code>font-bold uppercase tracking-wide</code> auf Label</td><td>9px</td><td></td></tr>
<tr><td>Komponenten-Namen</td><td><code>CalendarView.svelte</code>, <code>CalendarMonthGrid.svelte</code>, <code>CalendarDayCell.svelte</code>, <code>CalendarDocEntry.svelte</code>, <code>CalendarHoverCard.svelte</code>, <code>MonthPicker.svelte</code></td><td></td><td>Alle unter <code>src/lib/components/calendar/</code></td></tr>
<tr><td>Benötigter URL-Parameter</td><td><code>?view=calendar&amp;year=1912&amp;month=10</code></td><td></td><td>SvelteKit <code>url.searchParams</code> in <code>+page.server.ts</code></td></tr>
</table>
</div>
</div><!-- /page -->
</body>
</html>