Add a 32px invisible strip on the left edge of the viewport that
auto-opens the sidebar when the user drags a card and dwells near the
edge for >=400ms. Removes the manual toggle step when moving cards to
sidebar-located columns.
- App.tsx: global mousemove listener while drag is active; 400ms hover
timer; sets navOpen(true) when triggered; cancels on pointer leave or
drag end. No auto-close on drag end (user keeps sidebar open).
- dropzone.css: subtle inset blue glow with pulse animation while
pointer is inside the strip and a drag is active.
- KanbanColumn.tsx: add data-column-id and data-column-location to the
Paper root for stable e2e selectors.
- e2e/sidebar-dropzone.spec.ts: Playwright test driving a slow drag
to the left edge, asserting the strip arms, sidebar opens, and the
card moves to a sidebar column via /api/board.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a column-level "Seleccionar Aleatorio" context menu entry that picks
a card at random from the column with a roulette-style highlight
animation that decelerates to the winner.
Selection respects existing filters (uses cardsByColumn which is the
post-filter view) and always excludes locked cards. Menu entry is
disabled when nothing pickable is left.
Implementation:
- KanbanColumn: new Menu.Item with IconDice5; data-test selector for e2e.
- onPickRandom prop wired from KanbanColumn -> App.
- handlePickRandom in App.tsx: cryptographically random winner via
crypto.getRandomValues, 2 full laps + offset, cubic decay 50ms -> 220ms,
follows the active card with scrollIntoView.
- src/styles/roulette.css: .kanban-roulette-active (blue pulse, single
step) and .kanban-roulette-winner (green pulse + scale, ~1.6s).
Imported globally from main.tsx.
Manual verification only (visual timing + needs real cards). Backend
untouched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>