diff --git a/AGENTS.md b/AGENTS.md
index 314f909..feb4d5c 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -140,6 +140,14 @@ conflict on, do an existence check instead.
flag set to false was silently on. Use the `envBoolean` helper in
`apps/api/src/lib/config.ts`.
+**shadcn's `accent` is a SUBTLE surface, not the brand.** shadcn uses
+`bg-accent` for hover, focus and selected states — dropdown items, command
+rows, ghost buttons. The brand is `primary`. In `tailwind.config.js`, `accent`
+is therefore aliased to `--accent-subtle` and `primary` to `--accent`. Use
+`bg-primary` for a solid brand fill; never `bg-accent`. Mapping them the other
+way makes every hover state paint a full-strength brand block, which in dark
+mode with the monochrome palette is a glaring white slab.
+
**Grid and flex children need `min-w-0`.** They default to
`min-width: auto`, meaning they refuse to shrink below their content — and a
`tabular-nums` figure, a `whitespace-nowrap` badge or a `truncate` title is all
diff --git a/apps/web/src/components/AdminSettings.tsx b/apps/web/src/components/AdminSettings.tsx
index 71103a1..4ef6b34 100644
--- a/apps/web/src/components/AdminSettings.tsx
+++ b/apps/web/src/components/AdminSettings.tsx
@@ -67,7 +67,7 @@ export function AdminSettings() {
-
+
diff --git a/apps/web/src/components/AllocationSheet.tsx b/apps/web/src/components/AllocationSheet.tsx
index 2e16205..c65f476 100644
--- a/apps/web/src/components/AllocationSheet.tsx
+++ b/apps/web/src/components/AllocationSheet.tsx
@@ -526,8 +526,8 @@ function CommitmentContext({ row, detail, match, quotedPrice }: { row: Availabil
{match ? 0.7 ? 'positive' : 'neutral'}>{percent(match.score)} fit : null}
Sold
{compactNumber(row.soldGpuHours)} hrs
diff --git a/apps/web/src/components/GoogleSheetsSource.tsx b/apps/web/src/components/GoogleSheetsSource.tsx
index 104d4d8..1aa91cd 100644
--- a/apps/web/src/components/GoogleSheetsSource.tsx
+++ b/apps/web/src/components/GoogleSheetsSource.tsx
@@ -137,7 +137,7 @@ export function GoogleSheetsSource({ onLoaded }: { onLoaded(table: GoogleParsedT
{files.isLoading ?
: files.isError ?
: files.data?.files.length === 0 ?
: (
{files.data?.files.map((file) => (
-
{ setSpreadsheetId(file.id); setSheetId(''); }} className={spreadsheetId === file.id ? 'tap min-w-0 rounded-lg border border-accent bg-accent-subtle p-3 text-left' : 'tap min-w-0 rounded-lg border border-border p-3 text-left hover:bg-surface-2'}>
+ { setSpreadsheetId(file.id); setSheetId(''); }} className={spreadsheetId === file.id ? 'tap min-w-0 rounded-lg border border-primary bg-accent-subtle p-3 text-left' : 'tap min-w-0 rounded-lg border border-border p-3 text-left hover:bg-surface-2'}>
{file.name}
{file.modifiedTime ? `Modified ${relativeTime(file.modifiedTime)}` : 'Modified time unavailable'}
diff --git a/apps/web/src/components/PiggyChat.tsx b/apps/web/src/components/PiggyChat.tsx
index 2efd4a5..8afae66 100644
--- a/apps/web/src/components/PiggyChat.tsx
+++ b/apps/web/src/components/PiggyChat.tsx
@@ -264,7 +264,7 @@ function PiggyChatPanel({
function ChatMessage({ message }: { message: TranscriptMessage }) {
if (message.role === 'user') {
- return ;
+ return ;
}
return (
diff --git a/apps/web/src/pages/Capacity.tsx b/apps/web/src/pages/Capacity.tsx
index 26ff986..05a545f 100644
--- a/apps/web/src/pages/Capacity.tsx
+++ b/apps/web/src/pages/Capacity.tsx
@@ -161,9 +161,9 @@ function CapacityCard({ row, writable, onAllocate }: { row: AvailabilityRow; wri
bar made mostly of unconverted holds is a lie a seller would act on. */}
diff --git a/apps/web/src/pages/CreateProfile.tsx b/apps/web/src/pages/CreateProfile.tsx
index 758cb47..d3ced5e 100644
--- a/apps/web/src/pages/CreateProfile.tsx
+++ b/apps/web/src/pages/CreateProfile.tsx
@@ -95,7 +95,7 @@ export function CreateProfile({
className={[
'flex cursor-pointer items-start gap-3 rounded-lg border p-3 transition-colors',
team === value
- ? 'border-accent bg-accent-subtle'
+ ? 'border-primary bg-accent-subtle'
: 'border-border hover:bg-surface-2',
].join(' ')}
>
diff --git a/apps/web/src/pages/FactReview.tsx b/apps/web/src/pages/FactReview.tsx
index f5c9a83..9b39b5c 100644
--- a/apps/web/src/pages/FactReview.tsx
+++ b/apps/web/src/pages/FactReview.tsx
@@ -99,7 +99,7 @@ export function FactReview() {
-
+
diff --git a/apps/web/src/pages/Imports.tsx b/apps/web/src/pages/Imports.tsx
index e77cc97..5a6af92 100644
--- a/apps/web/src/pages/Imports.tsx
+++ b/apps/web/src/pages/Imports.tsx
@@ -145,7 +145,7 @@ export function Imports() {
type="button"
aria-pressed={entity === candidate}
onClick={() => resetForEntity(candidate)}
- className={entity === candidate ? 'tap card min-w-0 border-accent p-4 text-left ring-1 ring-accent' : 'tap card min-w-0 p-4 text-left'}
+ className={entity === candidate ? 'tap card min-w-0 border-primary p-4 text-left ring-1 ring-primary' : 'tap card min-w-0 p-4 text-left'}
>
{candidateDefinition.label}
{candidateDefinition.description}
diff --git a/apps/web/src/pages/Pipeline.tsx b/apps/web/src/pages/Pipeline.tsx
index 39a0acb..e5b83da 100644
--- a/apps/web/src/pages/Pipeline.tsx
+++ b/apps/web/src/pages/Pipeline.tsx
@@ -184,7 +184,7 @@ function PipelineBoard
diff --git a/apps/web/src/pages/Register.tsx b/apps/web/src/pages/Register.tsx
index 2a35b37..4583e50 100644
--- a/apps/web/src/pages/Register.tsx
+++ b/apps/web/src/pages/Register.tsx
@@ -172,7 +172,7 @@ export function Register({
className={[
'flex cursor-pointer items-start gap-3 rounded-lg border p-3 transition-colors',
team === value
- ? 'border-accent bg-accent-subtle'
+ ? 'border-primary bg-accent-subtle'
: 'border-border hover:bg-surface-2',
].join(' ')}
>
diff --git a/apps/web/src/pages/Settings.tsx b/apps/web/src/pages/Settings.tsx
index 9d34d09..ada565c 100644
--- a/apps/web/src/pages/Settings.tsx
+++ b/apps/web/src/pages/Settings.tsx
@@ -93,7 +93,7 @@ function Appearance() {
title={option.label}
className={[
'tap relative flex items-center gap-2 rounded-lg border px-3 py-2 text-sm font-medium transition-colors',
- selected ? 'border-accent bg-accent-subtle' : 'border-border hover:bg-surface-2',
+ selected ? 'border-primary bg-accent-subtle' : 'border-border hover:bg-surface-2',
].join(' ')}
>
{/*
diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js
index 61a0260..433e17c 100644
--- a/apps/web/tailwind.config.js
+++ b/apps/web/tailwind.config.js
@@ -20,8 +20,22 @@ export default {
foreground: 'hsl(var(--fg))',
muted: 'hsl(var(--muted))',
'muted-foreground': 'hsl(var(--muted))',
- accent: 'hsl(var(--accent))',
- 'accent-foreground': 'hsl(var(--accent-on))',
+ /*
+ * shadcn's `accent` is its SUBTLE hover/selected surface — dropdown
+ * items, command rows, ghost-button hover. It is not the brand colour;
+ * that is `primary`, mapped below.
+ *
+ * Mapping `accent` to --accent (the brand) inverted this, so every
+ * hover state painted a full-strength brand block: in dark mode with
+ * the monochrome "pig" accent that is near-white, which made a selected
+ * command row glare. Aliased to the subtle pair instead, so shadcn
+ * primitives tint the way their authors intended while PIG's own brand
+ * fills use `primary`.
+ */
+ accent: 'hsl(var(--accent-subtle))',
+ 'accent-foreground': 'hsl(var(--accent-fg))',
+ /** The brand itself, for PIG's own components that need a solid fill. */
+ brand: 'hsl(var(--accent))',
'accent-fg': 'hsl(var(--accent-fg))',
'accent-on': 'hsl(var(--accent-on))',
'accent-subtle': 'hsl(var(--accent-subtle))',