feat: prioritize campaign names over descriptions and use available list width while keeping actions accessible

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Matthew Meszaros
2026-10-07 07:30:19 +00:00
co-authored by Devin AI
parent 26389bc116
commit efd2bb26b4
3 changed files with 19 additions and 13 deletions
+4
View File
@@ -17,6 +17,10 @@ Campaigns belong to the workspace. Members with **View campaigns** can read camp
Select the workspace that owns the campaign before opening it. Creating a campaign does not grant access to it from a different workspace.
## Campaigns list
Campaign names take priority over descriptions in the list. Descriptions use the remaining space and are hidden on small screens. A name that is still too long for the available space is shortened with an ellipsis so the status and actions stay accessible; hover over the name to read it in full, or open the campaign on a touch screen. The top campaigns list in Analytics also uses the available space for names before shortening them.
## Create a campaign
**Campaigns** > **New campaign** opens a four-step flow. A campaign is a first email and, optionally, follow-ups that stop for anyone who replies.
+1 -1
View File
@@ -233,7 +233,7 @@ export default function AnalyticsPage() {
className="group h-11 px-5 flex items-center gap-3 hover:bg-slate-50 transition-colors"
>
<span className={`size-1.5 rounded-full shrink-0 ${dot}`} />
<span className="text-[12.5px] font-medium text-slate-900 truncate max-w-[40%]">{c.name}</span>
<span className="min-w-0 flex-1 text-[12.5px] font-medium text-slate-900 truncate" title={c.name}>{c.name}</span>
<span className="ml-auto flex items-center gap-2 md:gap-4 font-mono text-[11px] text-slate-500 tabular-nums shrink-0">
<span title="Emails sent">{num(c.emails_sent)} sent</span>
<span title="Open rate" className="hidden md:inline text-emerald-600">{pct(c.open_rate)} open</span>
+14 -12
View File
@@ -531,19 +531,21 @@ export default function CampaignsPage() {
<span className="shrink-0 w-3.5 flex items-center justify-center">
<CampaignStatusMark status={cstatus} idle={isIdleCampaign(c)} />
</span>
<span className="text-[12.5px] text-slate-900 font-medium truncate max-w-[40%]">
{c.name}
</span>
<span className="font-mono text-[10.5px] text-slate-400 tabular-nums shrink-0 hidden sm:inline">
{c.id.slice(0, 8)}
</span>
<AdvisorRowFlag findings={advisor.get(c.id)} subject={c.name} />
<CampaignFolderChips campaign={c} folders={folders} />
{c.description && (
<span className="text-[11.5px] text-slate-400 truncate hidden md:inline">
{c.description}
<div className="flex min-w-0 flex-1 items-center gap-3 overflow-hidden">
<span className="min-w-0 text-[12.5px] text-slate-900 font-medium truncate" title={c.name}>
{c.name}
</span>
)}
<span className="font-mono text-[10.5px] text-slate-400 tabular-nums shrink-0 hidden sm:inline">
{c.id.slice(0, 8)}
</span>
<AdvisorRowFlag findings={advisor.get(c.id)} subject={c.name} />
<CampaignFolderChips campaign={c} folders={folders} />
{c.description && (
<span className="min-w-0 flex-1 text-[11.5px] text-slate-400 truncate hidden md:inline">
{c.description}
</span>
)}
</div>
<span className={cn("ml-auto text-[10px] uppercase tracking-[0.1em] font-medium shrink-0", campaignDisplayTone(c))}>
{stateLabel}
</span>