The Skills page (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/magical/llms.txt
Use this file to discover all available pages before exploring further.
/skills) is titled Affinities and subtitled “Circle of Competencies.” It replaces a traditional skills list with an interactive orbital visualisation: a spinning circular center hub surrounded by seven skill-category nodes arranged in a perfect circle, connected by dashed SVG lines. Hovering any node reveals a tooltip card listing that category’s individual skills.
Visual & UX Overview
Circular Center Hub
The center hub is a
w-32 h-32 rounded-full motion.div with border-2 border-mystic-violet/50 bg-mystic-950. It contains an inner w-24 h-24 rounded-full border border-mystic-teal/30 circle housing a Sparkles icon. The outer hub animates with a continuous rotate: 360 spin over 60 seconds, signalling the system is “active.”Orbital Node Positioning
Seven skill nodes are arranged in a circle of radius
220px around the hub. Each node’s (x, y) position is calculated as:
angle = (index / skills.length) × 2π − π/2
x = 220 × cos(angle), y = 220 × sin(angle)
The −π/2 offset places the first node at the 12 o’clock position.SVG Connector Lines
Each node renders its own
<svg> element (absolutely positioned, overflow visible) with a <line> drawn from (0,0) back to the hub. Lines use strokeDasharray="4 4". When a node is active (hovered), its line stroke uses the node’s color; inactive lines use #2d1b4e.Skill Tooltip Cards
Hovering a node triggers a floating tooltip that appears via
AnimatePresence. It shows the category label and a list of individual skills, each animated in with a staggered delay: index * 0.05s. The tooltip is positioned at the bottom of the container on mobile, or centered on desktop.Skill Categories Data
The seven skill categories are defined in a static array. Each category has anid, display label, color (hex value for accent styling), and a skills string array:
Category Summary Table
| # | ID | Label | Color | Individual Skills |
|---|---|---|---|---|
| 1 | lang | Incantations | #a855f7 | JavaScript (ES6+), TypeScript, HTML5, CSS3/Sass |
| 2 | front | Illusions | #2dd4bf | React, Next.js, Tailwind CSS, Framer Motion |
| 3 | back | Deep Magic | #a7f3d0 | Node.js, Express, PostgreSQL, REST APIs |
| 4 | debug | Divination | #f43f5e | Chrome DevTools, Jest, React Testing Library, Console.log() Divination |
| 5 | docs | Scribing | #fbbf24 | Markdown, JSDoc, Technical Writing, Architecture Diagrams |
| 6 | git | Time Travel | #60a5fa | Git, GitHub Actions, CI/CD, Branching Strategies |
| 7 | ui | Aesthetics | #c084fc | Figma, UI/UX Principles, Accessibility (a11y), Responsive Design |
Orbital Position Calculation
Node positions are computed at render time (not hardcoded) so that adding or removing categories automatically redistributes all nodes evenly:The
ORBIT_RADIUS of 220px is calibrated for a container of w-full max-w-3xl h-[600px]. The container uses flexbox centering so the hub sits at the geometric center, and node coordinates are offsets from that center.Hover Interaction Flow
Customization
Adding a new skill category
Adding a new skill category
Append an entry to the
skills array. The orbital layout recalculates automatically — no manual position values needed. Choose a unique hex color that doesn’t clash with existing nodes. If adding an eighth category, the orbit spacing becomes 360° / 8 = 45° per node, which remains visually comfortable.Updating skills within a category
Updating skills within a category
Edit the
skills string array inside the relevant category object. There is no enforced maximum, but more than six items may overflow the tooltip card. Consider splitting oversized categories into two if the list grows.Changing orbit radius
Changing orbit radius
Adjust the
ORBIT_RADIUS constant (currently 220). Increase it to give more space between the hub and nodes; decrease it for a more compact layout. The SVG connector lines will stretch or shrink automatically since they are drawn to the same computed (x, y) positions.Replacing the hub icon
Replacing the hub icon
The center hub uses a
Sparkles (Oe) icon from lucide-react. Swap this for any other Lucide icon by importing it and replacing the JSX element. The spinning animation is applied to the outer motion.div wrapper, not the icon itself.Component Dependencies
| Component | Source | Role |
|---|---|---|
Sigil | components/Sigil.js | Optional decorative sigils on node backgrounds |
BackgroundEffects | components/BackgroundEffects.js | Ambient particle and blur layer |
Navigation | components/Navigation.js | Fixed top navigation bar |
Sparkles (Lucide) | lucide-react | Center hub icon |
motion / AnimatePresence | Framer Motion | Node entrance spring, hover scale, tooltip mount/unmount |