// STYLE 3: CASE WALL — 刑侦板 · 照片 + 图钉 + 红线 + 便签 // 像一面满满的案件墙,随意但克制 const casewallStyles = { page: { // textured corkboard-like dark surface, no emoji background: "#1a1410", backgroundImage: ` radial-gradient(circle at 10% 20%, rgba(88,60,35,0.3) 0, transparent 40%), radial-gradient(circle at 85% 60%, rgba(60,40,22,0.35) 0, transparent 45%), radial-gradient(circle at 40% 85%, rgba(40,25,15,0.4) 0, transparent 50%) `, color: "#e8e2d0", minHeight: "100vh", fontFamily: "'EB Garamond','Noto Serif SC',serif", position: "relative", overflow: "hidden", }, }; const Pushpin = ({ color = "#8b0000", x = 0, y = 0 }) => (
); const CaseWallHeader = () => (
{SITE.since} · VOL. XII

暗黑收集站

— AI DARK FILE —
{SITE.tagline_zh}
案卷 {SITE.total_files} | 未结 {SITE.total_unsolved} | 活跃 9
); const CaseWallNav = ({ active, onChange }) => ( ); // "Polaroid" photo card const PolaroidCard = ({ item, rot, pin, width = 280 }) => (
№ {item.id}{item.date.split(" ")[0]}
{item.title}
); // Sticky note const StickyNote = ({ item, rot, pin, color = "#d4c9a8", width = 260 }) => (
▸ {item.cat_en} № {item.id}
{item.title}
{item.excerpt.slice(0, 58)}…
{item.date}
); // Index card const IndexCard = ({ item, rot, pin, width = 340 }) => (
{/* red header line */}
▸ {item.cat_en} / {item.cat} {item.id}

{item.title}

{item.title_en}
{item.excerpt.slice(0, 95)}…
DATE{item.date} LOC{item.loc} STAT● {item.status}
); // Connecting red thread (decorative SVG) const RedThreads = () => ( {/* Several thread lines between random points */} {[ ["M 220 240 Q 420 200 680 340"], ["M 680 340 Q 900 480 1180 260"], ["M 220 240 Q 400 520 640 700"], ["M 1180 260 Q 1080 520 820 700"], ["M 640 700 Q 800 780 1000 720"], ].map((d, i) => ( ))} ); const CaseWallView = () => { const [active, setActive] = React.useState("all"); const filtered = active === "all" ? CASES : CASES.filter(c => c.cat === active); // layout: absolute-positioned wall with some jitter const positions = [ // [leftPct, topPx, rot, kind, pinColor] [4, 30, -2.4, "polaroid", "#8b0000"], [25, 10, 1.8, "index", "#c49a3a"], [52, 50, -1.2, "polaroid", "#a81515"], [74, 0, 2.6, "sticky", "#8b0000"], [90, 70, -3.1, "sticky", "#c49a3a"], [6, 420, 2.2, "sticky", "#a81515"], [22, 400, -1.5, "polaroid", "#8b0000"], [47, 440, 1.6, "index", "#a81515"], [70, 420, -2.8, "polaroid", "#c49a3a"], [3, 770, -1.8, "index", "#8b0000"], [30, 800, 2.4, "sticky", "#a81515"], [55, 820, -1.5, "polaroid", "#c49a3a"], [78, 780, 2.0, "index", "#8b0000"], ]; return (
{/* subtle cork texture via noise */}
")`, }} /> {/* the wall */}
{/* "CASE BOARD" label */}
▸ ACTIVE CASE BOARD · {filtered.length} PINNED
RED THREAD · 已建立关联 5
{filtered.slice(0, positions.length).map((item, i) => { const [left, top, rot, kind, pin] = positions[i] || positions[i % positions.length]; return ( {kind === "polaroid" && } {kind === "sticky" && } {kind === "index" && } ); })}
); }; window.CaseWallView = CaseWallView;