Replaces the eval-based set_window_opacity in the plan with the
SetLayeredWindowAttributes implementation that actually shipped.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tauri 2.11 doesn't expose set_opacity on its WebviewWindow (open issue
tauri-apps/tauri#3279). Drop down to the Win32 API directly: ensure
WS_EX_LAYERED is set on the overlay HWND, then SetLayeredWindowAttributes
with an 0..255 alpha. This is true OS-level window translucency — the
same call Tauri will eventually wrap upstream — not a CSS shim.
windows crate version is pinned to 0.61 to match Tauri 2.11.x's
transitive dependency, so WebviewWindow::hwnd() returns a compatible
HWND with no diamond-dependency conflict.
Replaces the earlier eval-based opacity workaround in apply_state and
set_window_opacity. Both call sites now go through apply_window_opacity.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Not a real Tauri 2.11.x permission identifier. Discovered when cargo
check listed the actual valid permissions. Opacity is Rust-side only
and routes through our custom command.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Removed `core:window:allow-set-opacity` from the default capability —
that permission identifier doesn't exist in Tauri 2.11.x. Window
opacity is exposed only on the Rust side; the JS layer routes through
our custom `set_window_opacity` command (added in Task 16).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tauri 2 JS WebviewWindow does not expose setOpacity (only the Rust
side has set_opacity), so the JS layer routes through a custom
command. Surfaced during Task 9 implementation; updates Tasks 16 and
17 to register the command.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patches:
- Wire tauri://destroyed listener through onDestroyed callback so
taskbar-close keeps isOpen in sync (was: defined onOverlayClosed
but never wired).
- Drop Rust-side opacity restore in apply_state; JS event handler
reads useOverlayStore.getState().opacity and restores. Fixes
hotkey-from-50%-opacity stuck at 100%.
- Replace event-based hotkey-registration signal with pull-style
AppState.hotkey_status + get_hotkey_status command. Eliminates
the listener-not-yet-registered race.
- Remove unused LogicalPosition/LogicalSize imports (would have
failed tsc under noUnusedLocals).
- Remove unused urlError selector in OpenOverlayButton (same).
- Replace flushPendingPersist with flushPendingPersistSync that
fires the write fire-and-forget; document the bounded staleness
trade-off (<= 300ms loss on crash).
- Drop broken docs/screenshot.png reference from README.
- Collapse Task 18 down: syncClickThroughCache now lives in Task 9
alongside lib/overlay.ts; Task 18 only touches the live-wiring
hook to keep the cache in sync on UI-side toggles.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Captures the brainstormed design for the two-window overlay app:
architecture, frontend structure, Rust backend split, persistence
model, click-through escape hatch, and the manual verification
checklist that defines "Phase 1 done."
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>