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.
OrbitingSatellites component turns your blog post links into live satellites — each post orbits a glowing “DATA CORE” node at the center of the section, rotating continuously on its own ring at a unique speed and radius. Hovering over the orbital area pauses all motion, letting visitors read the post tooltip. Clicking any satellite opens a modal that displays the full post excerpt and a “Download Full Transmission” call to action. It’s a blog index unlike any conventional list.
All three orbital rings animate simultaneously using Framer Motion’s
animate: { rotate: 360 } with repeat: Infinity. A shared pause state (l) is toggled by mouse enter/leave on the orbital container, which is used to set transition: { duration: 0 } — effectively freezing the animation in place.Post Data Shape
All posts are stored in a static array (n in the compiled source). Each entry must conform to this object shape:
Pre-configured Posts
The component ships with three posts at staggered orbital radii:| Title | Date | Orbit Radius | Revolution |
|---|---|---|---|
| The Architecture of Nothingness | Stardate 4592.1 | 150px | 20s |
| Quantum State Management | Stardate 4610.4 | 250px | 35s |
| CSS in the Dark Forest | Stardate 4688.9 | 350px | 50s |
Layout Architecture
The entire component is asection with min-h-[80vh] flex items-center justify-center relative overflow-hidden. Three types of elements are layered absolutely at the centre:
DATA CORE Node
A
w-32 h-32 rounded-full circle with bg-space-900 border-2 border-aurora-teal/30 and a shadow-[0_0_50px_rgba(13,148,136,0.2)] glow. Fixed at the exact centre using absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2. Contains two lines of monospace text: “DATA” and “CORE” in text-aurora-teal.This is the static anchor point that all orbital rings encircle.Orbital Ring + Satellite
For each post, two elements are centered with the same
-translate-x-1/2 -translate-y-1/2 trick:- The ring — a
rounded-full border border-slate-800/50div sized toorbitRadius * 2×orbitRadius * 2pixels. Static, purely decorative. - The rotating wrapper — a
motion.divwithanimate: { rotate: 360 }andtransition: { duration, repeat: Infinity, ease: "linear" }. This div isabsolute inset-0, so it fills the ring exactly. The satellite icon sits atabsolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2— the 12 o’clock position — and rotates around the ring as the wrapper spins.
Modal Overlay
Conditionally rendered when a post is selected (
a !== null). An absolute inset-0 z-50 backdrop with bg-space-950/80 backdrop-blur-sm, containing a motion.div card that scales in from 0.9 to 1.Orbital Rotation Mechanics
The key to the spinning effect is that Framer Motion rotates the entire invisibleinset-0 wrapper div, not the satellite icon itself. Because the icon is pinned to the top-centre of this wrapper, it travels in a circle as the wrapper rotates:
Pause-on-Hover Behaviour
A single boolean statel (mapped to isPaused in context) controls whether all orbits are paused. The onMouseEnter and onMouseLeave handlers are placed on each rotating motion.div. When any satellite is hovered:
isPausedbecomestrue.- All three orbital wrappers receive
transition: { duration: 0 }. - The currently active Framer Motion transition is overridden and the rotation freezes.
- The satellite tooltip becomes visible via CSS
group-hover:opacity-100.
selectedId !== null), orbits also pause automatically — the condition l || a !== null ensures no satellite continues spinning behind the open modal.
Satellite Icon and Tooltip
Each satellite button is aw-10 h-10 bg-space-800 border border-aurora-teal/50 rounded-lg square with a FileText icon from lucide-react at the centre. On hover:
- Background transitions to
bg-aurora-teal/20. - A tooltip div fades in below the icon (
top-12,opacity-0 group-hover:opacity-100). - The tooltip shows the post
titleinfont-sans text-sm font-bold text-slate-200and thedateinfont-mono text-[10px] text-aurora-pink.
w-48 and text-center to handle multi-word titles gracefully, and pointer-events-none so it doesn’t interfere with mouse tracking.
Click-to-Expand Modal
Clicking a satellite sets the selected post ID in state (a). The modal is rendered as a Framer Motion scale entrance:
- Close button —
Xicon anchoredabsolute top-4 right-4inside the glass panel, callssetSelectedId(null)on click. - Date —
font-mono text-xs text-aurora-pinkat the top of the content area. - Title —
font-sans text-2xl font-bold text-slate-100. - Excerpt —
font-serif text-lg text-slate-300 leading-relaxed, using the serif typeface for a “transmission text” feel. - CTA button —
"Download Full Transmission"infont-mono text-sm text-aurora-light, full-width, with aurora-teal border and hover fill.
Adding New Posts
Locate the posts array
Open
components/OrbitingSatellites.js and find the n array. Each object in the array renders as one orbital satellite.Choose an orbital radius
Existing rings are at 150, 250, and 350px. Add a fourth at 450px — each ring adds 100px, keeping the spacing visually consistent.
Ensure the section is tall enough
The outermost ring’s diameter is
orbitRadius * 2. At 450px that’s a 900px-wide ring. The section uses overflow-hidden, so rings wider than the viewport will be clipped — this is intentional on mobile, but test on desktop to verify the outermost ring has visible arc.Controlling orbital direction
Controlling orbital direction
All orbits currently rotate clockwise (You can mix clockwise and counter-clockwise orbits to add visual complexity — for example, inner orbits clockwise and outer orbits counter-clockwise, mimicking retrograde motion.
rotate: 360). To reverse an orbit to counter-clockwise, change its animate value to rotate: -360: