SwiftUI's built-in MenuBarExtra
API makes it easy to create menu bar applications in pure SwiftUI. However, as of macOS 13 its functionality is extremely limited. Worse, it doesn't behave correctly (e.g. it doesn't animate, it doesn't close the pop-up when the user interacts with other menu items, etc).
FluidMenuBarExtra provides a drop-in replacement to correct these issues.
- Animated resizing when SwiftUI content changes.
- Ability to access the scene phase of the menu using the
scenePhase
environment key. - Persisted highlighting of the menu bar button.
- Smooth fade out animation when the menu is dismissed.
- Automatic repositioning if the menu would otherwise surpass the screen edge.
Use FluidMenuBarExtra like you would Apple's MenuBarExtra, e.g.:
import SwiftUI
import FluidMenuBarExtra
@main
private struct DemoApp: App {
@AppStorage("showMenuBarExtra") var showMenuBarExtra = true
var body: some Scene {
FluidMenuBarExtra("Demo", systemImage: "chevron.down.circle", isInserted: $showMenuBarExtra) {
Text("Hello, world!")
.padding(20)
}
}
}
See also the included demo application for a more elaborate example.
- Since FluidMenuBarExtra uses an
NSWindow
, not anNSMenu
, you'll find that the window presented by FluidMenuBarExtra has a slighter wider corner radius than other menus.
All contributions are welcome. If you have a need for this kind of package, feel free to resolve any issues and add any features that may be useful.
FluidMenuBarExtra is released under the MIT License unless otherwise noted.