feat: annotation UX overhaul, animated packing, toolbar redesign

- PinOverlay: zero-allocation rendering with in-place Graphics/Text updates,
  fix WebGL texture crash (addressModeU null) from orphaned Text objects
- Pins always visible on media, track during drag via updatePositions() fast path
- Replace eraser with Review mode in toolbar tool group (orange gradient)
- Add tool instruction hints bar below toolbar (context-sensitive per tool)
- Feedback panel: glassmorphism, improved ThreadDetail/CommentItem/ThreadListItem
- Timestamps: relative with "ago" suffix, full date on hover tooltip
- De-emphasize pin numbers, show status text in thread list
- Animated arrangement transitions (easeOutCubic, 320ms) for pack/grid/row/column
- Disable snap guides (user requested)
- Paste now selects newly created items
- Remove eraser keyboard shortcuts, remap tool shortcuts
- Orphaned thread cleanup: safe destroy check for deleted media pins
This commit is contained in:
Hiren Kangad
2026-03-11 01:53:56 +05:30
parent ed8424d9a1
commit fc2d9df741
16 changed files with 611 additions and 360 deletions
+8 -8
View File
@@ -249,8 +249,8 @@ export class SelectionManager {
// Lift shadow + spring scale on all selected image sprites
this._applyLift();
// Begin snap guide session
this._snapGuides.beginSession(this.selectedIds);
// Snap guides disabled — users found it annoying
// this._snapGuides.beginSession(this.selectedIds);
}
if (this._objectDragging) {
@@ -266,11 +266,11 @@ export class SelectionManager {
prospective.x += ddx;
prospective.y += ddy;
// Snap to alignment guides
const snap = this._snapGuides.computeSnap(prospective, this._viewport);
ddx += snap.dx;
ddy += snap.dy;
this._snapGuides.drawGuides(snap.guides, this._viewport);
// Snap guides disabled
// const snap = this._snapGuides.computeSnap(prospective, this._viewport);
// ddx += snap.dx;
// ddy += snap.dy;
// this._snapGuides.drawGuides(snap.guides, this._viewport);
// Move all selected items by corrected delta and broadcast all together
for (const item of selected) {
@@ -311,7 +311,7 @@ export class SelectionManager {
if (this._objectDragging) {
// End object drag — drop shadow + spring scale back
this._applyDrop();
this._snapGuides.endSession();
// this._snapGuides.endSession();
this._objectDragging = false;
// Resume viewport drag