diff --git a/frontend/src/components/heaps/HeapsPanel.tsx b/frontend/src/components/heaps/HeapsPanel.tsx
index 4cf0bf0..75fd9cb 100644
--- a/frontend/src/components/heaps/HeapsPanel.tsx
+++ b/frontend/src/components/heaps/HeapsPanel.tsx
@@ -338,17 +338,13 @@ export function HeapsPanel() {
)}
- {/* Right-aligned cluster. Active indicator + count are
- * always visible; set-active and kebab appear on hover
- * to the RIGHT of the count, displacing it slightly so
- * the count column lines up with the rest of the
- * sidebar in the resting state. */}
- {isActive && (
-
- )}
+ {/* Right cluster. Count is the rightmost element in the
+ * resting state — set-active and kebab use display:none
+ * (not invisible) so they reserve no width until hover,
+ * keeping the count column aligned with the rest of the
+ * sidebar. The active heap is signaled by font-semibold
+ * on the name above; the standalone Target indicator
+ * was making heap counts sit left of the others. */}
{heap.photo_count > 0 ? (
{heap.photo_count}
@@ -362,7 +358,7 @@ export function HeapsPanel() {
e.stopPropagation()
setActiveMutation.mutate(heap.id)
}}
- className="invisible flex-shrink-0 rounded p-0.5 text-text-muted hover:bg-surface-offset hover:text-text group-hover:visible"
+ className="hidden flex-shrink-0 rounded p-0.5 text-text-muted hover:bg-surface-offset hover:text-text group-hover:block"
title="Set as active heap (T target)"
aria-label="Set as active heap"
>
@@ -372,16 +368,18 @@ export function HeapsPanel() {
{/* Kebab menu — collects rename / duplicate / convert /
* delete so the row stays compact. */}
-