Open source · Swift · MIT

Radial Menu

A tunable radial, vertical and horizontal menu for visionOS, macOS, iPadOS and iOS. One Swift file with no dependencies, plus the app you tune it in: live sliders, draggable measure guides, synthesised audio cues and code export.

The packing rule

R = pitch / (2·sin(step/2))
pitch = iconSize × (1 + gutter)

One base unit, one constraint. Change the icon size, the item count or the arc and the spacing re-solves. Nothing overlaps because nothing can.

Why it exists

Radial menus are easy to draw and hard to get right

Parametric geometry

Spacing, hit targets and the distance a hand travels before a sub-menu opens are all numbers, and every number is wrong until you've felt it on a device. So the geometry is parametric and the export ships ratios, not points.

It does not scroll

Every item is on screen. Eight is comfortable, twelve is the ceiling. A radial menu's whole value is spatial constancy: Delete is at 7 o'clock, always, and your hand learns it in a week.

Four platforms, real hardware

One target runs on visionOS, macOS, iPadOS and iOS, and all four have been run on real devices rather than only a simulator, which is where the more interesting bugs in DESIGN.md came from.

The tuning app

Load your own menu, adjust icon size, gutter, arc, ring radius, sub-menu slide and easing with live sliders. Switch on measure guides to see the ring and the gutter it was solved for. Synthesised audio cues give each hover and commit a sound. When it feels right, export the ratios as Swift you can paste into your project.

Designed for pinch

Long pinch opens the dial, slide highlights, sub-items slide outward from their parent, release commits, and a short ease in and out keeps it from feeling jarring. It is the same interaction model that drives Quads' hold-menus in mid-air.