展示HN:Radiant – 受Blender的圆形菜单启发的macOS径向菜单启动器
嗨,HN,我开发了Radiant。
我经常使用Blender的圆形菜单,喜欢这种空间定位变成肌肉记忆的感觉——按住一个键,朝某个方向移动,然后释放。过一段时间后,你就不再思考这个过程。我希望在Figma、VS Code以及macOS的其他地方也能实现同样的交互模型,因此我构建了一个系统级的版本。
Radiant是一个适用于macOS的径向和列表菜单启动器。你可以将操作组织成菜单,通过热键触发它们,并根据方向或位置进行选择。
一些我乐意讨论的设计决策:
- 每个径向菜单有8个固定槽位——这是为了增强空间记忆而故意设定的限制。槽位越多,选择速度越慢(根据Fitts定律),槽位越少则实用性不足。列表菜单则可以处理“我需要20个以上项目”的情况。
- 三种关闭模式:释放确认(Blender风格)、点击确认和切换(菜单保持打开以进行多个操作)。
- 应用特定的配置文件,基于最前面的应用程序自动切换。
- 内置宏系统——可以链式输入按键、延迟、文本输入和系统操作,无需外部工具。
技术细节:
- 原生Swift/SwiftUI,无Electron。
- 使用CGEventTap进行全局键盘/鼠标监控。
- 使用无障碍API进行按键注入。
- 所有数据存储在UserDefaults中,无遥测。
- JSON配置支持导入/导出以共享预设。
网址: [https://radiantmenu.com](https://radiantmenu.com)
期待听到你的想法。
查看原文
Hi HN, I built Radiant.<p>I use Blender's Pie Menu a lot and like how spatial positioning turns into
muscle memory — hold a key, move toward a direction, release. After a while
you stop thinking about it. I wanted that same interaction model in Figma,
VS Code, and the rest of macOS, so I built a system-wide version.<p>Radiant is a radial and list menu launcher for macOS. You organize actions
into menus, trigger them with a hotkey, and pick by direction or position.<p>Some design decisions I'd be happy to discuss:<p>- 8 fixed slots per radial menu — a deliberate constraint for spatial memory.
More slots = slower selection (Fitts's Law), fewer = not enough utility.
List menus handle the "I need 20+ items" case.
- Three close modes: release-to-confirm (Blender-style), click-to-confirm,
and toggle (menu stays open for multiple actions)
- App-specific profiles that auto-switch based on the frontmost application
- Built-in macro system — chain keystrokes, delays, text input, and system
actions without external tools<p>Technical details:
- Native Swift/SwiftUI, no Electron
- CGEventTap for global keyboard/mouse monitoring
- Accessibility API for keystroke injection
- All data stored locally in UserDefaults, no telemetry
- JSON config with import/export for sharing presets<p>URL: <a href="https://radiantmenu.com" rel="nofollow">https://radiantmenu.com</a><p>Would love to hear your thoughts.