TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/dev.void/llms.txt
Use this file to discover all available pages before exploring further.
TelemetryRadar component renders your technical skills as signals on a radar scope — a rotating sweep arm continuously circles the display, and each skill “pings” with a mint glow when the sweep crosses its position. Below the radar, a grid of skill cards shows the same data as animated progress bars that fill into view on scroll. The result is a two-layer visualization: spatial intuition on the radar, precise percentages in the cards.
The radar sweep is driven by
requestAnimationFrame rather than a CSS animation or Framer Motion transition. This gives frame-accurate sweep-angle tracking so the ping detection logic can fire reliably at the exact moment the sweep crosses each skill’s angular position.Skill Data Shape
All skills are stored in a static array (d in the compiled source). Each entry must conform to this object shape:
Pre-configured Skills
The component ships with eight skills pre-positioned around the radar:| Skill | Angle | Distance | Strength |
|---|---|---|---|
| React | 30° | 40 | 95% |
| TypeScript | 75° | 60 | 90% |
| Tailwind | 120° | 35 | 98% |
| Framer Motion | 160° | 70 | 85% |
| Node.js | 210° | 55 | 80% |
| Three.js | 260° | 80 | 70% |
| GraphQL | 310° | 65 | 75% |
| UI/UX Design | 345° | 45 | 88% |
Radar Structure
The radar container is a circularaspect-square div with a faint border-aurora-teal/20 border and a dark bg-space-900/50 fill. Inside it, four layers are stacked:
Concentric Rings
Four
absolute rounded-full border border-aurora-teal/10 divs sized at 25%, 50%, 75%, and 100% of the container. These represent the range rings visible on real radar displays.Crosshair Lines
A full-width horizontal
div and a full-height vertical div, each 1px thick with bg-aurora-teal/10, forming the cardinal axis lines at the radar’s centre.Sweep Wedge
A
conic-gradient div (w-1/2 h-1/2) positioned in the top-left quadrant of the radar container, with origin-bottom-right so its rotation pivot sits at the radar’s centre. Its rotate CSS transform is updated each frame via React state, creating the illusion of a rotating sweep arm.Skill Dots
Each skill is an absolutely positioned dot whose
left and top percentage positions are calculated from its angle and distance polar coordinates.Polar-to-CSS Coordinate Conversion
Each skill’s radar position is derived from itsangle (degrees) and distance (0–100 scale) using standard polar-to-Cartesian maths, mapped to percentage-based CSS positioning:
/ 2 factor scales the distance value (0–100) into half the container’s width, keeping all dots within the radar circle.
Sweep Animation & The Ping Effect
The sweep angle is stored in React state (n) and incremented every animation frame:
isPinging is true, the dot switches from bg-aurora-teal/40 to bg-aurora-mint with a bright shadow-[0_0_15px_rgba(52,211,153,1)] glow, and a Framer Motion animate prop pulses its scale:
Hover Tooltip
Each skill dot is wrapped in agroup div. A tooltip overlay is absolutely positioned below the dot (top: 4) with opacity-0 group-hover:opacity-100 transition-opacity. The tooltip displays:
- The skill
namein aurora-light monospace. - The
strengthpercentage in aurora-pink, separated by a space.
Progress Bar Grid
Below the radar, agrid grid-cols-2 md:grid-cols-4 lays out one card per skill. Each card contains:
- Skill name —
text-sm font-sans text-slate-300 - Progress track —
w-full h-1 bg-space-800 rounded-full overflow-hidden - Animated fill bar — a Framer Motion div that animates from
width: 0towidth: {strength}%when the card scrolls into view:
viewport: { once: true } flag means each bar animates only the first time it enters the viewport — it will not re-animate on subsequent scrolls.
Adding and Editing Skills
Locate the skills array
Open
components/TelemetryRadar.js and find the d array near the top of the file.Append a new skill entry
Add a new object with a unique
name, an angle (0–359°), a distance (10–85 recommended to stay within the radar circle visually), and a strength (0–100).Avoid overlapping positions
Check existing angles before placing a new dot. Skills whose angles differ by fewer than 20° may have overlapping tooltips. Adjust
angle or distance to give each dot visual breathing room.Sweep speed tuning
Sweep speed tuning
The sweep speed is controlled by the increment value inside the
requestAnimationFrame callback. The default increments by 1 degree per frame:- Faster sweep: increase to
2or3degrees per frame. - Slower sweep: use a fractional accumulator pattern — accumulate a float and only update state when a full degree is crossed, or throttle with a timestamp check.
- Pause on hover: add a
isPausedref and skip thesetSweepAnglecall whenisPaused.currentis true. Toggle it inonMouseEnter/onMouseLeaveon the radar container.