export const PROJECT_TICKET_TYPES = [ { label: "Task", value: "task" }, { label: "Bug", value: "bug" }, { label: "Story", value: "story" }, { label: "Epic", value: "epic" }, { label: "Improvement", value: "improvement" }, { label: "Subtask", value: "subtask" }, ] as const; export const TYPE_LABEL: Readonly> = Object.fromEntries( PROJECT_TICKET_TYPES.map((type) => [type.value, type.label]), ); export const TYPE_STYLES: Readonly> = { task: "bg-slate-500/15 text-slate-400 border-slate-500/30", bug: "bg-red-500/15 text-red-400 border-red-500/30", story: "bg-emerald-500/15 text-emerald-400 border-emerald-500/30", epic: "bg-violet-500/15 text-violet-400 border-violet-500/30", improvement: "bg-amber-500/15 text-amber-400 border-amber-500/30", subtask: "bg-sky-500/15 text-sky-400 border-sky-500/30", }; /** Safely extracts readable text from Payload's Lexical rich-text JSON. */ export function richTextToPlaintext(value: unknown): string { if (typeof value === "string") return value; if (!value || typeof value !== "object") return ""; const node = value as { text?: unknown; children?: unknown }; if (typeof node.text === "string") return node.text; if (!Array.isArray(node.children)) return ""; return node.children .map((child) => richTextToPlaintext(child)) .filter(Boolean) .join(" "); }