Compact-only notch with expandable panels
NO
8d ago+776+776+012345678901234567890123456789-1082-1082-0123456789012345678901234567890123456789
Summary
Compact is now the only notch layout (VISION.md items 1 and 2). Calendar, mirror and shelf open as panels: the notch shape springs wider and taller to each panel's own size, then collapses back to the music player. The design is in docs/PANELS.md.
What changed
NotchPanel(components/Notch/NotchPanel.swift) describes a panel: id, title, icon, availability, preferred size and content, plus start/stop hooks. The built-in panels are listed inNotchPanels.builtIn, so a Raycast panel later is one more entry there.- Header row (
NotchPanelHeader):- Left side: the settings gear first, then the calendar, mirror and shelf buttons.
- Right side: the battery, or the volume/brightness indicator while one is showing.
- On a notched display the two sides sit either side of the cutout. Without a notch it's a plain bar.
- Clicking the active button again goes back to the music player.
- Morph. The panel area is framed at the panel's size inside a spring (
StandardAnimations.panelMorph), so a single notch shape animates between sizes in one window. Only the content fades. - Hover and close. After each panel switch, the real pointer position is checked against the notch's measured frame and fed into the existing hover handling. A pointer left outside after a collapse closes the notch through the usual 350 ms grace period. Popovers and sharing still keep it open.
- Per-display state.
BoringViewModel.activePanelreplaces the sharedcoordinator.currentView.open(panel:)picks the starting panel. Dragging a file in opens the shelf, or switches to it if the notch is already open. - Mirror. The panel takes the camera's aspect ratio, or a square for the circle shape. The camera only runs while the panel is open, and
CameraPreviewViewfills the frame it's given. - Sizing. The window size comes from
maxOpenNotchSize(now 640×280, plus shadow room), and panels are clamped to it. Panel widths are widened where needed so the header fits beside the real cutout. - Removed:
- the tab bar,
BoringHeader, and the old full layoutNotchHomeView(the music controls still in use moved tocomponents/Music/MusicPlayerControls.swift) - the
compactMode, "Always show tabs" and "Remember last tab" settings and their strings - the stale values of those settings, which are cleared from user defaults at launch
- the tab bar,
- Defaults.
showCalendarandshowMirrornow default to on, so the buttons are there out of the box. Anyone who turned either off keeps it off.
Unverified at runtime
Agents don't launch the app, so none of this has been seen running. scripts/dev.sh build passes, and the two compiler warnings it shows are the same as on main.
- How the spring feels compared with Vorsaint, and whether the music player's measured height is right.
- Whether the header fits beside wider cutouts. The music player is now about 50 pt wider on notched Macs so the four left-side buttons fit.
- Behaviour on non-notch displays (MacBook Air M1) and external monitors.
- The notch window is now 300 pt tall instead of 210 pt. Clear areas should let clicks through as before, but the lock-screen bug where the window swallows nearby clicks may now cover a larger area.
- Turning off a panel in Settings while it's open may not take effect until the notch redraws.
- The mirror opens at 16:9 the first time and reshapes once a camera with a different shape starts.
How to test
- Quit the installed Boring Notch first (right-click the notch and choose Quit). The dev build uses the same bundle ID and won't start while it's running.
- Build and run:
Ctrl-C quits.cd /Users/knewton/.t3/worktrees/not.boring.notch/feat-compact-only && scripts/dev.shscripts/dev.sh killalso stops it. - Permissions:
- Camera for the mirror. You're asked the first time you open the mirror panel.
- Calendar and Reminders for the calendar panel.
- Accessibility, only if you use the volume/brightness overlay or notification features.
- Ad-hoc rebuilds may ask for these again.
Checklist (start on the notch-less MacBook Air M1):
- Hover over or click the notch. Expected: the music player, under a top bar with the gear, calendar, camera and tray icons on the left and the battery on the right. There's no gap in the middle on a display without a notch.
- Click the calendar icon. Expected: the notch springs wider and taller and shows the date strip and events. Click it again and it springs back to the music player.
- Click the camera icon. Expected: the notch reshapes to the camera's shape and the camera's green light comes on. Switching panels or closing the notch turns the camera off.
- Set the mirror shape to circle in Settings. Expected: a square panel with a round preview.
- Click the tray icon. Expected: a wide, short shelf panel.
- Drag a file to the top of the screen, once with the notch closed and once with it open on another panel. Expected: it opens or switches to the shelf.
- Open the calendar, collapse it, then move the pointer away. Expected: the notch closes about 0.35 s later. While the pointer stays inside it never closes, even right after a collapse.
- Close the notch and reopen it. Expected: it opens on the music player, or on the shelf if the shelf has files and "open shelf by default" is on.
- Try with no music playing. Expected: the last track's info is still shown and the panels still work.
- Open Settings. Expected: "Compact mode", "Always show tabs" and "Remember last tab" are gone. Turning off "Show calendar" or "Enable boring mirror" hides that button.
- On a notched Mac or an external monitor later: the icons sit beside the cutout without overlapping it.
🤖 Generated with Claude Code
Summary by cubic
Makes compact the only notch layout. Calendar, mirror and shelf now open as panels that spring the notch shape to their own size, then collapse back to the music player.
- The open notch is a header row above one panel: settings and feature buttons on one side of the cutout, battery or OSD on the other (a plain bar without a notch).
- Each panel is a
NotchPanel(id, title, icon, availability, size, content, start/stop hooks); the built-ins are registered inNotchPanels.builtIn, so a future Raycast panel is one entry. - The notch shape morphs between panel sizes in a single window via
StandardAnimations.panelMorph; only the content fades. Clicking the active button again returns to home. activePanelis per display and replaces the sharedcoordinator.currentView; dragging a file opens the shelf, or switches to it if the notch is already open. Hover is reconciled against the measured frame on everyactivePanelchange, covering switches, drags, and panels turned off in Settings.- The mirror sizes to the camera's aspect ratio (square for the circle shape) and defaults to 4:3 until a camera has run; the camera only runs while its panel is open and stops when the panel is turned off in Settings. A camera disconnecting only hides the mirror button: the panel stays active instead of silently falling back to home, and reconnecting never restarts capture behind home.
- The mirror button is hidden on Macs without a camera.
- Removed the tab bar, the old full layout, the
compactModesetting, "Always show tabs" and "Remember last tab"; stale values of the removed settings are cleared from user defaults at launch. showCalendarandshowMirrornow default to on; users who turned either off keep it off.
Known risks
- None of this has been run; it builds with the same compiler warnings as
main. - The notch window is now 300pt tall instead of 210pt; the lock-screen click-swallowing bug may cover a larger area.
- The mirror opens at 4:3 the first time and reshapes once a camera with a different shape starts.