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.
Postcard renders one blog article as a tactile, vintage-styled postcard complete with a stamp placeholder, a handwritten-style excerpt, and a textured paper background. Multiple Postcard components are stacked on top of each other on the Blog page — clicking a card fans it out and lifts it above the stack to reveal its content.
Props
The blog article data object to render on this postcard.
Unique identifier for the article. Used by the Blog page to track which card is currently selected via
useState.Article title displayed in the spooky font at the top-left of the card face.
Publication date rendered in small-caps monospace at the bottom-right of the card (e.g.
"Oct 31, 2023").Preview text shown in a handwritten-style font (
Caveat Brush) in the body of the card. Always rendered on the card face; lifting a card above the stack brings it fully into view.Hex background colour for this card (e.g.
"#f4f1ea"). Giving each article a slightly different tint creates visual variety in the stack and helps readers distinguish between cards.Zero-based position of this card in the rendered stack. Controls both the rotation offset (even indices tilt right, odd tilt left) and the base z-index so earlier articles sit closer to the top of the pile.
When
true, the card springs upward, flattens its rotation, and scales to 1.1×. Only one card should be selected at a time — managed by the Blog page’s useState.Callback fired when the card is clicked. The Blog page uses this to toggle selection: clicking an already-selected card passes
null to collapse it; clicking a different card passes its id to select it.Blog Articles Data
The four built-in articles are defined inassets/main.js and passed to each <Postcard> by the Blog page:
Stack Layout & Animation
Cards are positionedabsolute inside a fixed-height container so they overlap into a physical pile. Framer Motion spring physics handle all transitions:
| State | rotate | y | x | scale | zIndex |
|---|---|---|---|---|---|
| Stacked | ±(index × 2 + 2)° | index × 4px | ±10px (even +, odd −) | 1 | 10 + index |
| Hovered | 0° | –20px | unchanged | 1 | 40 |
| Selected | 0° | –150px | 0 | 1.1 | 50 |
x: 10); odd-indexed cards lean left and shift left (x: -10). On selection both offsets reset to zero.
Usage
Rendering the full stack
The Blog page manages selection state and maps thearticles array to individual <Postcard> components:
Single card (preview / testing)
Card Visual Design
- Paper texture — an inline SVG
feTurbulencefilter at 8 % opacity overlays the card’sbackground-colorto simulate aged paper. - Stamp area — a dashed border box in the top-right corner reads “Place Stamp Here”, keeping the postcard aesthetic faithful.
- Dividing line — a hairline
w-px bg-black/10runs vertically down the centre of the card, mimicking the traditional postcard address/message split. - Excerpt font —
Caveat Brush, cursiveat1.2remgives the body text a handwritten feel.
Customisation
To add, remove, or edit articles, update thearticles array in assets/main.js. Each entry only needs the five fields listed above — the stacking positions and rotations are calculated automatically from the array index.
The
color field determines the full card background. Keep colours in a similar warm, desaturated range (creams, tans, greys) to maintain the vintage-paper aesthetic. Very saturated colours will clash with the spooky site palette.