Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/observatory/llms.txt
Use this file to discover all available pages before exploring further.
RadioDial presents contact links through the metaphor of an analogue radio. A circular dial with tick marks occupies the left side of the layout. Clicking one of the small dot buttons positioned on the dial’s circumference rotates the dial pointer to that channel’s angle and updates the detail panel on the right with the channel’s icon, label, and link.
Visual appearance
The dial is a 256×256px circle built from several nested layers:- Outer ring — a full-size
rounded-fulldiv with a 2pxspace-700border and an inset shadow - Tick marks — an SVG overlay with 36 tick lines spaced 10° apart. Every 9th tick (90°) is longer and brighter
- Inner rotor — a Framer Motion
m.divsized atinset-4(the inner circle) with a gradient fromspace-700tospace-900. This div rotates based onactiveChannel.angle - Pointer — a 4×32px
aurora-turquoiserectangle at the top center of the rotor, glowing withshadow-[0_0_10px_rgba(45,212,191,0.8)] - Channel buttons — small invisible
buttonelements positioned on the circumference at each channel’s angle. Each contains a 2×2px dot: active channels are lit inaurora-tealwith a glow; inactive channels are slate
-90 offset rotates the coordinate system so 0° points upward (12 o’clock).
Detail panel
The right panel is aspace-900 card with a white/10 border. It contains:
- A status bar at the top showing the channel ID in uppercase monospace and three indicator dots (the first pulses
aurora-tealwhen active, turns red during channel switching) - The channel’s Lucide icon and label heading
- The channel’s value (URL or handle) as a clickable link
id inside a m.div with opacity: 0 → 1 and y: 10 → 0 over 0.2s (with a 0.2s delay). This gives a smooth slide-up feel when switching channels.
Noise static effect
When a channel switch occurs, a noise texture overlay is briefly flashed over the detail panel at 15% opacity usingmix-blend-screen. The noise is an inline SVG feTurbulence filter applied to a rect, encoded as a data: URI in the backgroundImage style.
The transition is implemented with a boolean isStatic state set to true on channel change and reset after 500 ms via setTimeout.
Animations
| Effect | Implementation |
|---|---|
| Dial rotation | m.div animate={{ rotate: activeChannel.angle }}, spring stiffness: 100, damping: 20 |
| Static noise | m.div animate={{ opacity: isStatic ? 0.15 : 0 }} |
| Panel content | m.div initial/animate opacity + y, keyed to channel id |
Where it’s used
RadioDial is the sole interactive element on the /contact route:
Data shape
The channels array is defined incomponents/aurora/RadioDial.js. Each entry represents one contact channel.
Unique identifier for the channel. Used as the React key and displayed as the frequency label in the panel status bar. Standard values:
'email', 'github', 'linkedin', 'twitter'.Display name for the channel shown as the heading in the detail panel. E.g.,
'Secure Channel', 'Code Repository'.The contact value — a full URL for links, or an
@handle for social channels. Rendered as a clickable anchor.A Lucide React icon component (imported directly, not as a string). Rendered at
size={24} next to the channel label in the detail panel. Example: Mail, Github, Linkedin, Twitter.The rotation angle (in degrees) that the dial pointer snaps to when this channel is selected. Defines both the dot position on the circumference and the rotor rotation. The default channels use
-45, 0, 45, and 90.How to customize
Layout tips
- Keep channels to 3–5 entries. More channels will crowd the dot positions on the circumference.
- Spread angles evenly (e.g., 90° apart for 4 channels) to prevent dots from visually overlapping.
- The first entry in the array is the default selected channel on mount.
- To add a new Lucide icon, import it at the top of the component file from
lucide-react.