展示HN:Radiant – 受Blender的圆形菜单启发的macOS径向菜单启动器

1作者: sagawafumiya大约 1 个月前原帖
嗨,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&#x27;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&#x27;d be happy to discuss:<p>- 8 fixed slots per radial menu — a deliberate constraint for spatial memory. More slots = slower selection (Fitts&#x27;s Law), fewer = not enough utility. List menus handle the &quot;I need 20+ items&quot; 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&#x2F;SwiftUI, no Electron - CGEventTap for global keyboard&#x2F;mouse monitoring - Accessibility API for keystroke injection - All data stored locally in UserDefaults, no telemetry - JSON config with import&#x2F;export for sharing presets<p>URL: <a href="https:&#x2F;&#x2F;radiantmenu.com" rel="nofollow">https:&#x2F;&#x2F;radiantmenu.com</a><p>Would love to hear your thoughts.