mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-25 09:41:04 +01:00
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:
1 parent
904de491ff
commit
45ce6fb398
2 files changed
+24
-9
No files matched your search
@@ -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.
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user