Your first nook
You depend on OpenNook as a package and customize it through public API - you do not fork the framework. Four steps take you from empty target to running notch app.
1. Register a view
Hand NookApp.main your expanded home view; the top bar, Settings, hotkey,
and compact pill all come for free:
import NookAppimport SwiftUI
NookApp.main { MyHomeView() }Run it and press ⌥⌘; (or use the menu-bar item) to expand the nook.
2. Customize via NookConfiguration
Use this when you need more than a home view - the compact slots, the chrome theme, the top bar’s leading label/icon, the chrome flags, lifecycle hooks, and file drops:
var configuration = NookConfiguration()configuration.setHome { MyHomeView() }configuration.setCompactTrailing { MyGlyph() }configuration.theme = { appState in MyPalette.resolve(appState) }
// Top bar - leading cluster identity and chrome flags live on `topBar`.configuration.topBar.leadingTitle = { _ in "Today" } // default: "Home"configuration.topBar.leadingIcon = nil // default: "house"configuration.topBar.showsTopBar = true // false strips top bar + gear + lockconfiguration.topBar.showsSettings = true // false drops the gear (top bar stays)
// Lifecycle hooks.configuration.onExpand = { print("nook expanded") }configuration.onCompact = { /* user dismissed / hover-exit collapsed the nook */ }configuration.onHide = { /* nook went hidden */ }configuration.onFileDrop = { urls in /* accept/reject dropped files */ true }configuration.onReady = { coordinator in /* post-launch handle for components */ }
NookApp.main(configuration)Your views read the resolved palette from the \.nookResolvedTheme
environment value and shared services from \.appServices.
3. Add your state and services
AppState (Sources/NookKit/App/AppState.swift) holds chrome state - add
product state alongside it. AppServices
(Sources/NookKit/App/AppServices.swift) is the dependency container
threaded into views.
4. Drive the chrome
AppCoordinator exposes the lifecycle vocabulary: showNook(),
hideNook(), toggleNook(), toggleKeepNookOpen(). The global hotkey and
menu-bar fallback already call into them.
Rename the product (Nook → your app) by editing project.yml,
App/Info.plist, and the Package.swift product name when you’re ready
to ship.