- UiElement: two new virtuals GetDragPayload()/GetDragGhost() (default null)
keep UiRoot item-agnostic; any leaf can opt into drag by overriding these.
- UiItemSlot: SlotIndex + SourceKind properties for payload identity; two
overrides return ItemDragPayload / icon ghost when the slot is occupied.
FindList() walks the parent chain to locate the owning UiItemList and its
registered IItemListDragHandler.
- UiItemSlot.OnEvent: MouseDown now just consumes the press; use-item fires
on Click (mouse-up) so a drag doesn't also trigger the use-item callback.
DragEnter → ask handler, set Accept/Reject overlay. DragOver → reset to
None (fires on leave). DropReleased → clear overlay + dispatch to handler
when Data0 == 1 (accepted). DragBegin consumed (source).
- OnDraw: accept/reject sprite overlay drawn last, guarded on id != 0 to
avoid the resolve(0)-→-magenta footgun.
- ToolbarControllerTests: Click_emitsUseForBoundItem changed from MouseDown
to Click to match the new dispatch.
- 12 new DragDropSpineTests pass; full suite 481/483 (2 pre-existing skips).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>