c8131a39c8
- vuedraggable@^4.1.0 + sortablejs@1.14.0 (--legacy-peer-deps). - KanbanColumn: <draggable v-model="localDeals" group="kanban-deals" item-key="id" ghost-class="ghost-card" drag-class="drag-card" animation="150"> + #footer empty-state «пусто · перетащите сюда». - DraggableChangeEvent типизирован (added/removed/moved discriminated union). - KanbanView: const → reactive<Record<slug, MockDeal[]>> (vuedraggable v-model требует независимые arrays); shallow-clone {...d} чтобы не мутировать MOCK_DEALS. - onColumnChange: при event.added → element.statusSlug = targetSlug. TODO: POST /api/deals/{id}/transition с проверкой allowed-переходов. - cspell-words.txt: vuedraggable, симулируется. Visual: ghost-card opacity 0.4 + ivory-tint bg, drag-card rotate 1deg. Vitest +1 (всего 71/71 за 7.48s): эмулирует $emit('change', {added}) → проверяет statusSlug update. Полный mouse-DnD не симулируется — JSDOM не умеет drag-events, но event-handler логика покрыта. Регресс: lint+type+format OK; vitest 71/71; vite build (KanbanView lazy-chunk вырос до 180.53KB - SortableJS-обёртка, грузится только на /kanban); story:build 14/20 за 30.45s; Pest 48/48 за 4.88s. CLAUDE.md v1.24->v1.25, реестр Открытых_вопросов v1.33->v1.34. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>