Skip to content

pull over new features from dev#340

Merged
jonathancaudill merged 11 commits into
mainfrom
dev
May 28, 2026
Merged

pull over new features from dev#340
jonathancaudill merged 11 commits into
mainfrom
dev

Conversation

@jonathancaudill
Copy link
Copy Markdown
Contributor

No description provided.

AllDaGearNoIdea and others added 11 commits March 3, 2026 17:16
… keyboard input, closer visual design (#329)

* fix: allow quitting with Cmd+Q when "warn before quitting" is disabled

Replace the "Force Quit App" menu item with a standard Cmd+Q that
routes through showQuitDialog(). When "warn before quitting" is off,
return .terminateNow immediately to avoid a deadlock in
applicationShouldTerminate.

* fix: prevent keyboard/mouse interaction with WebView while dialog is open and improve quit dialog design

Resign WebView as first responder when a dialog appears so Enter/Escape
reach dialog buttons. Disable hit testing on the WebView during dialog
display. Add an NSEvent monitor to block Tab key and play the system beep.
Update quit dialog copy and icon size. Add customIcon support to
DialogButton with a KeycapLabel view for text-based shortcut hints.
Simplify duplicate left-button branch in DialogFooter.

* chore: trim verbose comments to match project style

* fix: address review feedback on dialog focus and actor isolation

Remove overly narrow WKWebView type check when resigning first
responder. Drop unnecessary nonisolated(unsafe) from tabKeyMonitor.

---------

Co-authored-by: AllDaGearNoIdea <AllDaGear@No.Idea>
…anizer, settings redesign

Major additive contribution with new features and improvements — no upstream features removed.

Content Blocker System:
- AdvancedBlockingEngine with SafariConverterLib pipeline
- Site-specific scripts (Facebook, YouTube)
- Filter list management with EasyList integration

Extension System Overhaul:
- Split ExtensionManager into focused modules (Delegate, Installation, Diagnostics, ExternallyConnectable, TabNotifications)
- New Extension Library panel UI
- Bitwarden biometric unlock support
- Native messaging handler

SponsorBlock:
- Built-in YouTube sponsor segment skipping
- SponsorBlock API integration with category options

Air Traffic Control:
- SiteRoutingManager for domain-based tab routing rules
- Settings UI for managing routing rules

Tab Organizer:
- Local LLM-powered tab organization via mlx-swift-lm
- Organization preview and apply workflow

Settings Redesign:
- New NavigationSplitView sidebar layout
- Dedicated tabs for Ad Blocker, SponsorBlock, ATC

Core Improvements:
- Tab: favicon lazy loading, URL sanitization, crash tracking
- TabManager: N+1 query elimination, pre-fetch optimization
- HoverTrackingView replacing SwiftUI .onHover across UI
- PageLoadingProgressBar, EditPinnedURLDialog, View+GlassEffect
- Remove dead code (8 unused files)
- Add .superpowers to gitignore

New SPM dependencies: mlx-swift-lm, SafariConverterLib
… flash

Replace the two separate SpacesSideBarView containers (HStack layout and
SidebarHoverOverlayView) with a single instance rendered as an overlay.
A Color.clear spacer animates width to push web content when pinned.
The floating sidebar slides in/out via offset instead of being
conditionally created/destroyed, preserving view identity and state.

- Delete SidebarHoverOverlayView.swift (logic moved to WindowView)
- Increase toggleSidebar animation from 0.1s to 0.2s for smoother transition
- Animate hover dismissal when sidebar becomes pinned

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace branching if/else HStack with fixed-order ZStack layout so
WebContent keeps stable view identity when swapping sidebar sides.
Sidebar and AI panels slide under web content (zIndex layering) during
the swap animation. When unpinned, sidebar floats above as before.

- Add peekOverlay to HoverSidebarManager so the floating sidebar
  briefly appears on its new side for 2s after a position swap
- Use layoutDirection environment to flip SidebarMenu tab placement
- Wrap all position setters (context menu, settings) in withAnimation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Matches Arc-style instant snap when pinning the sidebar while preserving
the smooth ease-out animation when unpinning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…sible

Animate sidebar toggle in both directions (pin and unpin). When the
floating sidebar is already showing via hover, pinning is instant since
the sidebar is already visually present.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…debar animation

Use each tab's pageBackgroundColor instead of windowBackgroundColor for
webview and split pane backgrounds. Switch sidebar pin/unpin animation
to .smooth(duration: 0.1) for a snappier feel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ssary hover publishes

Replace .environment(\.layoutDirection) override with explicit child ordering
to prevent SF Symbols and text from being mirrored. Guard isMouseInsideSidebar
updates to only publish when the value changes.
* refactor: unify sidebar into single view instance to eliminate redraw flash

Replace the two separate SpacesSideBarView containers (HStack layout and
SidebarHoverOverlayView) with a single instance rendered as an overlay.
A Color.clear spacer animates width to push web content when pinned.
The floating sidebar slides in/out via offset instead of being
conditionally created/destroyed, preserving view identity and state.

- Delete SidebarHoverOverlayView.swift (logic moved to WindowView)
- Increase toggleSidebar animation from 0.1s to 0.2s for smoother transition
- Animate hover dismissal when sidebar becomes pinned

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: smooth animated sidebar position swap

Replace branching if/else HStack with fixed-order ZStack layout so
WebContent keeps stable view identity when swapping sidebar sides.
Sidebar and AI panels slide under web content (zIndex layering) during
the swap animation. When unpinned, sidebar floats above as before.

- Add peekOverlay to HoverSidebarManager so the floating sidebar
  briefly appears on its new side for 2s after a position swap
- Use layoutDirection environment to flip SidebarMenu tab placement
- Wrap all position setters (context menu, settings) in withAnimation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: remove animation when pinning sidebar, keep it when unpinning

Matches Arc-style instant snap when pinning the sidebar while preserving
the smooth ease-out animation when unpinning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: restore pinning animation, skip when floating sidebar already visible

Animate sidebar toggle in both directions (pin and unpin). When the
floating sidebar is already showing via hover, pinning is instant since
the sidebar is already visually present.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use page background color for webview containers and speed up sidebar animation

Use each tab's pageBackgroundColor instead of windowBackgroundColor for
webview and split pane backgrounds. Switch sidebar pin/unpin animation
to .smooth(duration: 0.1) for a snappier feel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: avoid layoutDirection mirroring in SidebarMenu and reduce unnecessary hover publishes

Replace .environment(\.layoutDirection) override with explicit child ordering
to prevent SF Symbols and text from being mirrored. Guard isMouseInsideSidebar
updates to only publish when the value changes.

* Quit Fixes: correct quitting behaviour when 'warn' is false, improved keyboard input, closer visual design (#329)

* fix: allow quitting with Cmd+Q when "warn before quitting" is disabled

Replace the "Force Quit App" menu item with a standard Cmd+Q that
routes through showQuitDialog(). When "warn before quitting" is off,
return .terminateNow immediately to avoid a deadlock in
applicationShouldTerminate.

* fix: prevent keyboard/mouse interaction with WebView while dialog is open and improve quit dialog design

Resign WebView as first responder when a dialog appears so Enter/Escape
reach dialog buttons. Disable hit testing on the WebView during dialog
display. Add an NSEvent monitor to block Tab key and play the system beep.
Update quit dialog copy and icon size. Add customIcon support to
DialogButton with a KeycapLabel view for text-based shortcut hints.
Simplify duplicate left-button branch in DialogFooter.

* chore: trim verbose comments to match project style

* fix: address review feedback on dialog focus and actor isolation

Remove overly narrow WKWebView type check when resigning first
responder. Drop unnecessary nonisolated(unsafe) from tabKeyMonitor.

---------

Co-authored-by: AllDaGearNoIdea <AllDaGear@No.Idea>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Maciej Baginski <baginskimaciek08@gmail.com>
feat: content blocker, extension overhaul, SponsorBlock, ATC, tab organizer, settings redesign
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 28, 2026

Important

Review skipped

Too many files!

This PR contains 156 files, which is 6 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5ee77b6d-6a30-4288-b5e5-cf48e0a91fa2

📥 Commits

Reviewing files that changed from the base of the PR and between 1613388 and fe81d9e.

📒 Files selected for processing (156)
  • .gitignore
  • App/AppDelegate.swift
  • App/ContentView.swift
  • App/NookApp.swift
  • App/NookCommands.swift
  • App/Window/WindowView.swift
  • CommandPalette/CommandPalette Accessories/CommandPaletteSuggestionView.swift
  • CommandPalette/CommandPalette Accessories/HistorySuggestionItem.swift
  • CommandPalette/CommandPalette Accessories/TabSuggestionItem.swift
  • CommandPalette/CommandPaletteView.swift
  • Navigation/Sidebar/SidebarBottomBar.swift
  • Navigation/Sidebar/SidebarHeader.swift
  • Navigation/Sidebar/SpaceContextMenu.swift
  • Navigation/Sidebar/SpacesList/SpacesList.swift
  • Navigation/Sidebar/SpacesList/SpacesListItem.swift
  • Navigation/Sidebar/SpacesSideBarView.swift
  • Nook.xcodeproj/project.pbxproj
  • Nook.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
  • Nook/Adapters/TabListAdapter.swift
  • Nook/Components/Browser/Window/TabCompositorView.swift
  • Nook/Components/Dialog/DialogView.swift
  • Nook/Components/DragDrop/NookDragPreviewWindow.swift
  • Nook/Components/DragDrop/NookDragSessionManager.swift
  • Nook/Components/DragDrop/NookDragSourceView.swift
  • Nook/Components/DragDrop/NookDropZoneHostView.swift
  • Nook/Components/EmojiPicker/EmojiPicker.swift
  • Nook/Components/Extensions/ExtensionActionView.swift
  • Nook/Components/Extensions/ExtensionLibraryButton.swift
  • Nook/Components/Extensions/ExtensionLibraryMoreMenu.swift
  • Nook/Components/Extensions/ExtensionLibraryPanel.swift
  • Nook/Components/Extensions/ExtensionLibraryView.swift
  • Nook/Components/Extensions/ExtensionPermissionView.swift
  • Nook/Components/FindBar/FindBarView.swift
  • Nook/Components/Peek/PeekOverlayView.swift
  • Nook/Components/Settings/PrivacySettingsView.swift
  • Nook/Components/Settings/ProfileRowView.swift
  • Nook/Components/Settings/SettingsUtils.swift
  • Nook/Components/Settings/SettingsView.swift
  • Nook/Components/Settings/SettingsWindow.swift
  • Nook/Components/Settings/ShortcutRecorderView.swift
  • Nook/Components/Settings/Tabs/AI.swift
  • Nook/Components/Settings/Tabs/AdBlocker.swift
  • Nook/Components/Settings/Tabs/AirTrafficControlSettingsView.swift
  • Nook/Components/Settings/Tabs/Appearance.swift
  • Nook/Components/Settings/Tabs/General.swift
  • Nook/Components/Settings/Tabs/SponsorBlock.swift
  • Nook/Components/Sidebar/AIChat/AISidebarResizeView.swift
  • Nook/Components/Sidebar/AIChat/SidebarAIChat.swift
  • Nook/Components/Sidebar/MediaControls/MediaControlsView.swift
  • Nook/Components/Sidebar/Menu/SidebarMenu.swift
  • Nook/Components/Sidebar/Menu/SidebarMenuDownloadsHover.swift
  • Nook/Components/Sidebar/Menu/SidebarMenuDownloadsTab.swift
  • Nook/Components/Sidebar/Menu/SidebarMenuHistoryTab.swift
  • Nook/Components/Sidebar/Menu/SidebarMenuTab.swift
  • Nook/Components/Sidebar/NavButtonsView.swift
  • Nook/Components/Sidebar/PinnedButtons/PinnedGrid.swift
  • Nook/Components/Sidebar/PinnedButtons/PinnedTabView.swift
  • Nook/Components/Sidebar/SidebarHoverOverlayView.swift
  • Nook/Components/Sidebar/SidebarResizeView.swift
  • Nook/Components/Sidebar/SpaceSection/SpaceSeparator.swift
  • Nook/Components/Sidebar/SpaceSection/SpaceTab.swift
  • Nook/Components/Sidebar/SpaceSection/SpaceTitle.swift
  • Nook/Components/Sidebar/SpaceSection/SpaceView.swift
  • Nook/Components/Sidebar/SpaceSection/SplitTabRow.swift
  • Nook/Components/Sidebar/SpaceSection/TabFolderView.swift
  • Nook/Components/Sidebar/TopBar/TopBarView.swift
  • Nook/Components/Sidebar/URLBarView.swift
  • Nook/Components/Sidebar/UpdateNotification/SidebarUpdateNotification.swift
  • Nook/Components/Toast/ToastView.swift
  • Nook/Components/WebsiteView/PageLoadingProgressBar.swift
  • Nook/Components/WebsiteView/WebView.swift
  • Nook/Components/WebsiteView/WebsiteView.swift
  • Nook/Extensions/View+GlassEffect.swift
  • Nook/Info.plist.bak
  • Nook/Managers/AIManager/AIConfigService.swift
  • Nook/Managers/AIManager/AIProvider.swift
  • Nook/Managers/AIManager/AIService.swift
  • Nook/Managers/AIManager/MCP/MCPTransport.swift
  • Nook/Managers/AIManager/Providers/OpenAICompatibleProvider.swift
  • Nook/Managers/AIManager/Tools/BrowserToolExecutor.swift
  • Nook/Managers/AIManager/Tools/BrowserTools.swift
  • Nook/Managers/AuthenticationManager/AuthenticationManager.swift
  • Nook/Managers/BrowserManager/BrowserManager.swift
  • Nook/Managers/ContentBlockerManager/AdvancedBlockingEngine.swift
  • Nook/Managers/ContentBlockerManager/ContentBlockerManager.swift
  • Nook/Managers/ContentBlockerManager/ContentRuleListCompiler.swift
  • Nook/Managers/ContentBlockerManager/FilterListManager.swift
  • Nook/Managers/ContentBlockerManager/Resources/facebook-sponsored-blocker.js
  • Nook/Managers/ContentBlockerManager/Resources/nook-filters-default.txt
  • Nook/Managers/ContentBlockerManager/Resources/scriptlets.corelibs.json
  • Nook/Managers/ContentBlockerManager/Resources/youtube-ad-blocker.js
  • Nook/Managers/ContentBlockerManager/Resources/youtube-sponsorblock.js
  • Nook/Managers/DialogManager/DialogManager.swift
  • Nook/Managers/DialogManager/Dialogs/EditPinnedURLDialog.swift
  • Nook/Managers/DialogManager/Dialogs/SpaceCreationDialog.swift
  • Nook/Managers/DialogManager/Dialogs/SpaceEditDialog.swift
  • Nook/Managers/DownloadManager/DownloadManager.swift
  • Nook/Managers/DragManager/DragLockManager.swift
  • Nook/Managers/DragManager/TabDragManager.swift
  • Nook/Managers/ExtensionManager/BitwardenBiometricHandler.swift
  • Nook/Managers/ExtensionManager/ExtensionBridge.swift
  • Nook/Managers/ExtensionManager/ExtensionManager+Delegate.swift
  • Nook/Managers/ExtensionManager/ExtensionManager+Diagnostics.swift
  • Nook/Managers/ExtensionManager/ExtensionManager+ExternallyConnectable.swift
  • Nook/Managers/ExtensionManager/ExtensionManager+Installation.swift
  • Nook/Managers/ExtensionManager/ExtensionManager+TabNotifications.swift
  • Nook/Managers/ExtensionManager/ExtensionManager.swift
  • Nook/Managers/ExtensionManager/InternalNativePortHandler.swift
  • Nook/Managers/ExtensionManager/NativeMessagingHandler.swift
  • Nook/Managers/ExtensionManager/PopupUIDelegate.swift
  • Nook/Managers/FindManager/FindManager.swift
  • Nook/Managers/HoverSidebarManager/HoverSidebarManager.swift
  • Nook/Managers/ImportManager/Safari.swift
  • Nook/Managers/KeyboardShortcutManager/KeyboardShortcutManager.swift
  • Nook/Managers/KeyboardShortcutManager/WebsiteShortcutDetector.swift
  • Nook/Managers/MediaControlsManager/MediaControlsManager.swift
  • Nook/Managers/PeekManager/PeekManager.swift
  • Nook/Managers/PeekManager/PeekWebView.swift
  • Nook/Managers/ProfileManager/ProfileManager.swift
  • Nook/Managers/SearchManager/SearchManager.swift
  • Nook/Managers/SearchManager/Utils.swift
  • Nook/Managers/SiteRoutingManager/SiteRoutingManager.swift
  • Nook/Managers/SiteRoutingManager/SiteRoutingRule.swift
  • Nook/Managers/SplitViewManager/SplitViewManager.swift
  • Nook/Managers/SponsorBlockManager/SponsorBlockManager.swift
  • Nook/Managers/SponsorBlockManager/SponsorBlockModels.swift
  • Nook/Managers/TabManager/TabManager.swift
  • Nook/Managers/TabOrganizerManager/LocalLLMEngine.swift
  • Nook/Managers/TabOrganizerManager/TabOrganizationApplier.swift
  • Nook/Managers/TabOrganizerManager/TabOrganizationPlan.swift
  • Nook/Managers/TabOrganizerManager/TabOrganizationPrompt.swift
  • Nook/Managers/TabOrganizerManager/TabOrganizerManager.swift
  • Nook/Managers/WebViewCoordinator/WebViewCoordinator.swift
  • Nook/Models/AI/AIModels.swift
  • Nook/Models/BrowserConfig/BrowserConfig.swift
  • Nook/Models/BrowserWindowState.swift
  • Nook/Models/Extension/ExtensionModels.swift
  • Nook/Models/KeyboardShortcut/KeyboardShortcut.swift
  • Nook/Models/Settings/NewDocumentTarget.swift
  • Nook/Models/Tab/Tab.swift
  • Nook/Models/Tab/TabFolder.swift
  • Nook/Models/Tab/TabsModel.swift
  • Nook/Protocols/TabListDataSource.swift
  • Nook/ThirdParty/MuteableWKWebView/MuteableWKWebView.m
  • Nook/Utils/AnyShape.swift
  • Nook/Utils/Colors.swift
  • Nook/Utils/DitheringUtils.swift
  • Nook/Utils/DragWindowView.swift
  • Nook/Utils/GradientInterpolation.swift
  • Nook/Utils/HoverTrackingView.swift
  • Nook/Utils/WebKit/FocusableWKWebView.swift
  • Settings/NookSettingsService.swift
  • UI/Buttons/NavButtons/NavButton.swift
  • UI/Buttons/NavButtons/NavMenuStyle.swift
  • UI/Buttons/NookButton/NookButtonStyle.swift
  • UI/ConditionalModifiers.swift

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@jonathancaudill jonathancaudill merged commit 584f372 into main May 28, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants