diff --git a/apps/web/src/components/ui/menu.tsx b/apps/web/src/components/ui/menu.tsx
index 75ea15d67..ed6e92dea 100644
--- a/apps/web/src/components/ui/menu.tsx
+++ b/apps/web/src/components/ui/menu.tsx
@@ -173,7 +173,7 @@ function MenuRadioItem({
"min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-pointer items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base text-foreground outline-none data-disabled:pointer-events-none data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
variant === "check"
? "grid grid-cols-[1rem_1fr] data-highlighted:bg-accent data-highlighted:text-accent-foreground"
- : "flex text-muted-foreground data-checked:bg-pick-selected data-checked:text-foreground data-highlighted:bg-foreground/12 data-highlighted:text-foreground",
+ : "flex text-muted-foreground data-checked:bg-pick-selected data-checked:text-foreground data-checked:inset-ring data-checked:inset-ring-border data-highlighted:bg-foreground/12 data-highlighted:text-foreground",
className,
)}
data-slot="menu-radio-item"
@@ -215,7 +215,8 @@ function MenuRadioItem({
*/
export const MENU_PICK_ITEM_CLASS_NAME =
"gap-2 text-muted-foreground data-highlighted:bg-foreground/12 data-highlighted:text-foreground";
-export const MENU_PICK_ITEM_SELECTED_CLASS_NAME = "bg-pick-selected text-foreground";
+export const MENU_PICK_ITEM_SELECTED_CLASS_NAME =
+ "bg-pick-selected text-foreground inset-ring inset-ring-border";
function MenuGroupLabel({
className,
diff --git a/apps/web/src/components/ui/select.tsx b/apps/web/src/components/ui/select.tsx
index 0a2ff3f01..4813269b0 100644
--- a/apps/web/src/components/ui/select.tsx
+++ b/apps/web/src/components/ui/select.tsx
@@ -184,7 +184,7 @@ function SelectItem({ className, children, ...props }: SelectPrimitive.Item.Prop
return (
Date: Sat, 15 Aug 2026 02:39:46 -0400
Subject: [PATCH 11/12] Match the branch selector's selected row and make
presence tooltips instant
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
ComboboxItem now carries the house selection treatment (faint
pick-selected fill + hairline inset ring + full text), so the ref
search's current row matches every other picker; the model row drops
its now-redundant copy. The Switch project presence glyphs swap the
native title for a zero-delay TooltipWrapper — the glyphs are the only
thing naming the machines, so the hover dwell read as unlabelled.
---
.../src/components/chat/DraftEmptyState.tsx | 36 +++++++++++--------
apps/web/src/components/chat/ModelListRow.tsx | 8 ++---
apps/web/src/components/ui/combobox.tsx | 2 +-
3 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/apps/web/src/components/chat/DraftEmptyState.tsx b/apps/web/src/components/chat/DraftEmptyState.tsx
index c0963add0..23e91ff7c 100644
--- a/apps/web/src/components/chat/DraftEmptyState.tsx
+++ b/apps/web/src/components/chat/DraftEmptyState.tsx
@@ -15,6 +15,7 @@ import { cn } from "../../lib/utils";
import { ProjectFavicon } from "../ProjectFavicon";
import { RecentThreadsList } from "../RecentThreadsList";
import { riseDelay, ThreadlinesFigure } from "../ThreadlinesFigure";
+import { TooltipWrapper } from "../ui/tooltip";
import {
Menu,
MENU_PICK_ITEM_CLASS_NAME,
@@ -175,28 +176,33 @@ export function DraftEmptyState({
/>
{snapshot.displayName}
{hasRemoteMachines ? (
-
- {hasLocal ? (
-
- ) : null}
- {hasRemote ? (
-
- ) : null}
- {remoteCount > 1 ? (
-
- {remoteCount}
-
- ) : null}
-
+
+ {hasLocal ? (
+
+ ) : null}
+ {hasRemote ? (
+
+ ) : null}
+ {remoteCount > 1 ? (
+
+ {remoteCount}
+
+ ) : null}
+
+
) : null}
);
diff --git a/apps/web/src/components/chat/ModelListRow.tsx b/apps/web/src/components/chat/ModelListRow.tsx
index 52f3dc3d6..1be74e488 100644
--- a/apps/web/src/components/chat/ModelListRow.tsx
+++ b/apps/web/src/components/chat/ModelListRow.tsx
@@ -61,10 +61,10 @@ export const ModelListRow = memo(function ModelListRow(props: {
// Single-line rows keep a compact fixed height; rows with a
// description or provider footer grow to two lines.
props.model.description || props.showProvider ? "py-1.5" : "h-8 py-0",
- // Selection is the house resting fill plus the primary-tinted name —
- // the tint alone says "this is the one" and the fill matches every
- // other picker; hover/keyboard highlight stays the stronger grey.
- "hover:bg-muted data-highlighted:bg-muted data-selected:bg-pick-selected data-selected:text-foreground data-selected:inset-ring data-selected:inset-ring-border [&[data-highlighted][data-selected]]:bg-muted",
+ // Selection styling (fill + hairline ring) comes from ComboboxItem;
+ // the primary-tinted name below is this row's own "this is the one"
+ // mark. Hover/keyboard highlight stays the stronger grey.
+ "hover:bg-muted data-highlighted:bg-muted [&[data-highlighted][data-selected]]:bg-muted",
)}
>
diff --git a/apps/web/src/components/ui/combobox.tsx b/apps/web/src/components/ui/combobox.tsx
index 850ed0bde..d9c2ad78b 100644
--- a/apps/web/src/components/ui/combobox.tsx
+++ b/apps/web/src/components/ui/combobox.tsx
@@ -197,7 +197,7 @@ function ComboboxItem({
return (
Date: Sat, 15 Aug 2026 02:49:34 -0400
Subject: [PATCH 12/12] Give the grouping test's repo fixture its required
locator
Local typecheck replayed a stale cache and let the incomplete
RepositoryIdentity fixture through; CI's cold run caught it.
---
apps/web/src/sidebarProjectGrouping.test.ts | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/apps/web/src/sidebarProjectGrouping.test.ts b/apps/web/src/sidebarProjectGrouping.test.ts
index 3f9de54dc..5ace30d12 100644
--- a/apps/web/src/sidebarProjectGrouping.test.ts
+++ b/apps/web/src/sidebarProjectGrouping.test.ts
@@ -15,6 +15,11 @@ const remoteEnvId = EnvironmentId.make("env-remote");
// identity the grouping collapses on.
const SHARED_REPO = {
canonicalKey: "github.com/example/shared",
+ locator: {
+ source: "git-remote" as const,
+ remoteName: "origin",
+ remoteUrl: "https://github.com/example/shared.git",
+ },
displayName: "shared",
name: "shared",
};