From 2caa909ad900e85e9a9f692909eb53173e622702 Mon Sep 17 00:00:00 2001 From: Rassl Date: Tue, 11 Aug 2026 17:01:35 +0400 Subject: [PATCH] fix: make "set as canonical" findable in merge reviews MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The control that changes which node survives a merge was an unlabeled 16px circle whose inner dot had no background colour — it rendered as an empty ring with a border/60 outline, indistinguishable from a bullet on a dark row, with the action named only in a title tooltip. The backend has accepted an override_payload {from, to} on approve for a while, so the capability was wired end to end but effectively undiscoverable. Replace the dot with a labelled pill (○ MAKE CANONICAL): muted at rest, primary border/tint/text on hover, plus cursor-pointer and a focus ring so it is reachable by keyboard. Also surface when the operator has edited the proposal. approve_review dispatches the override but never persists it on the Review node, so after approval nothing records that the direction was flipped — show an inline note naming the new canonical before the merge is committed. --- src/components/admin/review-row.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/components/admin/review-row.tsx b/src/components/admin/review-row.tsx index 5bdefdc..895e592 100644 --- a/src/components/admin/review-row.tsx +++ b/src/components/admin/review-row.tsx @@ -1047,9 +1047,13 @@ export function ReviewRow({ return next }) }} - className="shrink-0 flex h-4 w-4 items-center justify-center rounded-full border border-border/60 bg-background text-muted-foreground hover:border-primary/60 hover:text-primary transition-colors" + className="group shrink-0 flex cursor-pointer items-center gap-1.5 rounded-full border border-border px-2 py-1 font-mono text-[9px] font-semibold uppercase tracking-[0.12em] text-muted-foreground transition-colors hover:border-primary hover:bg-primary/10 hover:text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50" > - + {/* A bare dot reads as a bullet at this size — + the action has to be spelled out to be + findable at all. */} + + Make canonical ) @@ -1088,6 +1092,18 @@ export function ReviewRow({ + {/* Approving now runs something other than what was + proposed — say so before the operator commits. */} + {isModified && !mergeError && ( +

+ Edited — approving merges {effectiveFrom.length} source + {effectiveFrom.length === 1 ? "" : "s"} into{" "} + {getDisplayName(subjectMap.get(canonicalId), schemas) ?? + canonicalId} + , not the original proposal. +

+ )} + {/* Merge error */} {mergeError && (

{mergeError}