Context Menu (Radial)
Radial/pie menu for quick-access actions — 4-8 items in a circle
<div class="radial-menu">
<div class="radial-menu-item" style="top:8px;left:50%;transform:translateX(-50%)">★</div>
<div class="radial-menu-item" style="top:50%;right:8px;transform:translateY(-50%)">✎</div>
<div class="radial-menu-item" style="bottom:8px;left:50%;transform:translateX(-50%)">🗑</div>
<div class="radial-menu-item" style="top:50%;left:8px;transform:translateY(-50%)">🔍</div>
</div> .radial-menu {
width: 140px; height: 140px; border-radius: 50%;
background: var(--bg-raised); border: 2px solid var(--border-mid);
box-shadow: 0 4px 20px rgba(0,0,0,0.4); position: relative;
}
.radial-menu-item {
position: absolute; width: 36px; height: 36px; border-radius: 50%;
background: var(--bg-surface); border: 1px solid var(--border-subtle);
display: flex; align-items: center; justify-content: center;
font-size: 14px; color: var(--text-secondary); cursor: pointer;
transition: background 0.12s, color 0.12s;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
.radial-menu-item:hover { background: var(--bg-panel); color: var(--amber); } API
| Class | Type | Description |
|---|---|---|
.radial-menu | Base | Primary component class |
.default | Size | Extra large variant |
Design Notes
Physical Analog
Reference devices: Pro camera "quick menu" (Sony Alpha quick-access dial), Wacom tablet radial menu, video game weapon wheels. Mechanism: A radial/pie menu that appears around a point of activation. Items are arranged in a circle at equal angular intervals, each accessible by moving in that direction from center. Derived from military heads-up display (HUD) target-designator patterns. Faster than linear menus for small numbers of items (4-8) because the user only needs to specify a direction, not navigate a list.
Geometry
| Property | Value |
|---|---|
| Container | 140x140px, circular |
| Container border | 2px solid |
| Item size | 36x36px, circular |
| Item border | 1px solid |
| Shadow | 0 4px 20px rgba(0,0,0,0.4) |
CSS Recipe
Container (.radial-menu)
.radial-menu {
width: 140px; height: 140px; border-radius: 50%;
background: var(--bg-raised); border: 2px solid var(--border-mid);
box-shadow: 0 4px 20px rgba(0,0,0,0.4); position: relative;
}
Item (.radial-menu-item)
.radial-menu-item {
position: absolute; width: 36px; height: 36px; border-radius: 50%;
background: var(--bg-surface); border: 1px solid var(--border-subtle);
display: flex; align-items: center; justify-content: center;
font-size: 14px; color: var(--text-secondary); cursor: pointer;
transition: background 0.12s, color 0.12s;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
Hover
.radial-menu-item:hover { background: var(--bg-panel); color: var(--amber); }
HTML Structure
<div class="radial-menu">
<div class="radial-menu-item" style="top:8px;left:50%;transform:translateX(-50%)">★</div>
<div class="radial-menu-item" style="top:50%;right:8px;transform:translateY(-50%)">✎</div>
<div class="radial-menu-item" style="bottom:8px;left:50%;transform:translateX(-50%)">🗑</div>
<div class="radial-menu-item" style="top:50%;left:8px;transform:translateY(-50%)">🔍</div>
</div>
Size Variants
No size variants defined.
Material Variants
No material variants. Uses standard raised surface with elevated shadow.
Theme Behavior
- Background swaps via
--bg-raised - Item backgrounds swap via
--bg-surface - Hover always uses amber accent
- Shadow reduces in light mode
Constraints
- MUST use circular container (border-radius: 50%)
- Items MUST be positioned at cardinal/ordinal points using absolute positioning
- MUST support 4-8 items maximum (more becomes unusable)
- Items MUST be circular buttons (border-radius: 50%)
- Hover MUST highlight item in amber
- MUST use elevated shadow to indicate floating overlay context
- Container border MUST be 2px (thicker than standard 1px to define the ring)
Accessibility
- Container should have
role="menu" - Items should have
role="menuitem"with descriptivearia-label - Support arrow key navigation between items (mapped to positions)
- Escape key should dismiss the menu
- Menu should trap focus while open
- Element
- Use <nav> with aria-label
- Keyboard
- Arrow keys to navigate, Enter to select
- Focus
-
Visible focus indicator required. Use native browser focus ring or custom
:focus-visiblestyles.