diff --git a/frontend/src/components/fleet/FleetTable.tsx b/frontend/src/components/fleet/FleetTable.tsx
index 04f6689..c36ce1e 100644
--- a/frontend/src/components/fleet/FleetTable.tsx
+++ b/frontend/src/components/fleet/FleetTable.tsx
@@ -92,7 +92,7 @@ function SortHeader({ column, label, currentSort, currentDir, onSort, className
function DeviceCard({ device, tenantId }: { device: DeviceResponse; tenantId: string }) {
return (
@@ -402,7 +402,7 @@ export function FleetTable({
data-index={virtualRow.index}
ref={virtualizer.measureElement}
className={cn(
- 'border-b border-border/50 hover:bg-elevated/50 transition-colors',
+ 'border-b border-border/50 hover:bg-elevated/30 transition-[background-color] duration-[50ms]',
selectedIndex === virtualRow.index && 'bg-elevated/50',
)}
style={{
@@ -460,7 +460,7 @@ export function FleetTable({
key={device.id}
data-testid={`device-row-${device.hostname}`}
className={cn(
- 'border-b border-border/50 hover:bg-elevated/50 transition-colors',
+ 'border-b border-border/50 hover:bg-elevated/30 transition-[background-color] duration-[50ms]',
selectedIndex === idx && 'bg-elevated/50',
)}
>
diff --git a/frontend/src/index.css b/frontend/src/index.css
index e80f222..354272b 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -207,3 +207,19 @@
font-variant-numeric: tabular-nums;
}
}
+
+/* ── Interaction classes ── */
+@layer components {
+ .list-item-interactive {
+ border-left: 2px solid transparent;
+ transition: border-color 50ms linear, background-color 50ms linear;
+ }
+ .list-item-interactive:hover,
+ .list-item-interactive:focus-visible {
+ border-left-color: hsl(var(--accent));
+ outline: none;
+ }
+ .list-item-interactive:active {
+ background-color: hsl(var(--elevated));
+ }
+}