Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/dev-haunt/llms.txt
Use this file to discover all available pages before exploring further.
EvidenceBoard transforms your case studies into an atmospheric detective evidence board — a dark cork surface covered in pinned paper cards connected by dashed red string, where clicking any card reveals the full investigation details in a modal overlay. It lives on the /case-studies route and fills the full width of its container.
Overview
The component is entirely self-contained: the case study data, board layout, and modal state are all managed internally. There are no props to pass — drop<EvidenceBoard /> onto the page and the board renders immediately.
The Evidence Board is intentionally self-contained so the spatial card layout (each card has a fixed
x/y percentage position and rotation value) stays cohesive. Moving data outside the component would decouple the positions from the content they belong to.Built-in Case Studies
Three case studies ship with the component, each positioned and rotated to look like they were pinned by hand:| ID | Title | Summary | Position |
|---|---|---|---|
c1 | The Missing Render | A React performance mystery. | 10% / 10%, –5° |
c2 | Curse of the Z-Index | Stacking context horrors. | 55% / 5%, +3° |
c3 | Phantom Layout Shift | CLS optimization. | 30% / 50%, –2° |
Visual Design
The board mimics a physical detective’s cork board:- Background — warm brown (
#8d6e63) with a thick dark border (#4e342e) and a subtle dot-grid texture at 20 % opacity. - Pinned cards — off-white (
#f4f1ea) paper with a red pushpin at the top centre, a drop shadow, and a slight rotation applied via therotateCSS property. Cards scale to1.05and straighten on hover. - String connections — an SVG layer rendered above the board draws three dashed red paths (
stroke="#d32f2f",strokeDasharray="5,5") linking the three cards as quadratic Bézier curves. - Modal overlay — clicking a card opens a full-bleed
backdrop-blur-smpanel that fades in. The detail card itself slides up fromscale: 0.9, y: 20toscale: 1, y: 0. AnXbutton (LucideXicon) or a click on the backdrop closes the modal.
Entrance Animation
The Case Studies page wraps<EvidenceBoard /> in a Framer Motion motion.div that animates the whole board into view:
Usage
Customising Case Study Content
Because there are no external props, edit the internal case-study data array directly insideEvidenceBoard.js. In the dist build the array is minified to n; in a source build it would look like:
| Field | Type | Description |
|---|---|---|
id | string | Unique key used by React and the selected-card state. |
title | string | Displayed on the pinned card in the spooky font. |
summary | string | Short tagline shown on the card face. |
details | string | Full text revealed in the modal overlay. |
x | number | Horizontal position as a percentage of board width. |
y | number | Vertical position as a percentage of board height. |
rotation | number | CSS rotation in degrees (negative = counter-clockwise). |
When adding new cards, update the SVG string paths to connect them. Each
<path> element uses percentage-based coordinates ("M 20% 25% Q 40% 40% 65% 20%") so they scale with the board automatically.Accessibility
Keyboard & screen-reader considerations
Keyboard & screen-reader considerations
- Each pinned card is a
divwith anonClickhandler. Addrole="button"andtabIndex={0}plus anonKeyDownhandler if keyboard navigation is a requirement for your audience. - The modal close button uses a native
<button>element and is keyboard-focusable by default. - The modal backdrop click-to-close relies on
stopPropagationon the inner card to prevent accidental dismissal.