design(decisions): de-emphasize project chip, add issue title to eyebrow (board round)

Board feedback on the shipped card anatomy: the project folder icon
renders bare in label gray on the card background (colored tile
dropped; icon+name now link to the project), and the eyebrow shows
the related issue's title next to its mono ID, truncated at --sz-16rem.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
scotttongandClaude Fable 5 committed 2026-07-14 12:11:47 -07:00
1 parent 904de491ff
commit 45ce6fb398
2 files changed
+24 -9

No files matched your search

+4
View File
@@ -39,6 +39,10 @@ Every open question from TOKEN-AUDIT.md §8 + batch logs and COMPONENT-INVENTORY
| C10 | FeatureGate wrapper pattern (3 near-identical gates) | Nice-to-have shared primitive; backlog, not a run | APPROVED — backlog nice-to-have, not a run |
| C11 | Sidebar agents section: hand-rolled rows (own spacing/icon colors, palette-blue liveness dot) instead of `SidebarNavItem`; only section that is collapsible | Run 3 item: unify rows onto `SidebarNavItem`, settle collapsibility policy across sections, liveness dot → canonical status blue. Wholesale shadcn Sidebar adoption REJECTED for now (app already has equivalent machinery incl. icon-rail height trick; highest-regression chrome) — re-evaluate as a dedicated item after Run 3 only if its behaviors (kbd shortcut, persisted state, mobile sheet) are wanted | DONE (Run 3, Jul 7) — agent rows render via `SidebarNavItem` (new additive props: `iconNode`, `active`, `dense`, `trailing`, `liveAccessory`); all live dots (agents + nav rows, rail + expanded) now use `--status-agent-running` (#2563eb, was palette blue-500 #3b82f6 — small hue-darkening delta, per-C11 mandate; "N live" text keeps its palette classes for Run 4). **Collapsibility policy** (superseded Jul 8 by user review): EVERY labeled section (Work, Company, Projects, Agents) is collapsible, default-open, session-scoped state — one affordance everywhere. "See all agents" stays a plain muted Link on purpose (must not adopt active-route highlighting). 48 sidebar vitest assertions pass unchanged. |
## Decisions-page card anatomy → project chip de-emphasized, eyebrow gains issue title (PAP-313 board round, Jul 14 2026)
Board feedback on the shipped Quiet Ledger cards, two changes in one commit. (1) **The project chip loses its colored tile**: the icon renders bare on the card background in the same `text-muted-foreground` gray as the project name, and icon + name become a single `Link` to the project (`projectUrl`). Judgment call: project color now appears nowhere on the Decisions page — it stays on project-native surfaces (Projects list, project header); this extends the 1a "color is freed up for severity and CTAs" rule to the last colored element on the card. `ProjectTile` itself is untouched — the demotion is scoped to this feed. (2) **The eyebrow shows the related issue's title next to its ID** — mono ID + sans title in one link, title truncated at `--sz-16rem` so a long title can't crowd the recency stamp. Both changes are anatomy-only: no token edits, no new components.
## Decisions page → palette classes retired, series closed (PAP-319 / PAP-313 sweep, Jul 14 2026)
The Quiet Ledger series (anatomy 1a·2a·3a·4a·5b) closes with a page-level sweep: **no `sky/violet/rose/amber/orange/green` class remains anywhere on the Decisions page** — its color budget is the 12 shadcn core tokens plus `destructive`, which is reserved for the Critical badge alone (see the PAP-314 entry: red means Critical, never decoration; and the PAP-316 entry: the six-verb CTA vocabulary Approve / Reject / Answer / Review / Open / Restore). Spot-checks confirmed the keyboard-selection ring (`ring-ring`), curtain rows (`bg-muted/30`), and the expanded resolver band (`bg-muted/20` + `border-border/60`) were already token-only. Judgment call: the zero-state's green celebration mark (`bg-green-500/10` circle + `text-green-500` check) moves to `bg-muted` + `text-muted-foreground` — the CheckCircle2 glyph carries the "all clear" meaning by shape, and a page whose only red is an alarm shouldn't keep a green that means nothing is happening. Stories updated as the coverage map in the same commit (dead thumbnail fixtures dropped, `TypeColorsAndDetail` → "Card anatomy & detail", new `KeyboardSelected` ring story); snapshot suite untouched (dormant per this sheet). Flagged, not changed: the expanded resolver embeds the shared `IssueThreadInteractionCard` (violet plan chip et al.), which renders on issue threads too — resolver internals are out of scope per the approved plan, so its palette is that component's decision, not this page's.
+20 -9
View File
@@ -23,7 +23,8 @@ import {
severityBadge,
sourceMeta,
} from "../lib/attention";
import { cn, relativeTime } from "../lib/utils";
import { getProjectIcon } from "../lib/project-icons";
import { cn, projectUrl, relativeTime } from "../lib/utils";
import { Button } from "./ui/button";
import { Textarea } from "./ui/textarea";
import {
@@ -37,7 +38,6 @@ import {
DropdownMenuTrigger,
} from "./ui/dropdown-menu";
import { AttentionInteractionResolver } from "./AttentionInteractionResolver";
import { ProjectTile } from "./ProjectTile";
const HOUR_MS = 60 * 60 * 1000;
const DAY_MS = 24 * HOUR_MS;
@@ -195,10 +195,13 @@ export const AttentionQueueRow = memo(function AttentionQueueRow({
{item.relatedIssue?.identifier && (
<Link
to={item.relatedIssue.href ?? "#"}
className="font-mono text-(length:--text-nano) text-muted-foreground hover:text-foreground"
className="inline-flex min-w-0 items-baseline gap-1.5 text-(length:--text-nano) text-muted-foreground hover:text-foreground"
onClick={(e) => e.stopPropagation()}
>
{item.relatedIssue.identifier}
<span className="font-mono">{item.relatedIssue.identifier}</span>
{item.relatedIssue.title && (
<span className="max-w-(--sz-16rem) truncate">{item.relatedIssue.title}</span>
)}
</Link>
)}
</div>
@@ -497,17 +500,25 @@ function compactDecisionSuccessLabel(sourceKind: AttentionItem["sourceKind"], ac
return action === "reject" ? "Confirmation declined" : "Confirmation accepted";
}
/** Inline project identity keeps useful context without a competing badge. */
/**
* Inline project identity keeps useful context without a competing badge.
* The icon renders bare on the card background in the same gray as the name
* (no colored tile — the project color stays on project-native surfaces),
* and the whole pair links to the project.
*/
function ProjectMeta({ project }: { project: NonNullable<AttentionItem["project"]> }) {
const Icon = getProjectIcon(project.icon);
return (
<span
className="inline-flex max-w-(--sz-12rem) items-center gap-1.5 text-(length:--text-nano) text-muted-foreground"
<Link
to={projectUrl(project)}
className="inline-flex max-w-(--sz-12rem) items-center gap-1.5 text-(length:--text-nano) text-muted-foreground hover:text-foreground"
title={project.name}
data-testid="attention-project-meta"
onClick={(e) => e.stopPropagation()}
>
<ProjectTile color={project.color} icon={project.icon} size="xs" />
<Icon className="h-3.5 w-3.5 shrink-0" aria-hidden />
<span className="truncate">{project.name}</span>
</span>
</Link>
);
}