t.shouldGiveUp
? "2px solid #f97316"
: t.isDue
? "2px solid #3b82f6"
: "1px solid #e5e7eb",
),
overflow: "hidden",
}}
>
{/* Thread header */}
t.shouldGiveUp
? "#fff7ed"
: t.isDue
? "#eff6ff"
: "#f9fafb",
),
borderBottom: "1px solid #e5e7eb",
}}
>
{/* Subject */}
{derive(thread, (t) => t.subject)}
{/* Ping count badge */}
{ifElse(
derive(thread, (t) => t.pingCount > 0),
{derive(thread, (t) => t.pingCount)} pings
,
null,
)}
{/* Context badge */}
{/* Metadata row */}
From: {derive(thread, (t) => t.lastResponder)}
Last: {derive(
thread,
(t) => formatDate(t.lastMessageDate),
)}
(t.isDue ? "#dc2626" : "#059669"),
),
}}
>
{derive(
thread,
(t) =>
formatDaysDisplay(
t.daysSinceLastResponse,
t.settings.context,
),
)} waiting
{/* Settings panel (collapsible) */}
{ifElse(
settingsOpen,
,
null,
)}
{/* Thread history (expandable) */}
{ifElse(
isExpanded,
{derive(thread, (t) =>
t.emails.map((email, i) => (
{email.from}
{formatDate(email.date)}
{email.snippet?.slice(0, 200)}
{(email.snippet?.length || 0) > 200
? "..."
: ""}
)))}
,
null,
)}
{/* Draft / Send area */}
{ifElse(
isSendingThis,
// Gmail-sender UI shown inline when this thread is active
,
// Draft editing UI
(() => {
const isGenerating = computed(() =>
generatingDraftFor.get() === uiThreadId &&
draftLlmResult.pending
);
const hasDraft = computed(() => {
const d = drafts.get();
if (d[uiThreadId]) return true;
const genFor = generatingDraftFor.get();
if (
genFor === uiThreadId &&
!draftLlmResult.pending &&
draftLlmResult.result
) {
return true;
}
return false;
});
const draftText = computed((): string => {
const d = drafts.get();
if (d[uiThreadId]) return String(d[uiThreadId]);
const genFor = generatingDraftFor.get();
if (genFor === uiThreadId) {
const result = draftLlmResult.result;
const error = draftLlmResult.error;
return String(result || error || "");
}
return "";
});
return ifElse(
isGenerating,
Generating follow-up draft...
,
ifElse(
hasDraft,
,
,
),
);
})(),
)}
);
})}