ZubiSniffer - Single Settings / Global Effects / Interface Switch Fix
=====================================================================
Baseline:
  ZubiSniffer-CustomUI-SourcePatch.zip

UI / behavior changes
---------------------
- Sidebar remains icon-only: Packet Cap, IP Vault, Settings, About.
- Settings is now the single configuration destination.
- The old separate tabbed settings editor is embedded and flattened into continuous sections.
- The Settings menu now routes to the embedded Settings page instead of opening another settings window.
- Settings top controls reflow from two columns to one column on narrower windows to prevent clipping/broken card layouts.
- Background engine has a user-selectable base background color.
- Snow, rain, stars, clouds and neon grid use a click-through global overlay above the app shell so they remain visible over the sidebar and page surfaces without blocking clicks.
- Custom image/video remain background media beneath the UI.
- Animation opacity, speed, low-resource mode and pause-when-minimized remain live settings.
- Capture interface display now includes adapter + selected IP target.
- Changing interface from Settings immediately refreshes the embedded settings editor and runtime status.
- Fixed interface-switch logic that previously treated the same physical adapter as unchanged even when the selected IP/target row differed.
- Manual-only IP saving/classification and saved-IP alerts are preserved.

Additional baseline fixes discovered while testing
--------------------------------------------------
- Fixed runtime annotation NameError issues in text_utils.py, error_messages.py,
  utils.py and utils_exceptions.py caused by runtime-evaluated annotations that
  referenced TYPE_CHECKING-only imports.

Validation
----------
- Focused ZubiSniffer UI contract tests: 13 passed.
- Full pytest suite in this Linux container: 49 passed, 1 environment-blocked.
- Remaining blocked test imports the Qt About page; PySide6 is not installed in
  this container. The exact baseline ZIP had the same PySide6 environment failure.
- The exact baseline also failed the runtime annotation test fixed by this patch.
- python -m compileall -q src/session_sniffer: PASS.
- Ruff was not available in this container.

Build note
----------
This package is full updated source. Build the Windows EXE on Windows using the
included BUILD_EXE.bat so Npcap/Qt/Windows-specific dependencies are available.

======================================================================
2026-10-01 — DUPLICATE NAV / FLOATING HEADER / INTERFACE EFFECTS FIX
======================================================================

Root cause of the broken top-left UI
------------------------------------
1. The upstream QMainWindow menu bar was still being constructed and shown, so
   Capture/Tools/Statistics/Data & Files/Settings/Help rendered above the new
   Zubi icon-only sidebar. This created two navigation systems at once.
2. SessionHeader was still created as a direct QMainWindow child but was not
   inserted into the Zubi shell layout. Qt therefore painted the legacy P2P
   header at its default top-left geometry, overlapping the sidebar/page stack.
3. The Capture Interface dialog was still a standalone QDialog with no
   ZubiBackgroundHost, so the selected Snow/Rain/Stars/Clouds/Grid visual engine
   could not render over that window.

Fixes
-----
- The upstream menu/action graph remains instantiated for backend compatibility,
  but the QMenuBar is explicitly hidden at source level. It is no longer a
  visible navigation surface.
- The legacy SessionHeader remains a hidden compatibility/status sink only. It
  cannot paint over the icon rail anymore, and the obsolete Ctrl+F shortcut to
  its hidden search control was removed.
- The Zubi icon-only sidebar is now the only visible main navigation:
  Packet Cap / IP Vault / Settings / About.
- Capture Interface now hosts its whole UI inside ZubiBackgroundHost. This gives
  it the exact saved base color/custom media and the same click-through global
  effects overlay as the main shell.
- Interface effects are raised after construction, on resize, and on show so
  Snow/Rain/Stars/Clouds/Neon Grid stay visible over table/header/buttons while
  never consuming mouse, wheel, keyboard, selection, or drag input.
- Interface table/container styling was tightened with glass transparency,
  cyan/violet borders, and custom scrollbars.
- The same-adapter/different-IP capture-target check from the previous patch is
  retained, so switching target IPs on one physical NIC still performs a real
  rebind instead of being incorrectly ignored.

Validation
----------
- python -m compileall -q src tests: PASS
- tests/test_packet_capture_ui.py: 17 passed
- full pytest: 53 passed, 1 environment-blocked
  - the single blocked test imports PySide6 in this Linux sandbox, where PySide6
    is not installed. This is not an application assertion failure.

Files changed in this patch
---------------------------
- src/session_sniffer/guis/main_window.py
- src/session_sniffer/guis/interface_selection_dialog.py
- src/session_sniffer/guis/stylesheets/_interface.py
- tests/test_packet_capture_ui.py
- ZUBI-UI-FIX-REPORT.txt
