({
task,
projectSlug,
assignee,
}: {
task: Task;
projectSlug: string;
assignee: string;
})
| 498 | } |
| 499 | |
| 500 | function TaskCard({ |
| 501 | task, |
| 502 | projectSlug, |
| 503 | assignee, |
| 504 | }: { |
| 505 | task: Task; |
| 506 | projectSlug: string; |
| 507 | assignee: string; |
| 508 | }) { |
| 509 | return ( |
| 510 | <Link |
| 511 | href={projectHref(projectSlug, `/tasks/${task.id}`)} |
| 512 | className="block rounded-[10px] bg-card p-3 transition-colors hover:bg-[hsl(0_0%_99%)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--notfair-accent-border))]" |
| 513 | style={{ boxShadow: "var(--notfair-shadow-sm)" }} |
| 514 | > |
| 515 | <div className="flex items-center justify-between gap-2"> |
| 516 | <span className="font-mono text-[10px] tabular-nums text-[hsl(var(--notfair-ink-4))]"> |
| 517 | {task.display_id.toUpperCase()} |
| 518 | </span> |
| 519 | <span className="text-[10px] text-[hsl(var(--notfair-ink-4))]"> |
| 520 | {relativeTime(task.updated_at)} |
| 521 | </span> |
| 522 | </div> |
| 523 | <p className="mt-1.5 line-clamp-2 text-[13px] font-medium text-[hsl(var(--notfair-ink))]"> |
| 524 | {task.title ?? task.brief} |
| 525 | </p> |
| 526 | {task.title && ( |
| 527 | <p className="mt-0.5 line-clamp-2 text-[11.5px] text-[hsl(var(--notfair-ink-4))]"> |
| 528 | {task.brief} |
| 529 | </p> |
| 530 | )} |
| 531 | <div className="mt-2 flex items-center justify-between gap-2"> |
| 532 | <span className="ns-tag">{assignee}</span> |
| 533 | </div> |
| 534 | </Link> |
| 535 | ); |
| 536 | } |
| 537 | |
| 538 | // ── List view ───────────────────────────────────────────────────────── |
| 539 |
nothing calls this directly
no test coverage detected