The Journal section spans two routes: a listing grid atDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/nightshade/llms.txt
Use this file to discover all available pages before exploring further.
/blog where each post is a hoverable parchment card, and a full-page reader at /blog/:slug featuring a live scroll-progress bar and drop-cap opening paragraph. BlogPage (Ge) handles the listing; BlogPostPage (Xe) handles the reader.
Routes
| Route | Component |
|---|---|
/blog | BlogPage (Ge) |
/blog/:slug | BlogPostPage (Xe) |
Listing Page — /blog
Layout
The listing page renders under amax-w-4xl mx-auto container. The header block displays “The Coven Journal” in font-heading and the subtitle “Papers, Essays, and Field Notes.” in font-code. Beneath it, a two-column md:grid-cols-2 grid holds the post cards, with staggered entrance animations (delay: index * 0.1).
Post Card
Each card is amotion.div with parchment-bg border border-witch-plum/30 rounded-sm. On hover the border changes to border-witch-turquoise and a small Candle component fades in at the top-right corner (opacity-0 → opacity-100). Clicking the card navigates to /blog/:slug via useNavigate.
Card content from top to bottom:
- Meta row —
font-code text-xsbar with the category label (left,text-witch-plum uppercase tracking-widest) and date (right,text-witch-moonlight/40). - Title —
font-heading text-2xlthat transitions totext-witch-amberon hover. - “Read entry →” footer — a small
font-code text-xs text-witch-turquoise/50line whose arrow nudges right (translate-x-2) on hover.
Post Data
Post Reader — /blog/:slug
Scroll Progress Bar
Amotion.div is fixed to the very top of the viewport for the duration of the article. The component uses a locally-bundled useScroll implementation (qe) that tracks scrollYProgress, and a custom useSpring (le) imported from FamiliarCursor.js — both mirror the Framer Motion API exactly:
fixed top-0 left-0 right-0 h-1 bg-witch-turquoise/50 blur-[1px] origin-left z-50 and driven by style={{ scaleX }}. As the reader scrolls down the page, the bar extends left-to-right from scaleX: 0 to scaleX: 1.
Title Derivation
The post title is derived from the URL slug at render time, following the same pattern as the case study detail page:Article Header
Centered above the article body, inside aborder-b border-witch-plum/20 pb-8 divider:
h1infont-heading text-4xl text-witch-moonlight- A
font-code text-witch-plum text-smbyline:"A Field Note • Oct 31, 2023"
Drop-Cap Opening Paragraph
The first paragraph uses Tailwind’sfirst-letter pseudo-element utilities to create a large decorative initial:
Article Prose
The article body is wrapped inprose prose-invert prose-lg max-w-none font-body text-witch-moonlight/80. Subsequent headings render in font-heading text-witch-turquoise; blockquotes use a left border of border-witch-plum with italic text-witch-moonlight/60 text.
Back Navigation
A← Close Journal button above the article header calls useNavigate to return to /blog:
Customization
Adding a New Blog Post
Step 1 — Append an entry toblogPosts:
BlogPostPage derives its content from the slug. The body prose is currently static placeholder text inside the component. To show per-post content, add a content field to each entry or fetch it from an external source (MDX file, CMS, etc.) keyed on the slug.
The category label renders as plain text — it is not filtered or linked anywhere. You can use any short string (
"Tutorial", "Deep Dive", "Rant") without breaking the layout.