Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/sys-core/llms.txt
Use this file to discover all available pages before exploring further.
OrbitalDiagram renders the sys-core home page’s central navigation as a living solar system. Each major section of the site — Projects, About, Skills, Writing, Case Studies, and Contact — is represented as a glowing planet orbiting a central star at its own orbital radius and speed. Clicking any planet navigates to that section. Hovering over a planet reveals a floating HUD tooltip with the section’s label and tagline. The entire diagram is 1000 × 1000 px and designed to be the focal point of the home page, conveying the “mission control” identity of the portfolio at a glance.
Visual Role
The orbital diagram translates site navigation into a physical metaphor: the developer is the central star, and each area of their work — projects, skills, writing — is a satellite in orbit. This framing reinforces the cosmic theme while making navigation spatially memorable. Planets are sized proportionally to their importance (Projects is the largest at 64 px; Writing is the smallest at 16 px), and each orbit ring is a faintborder-nebula-purple/30 circle. Each planet has a coloured glow shadow matching its associated site colour:
| Section | Colour class | Glow | Orbit radius | Period |
|---|---|---|---|---|
| Projects | bg-violet-glow | Violet, 30 px spread | 180 px | 60 s |
| About | bg-cyan-signal | Cyan, 20 px spread | 100 px | 40 s |
| Skills | bg-mint-comms | Mint, 15 px spread | 260 px | 80 s |
| Writing | bg-magenta-flare | Magenta, 15 px spread | 320 px | 100 s |
| Case Studies | bg-off-white | Off-white, 25 px spread | 400 px | 120 s |
| Contact | bg-cyan-signal | Cyan, 15 px spread | 480 px | 150 s |
animate-pulse).
Usage
OrbitalDiagram is a zero-prop component that internally sources all planet definitions and uses React Router’s useNavigate hook for navigation. Place it in a centred container on the home page.
OrbitalDiagram calls useNavigate() from React Router internally. It must be rendered inside a React Router <BrowserRouter> (or equivalent) provider — rendering it outside a router context will throw a runtime error.Props
OrbitalDiagram is a zero-configuration component and accepts no props. Planet definitions — including labels, paths, sizes, orbit radii, speeds, start angles, and colour classes — are all declared in a static planets array inside the component itself.
Planet Data Shape
Each orbital body is described by an internal configuration object with the following shape:The
OrbitalDiagram is a section navigator, not a project browser. For the coordinate-plotted project map used in the Projects section, see the coordinates field on each project entry in data/projects.js and refer to the Projects Data reference.Projects Data and Coordinates
Individual projects indata/projects.js each carry a coordinates field placing them on a 2D orbital grid (0–100 scale on both axes). This data is consumed by the Projects section to plot project nodes on a spatial map:
| Project | x | y | Tagline |
|---|---|---|---|
| NEXUS_CORE | 20 | 30 | Real-time telemetry dashboard |
| AETHER_SYNC | 60 | 20 | Conflict-free offline storage |
| STELLAR_ROUTER | 80 | 60 | Intelligent API gateway |
| VOID_CANVAS | 30 | 70 | Infinite collaborative whiteboard |
| PULSAR_UI | 50 | 50 | Component design system |
Implementation Notes
CSS spin animation
Each planet’s orbit is implemented using a CSSspin keyframe applied to a full-circle wrapper <div> sized to the orbit diameter. The planet is absolutely positioned at the top-centre of this wrapper (top: -size/2, left: 50%), so as the wrapper spins, the planet traces the circular orbit path.
The HUD tooltip counter-rotates via a spin-reverse animation at the same speed, with an animationDelay offset derived from the planet’s startAngle, ensuring the tooltip text always reads horizontally regardless of the planet’s orbital position.
startAngle for visual distribution
Each planet’s startAngle staggers its initial position around the orbit ring, so at page load the planets are distributed visually rather than all starting at the 12 o’clock position. This is achieved by setting transform: rotate(startAngleDeg) as the initial state of the spinning wrapper before the CSS animation takes over.