The Skills page (nav label: Cauldron, routeDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/v-doom/llms.txt
Use this file to discover all available pages before exploring further.
/skills) replaces a static list of skill ratings with a living cauldron metaphor. Visitors click ingredient buttons to add a skill to the brew — the cauldron responds with a color shift, a burst of rising bubbles, and a potency bar that fills to the skill’s percentage level.
What’s on This Page
Heading block:lg+ screens (stacked on mobile), using flex-col lg:flex-row:
Left — Ingredient Button Grid
A grid of 5 buttons arranged in 2 columns on mobile and 3 columns on md+ (grid-cols-2 md:grid-cols-3). Each button is styled as a glass panel with:
- A colored circle indicator (the skill’s brand color as fill, also used for the border)
- The ingredient name as a label
- Hover: scales up (
scale: 1.05) and translates upward (y: -5) via Framer MotionwhileHover - Click: triggers the cauldron interaction
w-64 h-64 md:w-80 md:h-80) with several animated layers:
| Layer | Animation |
|---|---|
| Elliptical rim | ry breathes between 15 and 17 on a 2-second infinite ease loop |
| Radial blur glow | Changes color to the selected ingredient’s color over 1 second |
| Floating bubbles | Spawned at the cauldron area, animate upward (y: -150) with opacity fade on click |
| Potency readout | AnimatePresence mode="wait" swaps the selected ingredient display below the cauldron |
0% to the ingredient’s level value. The readout animates in/out with AnimatePresence mode="wait", so switching ingredients cleanly replaces the previous display.
Key Interactions
- Ingredient click — Selecting a button updates the selected name state, changes the cauldron’s glow color to match
ingredient.color, and spawns exactly 5 bubble particles from the cauldron area. - Bubble particles — Each bubble is a small circle that animates from the cauldron upward (
y: -150) with a randomized horizontal offset and fades toopacity: 0over 2 seconds. They are removed from state after 2 seconds viasetTimeout. - Cauldron rim breath — The rim ellipse’s
ryattribute oscillates15 → 17 → 15on an infinite loop usingrepeat: Infinity, ease: 'easeInOut'with a 2-second duration. - Potency bar fill — The bar width animates from
0to${skill.level}%using Framer Motionanimate={{ width: '...' }}withduration: 1, ease: 'easeOut'. - Ingredient swap —
AnimatePresence mode="wait"wraps the potency display so the old ingredient exits before the new one enters, preventing overlapping content.
Customizing
The entire ingredient list is defined in a single array. Replace it with your own skills, colors, and proficiency levels:| Field | Type | Description |
|---|---|---|
id | string | Unique key, used as React key and for state tracking |
name | string | Display label shown on the button and below the cauldron |
color | string | Hex color for the dot indicator, cauldron glow, and potency bar |
level | number | Proficiency percentage (0–100) — controls the bar fill width |
Add a new ingredient
Append an object to the
ingredients array with a unique id, a thematic name, a brand hex color, and a level between 0 and 100.Update the grid layout
The button grid is
grid-cols-2 md:grid-cols-3. If you add more than 6 ingredients, consider switching to md:grid-cols-4 or letting it wrap naturally.level is purely visual — it controls only the width of the potency bar. It does not affect any other part of the page’s layout or content. Choose values that honestly represent your relative proficiency.