The portfolio’s component library is intentionally small and composable. Four primitives —Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/choose-your-destiny/llms.txt
Use this file to discover all available pages before exploring further.
NeonCard, NeonButton, TerminalLine, and BlinkingCursor — produce every interactive surface, label, and status indicator in the project. Each is color-aware through a single color prop that maps to the five neon custom properties, so swapping a section’s accent is a one-prop change rather than a class-string audit. All four components live in components/UIComponents.js and are tree-shaken by Vite’s rollup build under short single-letter aliases.
NeonCard
NeonCard is the primary container primitive. It renders a dark panel (bg-dark-panel) with a 1px border-dark-lighter border, absolute-positioned corner accent decorators in the active neon color, and a glow-* box shadow. When hover is enabled the card lifts 4px on :hover and deepens its glow, making it suitable for clickable project tiles or selectable stage entries.
Props
NeonCard prop reference
NeonCard prop reference
| Prop | Type | Default | Description |
|---|---|---|---|
color | string | "cyan" | Neon accent color. Accepts "cyan", "magenta", "purple", "lime", or "orange". |
className | string | "" | Extra Tailwind classes appended to the wrapper div. |
hover | boolean | false | When true, adds hover:glow-* and hover:-translate-y-1 for a lift-and-brighten interaction. |
onClick | function | undefined | Click handler. When provided, a Framer Motion whileTap={{ scale: 0.98 }} press effect is also applied. |
children | ReactNode | — | Content rendered inside a relative z-10 wrapper, above the corner decorators. |
Corner Decorators
Four8×8px absolute-positioned divs sit at each corner of the card. Each one has two borders (border-t-2 border-l-2, etc.) in the active border-neon-{color} shade, recreating the crosshair-corner aesthetic common to JRPG and retro HUD designs.
Usage Examples
When to use
UseNeonCard as the wrapper for any discrete content block: project tiles, skill category panels, blog post previews, or contact form containers. Pair hover={true} whenever the card is clickable. For non-interactive decorative panels pass hover={false} (the default) to avoid misleading pointer affordances.
NeonButton
NeonButton renders a terminal-style <button> that pairs a 2px border-neon-{color} outline with an offset box-shadow (4px 4px 0px var(--neon-{color})), producing a hard-edged “pixel shadow” common in retro game UI. The active state collapses the shadow (active:shadow-none) and shifts the element down (active:translate-y-1) to simulate a physical key press.
Props
NeonButton prop reference
NeonButton prop reference
Button Typography
Buttons usefont-terminal (VT323), text-xl, uppercase, and tracking-wider. This intentionally avoids font-arcade for buttons — Press Start 2P at interactive sizes would be illegible. VT323 reads clearly at large sizes while keeping the terminal aesthetic.
Usage Examples
When to use
UseNeonButton for all primary CTA actions: form submissions, navigation triggers, and modal confirmations. The pixel-shadow variant matches the arcade brand. For secondary or ghost-style actions, apply bg-transparent via the className prop rather than switching to a plain <button>.
TerminalLine
TerminalLine is a single-line read-only terminal output row. It renders a flex container with a neon-lime prefix symbol on the left (defaulting to >) and the line’s content on the right in font-terminal text-xl text-gray-300. It is used throughout the About and Contact sections for status messages, log entries, and narrative exposition.
Props
TerminalLine prop reference
TerminalLine prop reference
| Prop | Type | Default | Description |
|---|---|---|---|
children | ReactNode | — | The text or elements displayed as the line’s content. |
className | string | "" | Extra classes on the outer flex container. |
prefix | string | ">" | The prefix symbol shown in neon-lime on the left. Override with $, //, or >> for variety. |
Usage Examples
When to use
UseTerminalLine for any UI text that should read as machine output rather than human prose — status messages, data readouts, navigation breadcrumbs, and step-by-step boot sequences. Wrap multiple lines in a space-y-2 container to produce a scrolling log effect.
BlinkingCursor
BlinkingCursor renders a single 3×5 (w-3 h-5) neon-lime rectangle using the .blinking-cursor CSS class, which drives a 1s step-end opacity animation. The result is a sharp, non-interpolated blink identical to a physical terminal cursor. It is an inline-block element positioned with align-middle, so it sits correctly inline with any font-terminal text.
No props
BlinkingCursor accepts no props. Its color, size, and blink rate are fixed to the design system values.
step-end is the critical detail. It makes the cursor switch states instantaneously at the 50% mark rather than fading, reproducing the binary on/off rhythm of a real CRT terminal.
Usage Examples
When to use
PlaceBlinkingCursor at the end of the last visible TerminalLine whenever the UI should suggest that the terminal is live and awaiting input. Avoid using more than one cursor on screen simultaneously — two blinking elements compete for attention and dilute the effect.
Component Combinations
The four primitives are designed to compose naturally. The most common pattern in the project is a
NeonCard containing one or more TerminalLine rows, with a BlinkingCursor on the final line and a NeonButton below it as a CTA.