From 1547ad5a709ca0f6c305e63f86e2c97abef225d4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 15 Feb 2026 20:29:29 +0200 Subject: [PATCH] feat: add card cover color with picker in card detail and bar in thumbnail --- src/components/board/CardThumbnail.tsx | 23 ++++++++- .../card-detail/CardDetailModal.tsx | 47 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/components/board/CardThumbnail.tsx b/src/components/board/CardThumbnail.tsx index 1b769e4..734f4d8 100644 --- a/src/components/board/CardThumbnail.tsx +++ b/src/components/board/CardThumbnail.tsx @@ -6,6 +6,7 @@ import { CSS } from "@dnd-kit/utilities"; import type { Card, Label } from "@/types/board"; import { LabelDots } from "@/components/board/LabelDots"; import { ChecklistBar } from "@/components/board/ChecklistBar"; +import { Paperclip, AlignLeft } from "lucide-react"; interface CardThumbnailProps { card: Card; @@ -58,6 +59,17 @@ export function CardThumbnail({ card, boardLabels, columnId, onCardClick }: Card role="article" aria-label={card.title} > + {/* Cover color bar */} + {card.coverColor && ( +
+ )} + {/* Label dots */} {card.labels.length > 0 && (
@@ -69,7 +81,7 @@ export function CardThumbnail({ card, boardLabels, columnId, onCardClick }: Card

{card.title}

{/* Footer row: due date + checklist */} - {(hasDueDate || card.checklist.length > 0) && ( + {(hasDueDate || card.checklist.length > 0 || card.attachments.length > 0 || card.description) && (
{dueDate && ( 0 && ( )} + {card.description && ( + + )} + {card.attachments.length > 0 && ( + + + {card.attachments.length} + + )}
)} diff --git a/src/components/card-detail/CardDetailModal.tsx b/src/components/card-detail/CardDetailModal.tsx index 10679da..d200d94 100644 --- a/src/components/card-detail/CardDetailModal.tsx +++ b/src/components/card-detail/CardDetailModal.tsx @@ -57,6 +57,10 @@ export function CardDetailModal({ cardId, onClose }: CardDetailModalProps) { {/* Right sidebar (40%) */}
+ + + + ); } + +/* ---------- Cover color picker ---------- */ + +function CoverColorPicker({ cardId, coverColor }: { cardId: string; coverColor: string | null }) { + const updateCard = useBoardStore((s) => s.updateCard); + const presets = [ + { hue: "160", label: "Teal" }, { hue: "240", label: "Blue" }, + { hue: "300", label: "Purple" }, { hue: "350", label: "Pink" }, + { hue: "25", label: "Red" }, { hue: "55", label: "Orange" }, + { hue: "85", label: "Yellow" }, { hue: "130", label: "Lime" }, + { hue: "200", label: "Cyan" }, { hue: "0", label: "Slate" }, + ]; + + return ( +
+

+ Cover +

+
+ + {presets.map(({ hue, label }) => ( +
+
+ ); +}