handleCardSort(column.id, e)}
onfinalize={(e) => handleCardSort(column.id, e)}
>
{#each visibleCards as card (card.id)}
{@const progress = getChecklistProgress(card)}
{@const dueUrgency = getDueUrgency(card.dueDate)}
{
if (selectMode) {
const next = new Set(selectedCardIds);
if (next.has(card.id)) next.delete(card.id);
else next.add(card.id);
selectedCardIds = next;
} else {
selectedCard = card;
}
}}
role="button"
tabindex="0"
onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectedCard = card; } }}
>
{#if data.canEdit}
{
e.stopPropagation();
const next = new Set(selectedCardIds);
if (next.has(card.id)) next.delete(card.id);
else next.add(card.id);
selectedCardIds = next;
}}
>
{#if selectedCardIds.has(card.id)}
{/if}
{/if}
{#if card.labels && card.labels.length > 0}
{#each card.labels as label}
{label.tag.name}
{/each}
{/if}
{#if data.board.cardPrefix && card.cardNumber}
{data.board.cardPrefix}-{card.cardNumber}
{/if}
{card.title}
{#if card.dueDate || card._count?.comments > 0 || card._count?.attachments > 0 || progress}
{#if card.dueDate}
{formatDueDate(card.dueDate)}
{/if}
{#if progress}
{progress.done}/{progress.total}
{/if}
{#if card._count?.comments > 0}
{card._count.comments}
{/if}
{#if card._count?.attachments > 0}
{card._count.attachments}
{/if}
{/if}
{#if card.assignees && card.assignees.length > 0}
{#each card.assignees.slice(0, 3) as assignee}
{/each}
{#if card.assignees.length > 3}
+{card.assignees.length - 3}
{/if}
{/if}