Lightroom-style direct manipulation: pick up a photo (or a multi-
selection) and drop it on a heap to add it. Complements the P
shortcut without replacing it.
PhotoThumbnail
- Becomes draggable. onDragStart reads the current selection from
the photo store at fire time: if the dragged photo is part of the
selection, the payload is the whole selection; otherwise it's
just that one photo. Matches Finder semantics.
- Payload uses a custom MIME (application/x-mulita-photos) so the
drop target can recognise our drags vs. arbitrary file drags from
the OS. Also sets text/plain so dropping outside the app shows a
sensible "N photos" string.
HeapsPanel
- Each heap row is now a drop target. onDragOver previews the drop
effect and highlights the row with a primary ring and a faint
background tint. onDragLeave only clears the highlight if the
cursor actually left the row (not just moved over a child).
- New dropMutation handles the drop: optimistic membership cache
update so the basket affordance flips immediately, rollback on
error from a captured `previous`, success toast naming the heap
and the count of newly-added photos, onSettled invalidation of
heaps + heap-photo-ids + photos so server truth re-syncs.
PhotoThumbnail's title attribute now mentions the drag affordance
alongside click/double-click/shift+click/ctrl+click hints.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>