// 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 = () => (
);
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 = () => (
);
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 */}
);
};
window.CaseWallView = CaseWallView;