circle-play for the background job button, at full strength

White rather than muted, 18px rather than 16. Its neighbours on that row are
pickers — they report what is already selected — and this is the only control
there that does something, so it should not be wearing the same recessive grey
as a label.

The glyph was a radio tower, chosen because a play button implies one-shot. That
reasoning was too clever: most of what gets started here is a long-running
process, and a watcher is still something you press start on. Recognisable beats
precise at this size.

The dialog's own title icon changes with it. A button and the thing it opens
wearing different glyphs is a small lie about them being the same feature.

tsgo clean, frontend builds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 02:46:26 +00:00
co-authored by Claude Opus 5
parent f580d845ac
commit a78541a341
2 changed files with 12 additions and 6 deletions
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react';
import { Radio } from 'lucide-react';
import { CirclePlay } from 'lucide-react';
import { Button } from '@/components/ui/button';
import {
Dialog,
@@ -87,7 +87,7 @@ export const BackgroundJobDialog = ({ open, onOpenChange, cwd, onSubmit }: Backg
<DialogContent className="sm:max-w-lg">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<Radio className="h-4 w-4" />
<CirclePlay className="h-4 w-4" />
Background job
</DialogTitle>
<DialogDescription>
@@ -1,5 +1,5 @@
import { useEffect } from 'react';
import { Radio } from 'lucide-react';
import { CirclePlay } from 'lucide-react';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import type { ModelOption } from 'state/useModels';
import { getProviderDisplayName } from 'state/useModels';
@@ -126,15 +126,21 @@ export function ModelSelector({
)}
{/* Background job. Sits between the harness (left) and the model (right), in the gap
`justify-between` already leaves — session-level, like its neighbours, rather than about the
message being typed. `Radio` because it listens; a play button would imply one-shot. */}
message being typed.
Full-strength and a size up, unlike its muted neighbours: those are pickers reporting what is
already set, and this is the one control on this row that DOES something. The earlier glyph was
a radio tower, on the reasoning that a play button implies one-shot — but most of what gets
started here is a long-running process, and a watcher is still something you press start on.
Recognisable beats precise at 18px. */}
{onBackgroundJob && (
<button
type="button"
onClick={onBackgroundJob}
title="Start a background job or watcher"
className="shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground cursor-pointer"
className="shrink-0 cursor-pointer rounded-md p-1.5 text-foreground transition-colors hover:bg-foreground/10"
>
<Radio className="h-4 w-4" />
<CirclePlay className="h-[18px] w-[18px]" />
</button>
)}
{/* The thinking toggle used to render here. It is gone because it did nothing: `thinking` is