v1.1.2
What's new
# Changelog
All notable changes to this project are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.1.2] - 2026-09-15
### Fixed
- A bag window held mid-drag is now left alone by a layout pass that fires
while you are holding it — clicking a vendor or the bank with a bag in hand
opens the bags again. The window used to be snapshotted wherever the cursor
happened to be, which recorded the cursor as Blizzard's own slot (so
shift-right-click and `/mmb reset` put the bag back to a spot Blizzard never
chose) and re-anchored the window out from under the pointer.
- A flush that gives up waiting for a bag to acquire a rect no longer leaves
the next one believing it follows a Blizzard layout pass. The next drag would
otherwise have its own drop point recorded as Blizzard's slot, quietly
breaking reset for that bag.
- Compacting no longer stands down for the rest of the session on a single
layout it cannot model. The reading is validated on every layout pass, so it
is now un-stood-down on any pass that reproduces Blizzard's output again. The
explanation is still printed only once per session.
- A UI scale or resolution change now drops the measured column geometry
instead of re-stacking from it. The spacing and free height are measured in
UIParent units at a particular scale, so re-flowing from them after a change
misplaced the column; it re-opens to Blizzard's own slots until the next
layout pass re-measures.
- The store description and other repository-only material under `docs/` is no
longer copied into the packaged addon. `.pkgmeta`'s ignore list is opt-out and
the directory was not on it, so the CurseForge copy would have shipped inside
the addon folder.
## [1.1.1] - 2026-09-15
### Added
- Dropping a window near another window's edge, or the screen's, now lands it
exactly flush instead of overlapping by however much the drop was off. Bag
windows are opaque, so even a small overlap made the one underneath
unreadable. Each axis snaps independently, only windows you are actually
beside are considered, and nothing already parked is moved.
## [1.1.0] - 2026-09-14
### Added
- `/movemybags lock` (and `unlock`) stops bag windows being dragged. Saved
positions still apply and both resets still work; only the drag is off.
### Fixed
- After the column had closed up around a moved bag, an accidental nudge on
one of the re-stacked bags was stored as a real move, and that bag then
stayed stuck in the compacted spot when the column re-opened. A bag that was
never moved and lands where it started is now left alone, wherever that was.
- Bag windows are no longer clamped to the screen until the player actually
drags one. `ContainerFrameTemplate` has no `clampedToScreen`, and clamping
changes how Blizzard's own chain lays out near the edge, so applying it on
attach touched a layout the addon promises to leave alone.
- If `UpdateContainerFrameAnchors` is not yet defined when the addon file runs,
the hook is retried at `PLAYER_LOGIN` instead of leaving compacting off for
the whole session.
- The weekly API-contract workflow adds its report to the open issue rather
than opening a new one every week the check fails.
### Changed
- The README is now the player-facing page; the engineering notes moved to
`DESIGN.md`.
## [1.0.3] - 2026-09-13
### Fixed
- A bag that is shown but never acquires a rect — another addon clearing its
points, a reparent gone wrong — no longer leaves an `OnUpdate` running every
frame for the rest of the session. The retry now gives up after a second and
waits for the next bag open, drag or reset.
## [1.0.2] - 2026-09-13
First published release. 1.0.0 and 1.0.1 were both tagged but never published:
the release workflow passed the upload tokens under environment variable names
that the pinned version of the packager does not read, so it built the addon
and uploaded nothing while reporting success. The addon code is identical
across all three; only the release pipeline changed.
Verified against Blizzard's 12.1.0 (build 69587) UI source, and covered by a
headless test suite, but **not yet exercised in a live client** — in particular
the two checks that only the game can answer: that item clicks in combat are
never blocked, and that nothing from this addon appears in `Logs/taint.log`.
See `TESTING.md` if you want to run those before trusting it in a raid.
### Added
- Draggable bag windows, separate and combined, with positions persisted
account-wide and keyed by bag ID (the combined window gets its own key, so the
two modes never overwrite each other).
- Shift-right-click a window to return it to Blizzard's default slot, and
`/movemybags` (`/mmb`) with a `reset` argument that clears all positions.
Resets replay the position recorded from Blizzard's own last layout pass, so
no Blizzard layout code ever runs on the addon's tainted path.
- Positions stored in UIParent units and converted on both read and write, so
they survive `UpdateContainerFrameAnchors` rescaling the bags, plus clamping
on restore for resolution and UI-scale changes.
- Enumeration via `ContainerFrameContainer.ContainerFrames`, with a
`_G["ContainerFrame"..i]` fallback and per-window `OnShow` hooks, so the addon
survives reparenting and `UpdateContainerFrameAnchors` ceasing to be a global.
- Stand-down detection: a bag window that gains an Edit Mode registration, a
native `OnDragStart`, or the `ScriptBindings` forbidden aspect is left to
Blizzard. It is still re-anchored so it cannot trail a bag you did move, but
it never receives a saved position, including a stale one.
- A drag that lands within two pixels of Blizzard's own slot is treated as an
accidental nudge and clears the saved position instead of storing it.
- Positions record the window's unscaled height, so a bag parked in the upper
half of the screen keeps its top edge when the bag is upgraded (or when the
same bag ID is a larger bag on another character) instead of growing off the
top and being clamped back down. Bags parked low keep their bottom edge and
grow upward, as Blizzard's own do.
- The column closes up when a bag is dragged out of it, and re-opens when the
bag is put back — both on the drop, with no reopen or reload and nothing to
turn on. The column origins and spacing are measured from Blizzard's own
output rather than reimplementing its layout (two of the constants involved
are locals and unreachable from an addon), and the measurement is kept so a
drop can re-flow immediately. It validates itself against Blizzard's output on
every layout pass and stands down rather than misplacing bags if the two
disagree, or while a stood-down window is open.
- Luacheck linting, a scheduled TOC interface-version bump, a tag-driven release
workflow built on the BigWigs packager, and a headless test suite covering the
layout algorithm against a stand-in for the client.
- `tools/check-api-contract.sh` plus a weekly workflow, asserting against
Blizzard's live UI source that the facts the addon is built on still hold and
opening an issue when one stops. Each check names the design decision it
invalidates.
### Notes
Verified against Blizzard's 12.1.0 (build 69587) UI source. Two assumptions from
the original project brief did not survive that check and were corrected:
`ContainerFrameCombinedBags` is *not* natively draggable (it is `movable="true"`
but has no drag handler), and `SetPoint` offsets are interpreted in the anchored
frame's own units, which the brief's reference `Place` did not account for.
This mod has no additional files

