Skip to content

Commit

Lavender is the accent; mint means success

The logo's lavender (#b6a8ff) is now --g1t-accent across the app, docs, sudo and status: primary actions, links, focus rings, the current tab, selection, and g1t's own work. Mint becomes --g1t-success, for what passed, is live, is ready to merge or was added. Merged gets its own deeper violet (#a678f5), always beside the merge icon, so it still reads apart from the accent; the link previews follow. Every text token meets WCAG AA on the page, a card and a raised surface, and the dark base reads on an accent or success fill (9.2:1, 13.8:1); apps/web/app/lib/tokens.test.ts checks both.

syntaqxcommitted Parent5f8154bBrowse files
127 files+289−2800/127 viewed
+1−1
99 - **Pixels:** each is its own square, 0.8 of its cell, centred, with square
1010 corners.
1111 - **Colour:** G and T are `#ededef` (`--g1t-fg`) and the 1 is lavender
12− `#b6a8ff` (`--g1t-merged`), on the very dark gray base `#0f0f11`
12+ `#b6a8ff` (`--g1t-accent`, the brand accent), on the very dark gray base `#0f0f11`
1313 (`--g1t-bg`). On light backgrounds the letters are `#161618` and the 1 is
1414 `#6b56e8`. Printed in one ink, everything is that ink.
1515 - **Icon:** the 1 alone, centred in a square, for favicons, app icons and
+1−1
1919 y={p.y * 10 + 1}
2020 width="8"
2121 height="8"
22− fill={p.one ? 'var(--g1t-merged)' : 'currentColor'}
22+ fill={p.one ? 'var(--g1t-accent)' : 'currentColor'}
2323 />
2424 ))}
2525 </svg>
+3−3
5151 y={p.y * 10 + 1}
5252 width="8"
5353 height="8"
54− fill={p.one ? 'var(--g1t-merged)' : 'currentColor'}
54+ fill={p.one ? 'var(--g1t-accent)' : 'currentColor'}
5555 />
5656 ))}
5757 </svg>
9696 --scalar-color-2: var(--g1t-muted);
9797 --scalar-color-3: var(--g1t-faint);
9898 --scalar-color-accent: #cfc6ff;
99− --scalar-background-accent: color-mix(in srgb, var(--g1t-merged) 12%, transparent);
99+ --scalar-background-accent: color-mix(in srgb, var(--g1t-accent) 12%, transparent);
100100 --scalar-button-1: var(--g1t-fg);
101101 --scalar-button-1-color: var(--g1t-bg);
102102 --scalar-button-1-hover: #ffffff;
103− --scalar-color-green: var(--g1t-accent);
103+ --scalar-color-green: var(--g1t-success);
104104 --scalar-color-blue: var(--g1t-info);
105105 --scalar-color-red: var(--g1t-danger);
106106 --scalar-color-orange: var(--g1t-warn);
+10−10
99 --sl-font-mono: var(--g1t-font-mono);
1010
1111 /* Lavender is the docs' accent: links, the current page, highlights. */
12− --sl-color-accent-low: color-mix(in srgb, var(--g1t-merged) 14%, var(--g1t-bg));
13− --sl-color-accent: var(--g1t-merged);
12+ --sl-color-accent-low: color-mix(in srgb, var(--g1t-accent) 14%, var(--g1t-bg));
13+ --sl-color-accent: var(--g1t-accent);
1414 --sl-color-accent-high: #d9d1ff;
1515
1616 --sl-color-white: var(--g1t-fg);
130130 background: var(--g1t-surface);
131131 color: var(--g1t-fg);
132132 font-weight: 500;
133− box-shadow: inset 2px 0 0 var(--g1t-merged);
133+ box-shadow: inset 2px 0 0 var(--g1t-accent);
134134 }
135135
136136 /* --- Content -------------------------------------------------------------- */
178178 }
179179 .sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card) {
180180 color: #cfc6ff;
181− text-decoration-color: color-mix(in srgb, var(--g1t-merged) 45%, transparent);
181+ text-decoration-color: color-mix(in srgb, var(--g1t-accent) 45%, transparent);
182182 text-underline-offset: 0.2em;
183183 }
184184 .sl-markdown-content a:not(.card, .sl-link-button, .sl-link-card):hover {
185− text-decoration-color: var(--g1t-merged);
185+ text-decoration-color: var(--g1t-accent);
186186 }
187187 .sl-markdown-content :not(pre) > code {
188188 border-radius: 0.3rem;
251251 background: color-mix(in srgb, var(--g1t-info) 7%, var(--g1t-bg));
252252 }
253253 .starlight-aside--tip {
254− border-color: var(--g1t-accent);
255− background: color-mix(in srgb, var(--g1t-accent) 6%, var(--g1t-bg));
254+ border-color: var(--g1t-success);
255+ background: color-mix(in srgb, var(--g1t-success) 6%, var(--g1t-bg));
256256 }
257257 .starlight-aside--caution {
258258 border-color: var(--g1t-warn);
346346 color: var(--g1t-fg);
347347 }
348348 .sl-markdown-content .card .icon {
349− color: var(--g1t-merged);
350− background: color-mix(in srgb, var(--g1t-merged) 12%, transparent);
349+ color: var(--g1t-accent);
350+ background: color-mix(in srgb, var(--g1t-accent) 12%, transparent);
351351 border: 0;
352352 border-radius: 0.5rem;
353353 padding: 0.3rem;
413413 }
414414 .g1t-method-get,
415415 .g1t-method[data-method='get'] {
416− --method: var(--g1t-accent);
416+ --method: var(--g1t-success);
417417 }
418418 .g1t-method-post,
419419 .g1t-method[data-method='post'] {
+7−3
2020 --color-faint: var(--g1t-faint);
2121
2222 --color-accent: var(--g1t-accent);
23+ --color-accent-hover: var(--g1t-accent-hover);
2324 --color-accent-dim: var(--g1t-accent-dim);
2425
26+ --color-success: var(--g1t-success);
27+ --color-success-dim: var(--g1t-success-dim);
28+
2529 --color-info: var(--g1t-info);
2630 --color-merged: var(--g1t-merged);
2731 --color-warn: var(--g1t-warn);
3741 }
3842
3943 ::selection {
40− background: color-mix(in srgb, var(--color-merged) 35%, transparent);
44+ background: color-mix(in srgb, var(--color-accent) 35%, transparent);
4145 }
4246
4347 @layer base {
4448 :focus-visible {
45− outline: 2px solid var(--color-merged);
49+ outline: 2px solid var(--color-accent);
4650 outline-offset: 2px;
4751 }
4852
5761 }
5862
5963 :root {
60− accent-color: var(--color-merged);
64+ accent-color: var(--color-accent);
6165 }
6266
6367 /* Figures line up in columns of money. */
+8−8
185185 );
186186 }
187187 return (
188− <section id="review" className={`scroll-mt-20 rounded-lg border p-4 sm:p-5 ${danger ? "border-warn/40 bg-warn/5" : "border-merged/40 bg-merged/5"}`}>
188+ <section id="review" className={`scroll-mt-20 rounded-lg border p-4 sm:p-5 ${danger ? "border-warn/40 bg-warn/5" : "border-accent/40 bg-accent/5"}`}>
189189 <h2 className="font-semibold tracking-tight">{title}</h2>
190190 <div className="mt-3">{body}</div>
191191 <form method="post" action={`${pathname}#${RESULT_ANCHOR[review.intent] ?? "top"}`} className="mt-4 flex flex-wrap items-center gap-2">
462462 /** A radio drawn as one button of a segmented row; still a plain radio without CSS. */
463463 function Segment({ name, value, checked, children }: { name: string; value: string; checked: boolean; children: ReactNode }) {
464464 return (
465− <label className="flex-1 cursor-pointer border-r border-line px-3 py-1.5 text-center text-sm whitespace-nowrap text-muted transition-colors last:border-r-0 hover:bg-raised hover:text-fg has-checked:bg-merged has-checked:font-medium has-checked:text-bg has-focus-visible:outline-2 has-focus-visible:-outline-offset-2 has-focus-visible:outline-merged">
465+ <label className="flex-1 cursor-pointer border-r border-line px-3 py-1.5 text-center text-sm whitespace-nowrap text-muted transition-colors last:border-r-0 hover:bg-raised hover:text-fg has-checked:bg-accent has-checked:font-medium has-checked:text-bg has-focus-visible:outline-2 has-focus-visible:-outline-offset-2 has-focus-visible:outline-accent">
466466 <input type="radio" name={name} value={value} defaultChecked={checked} className="sr-only" />
467467 {children}
468468 </label>
534534 {CREDIT_KINDS.map((option) => (
535535 <label
536536 key={option.value}
537− className="flex cursor-pointer gap-2.5 rounded-md border border-line bg-bg px-3 py-2.5 transition-colors hover:border-line-strong has-checked:border-merged/60 has-checked:bg-merged/8"
537+ className="flex cursor-pointer gap-2.5 rounded-md border border-line bg-bg px-3 py-2.5 transition-colors hover:border-line-strong has-checked:border-accent/60 has-checked:bg-accent/8"
538538 >
539539 <input type="radio" name="kind" value={option.value} defaultChecked={kind === option.value} className="mt-0.5" required />
540540 <span>
633633 <Badge tone="lavender">{kindLabel(grant.kind)}</Badge>
634634 <Badge tone={state.tone}>{state.label}</Badge>
635635 {showWorkspace && (
636− <Link to={`/workspaces/${encodeURIComponent(grant.workspace)}#credits`} className="font-mono text-xs text-merged hover:underline">
636+ <Link to={`/workspaces/${encodeURIComponent(grant.workspace)}#credits`} className="font-mono text-xs text-accent hover:underline">
637637 {grant.workspace}
638638 </Link>
639639 )}
859859 {entry.creditKind ? `Credit · ${kindLabel(entry.creditKind)}` : (ENTRY_KIND[entry.kind] ?? entry.kind)}
860860 </Badge>
861861 {showWorkspace && entry.workspace && (
862− <Link to={`/workspaces/${encodeURIComponent(entry.workspace)}`} className="font-mono text-xs text-merged hover:underline">
862+ <Link to={`/workspaces/${encodeURIComponent(entry.workspace)}`} className="font-mono text-xs text-accent hover:underline">
863863 {entry.workspace}
864864 </Link>
865865 )}
882882 .join(" · ")}
883883 </p>
884884 </td>
885− <td className={`tabular px-4 py-2.5 text-right whitespace-nowrap sm:pr-5 ${entry.amountMicros > 0 ? "text-accent" : "text-fg-soft"}`}>
885+ <td className={`tabular px-4 py-2.5 text-right whitespace-nowrap sm:pr-5 ${entry.amountMicros > 0 ? "text-success" : "text-fg-soft"}`}>
886886 {usd(entry.amountMicros, { signed: true })}
887887 </td>
888888 </tr>
908908 ) : (
909909 <ol className="space-y-3">
910910 {audit.map((entry) => (
911− <li key={entry.id} className="border-l-2 border-merged/40 pl-3">
911+ <li key={entry.id} className="border-l-2 border-accent/40 pl-3">
912912 <p className="flex flex-wrap items-center gap-x-2 text-sm">
913− <span className="font-medium text-merged">{actionLabel(entry.action)}</span>
913+ <span className="font-medium text-accent">{actionLabel(entry.action)}</span>
914914 <span className="text-xs text-faint">
915915 <When at={entry.createdAt} time />
916916 </span>
+2−2
99 import { usd } from "~/lib/money";
1010
1111 /** The two series: what was charged (lavender) beside what it cost g1t (gray). */
12−const CHARGED = "var(--g1t-merged)";
12+const CHARGED = "var(--g1t-accent)";
1313 const COST = "#7a7a84";
1414
1515 function Legend() {
131131 <td className="py-1.5 pr-3 text-right">{usd(month.chargedMicros)}</td>
132132 <td className="py-1.5 pr-3 text-right">{usd(month.plansMicros ?? 0)}</td>
133133 <td className="py-1.5 pr-3 text-right text-muted">{usd(month.costMicros)}</td>
134− <td className="py-1.5 pr-3 text-right text-merged">{usd(month.givenMicros ?? 0)}</td>
134+ <td className="py-1.5 pr-3 text-right text-accent">{usd(month.givenMicros ?? 0)}</td>
135135 <td className={`py-1.5 pr-3 text-right ${margin.micros < 0 ? "text-danger" : "text-fg-soft"}`}>
136136 {usd(margin.micros)}
137137 {margin.percent != null && <span className="text-faint"> {margin.percent}%</span>}
+2−2
1212
1313 export function chip(active: boolean) {
1414 return `inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs whitespace-nowrap transition-colors ${
15− active ? "border-merged/50 bg-merged/10 text-merged" : "border-line text-muted hover:border-line-strong hover:text-fg"
15+ active ? "border-accent/50 bg-accent/10 text-accent" : "border-line text-muted hover:border-line-strong hover:text-fg"
1616 }`;
1717 }
1818
6262 key={tab.page}
6363 to={costsHref(tab.page, range)}
6464 aria-current={tab.page === page ? "page" : undefined}
65− className={`-mb-px border-b-2 pb-2 text-sm ${tab.page === page ? "border-merged text-fg" : "border-transparent text-muted hover:text-fg"}`}
65+ className={`-mb-px border-b-2 pb-2 text-sm ${tab.page === page ? "border-accent text-fg" : "border-transparent text-muted hover:text-fg"}`}
6666 >
6767 {tab.title}
6868 </Link>
+1−1
88 import { type DayFigures, marginPercent, percentLabel } from "~/lib/costs";
99 import { usd } from "~/lib/money";
1010
11−const CHARGED = "var(--g1t-merged)";
11+const CHARGED = "var(--g1t-accent)";
1212 const COST = "#7a7a84";
1313 const LOSS = "var(--g1t-danger)";
1414
+1−1
4949
5050 /** One timer: a label, a figure, and a line under it. */
5151 export function Timer({ label, value, hint, tone }: { label: string; value: ReactNode; hint?: ReactNode; tone?: "danger" | "warn" | "mint" }) {
52− const color = tone === "danger" ? "text-danger" : tone === "warn" ? "text-warn" : tone === "mint" ? "text-accent" : "text-fg";
52+ const color = tone === "danger" ? "text-danger" : tone === "warn" ? "text-warn" : tone === "mint" ? "text-success" : "text-fg";
5353 return (
5454 <div className="min-w-0 px-4 py-3">
5555 <p className="text-xs text-muted">{label}</p>
+2−2
2929 y={p.y * 10 + 1}
3030 width="8"
3131 height="8"
32− fill={p.one ? "var(--g1t-merged)" : "currentColor"}
32+ fill={p.one ? "var(--g1t-accent)" : "currentColor"}
3333 />
3434 ));
3535 }
5555 <Pixels of={WORD} />
5656 </svg>
5757 </span>
58− <span className="rounded-full bg-merged/12 px-2 py-0.5 font-mono text-[0.7rem] font-semibold tracking-wide text-merged ring-1 ring-merged/35 ring-inset">
58+ <span className="rounded-full bg-accent/12 px-2 py-0.5 font-mono text-[0.7rem] font-semibold tracking-wide text-accent ring-1 ring-accent/35 ring-inset">
5959 sudo
6060 </span>
6161 </span>
+2−2
169169 return (
170170 <ol className="mt-4 space-y-3">
171171 {sorted.map((note) => (
172− <li key={note.id} className="border-l-2 border-merged/40 pl-3">
172+ <li key={note.id} className="border-l-2 border-accent/40 pl-3">
173173 <p className="text-sm break-words whitespace-pre-line text-fg-soft">{note.text}</p>
174174 <p className="mt-1 flex flex-wrap items-center gap-x-2 text-xs text-faint">
175175 <StaffName email={note.by} me={me} />
200200 function StripeLink({ url, children }: { url: string | null; children: ReactNode }) {
201201 if (!url || !url.startsWith("https://")) return null;
202202 return (
203− <a href={url} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1 text-merged hover:underline">
203+ <a href={url} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1 text-accent hover:underline">
204204 {children}
205205 </a>
206206 );
+4−4
9292 return (
9393 <span
9494 title={label}
95− className="shrink-0 rounded-full bg-merged/15 px-1.5 py-px text-[0.6875rem] font-semibold text-merged tabular-nums ring-1 ring-merged/30"
95+ className="shrink-0 rounded-full bg-accent/15 px-1.5 py-px text-[0.6875rem] font-semibold text-accent tabular-nums ring-1 ring-accent/30"
9696 >
9797 {count > 99 ? "99+" : count}
9898 <span className="sr-only"> {label}</span>
127127 current ? "bg-raised font-medium text-fg" : "text-muted hover:bg-raised/60 hover:text-fg"
128128 }`}
129129 >
130− <NavGlyph icon={item.icon} className={`shrink-0 ${current ? "text-merged" : "text-faint group-hover:text-muted"}`} />
130+ <NavGlyph icon={item.icon} className={`shrink-0 ${current ? "text-accent" : "text-faint group-hover:text-muted"}`} />
131131 <span className="min-w-0 grow truncate">{item.label}</span>
132132 <CountPill count={countFor([item], counts)} label={countLabel(item)} />
133133 {item.soon && <SoonPill />}
145145 aria-current={current ? "page" : undefined}
146146 className={`relative flex h-8 items-center gap-2 rounded-md pr-2 pl-[2.375rem] text-[0.8125rem] transition-colors ${
147147 current
148− ? "bg-raised font-medium text-fg before:absolute before:top-1.5 before:bottom-1.5 before:left-[1.1875rem] before:z-10 before:w-px before:bg-merged"
148+ ? "bg-raised font-medium text-fg before:absolute before:top-1.5 before:bottom-1.5 before:left-[1.1875rem] before:z-10 before:w-px before:bg-accent"
149149 : item.soon
150150 ? "text-faint hover:bg-raised/60 hover:text-muted"
151151 : "text-muted hover:bg-raised/60 hover:text-fg"
240240 <div className="border-t border-line bg-raised/40 px-4 py-3">
241241 {email && (
242242 <p title="Signed in through Cloudflare Access" className="flex items-center gap-2 text-[0.8125rem]">
243− <ShieldCheck size={15} className="shrink-0 text-merged" />
243+ <ShieldCheck size={15} className="shrink-0 text-accent" />
244244 <span className="min-w-0 truncate font-mono text-xs text-fg-soft">{email}</span>
245245 </p>
246246 )}
+8−8
3434 }
3535
3636 const CONTROL =
37− "w-full rounded-md border border-line bg-bg px-3 py-2 text-sm outline-none transition-colors placeholder:text-faint hover:border-line-strong focus:border-merged/60";
37+ "w-full rounded-md border border-line bg-bg px-3 py-2 text-sm outline-none transition-colors placeholder:text-faint hover:border-line-strong focus:border-accent/60";
3838
3939 /** Tells password managers that a field is not a login. */
4040 const NOT_A_CREDENTIAL = {
6464
6565 const BUTTON_VARIANTS: Record<Variant, string> = {
6666 primary: "bg-fg text-bg hover:bg-white",
67− lavender: "bg-merged text-bg hover:bg-[#c8bdff]",
67+ lavender: "bg-accent text-bg hover:bg-accent-hover",
6868 quiet: "border border-line text-fg/80 hover:border-line-strong hover:bg-surface hover:text-fg",
6969 danger: "border border-danger/40 text-danger hover:border-danger/70 hover:bg-danger/10",
7070 };
117117 }
118118
119119 const NOTICE = {
120− ok: { icon: CheckCircle2, className: "border-accent/30 bg-accent/8 text-accent" },
120+ ok: { icon: CheckCircle2, className: "border-success/30 bg-success/8 text-success" },
121121 error: { icon: AlertTriangle, className: "border-danger/30 bg-danger/8 text-danger" },
122122 warn: { icon: AlertTriangle, className: "border-warn/30 bg-warn/8 text-warn" },
123− info: { icon: Info, className: "border-merged/30 bg-merged/8 text-merged" },
123+ info: { icon: Info, className: "border-accent/30 bg-accent/8 text-accent" },
124124 } as const;
125125
126126 export function Notice({ tone, children }: { tone: keyof typeof NOTICE; children: ReactNode }) {
137137 export function Badge({ tone = "plain", children }: { tone?: "plain" | "lavender" | "mint" | "warn" | "danger" | "info"; children: ReactNode }) {
138138 const tones = {
139139 plain: "border-line text-muted",
140− lavender: "border-merged/35 bg-merged/10 text-merged",
141− mint: "border-accent/30 bg-accent/8 text-accent",
140+ lavender: "border-accent/35 bg-accent/10 text-accent",
141+ mint: "border-success/30 bg-success/8 text-success",
142142 warn: "border-warn/35 bg-warn/10 text-warn",
143143 danger: "border-danger/35 bg-danger/10 text-danger",
144144 info: "border-info/35 bg-info/10 text-info",
197197 }
198198
199199 const STATE = {
200− ok: { label: "OK", fill: "var(--g1t-accent)", text: "text-accent" },
200+ ok: { label: "OK", fill: "var(--g1t-success)", text: "text-success" },
201201 warning: { label: "Warning", fill: "var(--g1t-warn)", text: "text-warn" },
202202 stopped: { label: "Stopped", fill: "var(--g1t-danger)", text: "text-danger" },
203203 } as const;
236236
237237 /** A label and a figure, for the strip of totals over a page. */
238238 export function Stat({ label, value, hint, tone }: { label: string; value: ReactNode; hint?: ReactNode; tone?: "danger" | "warn" | "mint" }) {
239− const color = tone === "danger" ? "text-danger" : tone === "warn" ? "text-warn" : tone === "mint" ? "text-accent" : "text-fg";
239+ const color = tone === "danger" ? "text-danger" : tone === "warn" ? "text-warn" : tone === "mint" ? "text-success" : "text-fg";
240240 return (
241241 <div className="rounded-lg border border-line bg-surface px-4 py-3">
242242 <p className="text-xs text-muted">{label}</p>
+1−1
7272 <ul className="list-disc space-y-1 pl-5 text-sm text-muted">
7373 <li>
7474 Disputes and declined cards are signals in{" "}
75− <Link to={reachOutHref({ kind: "declined" })} className="text-merged hover:underline">
75+ <Link to={reachOutHref({ kind: "declined" })} className="text-accent hover:underline">
7676 Reach out
7777 </Link>
7878 . Stripe Radar's early fraud warnings are not in sudo yet.
+2−2
102102 {before && (
103103 <p className="mt-4 text-xs text-faint">
104104 Changes before <When at={before} time />.{" "}
105− <Link to={auditHref({ by, action })} className="text-merged hover:underline">
105+ <Link to={auditHref({ by, action })} className="text-accent hover:underline">
106106 Back to the newest
107107 </Link>
108108 </p>
130130 </p>
131131 <div className="min-w-0 grow">
132132 <p className="flex flex-wrap items-center gap-x-2 text-sm">
133− <span className={`font-medium ${stripe ? "text-info" : "text-merged"}`}>{actionLabel(entry.action)}</span>
133+ <span className={`font-medium ${stripe ? "text-info" : "text-accent"}`}>{actionLabel(entry.action)}</span>
134134 {path && (
135135 <Link to={path} className="inline-flex items-center gap-0.5 text-fg-soft hover:text-fg hover:underline hover:underline-offset-4">
136136 <span className={entry.account.startsWith("ws_") ? "font-mono text-xs" : ""}>{accountName(entry.account, nameMap)}</span>
+4−4
211211 </Field>
212212 <div className="flex flex-col justify-end gap-2">
213213 <label className="flex items-center gap-2 text-sm text-muted">
214− <input type="checkbox" name="scaleToOwn" className="accent-[var(--g1t-merged)]" /> Scale to g1t's count
214+ <input type="checkbox" name="scaleToOwn" className="accent-[var(--g1t-accent)]" /> Scale to g1t's count
215215 </label>
216216 <div className="flex gap-2">
217217 <Button type="submit">Save mapping</Button>
233233 <input type="hidden" name="intent" value="settings" />
234234 <Field label="Apply small moves on their own">
235235 <label className="flex h-[38px] items-center gap-2 text-sm text-fg-soft">
236− <input type="checkbox" name="autoApply" defaultChecked={report.settings.autoApply} className="accent-[var(--g1t-merged)]" /> On
236+ <input type="checkbox" name="autoApply" defaultChecked={report.settings.autoApply} className="accent-[var(--g1t-accent)]" /> On
237237 </label>
238238 </Field>
239239 <Field label="Up to, either way, %">
259259 </Field>
260260 <Field label="Card fee on AI credit bought by card">
261261 <label className="flex h-[38px] items-center gap-2 text-sm text-fg-soft">
262− <input type="checkbox" name="cardFee" defaultChecked={report.settings.cardFee ?? true} className="accent-[var(--g1t-merged)]" /> Passed on as its own line
262+ <input type="checkbox" name="cardFee" defaultChecked={report.settings.cardFee ?? true} className="accent-[var(--g1t-accent)]" /> Passed on as its own line
263263 </label>
264264 </Field>
265265 <div className="sm:col-span-2 lg:col-span-4">
291291 </div>
292292 </div>
293293 <p className="tabular mt-1.5 text-sm">
294− Cost {unitDollars(p.currentCostMicros)} → <span className={rise ? "text-warn" : "text-accent"}>{unitDollars(p.proposedCostMicros)}</span> per {p.unit || "unit"}{" "}
294+ Cost {unitDollars(p.currentCostMicros)} → <span className={rise ? "text-warn" : "text-success"}>{unitDollars(p.proposedCostMicros)}</span> per {p.unit || "unit"}{" "}
295295 <span className="text-faint">({percentLabel(p.changePercent, { signed: true })})</span>
296296 </p>
297297 <p className="mt-1 text-xs text-muted">{p.reason}</p>
+1−1
169169
170170 function CapMeter({ label, used, cap, hint }: { label: string; used: number; cap: number; hint: ReactNode }) {
171171 const percent = capPercent(used, cap);
172− const tone = cap > 0 && used >= cap ? "bg-danger" : percent >= 75 ? "bg-warn" : "bg-merged";
172+ const tone = cap > 0 && used >= cap ? "bg-danger" : percent >= 75 ? "bg-warn" : "bg-accent";
173173 return (
174174 <div className="rounded-md border border-line px-4 py-3">
175175 <div className="flex flex-wrap items-baseline justify-between gap-2">
+1−1
293293 function StripeLink({ url }: { url: string | null }) {
294294 if (!url || !url.startsWith("https://")) return <span className="text-faint">—</span>;
295295 return (
296− <a href={url} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1 text-merged hover:underline">
296+ <a href={url} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1 text-accent hover:underline">
297297 Stripe
298298 <ExternalLink size={12} />
299299 </a>
+2−2
8484 {INCIDENT_SEVERITIES.map((s) => (
8585 <label
8686 key={s.value}
87− className="flex cursor-pointer gap-2.5 rounded-md border border-line px-3 py-2 has-checked:border-merged/60 has-checked:bg-merged/8"
87+ className="flex cursor-pointer gap-2.5 rounded-md border border-line px-3 py-2 has-checked:border-accent/60 has-checked:bg-accent/8"
8888 >
89− <input type="radio" name="severity" value={s.value} required defaultChecked={(v.severity || "sev3") === s.value} className="mt-1 accent-[#b6a8ff]" />
89+ <input type="radio" name="severity" value={s.value} required defaultChecked={(v.severity || "sev3") === s.value} className="mt-1 accent-[var(--g1t-accent)]" />
9090 <span>
9191 <span className="block text-sm font-semibold">{s.label}</span>
9292 <span className="block text-xs text-muted">{s.about}</span>
+1−1
109109 }
110110 actions={
111111 published ? (
112− <a href={`${incident.url}#postmortem`} className="inline-flex items-center gap-1.5 text-sm text-merged hover:underline">
112+ <a href={`${incident.url}#postmortem`} className="inline-flex items-center gap-1.5 text-sm text-accent hover:underline">
113113 On the status page <ExternalLink size={13} aria-hidden="true" />
114114 </a>
115115 ) : undefined
+13−13
128128 );
129129 if (entry.kind === "update") {
130130 return (
131− <li className="rounded-md border border-merged/30 bg-merged/6 px-3.5 py-3">
131+ <li className="rounded-md border border-accent/30 bg-accent/6 px-3.5 py-3">
132132 <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
133− <Globe size={14} aria-hidden="true" className="text-merged" />
134− <span className="text-xs font-semibold text-merged">Public update</span>
133+ <Globe size={14} aria-hidden="true" className="text-accent" />
134+ <span className="text-xs font-semibold text-accent">Public update</span>
135135 {entry.status && <Badge tone="lavender">{statusLabel(entry.status)}</Badge>}
136136 {meta}
137137 {entry.notified != null && <span className="text-xs text-faint">· emailed {entry.notified}</span>}
214214 {error && <Notice tone="error">{error}</Notice>}
215215 {!draft && (
216216 <fieldset className="flex flex-wrap gap-2" aria-label="Who sees it">
217− <label className="inline-flex cursor-pointer items-center gap-2 rounded-md border border-line px-3 py-1.5 text-sm has-checked:border-merged/60 has-checked:bg-merged/10">
218− <input type="radio" name="visibility" value="public" defaultChecked className="accent-[#b6a8ff]" />
217+ <label className="inline-flex cursor-pointer items-center gap-2 rounded-md border border-line px-3 py-1.5 text-sm has-checked:border-accent/60 has-checked:bg-accent/10">
218+ <input type="radio" name="visibility" value="public" defaultChecked className="accent-[var(--g1t-accent)]" />
219219 <Globe size={14} aria-hidden="true" /> Public update
220220 </label>
221221 <label className="inline-flex cursor-pointer items-center gap-2 rounded-md border border-line px-3 py-1.5 text-sm has-checked:border-line-strong has-checked:bg-raised">
222− <input type="radio" name="visibility" value="internal" className="accent-[#b6a8ff]" />
222+ <input type="radio" name="visibility" value="internal" className="accent-[var(--g1t-accent)]" />
223223 <Lock size={14} aria-hidden="true" /> Internal note
224224 </label>
225225 </fieldset>
259259 <div className="flex flex-wrap items-center justify-between gap-3">
260260 {!draft ? (
261261 <label className="flex items-center gap-2 text-sm">
262− <input type="checkbox" name="notify" defaultChecked={notifyByDefault(incident.severity)} className="accent-[#b6a8ff]" />
262+ <input type="checkbox" name="notify" defaultChecked={notifyByDefault(incident.severity)} className="accent-[var(--g1t-accent)]" />
263263 Email subscribers (public updates only)
264264 </label>
265265 ) : (
324324 </Field>
325325 <div className="flex flex-wrap items-center justify-between gap-3">
326326 <label className="flex items-center gap-2 text-sm">
327− <input type="checkbox" name="notify" defaultChecked={notifyByDefault(incident.severity)} className="accent-[#b6a8ff]" />
327+ <input type="checkbox" name="notify" defaultChecked={notifyByDefault(incident.severity)} className="accent-[var(--g1t-accent)]" />
328328 Email subscribers
329329 </label>
330330 <Button type="submit" variant="lavender">
366366 {errorFor("resolve") && <Notice tone="error">{errorFor("resolve")}</Notice>}
367367 <Textarea name="message" rows={3} required maxLength={4000} aria-label="Resolution update" placeholder="Pushes work again. A bad deploy was rolled back; nothing was lost." />
368368 <label className="flex items-center gap-2 text-sm">
369− <input type="checkbox" name="notify" defaultChecked={notifyByDefault(incident.severity)} className="accent-[#b6a8ff]" />
369+ <input type="checkbox" name="notify" defaultChecked={notifyByDefault(incident.severity)} className="accent-[var(--g1t-accent)]" />
370370 Email subscribers
371371 </label>
372372 <Button type="submit" variant="lavender" className="w-full">
379379 {!open && isPublic && (
380380 <Section title="Postmortem" description={incident.postmortem_published_at ? "Published on the incident's page." : incident.postmortem ? "Drafted, not published." : "Not started."}>
381381 <div className="flex flex-wrap items-center gap-2">
382− <Link to={`/incidents/${incident.id}/postmortem`} className="inline-flex items-center gap-1.5 text-sm font-medium text-merged hover:underline">
382+ <Link to={`/incidents/${incident.id}/postmortem`} className="inline-flex items-center gap-1.5 text-sm font-medium text-accent hover:underline">
383383 <FileText size={14} aria-hidden="true" />
384384 {incident.postmortem ? "Edit the postmortem" : "Write the postmortem"}
385385 </Link>
436436 <button
437437 type="submit"
438438 aria-label={f.done_at ? `Mark “${f.title}” not done` : `Mark “${f.title}” done`}
439− className="mt-0.5 shrink-0 rounded text-faint hover:text-merged"
439+ className="mt-0.5 shrink-0 rounded text-faint hover:text-accent"
440440 >
441− {f.done_at ? <CheckCircle2 size={16} className="text-accent" /> : <Circle size={16} />}
441+ {f.done_at ? <CheckCircle2 size={16} className="text-success" /> : <Circle size={16} />}
442442 </button>
443443 <span className="min-w-0 text-sm">
444444 <span className={f.done_at ? "text-faint line-through" : ""}>{f.title}</span>
466466 <ul className="space-y-1.5 text-sm">
467467 {isPublic ? (
468468 <li>
469− <a href={incident.url} className="inline-flex items-center gap-1.5 text-merged hover:underline">
469+ <a href={incident.url} className="inline-flex items-center gap-1.5 text-accent hover:underline">
470470 Status page permalink <ExternalLink size={13} aria-hidden="true" />
471471 </a>
472472 <span className="block truncate font-mono text-xs text-faint">{incident.url}</span>
+3−3
180180 to={incidentsHref({ ...filters, tab: tab.value })}
181181 aria-current={current ? "page" : undefined}
182182 className={`-mb-px flex shrink-0 items-center gap-2 border-b-2 px-3 py-2 text-sm whitespace-nowrap ${
183− current ? "border-merged font-medium text-fg" : "border-transparent text-muted hover:text-fg"
183+ current ? "border-accent font-medium text-fg" : "border-transparent text-muted hover:text-fg"
184184 }`}
185185 >
186186 {tab.label}
187− <span className={`tabular rounded-full px-1.5 text-xs ${counts[tab.value] && tab.value !== "resolved" ? "bg-merged/15 text-merged" : "text-faint"}`}>
187+ <span className={`tabular rounded-full px-1.5 text-xs ${counts[tab.value] && tab.value !== "resolved" ? "bg-accent/15 text-accent" : "text-faint"}`}>
188188 {counts[tab.value]}
189189 </span>
190190 </Link>
229229 {filters.tab === "maintenance" ? (
230230 shownMaintenance.length === 0 ? (
231231 <EmptyState title="No maintenance scheduled">
232− <Link to="/incidents/maintenance/new" className="text-merged hover:underline">
232+ <Link to="/incidents/maintenance/new" className="text-accent hover:underline">
233233 Schedule maintenance
234234 </Link>{" "}
235235 to tell people ahead of planned work.
+4−4
256256 <span className="font-medium">{waiting.length} waiting</span>
257257 <span className="text-muted"> · tick some, or </span>
258258 {selectAll ? (
259− <a href={clearHref} className="text-merged hover:underline">
259+ <a href={clearHref} className="text-accent hover:underline">
260260 clear
261261 </a>
262262 ) : (
263− <a href={selectHref} className="text-merged hover:underline">
263+ <a href={selectHref} className="text-accent hover:underline">
264264 tick all {Math.min(waiting.length, MAX_BULK)}
265265 </a>
266266 )}
300300 value={entry.id}
301301 defaultChecked={selectAll && index < MAX_BULK}
302302 aria-label={`Tick ${entry.email}`}
303− className="mt-1 size-4 shrink-0 accent-[var(--color-merged)]"
303+ className="mt-1 size-4 shrink-0 accent-[var(--color-accent)]"
304304 />
305305 )}
306306 <div className="min-w-0 grow space-y-2">
594594 to={invitesHref(value)}
595595 aria-current={value === tab ? "page" : undefined}
596596 className={`inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs whitespace-nowrap transition-colors ${
597− value === tab ? "border-merged/50 bg-merged/10 text-merged" : "border-line text-muted hover:border-line-strong hover:text-fg"
597+ value === tab ? "border-accent/50 bg-accent/10 text-accent" : "border-line text-muted hover:border-line-strong hover:text-fg"
598598 }`}
599599 >
600600 {TAB_LABEL[value]}
+2−2
194194 <span>
195195 <When at={invoice.createdAt} />
196196 {invoice.paidAt ? (
197− <span className="text-accent">
197+ <span className="text-success">
198198 {" · "}paid <When at={invoice.paidAt} />
199199 </span>
200200 ) : null}
206206 const safe = safeUrl(url);
207207 if (!safe) return <span className="text-faint">—</span>;
208208 return (
209− <a href={safe} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1 text-merged hover:underline">
209+ <a href={safe} target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1 text-accent hover:underline">
210210 Stripe
211211 <ExternalLink size={12} />
212212 </a>
+3−3
8888 {components.map((c) => (
8989 <label
9090 key={c.key}
91− className="inline-flex cursor-pointer items-center gap-2 rounded-md border border-line px-2.5 py-1.5 text-sm has-checked:border-merged/60 has-checked:bg-merged/10"
91+ className="inline-flex cursor-pointer items-center gap-2 rounded-md border border-line px-2.5 py-1.5 text-sm has-checked:border-accent/60 has-checked:bg-accent/10"
9292 >
93− <input type="checkbox" name="components" value={c.key} defaultChecked={failed?.chosen.includes(c.key)} className="accent-[#b6a8ff]" />
93+ <input type="checkbox" name="components" value={c.key} defaultChecked={failed?.chosen.includes(c.key)} className="accent-[var(--g1t-accent)]" />
9494 {c.name}
9595 </label>
9696 ))}
9999 <Section title="Message" description="What will happen and what people will notice. Shown publicly.">
100100 <Textarea name="message" rows={4} required maxLength={4000} aria-label="Message" defaultValue={v.message} placeholder="We are upgrading the database behind git. Pushes may pause for up to five minutes; clones and the website keep working." />
101101 <label className="mt-3 flex items-center gap-2 text-sm">
102− <input type="checkbox" name="notify" defaultChecked className="accent-[#b6a8ff]" />
102+ <input type="checkbox" name="notify" defaultChecked className="accent-[var(--g1t-accent)]" />
103103 Email subscribers now, when it starts, and when it ends
104104 </label>
105105 </Section>
+3−3
7575 </>
7676 }
7777 actions={
78− <a href={m.url} className="inline-flex items-center gap-1.5 text-sm text-merged hover:underline">
78+ <a href={m.url} className="inline-flex items-center gap-1.5 text-sm text-accent hover:underline">
7979 On the status page <ExternalLink size={13} aria-hidden="true" />
8080 </a>
8181 }
9393 <Textarea name="message" rows={3} maxLength={4000} aria-label="Update" placeholder="Running a little long: about 20 more minutes." />
9494 <div className="flex flex-wrap items-center justify-between gap-3">
9595 <label className="flex items-center gap-2 text-sm">
96− <input type="checkbox" name="notify" className="accent-[#b6a8ff]" />
96+ <input type="checkbox" name="notify" className="accent-[var(--g1t-accent)]" />
9797 Email subscribers
9898 </label>
9999 <Button type="submit" name="intent" value="update" variant="lavender">
128128 <Textarea name="message" rows={2} maxLength={4000} placeholder="Said for you when empty." />
129129 </Field>
130130 <label className="flex items-center gap-2 text-sm">
131− <input type="checkbox" name="notify" defaultChecked className="accent-[#b6a8ff]" />
131+ <input type="checkbox" name="notify" defaultChecked className="accent-[var(--g1t-accent)]" />
132132 Email subscribers
133133 </label>
134134 <div className="flex flex-wrap gap-2">
+1−1
6363 </p>
6464
6565 {review && (
66− <section id="review" className="mt-6 scroll-mt-20 rounded-lg border border-merged/40 bg-merged/5 p-4 sm:p-5">
66+ <section id="review" className="mt-6 scroll-mt-20 rounded-lg border border-accent/40 bg-accent/5 p-4 sm:p-5">
6767 <h2 className="font-semibold tracking-tight">Create {review.name}?</h2>
6868 <p className="mt-1 text-sm text-muted">
6969 These workspaces will be billed to it from now on, under its limit and terms instead of their own:
+1−1
277277 return (
278278 <div className={`flex justify-between gap-4 ${strong ? "border-t border-line pt-1 font-medium" : ""}`}>
279279 <dt className="text-muted">{label}</dt>
280− <dd className={`tabular ${tone === "mint" ? "text-accent" : tone === "warn" ? "text-warn" : "text-fg"}`}>{value}</dd>
280+ <dd className={`tabular ${tone === "mint" ? "text-success" : tone === "warn" ? "text-warn" : "text-fg"}`}>{value}</dd>
281281 </div>
282282 );
283283 }
+1−1
246246 description={signalsError ? undefined : signalCount === 0 ? "Nobody needs a word right now." : `The most urgent of ${signalCount}.`}
247247 actions={
248248 signalCount > 0 && (
249− <Link to="/reach-out" className="inline-flex items-center gap-1 text-sm text-merged hover:underline hover:underline-offset-4">
249+ <Link to="/reach-out" className="inline-flex items-center gap-1 text-sm text-accent hover:underline hover:underline-offset-4">
250250 All {signalCount}
251251 <ArrowRight size={14} />
252252 </Link>
+2−2
8383 to={to}
8484 aria-current={active ? "page" : undefined}
8585 className={`inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs whitespace-nowrap transition-colors ${
86− active ? "border-merged/50 bg-merged/10 text-merged" : "border-line text-muted hover:border-line-strong hover:text-fg"
86+ active ? "border-accent/50 bg-accent/10 text-accent" : "border-line text-muted hover:border-line-strong hover:text-fg"
8787 }`}
8888 >
8989 {children}
90− {count != null && <span className={`tabular ${active ? "text-merged/80" : "text-faint"}`}>{count}</span>}
90+ {count != null && <span className={`tabular ${active ? "text-accent/80" : "text-faint"}`}>{count}</span>}
9191 </Link>
9292 );
9393 }
+2−2
6565 to={requestsHref(value)}
6666 aria-current={value === status ? "page" : undefined}
6767 className={`inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs whitespace-nowrap transition-colors ${
68− value === status ? "border-merged/50 bg-merged/10 text-merged" : "border-line text-muted hover:border-line-strong hover:text-fg"
68+ value === status ? "border-accent/50 bg-accent/10 text-accent" : "border-line text-muted hover:border-line-strong hover:text-fg"
6969 }`}
7070 >
7171 {STATUS_LABEL[value]}
201201 {overage ? (
202202 <p className="text-sm text-muted">
203203 Usually answered with a goodwill credit on{" "}
204− <Link to={`/overages#${encodeURIComponent(request.workspace)}`} className="text-merged hover:underline">
204+ <Link to={`/overages#${encodeURIComponent(request.workspace)}`} className="text-accent hover:underline">
205205 Overages
206206 </Link>
207207 , which also closes this request. Or answer it here.
+3−3
4747 return (
4848 <main className="mx-auto max-w-3xl px-4 py-8 sm:py-14">
4949 <div className="flex items-center gap-3">
50− <span className="flex size-10 items-center justify-center rounded-lg bg-merged/10 text-merged ring-1 ring-merged/30 ring-inset">
50+ <span className="flex size-10 items-center justify-center rounded-lg bg-accent/10 text-accent ring-1 ring-accent/30 ring-inset">
5151 <NavGlyph icon={icon} size={18} />
5252 </span>
5353 <Badge tone="lavender">Soon</Badge>
6666 <ul className="mt-3 space-y-2.5">
6767 {soon.plans.map((plan) => (
6868 <li key={plan} className="flex gap-2.5 text-sm text-fg-soft">
69− <Check size={15} className="mt-0.5 shrink-0 text-merged" />
69+ <Check size={15} className="mt-0.5 shrink-0 text-accent" />
7070 <span>{plan}</span>
7171 </li>
7272 ))}
8181 {soon.meanwhile.to && (
8282 <>
8383 {" "}
84− <Link to={soon.meanwhile.to} className="inline-flex items-center gap-1 text-merged hover:underline hover:underline-offset-4">
84+ <Link to={soon.meanwhile.to} className="inline-flex items-center gap-1 text-accent hover:underline hover:underline-offset-4">
8585 {soon.meanwhile.link ?? "Open"}
8686 <ArrowRight size={13} />
8787 </Link>
+4−4
340340 <Section id="terms" title="Terms" description={`Charged on ${billedTo.name}'s terms while it pays for this workspace.`}>
341341 <div className="flex flex-wrap items-center justify-between gap-3">
342342 <TermsBadge terms={terms} />
343− <Link to={`/enterprises/${encodeURIComponent(billedTo.id)}#terms`} className="text-sm text-merged hover:underline hover:underline-offset-4">
343+ <Link to={`/enterprises/${encodeURIComponent(billedTo.id)}#terms`} className="text-sm text-accent hover:underline hover:underline-offset-4">
344344 Change them on {billedTo.name}
345345 </Link>
346346 </div>
376376 billedTo ? (
377377 <>
378378 Changes about this workspace in {billedTo.name}'s log.{" "}
379− <Link to={`/enterprises/${encodeURIComponent(billedTo.id)}`} className="text-merged hover:underline">
379+ <Link to={`/enterprises/${encodeURIComponent(billedTo.id)}`} className="text-accent hover:underline">
380380 Full log
381381 </Link>
382382 </>
484484 ) : enterprises.length === 0 ? (
485485 <p className="text-sm text-muted">
486486 Itself. There are no enterprises to move it onto yet;{" "}
487− <Link to="/enterprises/new" className="text-merged hover:underline hover:underline-offset-4">
487+ <Link to="/enterprises/new" className="text-accent hover:underline hover:underline-offset-4">
488488 create one
489489 </Link>
490490 .
608608 </div>
609609 <div className="flex justify-between gap-3">
610610 <dt className="text-muted">g1t's margin, returned</dt>
611− <dd className="tabular text-accent">{usd(overage.goodwill.marginMicros)}</dd>
611+ <dd className="tabular text-success">{usd(overage.goodwill.marginMicros)}</dd>
612612 </div>
613613 <div className="flex justify-between gap-3">
614614 <dt className="text-muted">Real cost absorbed</dt>
+2−2
135135 aria-label="Search workspaces"
136136 autoComplete="off"
137137 data-1p-ignore
138− className="w-full rounded-md border border-line bg-bg py-2 pr-3 pl-8 text-sm outline-none transition-colors placeholder:text-faint hover:border-line-strong focus:border-merged/60"
138+ className="w-full rounded-md border border-line bg-bg py-2 pr-3 pl-8 text-sm outline-none transition-colors placeholder:text-faint hover:border-line-strong focus:border-accent/60"
139139 />
140140 </div>
141141 <fieldset className="flex flex-wrap items-center gap-2">
143143 {(Object.keys(FILTERS) as Filter[]).map((key) => (
144144 <label
145145 key={key}
146− className="inline-flex cursor-pointer items-center gap-2 rounded-full border border-line px-3 py-1.5 text-xs text-muted transition-colors select-none hover:border-line-strong has-checked:border-merged/50 has-checked:bg-merged/10 has-checked:text-merged"
146+ className="inline-flex cursor-pointer items-center gap-2 rounded-full border border-line px-3 py-1.5 text-xs text-muted transition-colors select-none hover:border-line-strong has-checked:border-accent/50 has-checked:bg-accent/10 has-checked:text-accent"
147147 >
148148 <input type="checkbox" name="show" value={key} defaultChecked={show.includes(key)} className="size-3.5" />
149149 {FILTERS[key].label}
+5−1
2323 --color-faint: var(--g1t-faint);
2424
2525 --color-accent: var(--g1t-accent);
26+ --color-accent-hover: var(--g1t-accent-hover);
2627 --color-accent-dim: var(--g1t-accent-dim);
2728
29+ --color-success: var(--g1t-success);
30+ --color-success-dim: var(--g1t-success-dim);
31+
2832 --color-info: var(--g1t-info);
2933 --color-merged: var(--g1t-merged);
3034 --color-warn: var(--g1t-warn);
526530 position: absolute;
527531 inset: 0;
528532 border-radius: inherit;
529− box-shadow: 0 0 0 6px color-mix(in srgb, var(--color-merged) 18%, transparent);
533+ box-shadow: 0 0 0 6px color-mix(in srgb, var(--color-accent) 18%, transparent);
530534 opacity: 0;
531535 pointer-events: none;
532536 animation: flow-step 10s ease-in-out infinite both;
+1−1
8888 {REPO_ROLES.map((role) => (
8989 <td key={role} className="px-1 py-2 text-center">
9090 {allows(role, row.capability) ? (
91− <Check size={15} aria-label="Yes" className={`inline ${owners ? "text-muted" : "text-accent"}`} />
91+ <Check size={15} aria-label="Yes" className={`inline ${owners ? "text-muted" : "text-success"}`} />
9292 ) : (
9393 <Minus size={13} aria-label="No" className="inline text-line-strong" />
9494 )}
+1−1
1919 switch (conclusion) {
2020 case "success":
2121 return (
22− <span className="inline-flex shrink-0 rounded-full bg-accent/15 p-0.5 text-accent" aria-label="Succeeded">
22+ <span className="inline-flex shrink-0 rounded-full bg-success/15 p-0.5 text-success" aria-label="Succeeded">
2323 <Check size={size - 4} strokeWidth={3} />
2424 </span>
2525 );
+11−11
3333 case "issue.opened":
3434 return {
3535 icon: <CircleDot size={14} />,
36− tone: isG1t(actor) ? "text-merged" : "text-muted",
36+ tone: isG1t(actor) ? "text-accent" : "text-muted",
3737 actor,
3838 text: isG1t(actor) ? <>filed {ref(event.data.number)} for something it found</> : <>opened {ref(event.data.number)}</>,
3939 coordination: isG1t(actor),
4141 case "pull.opened":
4242 return {
4343 icon: <Play size={14} />,
44− tone: "text-merged",
44+ tone: "text-accent",
4545 actor: event.data.agent,
4646 text: (
4747 <>
5454 case "checks.completed":
5555 return {
5656 icon: <Terminal size={14} />,
57− tone: event.data.status === "passed" ? "text-accent" : "text-danger",
57+ tone: event.data.status === "passed" ? "text-success" : "text-danger",
5858 actor: null,
5959 text: (
6060 <>
6565 case "review.completed":
6666 return {
6767 icon: event.data.verdict === "approve" ? <CircleCheck size={14} /> : <CircleSlash size={14} />,
68− tone: event.data.verdict === "approve" ? "text-accent" : "text-warn",
68+ tone: event.data.verdict === "approve" ? "text-success" : "text-warn",
6969 actor: "g1t",
7070 text: (
7171 <>
7777 if (event.data.verdict) {
7878 return {
7979 icon: event.data.verdict === "approve" ? <CircleCheck size={14} /> : <CircleSlash size={14} />,
80− tone: event.data.verdict === "approve" ? "text-accent" : "text-warn",
80+ tone: event.data.verdict === "approve" ? "text-success" : "text-warn",
8181 actor,
8282 text: (
8383 <>
8888 }
8989 return {
9090 icon: <MessageSquare size={14} />,
91− tone: isG1t(actor) ? "text-merged" : "text-muted",
91+ tone: isG1t(actor) ? "text-accent" : "text-muted",
9292 actor,
9393 text: <>commented on {ref(event.data.number)}</>,
9494 coordination: isG1t(actor),
9696 case "pull.merged":
9797 return { icon: <GitMerge size={14} />, tone: "text-accent", actor, text: <>landed {ref(event.data.number)} on main</> };
9898 case "agent.asked":
99− return { icon: <MessageCircleQuestion size={14} />, tone: "text-merged", actor, text: <>asked the agent on {ref(event.data.number)}, and g1t woke it to answer</> };
99+ return { icon: <MessageCircleQuestion size={14} />, tone: "text-accent", actor, text: <>asked the agent on {ref(event.data.number)}, and g1t woke it to answer</> };
100100 case "pull.merge_requested":
101101 return { icon: <GitMerge size={14} />, tone: "text-muted", actor, text: <>is bringing {ref(event.data.number)} up to date</> };
102102 default:
117117 <li
118118 key={event.id}
119119 className={`flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-sm ${
120− line!.coordination ? "bg-merged/[0.07] ring-1 ring-merged/25" : ""
120+ line!.coordination ? "bg-accent/[0.07] ring-1 ring-accent/25" : ""
121121 }`}
122122 >
123123 <span className={`shrink-0 ${line!.tone}`}>{line!.icon}</span>
154154 const state = exchange.answer
155155 ? exchange.declined
156156 ? { label: "Declined", tone: "text-warn ring-warn/40" }
157− : { label: exchange.kind === "handoff" ? "Taken on" : "Answered", tone: "text-accent ring-accent/40" }
157+ : { label: exchange.kind === "handoff" ? "Taken on" : "Answered", tone: "text-success ring-success/40" }
158158 : exchange.deliveredAt
159159 ? { label: "Read", tone: "text-info ring-info/40" }
160160 : { label: "Waiting to be read", tone: "text-faint ring-line" };
161161 return (
162− <li key={exchange.id} className="rounded-2xl bg-merged/[0.05] p-4 ring-1 ring-merged/25">
162+ <li key={exchange.id} className="rounded-2xl bg-accent/[0.05] p-4 ring-1 ring-accent/25">
163163 <p className="flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted">
164164 <Avatar name="g1t" size={14} />
165165 <span>
170170 </p>
171171 <p className="mt-2 text-sm">{exchange.body}</p>
172172 {exchange.answer && (
173− <p className="mt-2 border-l-2 border-merged/40 pl-3 text-sm text-fg-soft">{exchange.answer}</p>
173+ <p className="mt-2 border-l-2 border-accent/40 pl-3 text-sm text-fg-soft">{exchange.answer}</p>
174174 )}
175175 </li>
176176 );
+2−2
7575 >
7676 <input type="hidden" name="intent" value="delegate" />
7777 <p className="flex items-center gap-2 text-sm font-semibold">
78− <Sparkles size={15} className="text-merged" />
78+ <Sparkles size={15} className="text-accent" />
7979 Put an agent on it
8080 </p>
8181 <p className="mt-1 text-xs leading-5 text-muted">
156156 <button
157157 type="submit"
158158 disabled={busy || repos.length === 0}
159− className="inline-flex shrink-0 items-center gap-1.5 rounded-md bg-merged px-3.5 py-2 text-sm font-semibold text-bg transition-colors hover:bg-[#c9bfff] disabled:opacity-60"
159+ className="inline-flex shrink-0 items-center gap-1.5 rounded-md bg-accent px-3.5 py-2 text-sm font-semibold text-bg transition-colors hover:bg-accent-hover disabled:opacity-60"
160160 >
161161 {busy ? <LoaderCircle size={14} className="animate-spin" /> : <Sparkles size={14} />}
162162 {busy ? "Starting…" : "Put an agent on it"}
+1−1
105105 onClick={copy}
106106 className="absolute top-1.5 right-1.5 rounded-md p-1.5 text-faint transition-colors hover:bg-raised hover:text-fg"
107107 >
108− {copied ? <Check size={14} className="text-accent" /> : <Copy size={14} />}
108+ {copied ? <Check size={14} className="text-success" /> : <Copy size={14} />}
109109 </button>
110110 </div>
111111 </div>
+9−9
8383 queued: { label: "Starting", tone: "text-muted border-line", icon: <Clock size={12} /> },
8484 running: {
8585 label: "Running",
86− tone: "text-merged border-merged/40 bg-merged/10",
86+ tone: "text-accent border-accent/40 bg-accent/10",
8787 icon: <Loader2 size={12} className="animate-spin" />,
8888 },
89− succeeded: { label: "Done", tone: "text-accent border-accent/40 bg-accent/10", icon: <Bot size={12} /> },
89+ succeeded: { label: "Done", tone: "text-success border-success/40 bg-success/10", icon: <Bot size={12} /> },
9090 failed: { label: "Failed", tone: "text-danger border-danger/40 bg-danger/10", icon: <TriangleAlert size={12} /> },
9191 stopped: { label: "Stopped", tone: "text-warn border-warn/40 bg-warn/10", icon: <OctagonX size={12} /> },
9292 };
194194 className="w-full rounded-md border border-line bg-bg px-3 py-2 text-sm outline-none placeholder:text-faint focus:border-accent-dim"
195195 />
196196 {fetcher.data?.error && <p className="text-sm text-danger">{fetcher.data.error}</p>}
197− {fetcher.data?.ok && fetcher.data.notice && <p className="text-sm text-accent">{fetcher.data.notice}</p>}
197+ {fetcher.data?.ok && fetcher.data.notice && <p className="text-sm text-success">{fetcher.data.notice}</p>}
198198 <div className="flex justify-end">
199199 <SubmitButton
200200 fetcher={fetcher}
246246 return (
247247 <li
248248 className={`rounded-xl border bg-surface p-4 transition-colors hover:border-line-strong ${
249− active ? "border-merged/30" : "border-line"
249+ active ? "border-accent/30" : "border-line"
250250 }`}
251251 >
252252 <div className="flex flex-wrap items-center gap-x-3 gap-y-2">
260260 </div>
261261 {run.step && (
262262 <p className={`mt-2.5 truncate font-mono text-xs ${active ? "text-fg/85" : "text-muted"}`} title={inlinePlain(shownStep(run.step))}>
263− {active && <span className="mr-1.5 inline-block size-1.5 animate-pulse rounded-full bg-merged align-middle" />}
263+ {active && <span className="mr-1.5 inline-block size-1.5 animate-pulse rounded-full bg-accent align-middle" />}
264264 <InlineMarkdown text={shownStep(run.step)} />
265265 </p>
266266 )}
351351
352352 /** "Agent confidence: Low — tests not added, 3 revisions", and what the agent said it was unsure of. */
353353 export function ConfidenceLine({ confidence }: { confidence: Confidence }) {
354− const tone = confidence.level === "low" ? "text-danger" : confidence.level === "medium" ? "text-warn" : "text-accent";
354+ const tone = confidence.level === "low" ? "text-danger" : confidence.level === "medium" ? "text-warn" : "text-success";
355355 const level = { low: "Low", medium: "Medium", high: "High" }[confidence.level];
356356 return (
357357 <div className="mt-3 text-xs leading-5">
404404 return (
405405 <section
406406 aria-label="Agent"
407− className={`mt-4 rounded-2xl bg-surface p-4 ring-1 ${active ? "ring-merged/40" : "ring-line"}`}
407+ className={`mt-4 rounded-2xl bg-surface p-4 ring-1 ${active ? "ring-accent/40" : "ring-line"}`}
408408 >
409409 <div className="flex flex-wrap items-center gap-x-3 gap-y-2">
410410 <Avatar name={current.agent} size={24} />
438438 </div>
439439 {current.step && (
440440 <p className="mt-3 truncate rounded-lg bg-bg px-3 py-2 font-mono text-xs text-fg/85 ring-1 ring-line" title={inlinePlain(shownStep(current.step))}>
441− {active && <span className="mr-2 inline-block size-1.5 animate-pulse rounded-full bg-merged align-middle" />}
441+ {active && <span className="mr-2 inline-block size-1.5 animate-pulse rounded-full bg-accent align-middle" />}
442442 <InlineMarkdown text={shownStep(current.step)} />
443443 </p>
444444 )}
478478 return (
479479 <span
480480 title={run.step ? inlinePlain(shownStep(run.step)) : undefined}
481− className="inline-flex shrink-0 items-center gap-1 rounded-full border border-merged/40 bg-merged/10 px-2 py-0.5 text-xs text-merged"
481+ className="inline-flex shrink-0 items-center gap-1 rounded-full border border-accent/40 bg-accent/10 px-2 py-0.5 text-xs text-accent"
482482 >
483483 <Loader2 size={11} className="animate-spin" />
484484 {RUN_KIND_LABEL[run.kind]}
+2−2
1717 import { type Point, iso, isoPath, pts, stagger, timing } from "../lib/art";
1818
1919 const LINE = "var(--color-fg)";
20−const MINT = "var(--color-accent)";
21−const LAVENDER = "var(--color-merged)";
20+const MINT = "var(--color-success)";
21+const LAVENDER = "var(--color-accent)";
2222 const PEACH = "var(--color-warn)";
2323 const DANGER = "var(--color-danger)";
2424
+1−1
1414 <section aria-label="Agent" className="space-y-3">
1515 <div aria-disabled="true" className="rounded-xl border border-line bg-surface opacity-80">
1616 <p className="flex items-center gap-2 px-4 pt-3 text-sm font-medium text-fg">
17− <Sparkles size={14} className="text-merged" aria-hidden="true" />
17+ <Sparkles size={14} className="text-accent" aria-hidden="true" />
1818 Agent
1919 <span className="rounded-full border border-line px-1.5 text-[0.6875rem] font-normal text-muted">Coming later</span>
2020 </p>
+5−5
8686 title={
8787 <>
8888 {plan?.title ?? "g1t"}
89− <span className={`rounded-full px-2 py-0.5 text-xs ${on && status.kind !== "past_due" && status.kind !== "canceling" ? "bg-accent/15 text-accent" : status.kind === "free" || status.kind === "trial" ? "border border-line text-muted" : "bg-warn/15 text-warn"}`}>
89+ <span className={`rounded-full px-2 py-0.5 text-xs ${on && status.kind !== "past_due" && status.kind !== "canceling" ? "bg-success/15 text-success" : status.kind === "free" || status.kind === "trial" ? "border border-line text-muted" : "bg-warn/15 text-warn"}`}>
9090 {status.label}
9191 {status.kind === "canceling" && subscription?.periodEnd ? `, ${new Date(subscription.periodEnd).toLocaleDateString()}` : ""}
9292 </span>
298298 <div className="mt-5 rounded-lg border border-line bg-bg/40 p-4">
299299 <div className="flex flex-wrap items-baseline justify-between gap-2">
300300 <p className="text-sm font-medium">Auto-reload</p>
301− <span className={`rounded-full px-2 py-0.5 text-xs ${r.enabled ? "bg-accent/15 text-accent" : "border border-line text-muted"}`}>{r.enabled ? "On" : "Off"}</span>
301+ <span className={`rounded-full px-2 py-0.5 text-xs ${r.enabled ? "bg-success/15 text-success" : "border border-line text-muted"}`}>{r.enabled ? "On" : "Off"}</span>
302302 </div>
303303 {r.failedAt && (
304304 <p className="mt-2 text-sm text-danger">
353353 </span>
354354 </div>
355355 <div className="relative mt-1.5 h-1.5 rounded-full bg-line" role="presentation">
356− <div className={`h-full rounded-full ${spent >= of ? "bg-danger" : spent * 4 >= of * 3 ? "bg-warn" : "bg-accent"}`} style={{ width: `${Math.min(100, (spent / Math.max(1, of)) * 100)}%` }} />
356+ <div className={`h-full rounded-full ${spent >= of ? "bg-danger" : spent * 4 >= of * 3 ? "bg-warn" : "bg-success"}`} style={{ width: `${Math.min(100, (spent / Math.max(1, of)) * 100)}%` }} />
357357 {levels.filter((l) => l < 100).map((l) => (
358358 <span key={l} className="absolute -top-0.5 h-2.5 w-px bg-fg/40" style={{ left: `${l}%` }} />
359359 ))}
498498 <p className="text-xs text-muted">{row.about}</p>
499499 </div>
500500 <span className="tabular-nums text-muted">{row.price}</span>
501− <span className={`rounded-full px-2 py-0.5 text-xs ${row.on ? "bg-accent/15 text-accent" : "border border-line text-muted"}`}>{row.label}</span>
501+ <span className={`rounded-full px-2 py-0.5 text-xs ${row.on ? "bg-success/15 text-success" : "border border-line text-muted"}`}>{row.label}</span>
502502 {row.control}
503503 </li>
504504 ))}
635635 <li key={invoice.id} className="flex flex-wrap items-center gap-x-4 gap-y-1 px-5 py-2.5 text-sm">
636636 <span className="w-24 shrink-0 text-muted tabular-nums">{new Date(invoice.createdAt).toLocaleDateString("en-US", { timeZone: "UTC" })}</span>
637637 <span className="min-w-0 flex-1 truncate">{invoice.description ?? invoice.number ?? invoice.id}</span>
638− <span className={`rounded-full px-2 py-0.5 text-xs ${invoice.status === "paid" ? "bg-accent/15 text-accent" : invoice.status === "open" ? "bg-warn/15 text-warn" : "border border-line text-muted"}`}>
638+ <span className={`rounded-full px-2 py-0.5 text-xs ${invoice.status === "paid" ? "bg-success/15 text-success" : invoice.status === "open" ? "bg-warn/15 text-warn" : "border border-line text-muted"}`}>
639639 {STATUS[invoice.status] ?? invoice.status}
640640 </span>
641641 <span className="w-20 text-right tabular-nums">{money(invoice.totalCents * 10_000)}</span>
+4−4
117117 calm?: boolean;
118118 }) {
119119 const part = share(used, of);
120− const bar = calm ? "bg-accent" : of != null && used >= of ? "bg-danger" : part >= 0.75 ? "bg-warn" : "bg-accent";
120+ const bar = calm ? "bg-success" : of != null && used >= of ? "bg-danger" : part >= 0.75 ? "bg-warn" : "bg-success";
121121 return (
122122 <div className="mt-4">
123123 <div className="flex flex-wrap justify-between gap-x-4 text-sm">
213213 status.kind === "past_due" || status.kind === "canceling"
214214 ? "bg-warn/15 text-warn"
215215 : on
216− ? "bg-accent/15 text-accent"
216+ ? "bg-success/15 text-success"
217217 : "border border-line text-muted"
218218 }`}
219219 >
239239 <ul className="mt-4 grid gap-1.5 text-sm text-muted sm:grid-cols-2">
240240 {plan.includes.map((line) => (
241241 <li key={line} className="flex gap-2">
242− <span className="text-accent">✓</span>
242+ <span className="text-success">✓</span>
243243 {line}
244244 </li>
245245 ))}
542542 <span
543543 className={`rounded-full px-2 py-0.5 text-xs ${
544544 request.status === "approved"
545− ? "bg-accent/15 text-accent"
545+ ? "bg-success/15 text-success"
546546 : request.status === "declined"
547547 ? "bg-danger/15 text-danger"
548548 : "border border-line text-muted"
+5−5
9292 return (
9393 <div>
9494 <p className="flex items-center gap-2 border-b border-line px-4 py-2 text-xs text-muted">
95− <Sparkles size={13} className="text-merged" />
95+ <Sparkles size={13} className="text-accent" />
9696 Pick any line to see why it is the way it is: the commit, the pull request and issue it
9797 came from, and what the agent was thinking.
9898 </p>
152152 rows.push(
153153 <tr key={`why-${line}`}>
154154 <td colSpan={4} className="border-y border-line bg-bg/60 px-3 py-3 font-sans whitespace-normal md:pl-80">
155− <div className="max-w-2xl overflow-hidden rounded-xl border border-merged/30 bg-surface shadow-xl shadow-black/40">
155+ <div className="max-w-2xl overflow-hidden rounded-xl border border-accent/30 bg-surface shadow-xl shadow-black/40">
156156 <WhyPanel
157157 base={base}
158158 picked={picked}
199199 return (
200200 <div>
201201 <header className="flex items-center gap-2 border-b border-line px-4 py-3">
202− <Sparkles size={15} className="text-merged" />
202+ <Sparkles size={15} className="text-accent" />
203203 <span className="grow text-sm font-medium">
204204 Why line{picked.start === picked.end ? ` ${picked.start}` : `s ${picked.start}–${picked.end}`}
205205 </span>
253253 <p className="mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted">
254254 {current.pull.runtime === "hosted" ? (
255255 <>
256− <span className="flex items-center gap-1 text-merged">
256+ <span className="flex items-center gap-1 text-accent">
257257 <Sparkles size={11} />
258258 written by {current.pull.agent}
259259 </span>
303303 .map((step) => (
304304 <blockquote
305305 key={step.seq}
306− className="mt-3 border-l-2 border-merged/50 pl-3 text-[0.8125rem] whitespace-pre-line text-fg/90"
306+ className="mt-3 border-l-2 border-accent/50 pl-3 text-[0.8125rem] whitespace-pre-line text-fg/90"
307307 >
308308 {step.text}
309309 </blockquote>
+3−3
5656 title={`${branch.drift.ahead} ${branch.drift.ahead === 1 ? "commit" : "commits"} ahead of ${main}, ${branch.drift.behind} behind`}
5757 >
5858 <span className="inline-flex items-center gap-0.5">
59− <ArrowUp size={11} className={branch.drift.ahead > 0 ? "text-accent" : "text-faint"} />
59+ <ArrowUp size={11} className={branch.drift.ahead > 0 ? "text-success" : "text-faint"} />
6060 {branch.drift.ahead}
6161 </span>
6262 <span className="inline-flex items-center gap-0.5">
7171 className="inline-flex items-center gap-1.5 rounded-md border border-line px-1.5 py-0.5 text-muted hover:border-line-strong hover:text-fg"
7272 title={branch.pull.title}
7373 >
74− <GitPullRequest size={12} className={branch.pull.draft ? "text-faint" : "text-accent"} />#{branch.pull.number}
74+ <GitPullRequest size={12} className={branch.pull.draft ? "text-faint" : "text-success"} />#{branch.pull.number}
7575 <CheckBadge status={branch.pull.checkStatus} />
7676 </Link>
7777 ) : branch.drift?.ahead === 0 ? (
9393 className="inline-flex max-w-48 items-center gap-1 truncate rounded-md border border-line px-1.5 py-0.5 text-muted hover:border-line-strong hover:text-fg"
9494 title={host(branch.preview)}
9595 >
96− <Globe size={12} className="shrink-0 text-merged" />
96+ <Globe size={12} className="shrink-0 text-accent" />
9797 Preview
9898 </a>
9999 )}
+2−2
4646 {done}/{total}
4747 </span>
4848 <span className="hidden h-1.5 w-24 overflow-hidden rounded-full bg-line sm:block" aria-hidden>
49− <span className="block h-full rounded-full bg-accent" style={{ width: `${(done / total) * 100}%` }} />
49+ <span className="block h-full rounded-full bg-success" style={{ width: `${(done / total) * 100}%` }} />
5050 </span>
5151 <button
5252 type="button"
7474 <span
7575 className={cn(
7676 "mt-px flex size-4.5 shrink-0 items-center justify-center rounded-full border",
77− item.done ? "border-accent bg-accent text-bg" : item.key === next ? "border-accent" : "border-line-strong",
77+ item.done ? "border-success bg-success text-bg" : item.key === next ? "border-success" : "border-line-strong",
7878 )}
7979 aria-hidden
8080 >
+1−1
1717 };
1818
1919 export function CheckIcon({ status, size = 15 }: { status: CheckStatus; size?: number }) {
20− if (status === "passed") return <CircleCheck size={size} className="shrink-0 text-accent" />;
20+ if (status === "passed") return <CircleCheck size={size} className="shrink-0 text-success" />;
2121 if (status === "failed") return <CircleX size={size} className="shrink-0 text-danger" />;
2222 if (status === "errored") return <TriangleAlert size={size} className="shrink-0 text-muted" />;
2323 return <LoaderCircle size={size} className="shrink-0 animate-spin text-info" />;
+4−4
136136 {errors > 0 ? (
137137 <FileWarning size={16} className="shrink-0 text-danger" />
138138 ) : (
139− <ShieldCheck size={16} className="shrink-0 text-accent" />
139+ <ShieldCheck size={16} className="shrink-0 text-success" />
140140 )}
141141 <Link to={blobHref(base, branch, path)} className="font-mono text-sm hover:text-accent hover:underline">
142142 {path}
194194 if (errors === 0) {
195195 return (
196196 <p className="mb-4 flex items-center gap-2 text-sm text-muted" role="status">
197− <CircleCheck size={15} className="shrink-0 text-accent" />
197+ <CircleCheck size={15} className="shrink-0 text-success" />
198198 No errors in this CODEOWNERS file.
199199 </p>
200200 );
225225 }
226226 if (review.satisfied && review.approved_by.length > 0) {
227227 return (
228− <span className="flex items-center gap-1 text-xs text-accent">
228+ <span className="flex items-center gap-1 text-xs text-success">
229229 <CircleCheck size={13} className="shrink-0" /> Approved by {names(review.approved_by)}
230230 </span>
231231 );
235235 }
236236 if (review.satisfied) {
237237 return (
238− <span className="flex items-center gap-1 text-xs text-accent">
238+ <span className="flex items-center gap-1 text-xs text-success">
239239 <CircleCheck size={13} className="shrink-0" /> Approved
240240 </span>
241241 );
+3−3
483483 function Rule({ rule, project, action }: { rule: RuleResult; project: string; action: string }) {
484484 const fetcher = useFetcher<Done>();
485485 const icon =
486− rule.status === "pass" ? <Check size={14} className="text-accent" /> : rule.status === "fail" ? <XCircle size={14} className="text-danger" /> : <CircleDashed size={14} className="text-faint" />;
486+ rule.status === "pass" ? <Check size={14} className="text-success" /> : rule.status === "fail" ? <XCircle size={14} className="text-danger" /> : <CircleDashed size={14} className="text-faint" />;
487487 return (
488488 <li className="flex items-start gap-2.5 py-1.5">
489489 <span className="mt-0.5">{icon}</span>
490490 <div className="min-w-0 grow text-sm">
491491 <span className={rule.status === "na" ? "text-muted" : ""}>{rule.title}</span>
492492 <p className="text-xs text-muted">{rule.detail}</p>
493− {fetcher.data?.message && <p className="mt-1 text-xs text-accent">{fetcher.data.message}</p>}
493+ {fetcher.data?.message && <p className="mt-1 text-xs text-success">{fetcher.data.message}</p>}
494494 {fetcher.data?.error && <p className="mt-1 text-xs text-danger">{fetcher.data.error}</p>}
495495 </div>
496496 {rule.fix && !fetcher.data?.ok && (
524524 <Link to={`/${card.repo.namespace}/${card.repo.name}`} className="font-medium hover:text-accent">
525525 {card.name}
526526 </Link>
527− <span className={`text-xs ${card.passed === card.total ? "text-accent" : "text-muted"}`}>
527+ <span className={`text-xs ${card.passed === card.total ? "text-success" : "text-muted"}`}>
528528 {card.passed} of {card.total}
529529 </span>
530530 </div>
+2−2
150150 ) : (
151151 entry.lastResult && (
152152 <p className="mt-2 flex items-start gap-1.5 text-xs text-muted">
153− <CircleCheck size={12} className="mt-0.5 shrink-0 text-accent" />
153+ <CircleCheck size={12} className="mt-0.5 shrink-0 text-success" />
154154 <span className="wrap-anywhere">
155155 <Said text={entry.lastResult} />
156156 </span>
191191 ) : pull.state === "requested" ? (
192192 <Loader size={13} className="text-info" />
193193 ) : (
194− <GitPullRequest size={13} className="text-accent" />
194+ <GitPullRequest size={13} className="text-success" />
195195 );
196196 const count = pull.dependencies.length;
197197 return (
+1−1
44 export const DEPLOY_STATUS: Record<DeployStatus, { label: string; tone: string }> = {
55 queued: { label: "Queued", tone: "text-muted" },
66 building: { label: "Building", tone: "text-warn" },
7− ready: { label: "Live", tone: "text-accent" },
7+ ready: { label: "Live", tone: "text-success" },
88 replaced: { label: "Replaced", tone: "text-faint" },
99 down: { label: "Down", tone: "text-faint" },
1010 failed: { label: "Failed", tone: "text-danger" },
+7−7
2626
2727 const ROW_STYLES: Record<DiffLine["kind"], string> = {
2828 context: "",
29− add: "bg-accent/[0.09]",
29+ add: "bg-success/[0.09]",
3030 delete: "bg-danger/[0.09]",
3131 };
3232
3333 const GUTTER_STYLES: Record<DiffLine["kind"], string> = {
3434 context: "text-faint",
35− add: "bg-accent/[0.14] text-accent/70",
35+ add: "bg-success/[0.14] text-success/70",
3636 delete: "bg-danger/[0.14] text-danger/70",
3737 };
3838
7171 const green = total === 0 ? 0 : Math.round((additions / total) * 5);
7272 return (
7373 <span className="flex shrink-0 items-center gap-2 font-mono text-xs">
74− <span className="text-accent">+{additions}</span>
74+ <span className="text-success">+{additions}</span>
7575 <span className="text-danger">−{deletions}</span>
7676 <span className="flex gap-px" aria-hidden="true">
7777 {Array.from({ length: 5 }, (_, i) => (
7878 <span
7979 key={i}
8080 className={`size-2 rounded-xs ${
81− total === 0 ? "bg-line" : i < green ? "bg-accent" : "bg-danger"
81+ total === 0 ? "bg-line" : i < green ? "bg-success" : "bg-danger"
8282 }`}
8383 />
8484 ))}
9292 }
9393
9494 function fileTone(status: HighlightedFile["status"]) {
95− return status === "added" ? "text-accent" : status === "deleted" ? "text-danger" : "text-faint";
95+ return status === "added" ? "text-success" : status === "deleted" ? "text-danger" : "text-faint";
9696 }
9797
9898 /** One comment made on a line, shown under that line. */
239239 }
240240
241241 function fileToneFor(kind: DiffLine["kind"]) {
242− return kind === "add" ? "text-accent" : kind === "delete" ? "text-danger" : "text-faint";
242+ return kind === "add" ? "text-success" : kind === "delete" ? "text-danger" : "text-faint";
243243 }
244244
245245 /** Lines side by side: a run of deletions beside the additions that replaced it. */
563563 <Icon size={13} className={`shrink-0 ${fileTone(file.status)}`} />
564564 <span className="min-w-0 grow truncate">{node.name}</span>
565565 <span className="shrink-0 text-[0.625rem] tabular-nums">
566− {file.additions > 0 && <span className="text-accent">+{file.additions}</span>}
566+ {file.additions > 0 && <span className="text-success">+{file.additions}</span>}
567567 {file.deletions > 0 && <span className="ml-1 text-danger">−{file.deletions}</span>}
568568 </span>
569569 </button>
+2−2
388388 </span>
389389 of {cap}m
390390 </p>
391− <Meter share={timeShare} tone={timeShare != null && timeShare > 0.85 ? "bg-warn" : "bg-accent"} />
391+ <Meter share={timeShare} tone={timeShare != null && timeShare > 0.85 ? "bg-warn" : "bg-success"} />
392392 </div>
393393 )}
394394 {member && (
398398 {spent ? <span className="tabular-nums text-fg">{spent}</span> : <span>Spend</span>}
399399 of {formatCap(budget)}
400400 </p>
401− <Meter share={costShare} tone={costShare != null && costShare > 0.85 ? "bg-warn" : "bg-accent"} />
401+ <Meter share={costShare} tone={costShare != null && costShare > 0.85 ? "bg-warn" : "bg-success"} />
402402 {active && !spent && budget != null && (
403403 <p className="mt-1.5 text-xs text-faint">
404404 The agent stops itself at the cap. What it spent is reported when the run ends.
+2−2
3131 const ICON: Record<InboxSeverity, { icon: ReactNode; ring: string }> = {
3232 error: { icon: <CircleX size={15} />, ring: "bg-danger/10 text-danger ring-danger/30" },
3333 warning: { icon: <Hand size={15} />, ring: "bg-warn/10 text-warn ring-warn/30" },
34− success: { icon: <CircleCheck size={15} />, ring: "bg-accent/10 text-accent ring-accent/30" },
34+ success: { icon: <CircleCheck size={15} />, ring: "bg-success/10 text-success ring-success/30" },
3535 info: { icon: <Info size={15} />, ring: "bg-info/10 text-info ring-info/30" },
3636 };
3737
363363 aria-label="Agent"
364364 className="pointer-events-none flex h-9 items-center gap-1.5 rounded-md border border-line px-2.5 text-sm text-muted opacity-60 sm:px-3"
365365 >
366− <Sparkles size={15} className="text-merged" />
366+ <Sparkles size={15} className="text-accent" />
367367 <span className="hidden sm:inline">Agent</span>
368368 </button>
369369 </span>
+1−1
5151 aria-label={`${percent}% complete`}
5252 className={cn("block h-2 overflow-hidden rounded-full bg-line", className)}
5353 >
54− <span className="block h-full rounded-full bg-accent transition-[width]" style={{ width: `${percent}%` }} />
54+ <span className="block h-full rounded-full bg-success transition-[width]" style={{ width: `${percent}%` }} />
5555 </span>
5656 );
5757 }
+9−9
1515
1616 /** A small label above a heading, in the mono face. */
1717 function Eyebrow({ children }: { children: ReactNode }) {
18− return <p className="font-mono text-xs tracking-[0.2em] text-merged uppercase">{children}</p>;
18+ return <p className="font-mono text-xs tracking-[0.2em] text-accent uppercase">{children}</p>;
1919 }
2020
2121 function Tags({ items }: { items: string[] }) {
3636 /** A link in running copy that leads to the docs or another page. */
3737 function More({ to, children }: { to: string; children: ReactNode }) {
3838 return (
39− <Link to={to} className="group mt-7 inline-flex items-center gap-1.5 text-sm font-medium text-fg hover:text-merged">
39+ <Link to={to} className="group mt-7 inline-flex items-center gap-1.5 text-sm font-medium text-fg hover:text-accent">
4040 {children}
4141 <ArrowRight size={14} className="transition-transform group-hover:translate-x-0.5" />
4242 </Link>
8686 <ul className="mt-6 grid gap-2.5 text-sm sm:grid-cols-2">
8787 {points.map((point) => (
8888 <li key={point} className="flex gap-2.5 text-fg-soft">
89− <Check size={15} className="mt-0.5 shrink-0 text-merged" />
89+ <Check size={15} className="mt-0.5 shrink-0 text-accent" />
9090 <span>{point}</span>
9191 </li>
9292 ))}
227227 to={`${DOCS}/concepts/overview/`}
228228 className="inline-flex animate-fade-up items-center gap-2 rounded-full bg-bg/50 px-3 py-1 text-xs text-fg-soft ring-1 ring-white/10 backdrop-blur transition-colors hover:bg-bg/70"
229229 >
230− <span className="size-1.5 rounded-full bg-merged" />
230+ <span className="size-1.5 rounded-full bg-accent" />
231231 Open source · built on Cloudflare
232232 <ArrowRight size={12} />
233233 </Link>
234234 <h1 className="mx-auto mt-7 max-w-4xl animate-fade-up text-[2.75rem] leading-[1.04] font-semibold tracking-tight text-balance sm:text-7xl">
235235 Where people and agents{" "}
236− <span className="bg-gradient-to-r from-fg via-[#d9d1ff] to-merged bg-clip-text text-transparent">
236+ <span className="bg-gradient-to-r from-fg via-[#d9d1ff] to-accent bg-clip-text text-transparent">
237237 ship software together.
238238 </span>
239239 </h1>
402402 column, so the line stops one column, less that, from the end. */}
403403 <span
404404 aria-hidden="true"
405− className="absolute top-4 right-[calc((100%-6rem)/5-1rem)] left-4 hidden h-px bg-gradient-to-r from-merged/50 via-warn/50 to-accent/70 md:block"
405+ className="absolute top-4 right-[calc((100%-6rem)/5-1rem)] left-4 hidden h-px bg-gradient-to-r from-accent/50 via-warn/50 to-success/70 md:block"
406406 >
407407 <span className="flow-runner absolute inset-0">
408− <span className="absolute -top-[3px] -left-[3.5px] size-[7px] rounded-full bg-merged shadow-[0_0_12px_2px_rgb(182_168_255/0.6)]" />
408+ <span className="absolute -top-[3px] -left-[3.5px] size-[7px] rounded-full bg-accent shadow-[0_0_12px_2px_rgb(182_168_255/0.6)]" />
409409 </span>
410410 </span>
411411 {FLOW.map(([step, about], index) => (
412412 <li key={step} className="relative">
413413 <span
414414 className={`flow-step relative flex size-8 items-center justify-center rounded-full font-mono text-xs ring-1 ${
415− index === FLOW.length - 1 ? "bg-accent text-bg ring-accent" : "bg-bg text-fg-soft ring-line-strong"
415+ index === FLOW.length - 1 ? "bg-success text-bg ring-success" : "bg-bg text-fg-soft ring-line-strong"
416416 }`}
417417 style={{ "--delay": `${index * 2}s` } as CSSProperties}
418418 >
462462 to={item.to}
463463 className="group rounded-2xl bg-surface p-6 ring-1 ring-line transition-colors hover:ring-line-strong"
464464 >
465− <span className="flex size-9 items-center justify-center rounded-lg bg-bg text-merged ring-1 ring-line">{item.icon}</span>
465+ <span className="flex size-9 items-center justify-center rounded-lg bg-bg text-accent ring-1 ring-line">{item.icon}</span>
466466 <h3 className="mt-5 font-semibold">{item.title}</h3>
467467 <p className="mt-2 text-sm leading-6 text-muted">{item.about}</p>
468468 </Link>
+2−2
4141 key={step}
4242 className={`size-1.5 rounded-full ${
4343 index < current || stage === "ready"
44− ? "bg-accent"
44+ ? "bg-success"
4545 : index === current
4646 ? "animate-pulse bg-accent"
4747 : "bg-line-strong"
105105 <span
106106 aria-hidden="true"
107107 className={`block h-1 rounded-full ${
108− done ? "bg-accent" : active ? "animate-pulse bg-accent/60 motion-reduce:animate-none" : "bg-line"
108+ done ? "bg-success" : active ? "animate-pulse bg-success/60 motion-reduce:animate-none" : "bg-line"
109109 }`}
110110 />
111111 <span className={`mt-1.5 block truncate text-[0.6875rem] ${active ? "font-medium text-fg" : done ? "text-muted" : "text-faint"}`}>
+1−1
2828 y={p.y * 10 + 1}
2929 width="8"
3030 height="8"
31− fill={p.one ? "var(--g1t-merged)" : "currentColor"}
31+ fill={p.one ? "var(--g1t-accent)" : "currentColor"}
3232 />
3333 ));
3434 }
+2−2
4747
4848 const ALERT: Record<AlertKind, { title: string; icon: ReactNode; tone: string }> = {
4949 note: { title: "Note", icon: <Info size={15} />, tone: "border-info/60 [&_.alert-title]:text-info" },
50− tip: { title: "Tip", icon: <Lightbulb size={15} />, tone: "border-accent/60 [&_.alert-title]:text-accent" },
50+ tip: { title: "Tip", icon: <Lightbulb size={15} />, tone: "border-success/60 [&_.alert-title]:text-accent" },
5151 important: {
5252 title: "Important",
5353 icon: <MessageSquareWarning size={15} />,
136136 }}
137137 className="rounded-md border border-line bg-raised p-1.5 text-muted hover:text-fg"
138138 >
139− {copied ? <Check size={13} className="text-accent" /> : <Copy size={13} />}
139+ {copied ? <Check size={13} className="text-success" /> : <Copy size={13} />}
140140 </button>
141141 </div>
142142 </div>
+1−1
238238 <input type="hidden" name="intent" value="add" />
239239 <input type="hidden" name="scope" value={scope} />
240240 <label className="flex items-center gap-2 text-sm font-medium">
241− <Brain size={15} className="text-merged" />
241+ <Brain size={15} className="text-accent" />
242242 Add to {scope === "workspace" ? "the workspace's" : "this project's"} memory
243243 </label>
244244 <textarea name="text" required rows={2} maxLength={1000} placeholder={placeholder} className={`${TEXTAREA} mt-3`} />
+1−1
101101 }`}
102102 >
103103 {handle === AGENT_HANDLE ? (
104− <Bot size={12} className="shrink-0 text-merged" />
104+ <Bot size={12} className="shrink-0 text-accent" />
105105 ) : (
106106 <Users size={12} className="shrink-0 text-faint" />
107107 )}
+8−8
4343 const ANSI_COLOURS: Record<number, string> = {
4444 30: "text-faint",
4545 31: "text-danger",
46− 32: "text-accent",
46+ 32: "text-success",
4747 33: "text-warn",
4848 34: "text-info",
4949 35: "text-merged",
5151 37: "text-fg",
5252 90: "text-faint",
5353 91: "text-danger",
54− 92: "text-accent",
54+ 92: "text-success",
5555 93: "text-warn",
5656 94: "text-info",
5757 95: "text-merged",
139139 setTimeout(() => setCopied(false), 1500);
140140 }}
141141 >
142− {copied ? <Check size={13} className="text-accent" /> : <Copy size={13} />}
142+ {copied ? <Check size={13} className="text-success" /> : <Copy size={13} />}
143143 </button>
144144 {cut && (
145145 <p className="border-b border-line px-3 py-1.5 text-xs text-faint">
179179 type Standing = "passed" | "failed" | "running" | "queued" | "skipped";
180180
181181 function StandingIcon({ standing, size = 15 }: { standing: Standing; size?: number }) {
182− if (standing === "passed") return <CircleCheck size={size} className="shrink-0 text-accent" aria-label="Passed" />;
182+ if (standing === "passed") return <CircleCheck size={size} className="shrink-0 text-success" aria-label="Passed" />;
183183 if (standing === "failed") return <CircleX size={size} className="shrink-0 text-danger" aria-label="Failed" />;
184184 if (standing === "running")
185185 return <LoaderCircle size={size} className="shrink-0 animate-spin text-warn" aria-label="Running" />;
395395 ) : standing === "running" ? (
396396 <LoaderCircle size={16} className="animate-spin text-warn" />
397397 ) : (
398− <CircleCheck size={16} className="text-accent" />
398+ <CircleCheck size={16} className="text-success" />
399399 )}
400400 </span>
401401 <div className="min-w-0 grow">
759759 if (mergeable === "clean") {
760760 return (
761761 <div className="flex gap-3 px-4 py-3 text-sm">
762− <CircleCheck size={16} className="mt-0.5 shrink-0 text-accent" />
762+ <CircleCheck size={16} className="mt-0.5 shrink-0 text-success" />
763763 <p className="font-medium">
764764 This branch has no conflicts with <span className="font-mono">{defaultBranch}</span>
765765 </p>
842842 }
843843 return (
844844 <div className="flex gap-3 px-4 py-3 text-sm">
845− <LoaderCircle size={16} className="mt-0.5 shrink-0 animate-spin text-merged" />
845+ <LoaderCircle size={16} className="mt-0.5 shrink-0 animate-spin text-accent" />
846846 <div className="min-w-0 grow">
847847 <p className="font-medium">{catchUpTitle(update.reason, defaultBranch)}</p>
848848 <p className="mt-0.5 text-muted">
859859 className="mt-2 truncate rounded-lg bg-bg px-3 py-2 font-mono text-xs text-fg/85 ring-1 ring-line"
860860 title={run?.step ?? undefined}
861861 >
862− <span className="mr-2 inline-block size-1.5 animate-pulse rounded-full bg-merged align-middle" />
862+ <span className="mr-2 inline-block size-1.5 animate-pulse rounded-full bg-accent align-middle" />
863863 {run?.step ?? (run ? "Starting a sandbox…" : "Waiting for a sandbox…")}
864864 </p>
865865 <p className="mt-2 flex flex-wrap items-center gap-x-3 text-xs text-muted">
+19−19
6363 outside_guardrails: "border-warn/35 bg-warn/10 text-warn",
6464 low_confidence: "border-warn/35 bg-warn/10 text-warn",
6565 stalled: "border-warn/35 bg-warn/10 text-warn",
66− asked_for_you: "border-merged/35 bg-merged/10 text-merged",
66+ asked_for_you: "border-accent/35 bg-accent/10 text-accent",
6767 needs_review: "border-info/35 bg-info/10 text-info",
68− ready_to_merge: "border-accent/35 bg-accent/10 text-accent",
68+ ready_to_merge: "border-success/35 bg-success/10 text-success",
6969 };
7070
7171 function Chip({ children, tone }: { children: ReactNode; tone: string }) {
9595 return <p className="font-mono text-[0.625rem] font-medium tracking-[0.12em] text-faint uppercase">{children}</p>;
9696 }
9797
98−const FACT_TONE = { good: "text-accent", warn: "text-warn", bad: "text-danger" } as const;
98+const FACT_TONE = { good: "text-success", warn: "text-warn", bad: "text-danger" } as const;
9999
100100 function Facts({ facts }: { facts: Fact[] }) {
101101 if (facts.length === 0) return <p className="text-sm text-muted">Nothing more is known about it yet.</p>;
139139 className={cn(
140140 "inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-default",
141141 variant === "accent"
142− ? "bg-merged text-bg hover:bg-[#c9bfff]"
142+ ? "bg-accent text-bg hover:bg-accent-hover"
143143 : "border border-line-strong text-fg/90 hover:bg-raised hover:text-fg",
144− done && "border-accent/40 text-accent",
144+ done && "border-success/40 text-success",
145145 )}
146146 >
147147 {done ? <Check size={14} /> : null}
188188 {by && (
189189 <>
190190 <span className="text-faint">·</span>
191− <Person who={by} size={14} className={cn("shrink-0", by.agent ? "text-merged" : "")} />
191+ <Person who={by} size={14} className={cn("shrink-0", by.agent ? "text-accent" : "")} />
192192 </>
193193 )}
194194 {sub && (
308308 sub={row.detail}
309309 chip={
310310 <Chip tone="border-line-strong bg-raised text-muted">
311− {row.live && <span className="mr-1.5 size-1.5 animate-pulse rounded-full bg-accent" />}
311+ {row.live && <span className="mr-1.5 size-1.5 animate-pulse rounded-full bg-success" />}
312312 {row.chip}
313313 </Chip>
314314 }
359359 sub={row.byAgents ? "landed without a person" : `merged by ${row.by?.name ?? "a person"}`}
360360 chip={
361361 row.byAgents ? (
362− <Chip tone="border-merged/35 bg-merged/10 text-merged">By agents</Chip>
362+ <Chip tone="border-accent/35 bg-accent/10 text-accent">By agents</Chip>
363363 ) : (
364364 <Chip tone="border-warn/35 bg-warn/10 text-warn">Needed a person</Chip>
365365 )
442442 <span
443443 className={cn(
444444 "rounded-full px-2 py-0.5 text-xs font-medium tabular-nums ring-1",
445− delta >= 0 ? "text-accent ring-accent/30" : "text-warn ring-warn/30",
445+ delta >= 0 ? "text-success ring-success/30" : "text-warn ring-warn/30",
446446 )}
447447 >
448448 {signedPercent(delta)} vs last week
464464 const bar = (n: number) => Math.max(3, Math.round((n / max) * (height - 4)));
465465 // Top to bottom: agents alone, agents with a person, people.
466466 const segments = [
467− { n: day.agents, tone: "bg-merged" },
467+ { n: day.agents, tone: "bg-accent" },
468468 { n: day.assisted, tone: "bg-warn" },
469469 { n: day.people, tone: "bg-info" },
470470 ].filter((segment) => segment.n > 0);
490490 <div className="pointer-events-none absolute bottom-full left-1/2 z-10 mb-1 hidden -translate-x-1/2 rounded-md border border-line-strong bg-raised px-2.5 py-1.5 text-xs whitespace-nowrap shadow-lg shadow-black/40 group-hover:block">
491491 <p className="font-medium text-fg">{day.label}</p>
492492 <p className="mt-0.5 flex items-center gap-1.5 text-muted">
493− <span className="size-1.5 rounded-full bg-merged" /> {day.agents} by agents on their own
493+ <span className="size-1.5 rounded-full bg-accent" /> {day.agents} by agents on their own
494494 </p>
495495 <p className="flex items-center gap-1.5 text-muted">
496496 <span className="size-1.5 rounded-full bg-warn" /> {day.assisted} by agents, merged by a person
520520 )}
521521 <div className={cn("mt-3 flex-wrap gap-x-4 gap-y-1 text-xs text-muted", week.total === 0 ? "hidden" : "flex")}>
522522 <span className="inline-flex items-center gap-1.5">
523− <span className="size-2 rounded-sm bg-merged" /> Agents, on their own
523+ <span className="size-2 rounded-sm bg-accent" /> Agents, on their own
524524 </span>
525525 <span className="inline-flex items-center gap-1.5">
526526 <span className="size-2 rounded-sm bg-warn" /> Agents, merged by a person
591591 <Avatar name={actor} size={22} />
592592 </span>
593593 <span className="min-w-0 grow text-[0.8125rem] leading-5 text-muted">
594− <span className={cn("font-medium", agent ? "text-merged" : "text-fg")}>{actor}</span> {VERB[part.verb]}{" "}
594+ <span className={cn("font-medium", agent ? "text-accent" : "text-fg")}>{actor}</span> {VERB[part.verb]}{" "}
595595 {part.verb === "learned" ? (
596596 <Link to={part.to ?? `${base}/memory`} className="text-fg-soft hover:text-fg">
597597 “{part.texts[0]}”
639639 <span
640640 className={cn(
641641 "mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full text-[0.6875rem] font-medium",
642− step.done ? "bg-accent text-bg" : "text-muted ring-1 ring-line-strong",
642+ step.done ? "bg-success text-bg" : "text-muted ring-1 ring-line-strong",
643643 )}
644644 >
645645 {step.done ? <Check size={12} /> : index + 1}
828828 }
829829 >
830830 <span className="inline-flex cursor-pointer items-center gap-1.5 rounded-l-md border border-line-strong bg-raised px-3 py-2 text-sm font-medium text-fg transition-colors hover:bg-line/60 group-open/composer:bg-line/60">
831− <Sparkles size={14} className="text-merged" /> Put an agent on it
831+ <Sparkles size={14} className="text-accent" /> Put an agent on it
832832 </span>
833833 </AgentComposer>
834834 <DropdownMenu>
895895 <Link
896896 to={`${link({ tab: "needs", all: null })}#work`}
897897 preventScrollReset
898− className="inline-flex items-center gap-1.5 rounded-md bg-merged px-3.5 py-2 text-sm font-semibold text-bg transition-colors hover:bg-[#c9bfff]"
898+ className="inline-flex items-center gap-1.5 rounded-md bg-accent px-3.5 py-2 text-sm font-semibold text-bg transition-colors hover:bg-accent-hover"
899899 >
900900 Review {needs.length} that need{needs.length === 1 ? "s" : ""} you <ArrowRight size={14} />
901901 </Link>
922922 <Stat
923923 label="Agents"
924924 value={loaded.runsLoaded || !workspace ? String(liveTotal) : "—"}
925− dot={liveTotal > 0 ? "bg-accent animate-pulse" : undefined}
925+ dot={liveTotal > 0 ? "bg-success animate-pulse" : undefined}
926926 hint={
927927 liveTotal > 0
928928 ? `live now · ${stats.agentHours < 10 ? stats.agentHours.toFixed(1) : Math.round(stats.agentHours)}h this week`
940940 />
941941 <Stat
942942 label="Landed without you"
943− dot="bg-merged"
943+ dot="bg-accent"
944944 value={share == null ? "—" : `${Math.round(share * 100)}%`}
945945 hint={share == null ? "no agent changes yet" : `${week.byAgents} of ${week.agentChanges} agent changes`}
946946 title="Of the changes agents wrote, those g1t merged by auto-merge or the merge queue, with no person pressing merge. People's own changes are not counted."
967967 aria-current={tab === value ? "page" : undefined}
968968 className={cn(
969969 "flex shrink-0 items-center gap-1.5 border-b-2 px-2 py-3 text-sm whitespace-nowrap transition-colors sm:px-2.5",
970− tab === value ? "border-merged font-medium text-fg" : "border-transparent text-muted hover:text-fg",
970+ tab === value ? "border-accent font-medium text-fg" : "border-transparent text-muted hover:text-fg",
971971 )}
972972 >
973973 <span className="sm:hidden">{TAB_SHORT[value]}</span>
+12−12
113113 runner: { icon: <TimerOff size={15} />, tone: "text-warn", label: "No runner" },
114114 review: { icon: <Eye size={15} />, tone: "text-info", label: "Review" },
115115 checks: { icon: <Terminal size={15} />, tone: "text-danger", label: "Checks" },
116− ready: { icon: <GitMerge size={15} />, tone: "text-accent", label: "Ready" },
116+ ready: { icon: <GitMerge size={15} />, tone: "text-success", label: "Ready" },
117117 };
118118
119119 /** What is waiting on the viewer, most urgent first, each with its next step. */
166166
167167 const VERB: Record<Verb, { icon: ReactNode; tone: string; text: (n: string) => string }> = {
168168 landed: { icon: <GitMerge size={14} />, tone: "text-merged", text: (n) => `landed ${n}` },
169− opened_issue: { icon: <CircleDot size={14} />, tone: "text-accent", text: (n) => `opened ${n}` },
169+ opened_issue: { icon: <CircleDot size={14} />, tone: "text-success", text: (n) => `opened ${n}` },
170170 closed_issue: { icon: <CircleSlash size={14} />, tone: "text-faint", text: (n) => `closed ${n}` },
171− started: { icon: <Play size={14} />, tone: "text-merged", text: (n) => `started on ${n}` },
171+ started: { icon: <Play size={14} />, tone: "text-accent", text: (n) => `started on ${n}` },
172172 ready: { icon: <GitPullRequest size={14} />, tone: "text-info", text: (n) => `marked ${n} ready for review` },
173− checks_passed: { icon: <Terminal size={14} />, tone: "text-accent", text: (n) => `checks passed on ${n}` },
173+ checks_passed: { icon: <Terminal size={14} />, tone: "text-success", text: (n) => `checks passed on ${n}` },
174174 checks_failed: { icon: <Terminal size={14} />, tone: "text-danger", text: (n) => `checks failed on ${n}` },
175− approved: { icon: <CircleCheck size={14} />, tone: "text-accent", text: (n) => `approved ${n}` },
175+ approved: { icon: <CircleCheck size={14} />, tone: "text-success", text: (n) => `approved ${n}` },
176176 changes_requested: { icon: <CircleSlash size={14} />, tone: "text-warn", text: (n) => `asked for changes on ${n}` },
177177 commented: { icon: <MessageSquare size={14} />, tone: "text-muted", text: (n) => `commented on ${n}` },
178− asked: { icon: <MessageCircleQuestion size={14} />, tone: "text-merged", text: (n) => `asked the agent on ${n}` },
179− deployed: { icon: <Rocket size={14} />, tone: "text-accent", text: () => "deployed production" },
178+ asked: { icon: <MessageCircleQuestion size={14} />, tone: "text-accent", text: (n) => `asked the agent on ${n}` },
179+ deployed: { icon: <Rocket size={14} />, tone: "text-success", text: () => "deployed production" },
180180 deploy_failed: { icon: <Rocket size={14} />, tone: "text-danger", text: () => "production build failed" },
181− learned: { icon: <Brain size={14} />, tone: "text-merged", text: () => "learned" },
181+ learned: { icon: <Brain size={14} />, tone: "text-accent", text: () => "learned" },
182182 };
183183
184184 function Refs({ numbers, base }: { numbers: number[]; base: string }) {
343343 </span>
344344 <span className="min-w-0 grow leading-6 text-muted">
345345 {group.actor ? (
346− <span className={cn("mr-1.5 inline-flex items-center gap-1.5 align-middle font-medium", agent ? "text-merged" : "text-fg")}>
346+ <span className={cn("mr-1.5 inline-flex items-center gap-1.5 align-middle font-medium", agent ? "text-accent" : "text-fg")}>
347347 <Avatar name={group.actor} size={16} />
348348 {group.actor}
349349 </span>
465465 // --- Deploys ------------------------------------------------------------------
466466
467467 const STRIP_TONE: Record<DeployStatus, string> = {
468− ready: "bg-accent",
468+ ready: "bg-success",
469469 // Served once, until a newer build or a take-down: it worked.
470− replaced: "bg-accent/45",
470+ replaced: "bg-success/45",
471471 down: "bg-line-strong",
472472 failed: "bg-danger",
473473 building: "bg-warn animate-pulse",
504504 }
505505
506506 /** A small meter for a share, 0 to 1. */
507−export function Meter({ value, tone = "bg-accent" }: { value: number | null; tone?: string }) {
507+export function Meter({ value, tone = "bg-success" }: { value: number | null; tone?: string }) {
508508 return (
509509 <span className="block h-1.5 w-full overflow-hidden rounded-full bg-line">
510510 {value != null && <span className={cn("block h-full rounded-full", tone)} style={{ width: `${Math.round(value * 100)}%` }} />}
+1−1
478478 <SubmitButton variant="quiet" match={{ intent: "routes" }} pending="Saving…">
479479 Save routing
480480 </SubmitButton>
481− {saved && <span className="text-sm text-accent">Saved. The next runs use it.</span>}
481+ {saved && <span className="text-sm text-success">Saved. The next runs use it.</span>}
482482 </div>
483483 )}
484484 </Form>
+20−20
3939 working: {
4040 label: "Agent working",
4141 icon: <Sparkles size={13} />,
42− ring: "ring-merged/60",
43− text: "text-merged",
44− bar: "bg-merged",
42+ ring: "ring-accent/60",
43+ text: "text-accent",
44+ bar: "bg-accent",
4545 live: true,
4646 },
4747 revising: {
4848 label: "Revising",
4949 icon: <Sparkles size={13} />,
50− ring: "ring-merged/60",
51− text: "text-merged",
52− bar: "bg-merged",
50+ ring: "ring-accent/60",
51+ text: "text-accent",
52+ bar: "bg-accent",
5353 live: true,
5454 },
5555 answering: {
5656 label: "Answering an agent",
5757 icon: <Sparkles size={13} />,
58− ring: "ring-merged/60",
59− text: "text-merged",
60− bar: "bg-merged",
58+ ring: "ring-accent/60",
59+ text: "text-accent",
60+ bar: "bg-accent",
6161 live: true,
6262 },
6363 catching_up: {
6464 label: "Catching up",
6565 icon: <Loader2 size={13} className="animate-spin" />,
66− ring: "ring-merged/60",
67− text: "text-merged",
68− bar: "bg-merged",
66+ ring: "ring-accent/60",
67+ text: "text-accent",
68+ bar: "bg-accent",
6969 live: true,
7070 },
7171 checking: {
8787 queued: {
8888 label: "In the merge queue",
8989 icon: <Layers size={13} />,
90− ring: "ring-accent/60",
91− text: "text-accent",
92− bar: "bg-accent/60",
90+ ring: "ring-success/60",
91+ text: "text-success",
92+ bar: "bg-success/60",
9393 live: true,
9494 },
95− ready: { label: "Ready to merge", icon: <Check size={13} />, ring: "ring-accent/60", text: "text-accent", bar: "bg-accent/60" },
95+ ready: { label: "Ready to merge", icon: <Check size={13} />, ring: "ring-success/60", text: "text-success", bar: "bg-success/60" },
9696 needs_you: { label: "Needs you", icon: <Hand size={13} />, ring: "ring-warn/70", text: "text-warn", bar: "bg-warn" },
97− landed: { label: "Landed", icon: <Check size={13} />, ring: "ring-accent/30", text: "text-accent", bar: "bg-accent" },
97+ landed: { label: "Landed", icon: <Check size={13} />, ring: "ring-success/30", text: "text-success", bar: "bg-success" },
9898 closed: { label: "Closed", icon: <X size={13} />, ring: "ring-line", text: "text-faint", bar: "bg-line" },
9999 };
100100
199199 key={index}
200200 d={path.d}
201201 fill="none"
202− stroke={path.done ? "var(--color-accent)" : "var(--color-line-strong)"}
202+ stroke={path.done ? "var(--color-success)" : "var(--color-line-strong)"}
203203 strokeOpacity={path.done ? 0.7 : 1}
204204 strokeWidth={1.5}
205205 strokeDasharray={path.done ? undefined : "4 5"}
229229 <div>
230230 <div className="grid gap-4 sm:grid-cols-4">
231231 {[
232− ["Landed", `${landed} of ${total}`, "text-accent"],
233− ["Agents at work", String(live), "text-merged"],
232+ ["Landed", `${landed} of ${total}`, "text-success"],
233+ ["Agents at work", String(live), "text-accent"],
234234 ["Needs you", String(needsYou), needsYou > 0 ? "text-warn" : "text-muted"],
235235 [
236236 "Agents have cost",
+1−1
103103 </SubmitButton>
104104 {saved && !busy && !error && (
105105 <span className="inline-flex items-center gap-1.5 text-sm text-muted">
106− <Check size={14} className="text-accent" />
106+ <Check size={14} className="text-success" />
107107 Saved
108108 </span>
109109 )}
+2−2
1010 import { Tabs, TabsList, TabsTrigger } from "./ui/tabs";
1111
1212 const STATUS: Record<Runner["status"], { dot: string; label: string }> = {
13− online: { dot: "bg-accent", label: "Idle" },
13+ online: { dot: "bg-success", label: "Idle" },
1414 busy: { dot: "bg-info", label: "Busy" },
1515 offline: { dot: "bg-faint", label: "Offline" },
1616 };
411411 return (
412412 <div className="max-w-5xl space-y-8">
413413 <div className="min-h-6">
414− {action?.notice && <p className="text-sm text-accent">{action.notice}</p>}
414+ {action?.notice && <p className="text-sm text-success">{action.notice}</p>}
415415 <ErrorText>{action?.error ?? data.error ?? null}</ErrorText>
416416 </div>
417417 <Section
+2−2
2828 function stateIcon(hit: SiteHit): ReactNode {
2929 if (hit.kind === "issue") {
3030 return hit.state === "open" ? (
31− <CircleDot size={15} className="text-accent" aria-label="Open" />
31+ <CircleDot size={15} className="text-success" aria-label="Open" />
3232 ) : (
3333 <CircleCheck size={15} className="text-merged" aria-label="Closed" />
3434 );
4141 case "draft":
4242 return <GitPullRequestDraft size={15} className="text-faint" aria-label="Draft" />;
4343 default:
44− return <GitPullRequest size={15} className="text-accent" aria-label="Open" />;
44+ return <GitPullRequest size={15} className="text-success" aria-label="Open" />;
4545 }
4646 }
4747
+2−2
3434 <h2 className="flex flex-wrap items-center gap-2 text-base font-semibold">
3535 <ShieldCheck size={16} className="text-accent" />
3636 {plan.title}
37− <span className={`rounded-full px-2 py-0.5 text-xs ${on ? "bg-accent/15 text-accent" : "border border-line text-muted"}`}>{label}</span>
37+ <span className={`rounded-full px-2 py-0.5 text-xs ${on ? "bg-success/15 text-success" : "border border-line text-muted"}`}>{label}</span>
3838 </h2>
3939 <p className="mt-1.5 max-w-2xl text-sm text-muted">
4040 The security suite's paid features for the workspace's private repositories. Public repositories have them free, and
5050 <ul className="mt-4 grid gap-1.5 text-sm text-muted sm:grid-cols-2">
5151 {plan.includes.map((line) => (
5252 <li key={line} className="flex gap-2">
53− <span className="text-accent">✓</span>
53+ <span className="text-success">✓</span>
5454 {line}
5555 </li>
5656 ))}
+6−6
288288
289289 function On({ on, children }: { on: boolean; children?: ReactNode }) {
290290 return on ? (
291− <span className="inline-flex items-center gap-1 text-accent">
291+ <span className="inline-flex items-center gap-1 text-success">
292292 <CircleCheck size={13} aria-hidden="true" />
293293 {children ?? "On"}
294294 </span>
336336 </td>
337337 <td className="px-3 py-2.5 text-xs whitespace-nowrap">
338338 {open === 0 ? (
339− <span className="inline-flex items-center gap-1 text-accent">
339+ <span className="inline-flex items-center gap-1 text-success">
340340 <ShieldCheck size={13} /> None
341341 </span>
342342 ) : (
355355 </td>
356356 <td className="px-3 py-2.5 text-xs">
357357 {repo.codeScanningAt ? (
358− <span className="text-accent">
358+ <span className="text-success">
359359 <TimeAgo at={repo.codeScanningAt} />
360360 </span>
361361 ) : (
411411 const [reason, setReason] = useState("");
412412 if (fetcher.data?.ok) {
413413 return (
414− <p className="rounded-md border border-accent/30 bg-accent/5 px-3 py-2 text-sm text-accent">
414+ <p className="rounded-md border border-success/30 bg-success/5 px-3 py-2 text-sm text-success">
415415 {fetcher.data.requested
416416 ? "Asked. The workspace's owners and the repository's admins were told; push again once one approves."
417417 : "Bypassed. Push again and it goes through."}
468468 const chars = [...text];
469469 return (
470470 <li className="flex items-start gap-2 font-mono text-xs break-all">
471− <CircleCheck size={13} className="mt-0.5 shrink-0 text-accent" />
471+ <CircleCheck size={13} className="mt-0.5 shrink-0 text-success" />
472472 <span>
473473 {chars.slice(0, found[0]).join("")}
474474 <mark className="rounded-sm bg-accent/25 text-fg">{chars.slice(found[0], found[1]).join("")}</mark>
584584 )}
585585 </div>
586586 {save.data?.error && <p className="text-sm text-danger">{save.data.error}</p>}
587− {save.data?.ok && (saved ? <p className="text-sm text-accent">Saved{saved.pattern.state === "published" ? " and published: the history is scanned again for it" : " as a draft"}.</p> : <p className="text-sm text-accent">Deleted. The alerts it found stay.</p>)}
587+ {save.data?.ok && (saved ? <p className="text-sm text-success">Saved{saved.pattern.state === "published" ? " and published: the history is scanned again for it" : " as a draft"}.</p> : <p className="text-sm text-success">Deleted. The alerts it found stay.</p>)}
588588 {dry.data?.error && <p className="text-sm text-danger">{dry.data.error}</p>}
589589 {dry.data?.dryRun && <DryRunResults dryRun={dry.data.dryRun} />}
590590 </div>
+5−5
9393 const shown = SEVERITIES.filter((severity) => counts[severity] > 0);
9494 if (shown.length === 0) {
9595 return (
96− <span className="inline-flex items-center gap-1 text-xs text-accent">
96+ <span className="inline-flex items-center gap-1 text-xs text-success">
9797 <ShieldCheck size={13} />
9898 Nothing open
9999 </span>
307307 about: finding.status === "allowed" ? "Pushes carrying it go through." : "Dismissed.",
308308 };
309309 }
310− if (finding.state === "fixed") return { label: "Revoked", tone: "accent", about: "Revoked or rotated." };
310+ if (finding.state === "fixed") return { label: "Revoked", tone: "success", about: "Revoked or rotated." };
311311 if (finding.status === "blocked") {
312312 return { label: "Push blocked", tone: finding.testValue ? "neutral" : "warn", about: "A push carrying it was refused, so it never landed." };
313313 }
414414 function Empty({ title, children }: { title: string; children: ReactNode }) {
415415 return (
416416 <div className="rounded-xl border border-dashed border-line px-6 py-10 text-center">
417− <ShieldCheck size={22} className="mx-auto text-accent" />
417+ <ShieldCheck size={22} className="mx-auto text-success" />
418418 <p className="mt-2 font-medium">{title}</p>
419419 <p className="mt-1 text-sm text-muted">{children}</p>
420420 </div>
508508 <span className="flex flex-wrap items-center gap-x-2 gap-y-1 text-xs">
509509 <span className="text-muted">Upgrade issue</span>
510510 <Link to={`${base}/issues/${issue}`} className="inline-flex items-center gap-1 text-fg-soft hover:text-fg">
511− {fix?.state === "closed" ? <CircleCheck size={12} className="text-merged" /> : <CircleDot size={12} className="text-accent" />}#{issue}
511+ {fix?.state === "closed" ? <CircleCheck size={12} className="text-merged" /> : <CircleDot size={12} className="text-success" />}#{issue}
512512 </Link>
513513 {pull && (
514514 <Link to={`${base}/pull/${pull.number}`} className="inline-flex items-center gap-1 text-muted hover:text-fg">
521521
522522 const PULL_ICON: Record<PullStatus, ReactNode> = {
523523 draft: <GitPullRequest size={13} className="text-muted" />,
524− open: <GitPullRequest size={13} className="text-accent" />,
524+ open: <GitPullRequest size={13} className="text-success" />,
525525 merged: <GitMerge size={13} className="text-merged" />,
526526 closed: <GitPullRequestClosed size={13} className="text-danger" />,
527527 };
+2−2
374374 aria-label={`Account menu for ${user.username}`}
375375 onPointerEnter={prefetch}
376376 onFocus={prefetch}
377− className="flex h-10 w-full items-center gap-2.5 rounded-md px-2 text-left outline-none transition-colors hover:bg-raised focus-visible:ring-2 focus-visible:ring-merged/60 data-[state=open]:bg-raised"
377+ className="flex h-10 w-full items-center gap-2.5 rounded-md px-2 text-left outline-none transition-colors hover:bg-raised focus-visible:ring-2 focus-visible:ring-accent/60 data-[state=open]:bg-raised"
378378 >
379379 <Avatar name={user.username} image={user.avatar} size={22} />
380380 <span className="min-w-0 grow truncate text-[0.8125rem] font-medium">{user.username}</span>
11021102 /** Help, status and the fine print under a visitor's sign-in buttons. */
11031103 function VisitorLinks() {
11041104 const status = useSiteStatus();
1105− const quiet = `${LEGAL_LINK} hover:bg-raised hover:text-fg focus-visible:ring-2 focus-visible:ring-merged/60`;
1105+ const quiet = `${LEGAL_LINK} hover:bg-raised hover:text-fg focus-visible:ring-2 focus-visible:ring-accent/60`;
11061106 const dot = (
11071107 <span aria-hidden="true" className="text-[0.625rem] text-line-strong">
11081108 ·
+5−5
113113 </div>
114114 <div className="px-4 py-3">
115115 <dt className="text-xs text-faint">{discountLabel}</dt>
116− <dd className="mt-0.5 font-mono tabular-nums text-accent">{charge(-(totals.discountMicros ?? 0))}</dd>
116+ <dd className="mt-0.5 font-mono tabular-nums text-success">{charge(-(totals.discountMicros ?? 0))}</dd>
117117 </div>
118118 <div className="px-4 py-3">
119119 <dt className="text-xs text-faint">Charged</dt>
146146 {totals.covered?.map((paid) => (
147147 <li key={paid.source} className="flex justify-between gap-4">
148148 <span className="text-muted">{paid.label}</span>
149− <span className="font-mono tabular-nums text-accent">{charge(paid.micros)}</span>
149+ <span className="font-mono tabular-nums text-success">{charge(paid.micros)}</span>
150150 </li>
151151 ))}
152152 {(totals.carriedMicros ?? 0) > 0 && (
191191 <li className="flex items-center gap-3 px-4 py-3 text-sm">
192192 <span className="w-3.5 shrink-0" />
193193 <span className="grow truncate text-muted">{discountLabel}</span>
194− <span className="w-24 shrink-0 text-right font-mono tabular-nums text-accent">{charge(-(g.discountMicros ?? 0))}</span>
194+ <span className="w-24 shrink-0 text-right font-mono tabular-nums text-success">{charge(-(g.discountMicros ?? 0))}</span>
195195 </li>
196196 )}
197197 </ul>
272272 {coveredMicros > 0 && ` · ${charge(coveredMicros)} paid for`}
273273 </span>
274274 <span
275− className={`w-24 shrink-0 text-right font-mono tabular-nums ${moneyIn ? "text-accent" : "text-fg"}`}
275+ className={`w-24 shrink-0 text-right font-mono tabular-nums ${moneyIn ? "text-success" : "text-fg"}`}
276276 >
277277 {moneyIn ? `+${dollars(-chargedMicros)}` : charge(chargedMicros)}
278278 </span>
299299 <span className="shrink-0 text-right font-mono text-xs tabular-nums text-muted">
300300 {entry.amountMicros > 0 ? `+${dollars(entry.amountMicros)}` : charge(entryPrice(entry))}
301301 {(entry.discountMicros ?? 0) > 0 && (
302− <span className="block text-[0.6875rem] text-accent">{charge(-(entry.discountMicros ?? 0))} discount</span>
302+ <span className="block text-[0.6875rem] text-success">{charge(-(entry.discountMicros ?? 0))} discount</span>
303303 )}
304304 </span>
305305 </li>
+1−1
2828 };
2929
3030 /** The daily grid's single hue, stronger with more tokens. */
31−const HEAT_SHADE = ["var(--color-line)", ...Array.from({ length: HEAT_LEVELS }, (_, i) => `color-mix(in oklab, var(--color-merged) ${[28, 48, 72, 100][i]}%, var(--color-surface))`)];
31+const HEAT_SHADE = ["var(--color-line)", ...Array.from({ length: HEAT_LEVELS }, (_, i) => `color-mix(in oklab, var(--color-accent) ${[28, 48, 72, 100][i]}%, var(--color-surface))`)];
3232
3333 type Scope = "workspace" | "mine";
3434
+2−1
55 // shadcn/ui's badge, styled with g1t's tokens: a small outlined label whose
66 // tone says how much it matters.
77
8−export type BadgeTone = "neutral" | "accent" | "info" | "merged" | "warn" | "danger";
8+export type BadgeTone = "neutral" | "accent" | "success" | "info" | "merged" | "warn" | "danger";
99
1010 const TONES: Record<BadgeTone, string> = {
1111 neutral: "border-line text-muted",
1212 accent: "border-accent/40 bg-accent/10 text-accent",
13+ success: "border-success/40 bg-success/10 text-success",
1314 info: "border-info/40 bg-info/10 text-info",
1415 merged: "border-merged/40 bg-merged/10 text-merged",
1516 warn: "border-warn/40 bg-warn/10 text-warn",
+2−2
118118
119119 const BUTTON_VARIANTS: Record<Variant, string> = {
120120 primary: "bg-fg text-bg hover:bg-white",
121− accent: "bg-accent text-bg hover:bg-[#aaf5d6]",
121+ accent: "bg-accent text-bg hover:bg-accent-hover",
122122 quiet:
123123 "border border-line text-fg/80 hover:border-line-strong hover:bg-surface hover:text-fg",
124124 // For what cannot be undone: transferring, deleting.
397397 setTimeout(() => setCopied(false), 1500);
398398 }}
399399 >
400− {copied ? <Check size={14} className="text-accent" /> : <Copy size={14} />}
400+ {copied ? <Check size={14} className="text-success" /> : <Copy size={14} />}
401401 </button>
402402 </div>
403403 );
+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

+0−0

Binary or large file; its contents are not shown.

This change is too large to show in full.