From 1ab6e5295998f10d5cfda5f994230e1adc25df3d Mon Sep 17 00:00:00 2001 From: Rassl Date: Mon, 10 Aug 2026 18:12:39 +0400 Subject: [PATCH] feat: fix contrast --- src/app/admin/reviews/page.tsx | 8 +-- src/app/globals.css | 54 ++++++++++---------- src/components/admin/review-row.tsx | 4 +- src/components/layout/node-preview-panel.tsx | 2 +- src/lib/hooks/use-stakwork-run-status.ts | 10 +++- 5 files changed, 43 insertions(+), 35 deletions(-) diff --git a/src/app/admin/reviews/page.tsx b/src/app/admin/reviews/page.tsx index af10baf..de23dcb 100644 --- a/src/app/admin/reviews/page.tsx +++ b/src/app/admin/reviews/page.tsx @@ -424,9 +424,9 @@ export default function ReviewsPage() { className={cn( "inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[11px] font-medium transition-all", active - ? "border-primary/40 bg-primary/15 text-primary" + ? "border-primary/70 bg-primary/10 text-primary" : anySelected - ? "border-border/40 bg-transparent text-muted-foreground/50 hover:border-muted-foreground/40 hover:text-foreground hover:opacity-100" + ? "border-border/60 bg-transparent text-muted-foreground hover:border-muted-foreground/40 hover:text-foreground hover:opacity-100" : "border-border bg-transparent text-muted-foreground hover:border-muted-foreground/40 hover:text-foreground" )} > @@ -484,7 +484,7 @@ export default function ReviewsPage() { className={cn( "inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[11px] font-medium transition-all", nodeTypeFilter === "" - ? "border-primary/40 bg-primary/15 text-primary" + ? "border-primary/70 bg-primary/10 text-primary" : "border-border bg-transparent text-muted-foreground hover:border-muted-foreground/40 hover:text-foreground" )} > @@ -505,7 +505,7 @@ export default function ReviewsPage() { className={cn( "inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[11px] font-medium transition-all", nodeTypeFilter === type - ? "border-primary/40 bg-primary/15 text-primary" + ? "border-primary/70 bg-primary/10 text-primary" : "border-border bg-transparent text-muted-foreground hover:border-muted-foreground/40 hover:text-foreground" )} > diff --git a/src/app/globals.css b/src/app/globals.css index 5650600..d1a08c0 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -54,21 +54,21 @@ :root { --background: oklch(0.08 0.022 260); --foreground: oklch(0.93 0.01 260); - --card: oklch(0.12 0.022 260); + --card: oklch(0.17 0.022 260); --card-foreground: oklch(0.93 0.01 260); - --popover: oklch(0.1 0.025 260); + --popover: oklch(0.16 0.025 260); --popover-foreground: oklch(0.93 0.01 260); --primary: oklch(0.72 0.14 200); --primary-foreground: oklch(0.08 0.022 260); - --secondary: oklch(0.16 0.025 260); + --secondary: oklch(0.22 0.025 260); --secondary-foreground: oklch(0.85 0.01 260); - --muted: oklch(0.14 0.02 260); - --muted-foreground: oklch(0.55 0.02 260); - --accent: oklch(0.16 0.025 260); + --muted: oklch(0.20 0.02 260); + --muted-foreground: oklch(0.68 0.02 260); + --accent: oklch(0.22 0.025 260); --accent-foreground: oklch(0.9 0.01 260); --destructive: oklch(0.65 0.2 25); - --border: oklch(0.2 0.025 260); - --input: oklch(0.16 0.025 260); + --border: oklch(0.46 0.025 260); + --input: oklch(0.22 0.025 260); --ring: oklch(0.65 0.12 200); --chart-1: oklch(0.72 0.14 200); --chart-2: oklch(0.65 0.15 160); @@ -85,28 +85,28 @@ --sidebar-primary-foreground: oklch(0.08 0.02 260); --sidebar-accent: oklch(0.13 0.025 260); --sidebar-accent-foreground: oklch(0.9 0.01 260); - --sidebar-border: oklch(0.18 0.025 260); + --sidebar-border: oklch(0.40 0.025 260); --sidebar-ring: oklch(0.55 0.1 200); } .dark { --background: oklch(0.08 0.022 260); --foreground: oklch(0.93 0.01 260); - --card: oklch(0.12 0.022 260); + --card: oklch(0.17 0.022 260); --card-foreground: oklch(0.93 0.01 260); - --popover: oklch(0.1 0.025 260); + --popover: oklch(0.16 0.025 260); --popover-foreground: oklch(0.93 0.01 260); --primary: oklch(0.72 0.14 200); --primary-foreground: oklch(0.08 0.022 260); - --secondary: oklch(0.16 0.025 260); + --secondary: oklch(0.22 0.025 260); --secondary-foreground: oklch(0.85 0.01 260); - --muted: oklch(0.14 0.02 260); - --muted-foreground: oklch(0.55 0.02 260); - --accent: oklch(0.16 0.025 260); + --muted: oklch(0.20 0.02 260); + --muted-foreground: oklch(0.68 0.02 260); + --accent: oklch(0.22 0.025 260); --accent-foreground: oklch(0.9 0.01 260); --destructive: oklch(0.65 0.2 25); - --border: oklch(0.2 0.025 260); - --input: oklch(0.16 0.025 260); + --border: oklch(0.46 0.025 260); + --input: oklch(0.22 0.025 260); --ring: oklch(0.65 0.12 200); --chart-1: oklch(0.72 0.14 200); --chart-2: oklch(0.65 0.15 160); @@ -122,7 +122,7 @@ --sidebar-primary-foreground: oklch(0.08 0.02 260); --sidebar-accent: oklch(0.13 0.025 260); --sidebar-accent-foreground: oklch(0.9 0.01 260); - --sidebar-border: oklch(0.18 0.025 260); + --sidebar-border: oklch(0.40 0.025 260); --sidebar-ring: oklch(0.55 0.1 200); } @@ -304,25 +304,25 @@ .skin-legal { --background: oklch(0.09 0.03 250); /* deep navy */ --foreground: oklch(0.92 0.02 55); /* warm cream */ - --card: oklch(0.12 0.04 250); + --card: oklch(0.17 0.04 250); --card-foreground: oklch(0.92 0.02 55); - --popover: oklch(0.11 0.04 250); + --popover: oklch(0.16 0.04 250); --popover-foreground: oklch(0.92 0.02 55); --primary: oklch(0.72 0.15 75); /* gold */ --primary-foreground: oklch(0.09 0.03 250); - --secondary: oklch(0.16 0.04 250); + --secondary: oklch(0.22 0.04 250); --secondary-foreground:oklch(0.88 0.02 55); - --muted: oklch(0.15 0.035 250); - --muted-foreground: oklch(0.55 0.02 55); - --accent: oklch(0.16 0.04 250); + --muted: oklch(0.21 0.035 250); + --muted-foreground: oklch(0.68 0.02 55); + --accent: oklch(0.22 0.04 250); --accent-foreground: oklch(0.92 0.02 55); - --border: oklch(0.22 0.04 250); - --input: oklch(0.16 0.04 250); + --border: oklch(0.46 0.04 250); + --input: oklch(0.22 0.04 250); --ring: oklch(0.65 0.13 75); /* gold ring */ --cyan: oklch(0.72 0.15 75); /* remap cyan → gold */ --cyan-muted: oklch(0.45 0.08 75); --sidebar: oklch(0.07 0.03 250); --sidebar-foreground: oklch(0.88 0.02 55); --sidebar-primary: oklch(0.72 0.15 75); - --sidebar-border: oklch(0.20 0.04 250); + --sidebar-border: oklch(0.40 0.04 250); } diff --git a/src/components/admin/review-row.tsx b/src/components/admin/review-row.tsx index 21de9e6..5bdefdc 100644 --- a/src/components/admin/review-row.tsx +++ b/src/components/admin/review-row.tsx @@ -418,7 +418,7 @@ function ConfirmActionPopover({ "shrink-0 whitespace-nowrap rounded border px-2 py-0.5 text-[11px] font-medium transition-all text-center", minWidthClass, disabled - ? "cursor-not-allowed border-border/40 bg-transparent text-muted-foreground/40" + ? "cursor-not-allowed border-border/60 bg-transparent text-muted-foreground/70" : isApprove ? open ? "border-emerald-500/70 bg-emerald-500/15 text-emerald-200" @@ -586,7 +586,7 @@ export function ReviewRow({ triggering: humanReviewTriggering, markTriggered: markHumanReviewTriggered, } = useStakworkRunStatus( - isMergeReviewEligible ? review.ref_id : "__noop__", + isMergeReviewEligible ? review.ref_id : null, "node_merge_review", { // The workflow reports back through the ingest webhook, which turns its diff --git a/src/components/layout/node-preview-panel.tsx b/src/components/layout/node-preview-panel.tsx index 1982e8e..f0814dc 100644 --- a/src/components/layout/node-preview-panel.tsx +++ b/src/components/layout/node-preview-panel.tsx @@ -797,7 +797,7 @@ export function NodePreviewPanel({ node, onBack, schemas }: NodePreviewPanelProp trigger: triggerDeepResearchRun, triggering: deepResearchLoading, } = useStakworkRunStatus( - DEEP_RESEARCH_NODE_TYPES.includes(currentNode.node_type) ? currentNode.ref_id : "__noop__", + DEEP_RESEARCH_NODE_TYPES.includes(currentNode.node_type) ? currentNode.ref_id : null, "deep_research", { onCompleted: () => setProbeNonce((n) => n + 1) } ) diff --git a/src/lib/hooks/use-stakwork-run-status.ts b/src/lib/hooks/use-stakwork-run-status.ts index 214829d..f96686d 100644 --- a/src/lib/hooks/use-stakwork-run-status.ts +++ b/src/lib/hooks/use-stakwork-run-status.ts @@ -94,7 +94,12 @@ export function isInFlightStatus(status: StakworkRunStatus): boolean { * (human-review dispatch). */ export function useStakworkRunStatus( - refId: string, + /** + * Node/review ref id to track. Pass `null` when this caller has nothing to + * track (hooks can't be called conditionally) — the hook then skips the + * hydration fetch and polling entirely instead of querying a sentinel id. + */ + refId: string | null, jobType: string, options: UseStakworkRunStatusOptions = {} ): UseStakworkRunStatusResult { @@ -143,6 +148,7 @@ export function useStakworkRunStatus( // Mount-time hydration (and re-run when refId changes) useEffect(() => { setStatus(null) + if (!refId) return let cancelled = false setLoading(true) @@ -172,6 +178,7 @@ export function useStakworkRunStatus( const trigger = useCallback( async (triggerFn: () => Promise<{ stakwork_run_ref_id: string }>) => { + if (!refId) return if (isInFlightStatus(status)) return setTriggering(true) setStatus("PENDING") @@ -193,6 +200,7 @@ export function useStakworkRunStatus( const markTriggered = useCallback( () => { + if (!refId) return if (isInFlightStatus(status)) return setStatus("PENDING") startPoll(refId)