Skip to content

Commit 3badf90

Browse files
committed
feat: re-aligned app colours for consistency
1 parent 5cdf6d5 commit 3badf90

20 files changed

Lines changed: 73 additions & 77 deletions

app/src/components/AgentRunRow.tsx

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,9 @@ interface Props {
66
jobId: string;
77
}
88

9-
const PHASE_COLOURS: Record<string, string> = {
10-
PLAN: 'bg-blue-900/60 text-blue-300',
11-
IMPLEMENT: 'bg-sky-900/60 text-sky-300',
12-
REVIEW: 'bg-violet-900/60 text-violet-300',
13-
REVISE: 'bg-sky-900/60 text-sky-300',
14-
VERIFY: 'bg-teal-900/60 text-teal-300',
15-
SUMMARY: 'bg-zinc-800 text-zinc-300',
16-
JUDGE: 'bg-pink-900/60 text-pink-300',
17-
};
18-
19-
function phasePill(phase: string): string {
20-
return PHASE_COLOURS[phase] ?? 'bg-zinc-800 text-zinc-300';
21-
}
9+
// Phase badges are neutral labels — the phase name carries the meaning, so they all share one zinc
10+
// style rather than a per-phase rainbow.
11+
const PHASE_PILL = 'bg-zinc-800 text-zinc-300';
2212

2313
function formatDuration(ms: number | null): string {
2414
if (ms === null) return '';
@@ -42,20 +32,20 @@ export default function AgentRunRow({ run, jobId }: Props) {
4232
return (
4333
<div
4434
class={`rounded-lg border p-3 transition-colors ${
45-
isRunning ? 'border-hermes-300/30 bg-zinc-900/50' : 'border-zinc-800 bg-zinc-900/50'
35+
isRunning ? 'border-green-500/30 bg-zinc-900/50' : 'border-zinc-800 bg-zinc-900/50'
4636
}`}
4737
>
4838
<div class="flex items-center gap-3">
4939
{/* Phase badge */}
50-
<span class={`font-mono text-xs px-2.5 py-1 rounded shrink-0 ${phasePill(run.phase)}`}>
40+
<span class={`font-mono text-xs px-2.5 py-1 rounded shrink-0 ${PHASE_PILL}`}>
5141
{run.phase}
5242
</span>
5343

5444
{/* Status, with model + duration on a meta line beneath */}
5545
<div class="flex-1 min-w-0 leading-tight">
5646
{isRunning ? (
57-
<span class="flex items-center gap-1.5 text-xs text-hermes-400 font-medium">
58-
<span class="w-1.5 h-1.5 rounded-full bg-hermes-400 animate-pulse" />
47+
<span class="flex items-center gap-1.5 text-xs text-green-400 font-medium">
48+
<span class="w-1.5 h-1.5 rounded-full bg-green-400 animate-pulse" />
5949
Running
6050
</span>
6151
) : isJudge && run.status === 'SUCCEEDED' ? (

app/src/components/Chat.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ export default function Chat() {
180180
<div class="flex flex-col items-center justify-center h-full text-zinc-500 gap-3">
181181
<p class="text-base">Chat not found</p>
182182
<button
183-
class="text-sm text-indigo-400 hover:text-indigo-300"
183+
class="text-sm text-cyan-400 hover:text-cyan-300"
184184
onClick={() => navigate('/chats')}
185185
>
186186
Back to chats
@@ -211,7 +211,7 @@ export default function Chat() {
211211
<div class="max-w-3xl mx-auto px-4 py-5 space-y-4">
212212
{session === null ? (
213213
<div class="flex justify-center py-10">
214-
<div class="w-5 h-5 border-2 border-zinc-700 border-t-indigo-500 rounded-full animate-spin" />
214+
<div class="w-5 h-5 border-2 border-zinc-700 border-t-cyan-500 rounded-full animate-spin" />
215215
</div>
216216
) : session.messages.length === 0 && !activeRunId ? (
217217
<p class="text-center text-sm text-zinc-600 py-10">
@@ -269,7 +269,7 @@ export default function Chat() {
269269
<select
270270
value={modelKey}
271271
onChange={(e) => setModelKey((e.target as HTMLSelectElement).value)}
272-
class="rounded-lg bg-zinc-900 border border-zinc-800 px-2 py-1 text-xs text-zinc-300 focus:outline-none focus:border-indigo-600"
272+
class="rounded-lg bg-zinc-900 border border-zinc-800 px-2 py-1 text-xs text-zinc-300 focus:outline-none focus:border-cyan-600"
273273
>
274274
{models.map((m) => (
275275
<option key={m.key} value={m.key}>
@@ -292,7 +292,7 @@ export default function Chat() {
292292
placeholder={activeRunId ? 'Hermes is responding…' : 'Message Hermes…'}
293293
rows={1}
294294
disabled={!!activeRunId}
295-
class="flex-1 rounded-xl bg-zinc-900 border border-zinc-800 px-3 py-2.5 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-indigo-600 resize-none disabled:opacity-60"
295+
class="flex-1 rounded-xl bg-zinc-900 border border-zinc-800 px-3 py-2.5 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-cyan-600 resize-none disabled:opacity-60"
296296
/>
297297
<button
298298
type="submit"

app/src/components/ChatList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export default function ChatList() {
9393
<div class="flex-1 overflow-y-auto">
9494
{sessions === null ? (
9595
<div class="flex justify-center py-16">
96-
<div class="w-5 h-5 border-2 border-zinc-700 border-t-indigo-500 rounded-full animate-spin" />
96+
<div class="w-5 h-5 border-2 border-zinc-700 border-t-cyan-500 rounded-full animate-spin" />
9797
</div>
9898
) : sessions.length === 0 ? (
9999
<p class="text-center text-sm text-zinc-600 py-16 px-4">

app/src/components/CreateJob.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { navigate } from '../utils/navigate.ts';
66
const SSH_REMOTE_REGEX = /^(?:[^@\s]+@[^:\s]+:.+|ssh:\/\/.+)$/;
77

88
const PROSE =
9-
'prose prose-sm prose-invert max-w-none prose-headings:text-zinc-100 prose-p:text-zinc-300 prose-a:text-blue-400 prose-strong:text-zinc-200 prose-code:text-amber-300 prose-code:bg-zinc-900 prose-code:px-1 prose-code:rounded prose-code:before:content-none prose-code:after:content-none prose-pre:bg-zinc-900 prose-pre:border prose-pre:border-zinc-800 prose-li:text-zinc-300';
9+
'prose prose-sm prose-invert max-w-none prose-headings:text-zinc-100 prose-p:text-zinc-300 prose-a:text-cyan-400 prose-strong:text-zinc-200 prose-code:text-cyan-300 prose-code:bg-zinc-900 prose-code:px-1 prose-code:rounded prose-code:before:content-none prose-code:after:content-none prose-pre:bg-zinc-900 prose-pre:border prose-pre:border-zinc-800 prose-li:text-zinc-300';
1010

1111
export default function CreateJob() {
1212
const [title, setTitle] = useState('');
@@ -76,7 +76,7 @@ export default function CreateJob() {
7676
value={title}
7777
onInput={(e) => setTitle((e.target as HTMLInputElement).value)}
7878
placeholder="Short summary of the work"
79-
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-indigo-600"
79+
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-cyan-600"
8080
/>
8181
</div>
8282

@@ -90,7 +90,7 @@ export default function CreateJob() {
9090
onInput={(e) => setRepoUrl((e.target as HTMLInputElement).value)}
9191
placeholder="git@github.com:owner/repo.git — leave empty for a scratch workspace"
9292
class={`w-full rounded-lg bg-zinc-900 border px-3 py-2 text-sm font-mono text-zinc-100 placeholder-zinc-600 focus:outline-none ${
93-
repoInvalid ? 'border-red-700 focus:border-red-600' : 'border-zinc-800 focus:border-indigo-600'
93+
repoInvalid ? 'border-red-700 focus:border-red-600' : 'border-zinc-800 focus:border-cyan-600'
9494
}`}
9595
/>
9696
{repoInvalid && (
@@ -125,7 +125,7 @@ export default function CreateJob() {
125125
onInput={(e) => setRequirements((e.target as HTMLTextAreaElement).value)}
126126
placeholder="Describe the work like a GitHub issue — context, goals, acceptance criteria…"
127127
rows={14}
128-
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm font-mono text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-indigo-600 resize-y"
128+
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm font-mono text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-cyan-600 resize-y"
129129
/>
130130
)}
131131
</div>

app/src/components/JobCard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export default function JobCard({ job }: Props) {
5656
{job.prNumber ? (
5757
<a
5858
href={job.prUrl ?? '#'}
59-
class={`text-xs font-mono hover:underline ${job.prIsDraft ? 'text-zinc-500' : 'text-sky-400'}`}
59+
class={`text-xs font-mono hover:underline ${job.prIsDraft ? 'text-zinc-500' : 'text-cyan-400'}`}
6060
onClick={(e) => e.stopPropagation()}
6161
target="_blank"
6262
rel="noopener noreferrer"

app/src/components/JobDetail.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ export default function JobDetail() {
197197
return (
198198
<div class="flex flex-col items-center justify-center h-full text-zinc-500 gap-3">
199199
<p class="text-base">Job not found</p>
200-
<button class="text-sm text-indigo-400 hover:text-indigo-300" onClick={() => navigate('/')}>
200+
<button class="text-sm text-cyan-400 hover:text-cyan-300" onClick={() => navigate('/')}>
201201
Back to all jobs
202202
</button>
203203
</div>
@@ -207,7 +207,7 @@ export default function JobDetail() {
207207
if (!job) {
208208
return (
209209
<div class="flex items-center justify-center h-full">
210-
<div class="w-6 h-6 border-2 border-zinc-700 border-t-indigo-500 rounded-full animate-spin" />
210+
<div class="w-6 h-6 border-2 border-zinc-700 border-t-cyan-500 rounded-full animate-spin" />
211211
</div>
212212
);
213213
}
@@ -250,16 +250,16 @@ export default function JobDetail() {
250250
{(activeRun || !TERMINAL_STATES.has(job.state) || job.state === 'FAILED') && (
251251
<div class="flex items-stretch gap-2">
252252
{activeRun && (
253-
<div class="flex-1 min-w-0 rounded-lg border border-hermes-300/30 bg-hermes-400/10 px-3 py-2.5 flex items-center gap-2.5">
254-
<span class="w-1.5 h-1.5 rounded-full bg-hermes-400 animate-pulse shrink-0" />
255-
<span class="text-xs text-hermes-400 font-mono">{activeRun.phase}</span>
253+
<div class="flex-1 min-w-0 rounded-lg border border-green-500/30 bg-green-500/10 px-3 py-2.5 flex items-center gap-2.5">
254+
<span class="w-1.5 h-1.5 rounded-full bg-green-400 animate-pulse shrink-0" />
255+
<span class="text-xs text-green-400 font-mono">{activeRun.phase}</span>
256256
{activeRun.model && (
257257
<span class="text-xs text-zinc-500 truncate hidden sm:block">
258258
{activeRun.model}
259259
</span>
260260
)}
261261
<button
262-
class="ml-auto shrink-0 text-xs font-medium text-hermes-400 hover:text-hermes-300 transition-colors"
262+
class="ml-auto shrink-0 text-xs font-medium text-green-400 hover:text-green-300 transition-colors"
263263
onClick={() => navigate(`/jobs/${id}/runs/${activeRun.id}`)}
264264
>
265265
Watch live →
@@ -315,7 +315,7 @@ export default function JobDetail() {
315315
{job.prNumber && (
316316
<a
317317
href={job.prUrl ?? '#'}
318-
class={`shrink-0 hover:underline ${job.prIsDraft ? 'text-zinc-500' : 'text-sky-400'}`}
318+
class={`shrink-0 hover:underline ${job.prIsDraft ? 'text-zinc-500' : 'text-cyan-400'}`}
319319
target="_blank"
320320
rel="noopener noreferrer"
321321
>
@@ -375,7 +375,7 @@ export default function JobDetail() {
375375
onInput={(e) => setChangesNote((e.target as HTMLTextAreaElement).value)}
376376
placeholder="Request changes (Markdown) — Hermes will revise and push an update…"
377377
rows={3}
378-
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-indigo-600 resize-y"
378+
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-cyan-600 resize-y"
379379
/>
380380
<button
381381
disabled={actionPending || changesNote.trim().length === 0}

app/src/components/JobList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ function MobileJobCard({ job }: { job: JobSummaryDto }) {
4141
</span>
4242
)}
4343
{job.prNumber && (
44-
<span class={job.prIsDraft ? 'text-zinc-600' : 'text-sky-400'}>PR #{job.prNumber}</span>
44+
<span class={job.prIsDraft ? 'text-zinc-600' : 'text-cyan-400'}>PR #{job.prNumber}</span>
4545
)}
4646
{job.confidence !== null && (
4747
<span

app/src/components/JudgeOutput.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default function JudgeOutput() {
3636
<div class="flex flex-col items-center justify-center h-full text-zinc-500 gap-3">
3737
<p class="text-base">Judgement not found</p>
3838
<button
39-
class="text-sm text-indigo-400 hover:text-indigo-300"
39+
class="text-sm text-cyan-400 hover:text-cyan-300"
4040
onClick={() => navigate(`/jobs/${jobId}`)}
4141
>
4242
Back to job
@@ -48,7 +48,7 @@ export default function JudgeOutput() {
4848
if (!judgement) {
4949
return (
5050
<div class="flex items-center justify-center h-full">
51-
<div class="w-6 h-6 border-2 border-zinc-700 border-t-indigo-500 rounded-full animate-spin" />
51+
<div class="w-6 h-6 border-2 border-zinc-700 border-t-cyan-500 rounded-full animate-spin" />
5252
</div>
5353
);
5454
}
@@ -66,7 +66,7 @@ export default function JudgeOutput() {
6666
← Back
6767
</button>
6868
<span class="text-zinc-700 text-sm">/</span>
69-
<span class="font-mono text-xs px-2 py-0.5 rounded shrink-0 bg-pink-900/60 text-pink-300">
69+
<span class="font-mono text-xs px-2 py-0.5 rounded shrink-0 bg-zinc-800 text-zinc-300">
7070
JUDGE
7171
</span>
7272
<span
@@ -80,7 +80,7 @@ export default function JudgeOutput() {
8080
<div class="max-w-4xl mx-auto px-4 py-5 space-y-4">
8181
{html ? (
8282
<div
83-
class="prose prose-sm prose-invert max-w-none prose-headings:text-zinc-100 prose-p:text-zinc-300 prose-li:text-zinc-300 prose-strong:text-zinc-200 prose-code:text-amber-300 prose-code:bg-zinc-900 prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-code:before:content-none prose-code:after:content-none prose-pre:bg-zinc-900 prose-pre:border prose-pre:border-zinc-800"
83+
class="prose prose-sm prose-invert max-w-none prose-headings:text-zinc-100 prose-p:text-zinc-300 prose-li:text-zinc-300 prose-strong:text-zinc-200 prose-code:text-cyan-300 prose-code:bg-zinc-900 prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-code:before:content-none prose-code:after:content-none prose-pre:bg-zinc-900 prose-pre:border prose-pre:border-zinc-800"
8484
// eslint-disable-next-line react/no-danger
8585
dangerouslySetInnerHTML={{ __html: html }}
8686
/>

app/src/components/Markdown.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ const PROSE =
55
'prose prose-sm prose-invert max-w-none ' +
66
'prose-headings:font-semibold prose-headings:text-zinc-100 ' +
77
'prose-p:text-zinc-300 prose-p:leading-relaxed ' +
8-
'prose-a:text-blue-400 hover:prose-a:text-blue-300 ' +
8+
'prose-a:text-cyan-400 hover:prose-a:text-cyan-300 ' +
99
'prose-strong:text-zinc-200 ' +
10-
'prose-code:text-amber-300 prose-code:bg-zinc-900 prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-code:text-[0.8em] prose-code:before:content-none prose-code:after:content-none ' +
10+
'prose-code:text-cyan-300 prose-code:bg-zinc-900 prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-code:text-[0.8em] prose-code:before:content-none prose-code:after:content-none ' +
1111
'prose-pre:bg-zinc-900 prose-pre:border prose-pre:border-zinc-800 ' +
1212
'prose-blockquote:border-zinc-700 prose-blockquote:text-zinc-400 ' +
1313
'prose-hr:border-zinc-800 prose-li:text-zinc-300';

app/src/components/PlanThread.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export default function PlanThread({
5959
? 'bg-green-900/50 text-green-400'
6060
: item.plan.status === 'SUPERSEDED'
6161
? 'bg-zinc-800 text-zinc-500'
62-
: 'bg-indigo-900/40 text-indigo-300'
62+
: 'bg-cyan-900/40 text-cyan-300'
6363
}`}
6464
>
6565
{item.plan.status}
@@ -89,7 +89,7 @@ export default function PlanThread({
8989
onInput={(e) => setFeedback((e.target as HTMLTextAreaElement).value)}
9090
placeholder="Request changes to the plan (Markdown) — Hermes will revise and re-propose…"
9191
rows={4}
92-
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-indigo-600 resize-y"
92+
class="w-full rounded-lg bg-zinc-900 border border-zinc-800 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-600 focus:outline-none focus:border-cyan-600 resize-y"
9393
/>
9494
<button
9595
disabled={pending || feedback.trim().length === 0}

0 commit comments

Comments
 (0)