Skip to content

Commit 23b03fe

Browse files
committed
fix(taskboard): slim card-row controls so titles get more horizontal room
Right-column task cards were wasting lateral pixels on chrome: - 24x24 checkbox + send + trash slots - Accent-tinted chip backgrounds painted under every action icon even at rest, so on hover the row read as "title squeezed between two color blocks" rather than "title with a discreet action cluster" Tightened pass: - Slots 24->18, checkbox SVG 18->14, action SVGs 14 (icon takes 78% of its 18px slot, reads as a compact glyph rather than a shrunken icon inside a chip) - Chip backgrounds removed from .task-slot-send / .task-slot-delete; affordance now lives on direct button-hover via opacity 0.85->1 + filter:brightness(1.25). Confirm-edit slot keeps its green chip since it's a solo modal action and benefits from the affirmative anchor - Row padding rebalanced 10/4/10/10 -> 10/4/10/8 (asymmetric: checkbox needs more breathing as the card's visual entry-point; the action cluster on the right can sit close to the edge) Net 14px more room for titles per row + the action cluster no longer competes with the title for visual weight. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 48364f8 commit 23b03fe

2 files changed

Lines changed: 40 additions & 31 deletions

File tree

src-ui/src/components/right/TaskBoard.css

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,13 @@
170170
.task-card-row {
171171
display: flex;
172172
align-items: center;
173-
/* 4px gap — keeps the title close to the checkbox on the left and
174-
* lets the trash + send buttons cluster tightly on the right, so
175-
* even multi-line titles have more horizontal room. Right padding
176-
* matches the gap so trash↔send and send↔card-edge are both 4px. */
173+
/* Asymmetric 8 L / 4 R — left needs more breathing because the
174+
* checkbox is the visual entry-point of the card; right is a
175+
* compact action cluster that can sit close to the edge. Tight
176+
* 4px gap throughout. The narrow right column (~280px) needs
177+
* every horizontal pixel for titles. */
177178
gap: 4px;
178-
padding: 10px 4px 10px 10px;
179+
padding: 10px 4px 10px 8px;
179180
}
180181

181182
.task-card:hover {
@@ -188,7 +189,10 @@
188189
}
189190

190191
.task-card.working .task-card-row {
191-
padding-left: 8px;
192+
/* Compensate for the 2px accent border-left so the checkbox sits
193+
in the same column as on non-working cards. Base padding-left
194+
is 8px (see .task-card-row), so working subtracts the border width. */
195+
padding-left: 6px;
192196
}
193197

194198
.task-card.expanded {
@@ -290,13 +294,12 @@
290294
display: flex;
291295
align-items: center;
292296
justify-content: center;
293-
/* Match .task-slot's 24×24 footprint — keeps the left/right action
294-
* affordances on a single visual rhythm; any extra hit area beyond
295-
* the dot itself is wasted on a desktop pointer. Vertical padding
296-
* (with cancelling negative margin) gives a slightly taller click
297-
* strip without growing the row height. */
298-
width: 24px;
299-
height: 24px;
297+
/* Match .task-slot's 18×18 footprint — keeps the left/right action
298+
* affordances on a single visual rhythm. Vertical padding (with
299+
* cancelling negative margin) gives a slightly taller click strip
300+
* without growing the row height. */
301+
width: 18px;
302+
height: 18px;
300303
padding: 8px 0;
301304
margin: -8px 0;
302305
background: transparent;
@@ -417,8 +420,8 @@
417420
display: flex;
418421
align-items: center;
419422
justify-content: center;
420-
width: 24px;
421-
height: 24px;
423+
width: 18px;
424+
height: 18px;
422425
padding: 0;
423426
border-radius: var(--radius-xs);
424427
background: transparent;
@@ -428,20 +431,26 @@
428431
transition: all 0.2s;
429432
}
430433

434+
/* Naked accent-colored glyph — no chip background, ever (rest OR hover).
435+
Earlier passes painted an `accent 12-22%` square behind every icon,
436+
which made the action cluster read as two color blocks competing
437+
for attention with the title. Now the icons sit unframed; rest
438+
state hides them via opacity, card-hover reveals them at 0.85
439+
opacity (calm), and direct button-hover bumps to full opacity +
440+
brightness for click affordance. */
431441
.task-slot-send {
432442
color: var(--accent, #c4956a);
433-
background: color-mix(in srgb, var(--accent) 12%, transparent);
434443
opacity: 0;
435-
transition: opacity 0.15s, color 0.15s, background 0.15s;
444+
transition: opacity 0.15s, filter 0.15s;
436445
}
437446

438-
/* Reveal the play triangle only on card hover — resting card stays clean */
439447
.task-card:hover .task-slot-send {
440-
opacity: 1;
448+
opacity: 0.85;
441449
}
442450

443451
.task-slot-send:hover:not(:disabled) {
444-
background: color-mix(in srgb, var(--accent) 25%, transparent);
452+
opacity: 1;
453+
filter: brightness(1.25);
445454
}
446455

447456
.task-slot-send:disabled {
@@ -464,21 +473,21 @@
464473

465474
.task-slot-delete {
466475
color: var(--accent, #c4956a);
467-
background: color-mix(in srgb, var(--accent) 12%, transparent);
468476
opacity: 0;
469-
transition: opacity 0.15s, color 0.15s, background 0.15s;
477+
transition: opacity 0.15s, filter 0.15s;
470478
}
471479

472-
/* Pair with .task-slot-send: both fade in together on card hover so the
473-
action cluster reads as a single unit. Destructive intent is carried by
474-
the trash glyph itself, not by colour — the chip follows the active theme
475-
accent so the UI stays visually of-a-piece as themes switch. */
480+
/* Pair with .task-slot-send — same reveal/affordance story:
481+
card-hover reveals at calm 0.85, direct hover bumps to full
482+
opacity + brightness. Destructive intent is carried by the
483+
trash glyph itself, not by chip colour. */
476484
.task-card:hover .task-slot-delete {
477-
opacity: 1;
485+
opacity: 0.85;
478486
}
479487

480488
.task-slot-delete:hover {
481-
background: color-mix(in srgb, var(--accent) 25%, transparent);
489+
opacity: 1;
490+
filter: brightness(1.25);
482491
}
483492

484493
/* ─── Description Area ──────────────────────────────────────────────────────── */

src-ui/src/components/right/TaskBoard.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -538,18 +538,18 @@ export function TaskBoard() {
538538
const renderCheckbox = (status: TaskStatus) => (
539539
<div className={`task-checkbox ${status}`}>
540540
{status === 'todo' && (
541-
<svg width="18" height="18" viewBox="0 0 18 18" fill="none">
541+
<svg width="14" height="14" viewBox="0 0 18 18" fill="none">
542542
<circle cx="9" cy="9" r="8" stroke="currentColor" strokeWidth="1.5" />
543543
</svg>
544544
)}
545545
{status === 'working' && (
546-
<svg width="18" height="18" viewBox="0 0 18 18" fill="none">
546+
<svg width="14" height="14" viewBox="0 0 18 18" fill="none">
547547
<circle cx="9" cy="9" r="8" stroke="currentColor" strokeWidth="1.5" />
548548
<circle cx="9" cy="9" r="4" fill="currentColor" className="pulse-dot" />
549549
</svg>
550550
)}
551551
{status === 'done' && (
552-
<svg width="18" height="18" viewBox="0 0 18 18" fill="none">
552+
<svg width="14" height="14" viewBox="0 0 18 18" fill="none">
553553
<circle cx="9" cy="9" r="8" fill="currentColor" />
554554
<path d="M5.5 9.5L7.5 11.5L12.5 6.5" stroke="#1c1c1e" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
555555
</svg>

0 commit comments

Comments
 (0)