Wave-5 reskin batch 5: normalize stray pixel text sizes onto the declared ladder
--text-xxs (10px) joins the ladder; every component-level text-[9|10|11px] literal in owned components now pulls from the ladder (graph-view.tsx and home.tsx untouched — graph stream). Cosmetic pins updated where touched.
This commit is contained in:
@@ -88,6 +88,8 @@
|
|||||||
--font-title: "lh-cmu", serif;
|
--font-title: "lh-cmu", serif;
|
||||||
/* The modular type ladder — each size carries its own line-height.
|
/* The modular type ladder — each size carries its own line-height.
|
||||||
Component sizes must pull from this ladder. */
|
Component sizes must pull from this ladder. */
|
||||||
|
--text-xxs: 10px;
|
||||||
|
--text-xxs--line-height: 1.4;
|
||||||
--text-xs: 11px;
|
--text-xs: 11px;
|
||||||
--text-xs--line-height: 1.4;
|
--text-xs--line-height: 1.4;
|
||||||
--text-sm: 12.5px;
|
--text-sm: 12.5px;
|
||||||
|
|||||||
@@ -294,7 +294,7 @@ export function ActivityDock({ feed: feedProp }: { feed?: ActivityFeed }) {
|
|||||||
narrow && "max-h-[60dvh] overflow-y-auto",
|
narrow && "max-h-[60dvh] overflow-y-auto",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-2 px-1 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
|
<div className="flex items-center gap-2 px-1 pb-1 text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
||||||
<ActivityIcon className="size-3.5" />
|
<ActivityIcon className="size-3.5" />
|
||||||
Background activity
|
Background activity
|
||||||
<span className="ml-auto tabular-nums" data-testid="activity-total-cost" title="Total running cost (inferred)">
|
<span className="ml-auto tabular-nums" data-testid="activity-total-cost" title="Total running cost (inferred)">
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export function AnsweredCard({ answer }: { answer: QuestionAnswerData }) {
|
|||||||
|
|
||||||
{answer.note && (
|
{answer.note && (
|
||||||
<div data-testid="your-thinking" className="mt-3 border-l-2 border-primary/40 pl-3">
|
<div data-testid="your-thinking" className="mt-3 border-l-2 border-primary/40 pl-3">
|
||||||
<span className="mb-0.5 block text-[10px] font-medium uppercase tracking-wide text-muted-foreground">
|
<span className="mb-0.5 block text-xxs font-medium uppercase tracking-wide text-muted-foreground">
|
||||||
Your thinking
|
Your thinking
|
||||||
</span>
|
</span>
|
||||||
<span className="block whitespace-pre-wrap text-sm text-foreground/90">{answer.note}</span>
|
<span className="block whitespace-pre-wrap text-sm text-foreground/90">{answer.note}</span>
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ function ResearchCompleteBadge({ result }: { result: ResearchResult }) {
|
|||||||
<span className="font-medium uppercase tracking-wide">Research</span>
|
<span className="font-medium uppercase tracking-wide">Research</span>
|
||||||
<span>complete</span>
|
<span>complete</span>
|
||||||
{result.sources.length > 0 && <span>· {result.sources.length} sources</span>}
|
{result.sources.length > 0 && <span>· {result.sources.length} sources</span>}
|
||||||
<span className="ml-1 text-[11px] text-muted-foreground/70 group-open:hidden">view brief</span>
|
<span className="ml-1 text-xs text-muted-foreground/70 group-open:hidden">view brief</span>
|
||||||
<span className="ml-1 hidden text-[11px] text-muted-foreground/70 group-open:inline">hide brief</span>
|
<span className="ml-1 hidden text-xs text-muted-foreground/70 group-open:inline">hide brief</span>
|
||||||
</summary>
|
</summary>
|
||||||
<div className="mt-2">
|
<div className="mt-2">
|
||||||
<ResearchBriefCard output={result} />
|
<ResearchBriefCard output={result} />
|
||||||
|
|||||||
@@ -70,14 +70,14 @@ export function Composer({
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={verdict.onAccept}
|
onClick={verdict.onAccept}
|
||||||
className="flex h-[19px] items-center justify-center gap-1 rounded-md bg-emerald-600 px-3 text-[11px] font-medium text-white transition-colors hover:bg-emerald-500"
|
className="flex h-[19px] items-center justify-center gap-1 rounded-md bg-emerald-600 px-3 text-xs font-medium text-white transition-colors hover:bg-emerald-500"
|
||||||
>
|
>
|
||||||
<CheckIcon className="size-3" /> Accept plan
|
<CheckIcon className="size-3" /> Accept plan
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={verdict.onDecline}
|
onClick={verdict.onDecline}
|
||||||
className="flex h-[19px] items-center justify-center gap-1 rounded-md bg-destructive px-3 text-[11px] font-medium text-destructive-foreground transition-colors hover:opacity-90"
|
className="flex h-[19px] items-center justify-center gap-1 rounded-md bg-destructive px-3 text-xs font-medium text-destructive-foreground transition-colors hover:opacity-90"
|
||||||
>
|
>
|
||||||
<XIcon className="size-3" /> Decline
|
<XIcon className="size-3" /> Decline
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ export function ModelControl({
|
|||||||
className="flex items-center gap-1.5 rounded-full border border-border/60 bg-card/70 px-2.5 py-1 transition-colors hover:border-border hover:bg-muted"
|
className="flex items-center gap-1.5 rounded-full border border-border/60 bg-card/70 px-2.5 py-1 transition-colors hover:border-border hover:bg-muted"
|
||||||
>
|
>
|
||||||
<span className="text-card-foreground">{effectiveId ? prettyModel(effectiveId) : "—"}</span>
|
<span className="text-card-foreground">{effectiveId ? prettyModel(effectiveId) : "—"}</span>
|
||||||
<span aria-hidden className="text-[9px] text-muted-foreground">▾</span>
|
<span aria-hidden className="text-xxs text-muted-foreground">▾</span>
|
||||||
</button>
|
</button>
|
||||||
<span aria-hidden>·</span>
|
<span aria-hidden>·</span>
|
||||||
<button
|
<button
|
||||||
@@ -177,7 +177,7 @@ export function ModelControl({
|
|||||||
<span className="text-card-foreground">
|
<span className="text-card-foreground">
|
||||||
{effectiveLevel === undefined ? "Thinking —" : `Thinking: ${LEVEL_LABEL[effectiveLevel] ?? effectiveLevel}`}
|
{effectiveLevel === undefined ? "Thinking —" : `Thinking: ${LEVEL_LABEL[effectiveLevel] ?? effectiveLevel}`}
|
||||||
</span>
|
</span>
|
||||||
<span aria-hidden className="text-[9px] text-muted-foreground">▾</span>
|
<span aria-hidden className="text-xxs text-muted-foreground">▾</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{open === "model" && (
|
{open === "model" && (
|
||||||
@@ -234,7 +234,7 @@ export function ModelControl({
|
|||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
<div className="mt-1 border-t px-2 pt-1.5 text-[10px] text-muted-foreground">
|
<div className="mt-1 border-t px-2 pt-1.5 text-xxs text-muted-foreground">
|
||||||
Applies to the next turn · background agents stay config-pinned
|
Applies to the next turn · background agents stay config-pinned
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -266,7 +266,7 @@ export function ModelControl({
|
|||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
{error && <div className="mt-1 text-destructive">{error}</div>}
|
{error && <div className="mt-1 text-destructive">{error}</div>}
|
||||||
<div className="mt-1 border-t px-2 pt-1.5 text-[10px] text-muted-foreground">
|
<div className="mt-1 border-t px-2 pt-1.5 text-xxs text-muted-foreground">
|
||||||
Levels this model actually supports
|
Levels this model actually supports
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -473,7 +473,7 @@ export function PlanPopup({ messages, onClose }: { messages: readonly PopupMessa
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="pointer-events-none absolute inset-x-0 bottom-0 flex items-end justify-between p-2">
|
<div className="pointer-events-none absolute inset-x-0 bottom-0 flex items-end justify-between p-2">
|
||||||
<span className="text-[10px] text-muted-foreground/60">Drag to pan · scroll to zoom</span>
|
<span className="text-xxs text-muted-foreground/60">Drag to pan · scroll to zoom</span>
|
||||||
<div className="flex gap-1">
|
<div className="flex gap-1">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export function PlanWindow({ messages, onOpen }: { messages: readonly PopupMessa
|
|||||||
title="Open the full plan"
|
title="Open the full plan"
|
||||||
className="fixed bottom-3 left-3 z-30 hidden w-80 flex-col gap-1 rounded-xl border bg-card/95 p-2 text-left shadow-lg backdrop-blur sm:flex"
|
className="fixed bottom-3 left-3 z-30 hidden w-80 flex-col gap-1 rounded-xl border bg-card/95 p-2 text-left shadow-lg backdrop-blur sm:flex"
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-2 px-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
|
<div className="flex items-center gap-2 px-1 text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
||||||
<WaypointsIcon className="size-3.5 text-primary" />
|
<WaypointsIcon className="size-3.5 text-primary" />
|
||||||
The plan
|
The plan
|
||||||
<span className="ml-auto min-w-0 truncate font-normal normal-case" title={currentTitle ?? undefined}>
|
<span className="ml-auto min-w-0 truncate font-normal normal-case" title={currentTitle ?? undefined}>
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ function QuestionDockForm({
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{isSel && (
|
{isSel && (
|
||||||
<span className={cn(qd.mode === "multi-select" ? "text-[10px]" : "size-1.5 rounded-full bg-current")}>
|
<span className={cn(qd.mode === "multi-select" ? "text-xxs" : "size-1.5 rounded-full bg-current")}>
|
||||||
{qd.mode === "multi-select" ? "✓" : ""}
|
{qd.mode === "multi-select" ? "✓" : ""}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
@@ -357,7 +357,7 @@ function QuestionDockForm({
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{sel.otherSelected && (
|
{sel.otherSelected && (
|
||||||
<span className={cn(qd.mode === "multi-select" ? "text-[10px]" : "size-1.5 rounded-full bg-current")}>
|
<span className={cn(qd.mode === "multi-select" ? "text-xxs" : "size-1.5 rounded-full bg-current")}>
|
||||||
{qd.mode === "multi-select" ? "✓" : ""}
|
{qd.mode === "multi-select" ? "✓" : ""}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
@@ -396,7 +396,7 @@ function QuestionDockForm({
|
|||||||
data-testid={qd.mode === "text" ? "answer-field" : "thinking-field"}
|
data-testid={qd.mode === "text" ? "answer-field" : "thinking-field"}
|
||||||
className="rounded-xl border border-border/70 bg-background/60 transition-colors focus-within:border-primary/50"
|
className="rounded-xl border border-border/70 bg-background/60 transition-colors focus-within:border-primary/50"
|
||||||
>
|
>
|
||||||
<div className="px-2.5 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground">
|
<div className="px-2.5 pt-2 text-xxs font-medium uppercase tracking-wide text-muted-foreground">
|
||||||
{qd.mode === "text" ? "Your answer" : "Your thinking"}
|
{qd.mode === "text" ? "Your answer" : "Your thinking"}
|
||||||
</div>
|
</div>
|
||||||
{qd.mode === "text" ? (
|
{qd.mode === "text" ? (
|
||||||
@@ -439,7 +439,7 @@ function QuestionDockForm({
|
|||||||
)}
|
)}
|
||||||
<div className="flex items-center justify-between gap-2 p-1">
|
<div className="flex items-center justify-between gap-2 p-1">
|
||||||
{qd.mode !== "text" && (
|
{qd.mode !== "text" && (
|
||||||
<span aria-hidden className="pl-1.5 text-[10px] text-muted-foreground">
|
<span aria-hidden className="pl-1.5 text-xxs text-muted-foreground">
|
||||||
⌘/Ctrl + ↵ submits
|
⌘/Ctrl + ↵ submits
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ function SessionsSidebar() {
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div className="mx-3 mb-1 flex items-center gap-2">
|
<div className="mx-3 mb-1 flex items-center gap-2">
|
||||||
<span className="text-[10px] uppercase tracking-widest text-muted-foreground/70">Sessions</span>
|
<span className="text-xxs uppercase tracking-widest text-muted-foreground/70">Sessions</span>
|
||||||
<span className="relative flex-1">
|
<span className="relative flex-1">
|
||||||
<Input
|
<Input
|
||||||
data-testid="session-search"
|
data-testid="session-search"
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ export function StatsBar({
|
|||||||
// (so its transparent gradient area never blocks scrolling) — this row
|
// (so its transparent gradient area never blocks scrolling) — this row
|
||||||
// must re-enable events or every control on it is dead (the model-
|
// must re-enable events or every control on it is dead (the model-
|
||||||
// control wave caught this live: buttons rendered, clicks never landed).
|
// control wave caught this live: buttons rendered, clicks never landed).
|
||||||
className="pointer-events-auto relative flex items-center justify-between gap-3 px-3 pt-1.5 text-[11px] text-muted-foreground"
|
className="pointer-events-auto relative flex items-center justify-between gap-3 px-3 pt-1.5 text-xs text-muted-foreground"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -79,7 +79,7 @@ export function StatsBar({
|
|||||||
data-testid="stats-detail"
|
data-testid="stats-detail"
|
||||||
className="absolute bottom-full left-0 z-40 mb-1.5 w-72 rounded-xl border bg-card p-3 text-xs shadow-xl"
|
className="absolute bottom-full left-0 z-40 mb-1.5 w-72 rounded-xl border bg-card p-3 text-xs shadow-xl"
|
||||||
>
|
>
|
||||||
<div className="mb-2 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
|
<div className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
||||||
Session stats
|
Session stats
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-1 text-muted-foreground">
|
<div className="flex flex-col gap-1 text-muted-foreground">
|
||||||
@@ -102,7 +102,7 @@ export function StatsBar({
|
|||||||
</div>
|
</div>
|
||||||
{turns.length > 0 && (
|
{turns.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<div className="mb-1 mt-2.5 border-t pt-2 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
|
<div className="mb-1 mt-2.5 border-t pt-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
||||||
Turns
|
Turns
|
||||||
</div>
|
</div>
|
||||||
<ul className="flex max-h-56 flex-col gap-1 overflow-y-auto">
|
<ul className="flex max-h-56 flex-col gap-1 overflow-y-auto">
|
||||||
|
|||||||
Reference in New Issue
Block a user