What's Changed
- docs: restructure and migrate developer docs
- docs(developer): add repo and site links
- docs(readme): link to local documentation
- fix(annotations): prevent marker stroke gaps
- refactor(region): isolate selector render state without changing UX
- test(region): tighten selector regression access around reveal and replay
- test(region): route selector probe coverage through a single access layer
- perf(region): keep selector hover responsive without changing interaction rules
- fix(dpi): preserve fractional-DPR thumbnail edges in region lists
- refactor(capture): deduplicate logical-region crop outside the GUI flow
- refactor(capture): collapse unannotated selector crops inside gui workflows
- fix(dpi): eliminate fractional-DPR seams in multi-region image assembly
- fix(region): remove Windows fractional-DPR hover artifacts
- perf(region): localize pencil and marker preview repaints
- perf(marker): avoid full preview raster rebuild on every point
- perf(region): shrink pencil and marker preview dirty rects to the tail
- perf(freehand): preserve fractional input for pencil and marker strokes
- perf(region): localize selected-annotation repaints on high-DPI overlays
- perf(freehand): stabilize high-DPI stroke sampling without changing tools
- refactor(tools): converge shared annotation repaint routing across hosts
- perf(region): remove host repaints for detached cursor chrome
- perf(region): cut full-screen overlay work from selection drag
- perf(region): route drag-selection visuals off the full-screen host
- perf(emoji): cache glyph rendering so scaling stays smooth across hosts
- perf(region): replace selection interior blits with a dimming-hole overlay
- fix(region): keep magnifier tracking live during drag capture
- perf(region): replace full-screen selection masks with strip overlays
- perf(region): avoid double-syncing selection preview overlays on pointer move
- test(region): align trace-probe hover expectation with overlay-based repainting
- perf(region): disable drag-frame polling on overlay-driven selection drags
- fix(region): stop re-raising selection overlays on every drag sync
- fix(region): snap selection borders to physical pixels on fractional DPI
- fix(region): revert strip dimming seams and restore selection chrome thickness
- fix(region): over-invalidate cleared window highlights before selection begins
- fix(region): force one host repaint when selection takes over from detection
- perf(region): move Windows capture rendering off the full-screen input host
- fix(windows): stabilize detached capture transitions
- perf(region): localize detached capture window repaints on Windows
- fix(region): restore detached floating UI after completed-selection drags
- fix(region): pad detached chrome dirty rect for size widget ghosting
- fix(ui): keep size readouts aligned with platform display units
- feat(tray): show hotkeys in tray tooltip
- chore: remove openspec in gitignore
- fix: adjust copyright to 2026
- fix(cmake): keep configure output focused on actionable warnings
- feat(canvas): add copy to clipboard support
- feat(canvas): hide surfaces during capture
- fix(screen-canvas): keep copy-export capture stable without native overlay handles
- feat(region-capture): make beaver the default cursor companion
- refactor(settings): remove legacy showMagnifier key, use cursorCompanionStyle as single source of truth
- fix: keep cursor companion aligned during fast region capture movement
- test: keep region selector regression coverage aligned with input and reveal fixes
- test: tolerate real cursor landing offsets in region selector cursor tests
- fix(canvas): avoid double hide/restore cycle during copy-export capture
- test(region): remove unstable cursor polling tests
- docs: clarify that GIF/WebP exports are silent, audio is MP4-only
Full Changelog: https://github.com/victorfu/snap-tray/compare/v1.0.39...v1.0.41