The Work page reframes employment history as a row of ritual candles. Each candle’s height corresponds to the seniority and impact of that role — the tallest flame for the most recent position, shorter flames for earlier ones. Clicking a candle selects it and causes a glass-panel detail card to animate into view below, recounting the company name, role title, and accomplishments in flavour-text prose.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/the-craft/llms.txt
Use this file to discover all available pages before exploring further.
Work History Entries
assets/Work.js holds an internal array of three entries. Each object has six fields:
| Field | Type | Purpose |
|---|---|---|
id | string | Unique key used for React reconciliation and active-state tracking |
year | string | Date range displayed as the candle caption (only the start year is shown) |
company | string | Organisation name rendered in the detail panel heading |
role | string | Job title rendered in the detail panel subheading |
description | string | Accomplishment prose shown in the detail panel body |
candleHeight | number | Pixel height of the wax-column portion of the candle |
High Sorcerer (Senior Frontend) — Ethereal Systems
Years: 2023 – PresentCandle Height: 140pxDescription: “Leading a coven of 5 junior developers. Architected the new React-based spellbook that increased casting speed (page load) by 40%. Implemented dark rituals (Redux Saga) for complex state management.”
Data Alchemist — Void Analytics
Years: 2020 – 2023Candle Height: 100pxDescription: “Transmuted raw user data into beautiful, interactive D3.js visualizations. Banished numerous memory leak demons from the legacy Angular application.”
Apprentice Weaver — Mystic Web Agency
Years: 2018 – 2020Candle Height: 70pxDescription: “Crafted responsive landing pages using ancient HTML/CSS incantations. Learned the sacred arts of accessibility and cross-browser compatibility.”
Candle Heights
ThecandleHeight value (in pixels) controls how tall the wax-column div renders inside the <Candle> component. The three values — 140px, 100px, 70px — create a descending visual hierarchy from most recent to earliest role, reinforcing career progression at a glance.
Interaction Model
Default State
The first entry is selected by default:
useState(entries[0].id). Its candle is already active and its detail panel is visible when the page loads.Click to Illuminate
Each
<Candle> component receives an onClick callback that calls setActiveId(entry.id), replacing the currently active entry. The candle component itself renders differently when isActive is true — the flame div plays the .animate-flicker CSS animation and the wax column switches from bg-parchment/40 to bg-parchment.AnimatePresence Transition
The detail panel is wrapped in an The
AnimatePresence with mode="wait". When the active entry changes the outgoing panel exits before the incoming panel enters, preventing a cross-fade overlap:key prop is set to activeEntry.id so React treats each entry as a distinct element and triggers mount/unmount animations correctly.The Candle Component
The<Candle> component (imported from components/Candle.js) accepts four props:
| Prop | Type | Default | Purpose |
|---|---|---|---|
label | string | — | Caption text rendered below the wax column (the start year) |
height | number | 120 | Pixel height of the wax-column div |
isActive | boolean | — | When true, enables the flame animation and full-opacity wax colour |
onClick | function | — | Called when the user clicks anywhere on the candle wrapper |
motion.div positioned at the top of the column. When isActive is true it receives bg-spell shadow-[0_0_20px_rgba(45,212,191,0.8)] animate-flicker and a blurred white inner highlight. When inactive the flame div uses bg-spell/20 with no shadow and no animation. Below the flame a thin wick line (w-0.5 h-3 bg-midnight-darker) connects flame to wax:
flex justify-center items-end gap-12 md:gap-24 so all candles align at their bases on a shared absolute gradient baseline:
label receives entry.year.split(" ")[0] — just the start year — as its caption.
Detail Panel
The glass panel below the candle row usesmax-w-2xl h-64 and the glass-panel utility. Inside it, centred content shows:
companyin Cinzeltext-3xl text-spellrolein Pinyon Scripttext-2xl text-parchment/80- A decorative
w-12 h-px bg-spell/30divider rule descriptionin EB Garamondtext-lg text-parchment leading-relaxed
bg-spell/5 opacity-50 absolute div behind the content creates a soft inner glow without obscuring the text.
How to Customize
Edit the entries array at the top ofassets/Work.js. Add, remove, or reorder entries as needed: