v0.1.90
## Vertical tabs - New SVG collapse/expand glyphs for the sidebar toggle; button centered in the bottom shelf instead of right-pinned. - Compact vertical tabs now show a status dot: gray for pinned, green/red/amber/blue for in-progress/error/warning/indeterminate. - Wider gap between vertical tab rows (6px) and slightly stronger tab strokes for clearer separation. - Inactive tab text alpha lifted 0.55 → 0.62; branding text floored at 0.82 alpha so the Termy wordmark stays readable on dim themes. - Shelf chrome (left edge / right divider / horizontal seam) factored into a single shared frame so top and bottom shelves stay in lockstep. ## Tab drag & titlebar - macOS: AppKit's automatic content-view window drag overridden with a custom `NSView` subclass so tab drags can no longer be hijacked into window moves mid-gesture. - Pending titlebar window-moves cancelled the moment a tab drag becomes active; previews update on global pointer move and commit on release. - Tab mouse-down handlers call `window.prevent_default()` to stop the OS initiating a window move from the same press. ## Terminal pointer mapping - Pointer-to-cell math subtracts the effective vertical sidebar width, so column hit-testing is correct when the sidebar is expanded. ## Search - Overlapping match ranges per line are sorted and merged; `is_any_match` now binary-searches — large result sets hit-test in O(log n). - Skip cell-column precomputation entirely when a line has no matches. - `SearchConfig` is now `Copy + PartialEq`; full-config equality drives re-pattern. ## Terminal grid rendering - Reuse a scratch `dirty_rows` Vec across paint passes instead of allocating a fresh `Arc<[usize]>` each frame. - `take_term_damage_snapshot` preallocates span capacity. ## Settings window - Plain Escape now closes the settings window (was previously consumed by sidebar search focus). ## Build - `[profile.release] strip = "symbols"` — smaller release binaries. - `termy` and `termy_cli` bumped from 0.1.89 → 0.1.90.