v1.3.0 — per-target spectral constraints + UX polish
Big feature release. Highlights:
- Per-target spectral constraints — per-row required λ ranges, no-gap, extend-blue/red, protect (collision). Pre-stage with a different disperser; tolerant filter silently drops ranges that fall outside the current grating's bandpass.
- Per-target source-centering override — sixth Constraints field. Overrides the global Source-centering Select unconditionally for that one row.
- Customisable top stats bar + catalog hover — drag-and-drop pickers in pop-up dialogs.
- Draggable modals with light-blue header bar + explicit ✕ close on every dialog. Header is the only drag handle; body widgets stay fully interactive.
- Confirm-overwrite dialog for CSV save + session save.
- Compact canvas X/Y inputs (Spinner pair, side-by-side). Per-pixel-square invariant via match_aspect symmetric inflation — image stays at native aspect at any (X, Y).
- Canvas resize loading overlay (1.2 s buffer) using the same gold-spinner widget as file loads.
- Persistent user preferences at
~/.vmpt/preferences.jsoncovering the full Settings tab. Auto-saved on every widget change; Reset display to defaults button wipes the file. - Help panel on by default, persisted.
- Catalog editor z is float-sortable.
Bug fixes: image aspect stretching (multi-causal), DataRange1d.start=None crash, optimizer crash on multi-source catalog with centration field, etc.
Test suite: 183 passed / 5 skipped (was 139 / 4 at v1.2.2).
Install:
```bash
pip install --upgrade jwst-vmpt
vmpt
```
See CHANGELOG.md for the full notes.