diff --git a/.changeset/unified-activity-indicators.md b/.changeset/unified-activity-indicators.md
new file mode 100644
index 0000000..6cc62ce
--- /dev/null
+++ b/.changeset/unified-activity-indicators.md
@@ -0,0 +1,5 @@
+---
+"@jmfederico/pi-web": patch
+---
+
+Pin navigation activity indicators to the top-right of list chips so active projects, workspaces, and sessions no longer shift their labels.
diff --git a/src/client/src/components/MachineList.ts b/src/client/src/components/MachineList.ts
index 2363813..8ac457b 100644
--- a/src/client/src/components/MachineList.ts
+++ b/src/client/src/components/MachineList.ts
@@ -3,7 +3,7 @@ import { customElement, property, state } from "lit/decorators.js";
import type { Machine, MachineHealth, WorkspaceActivity } from "../api";
import { machineActivityIndicator } from "../workspaceActivity";
import { actionMenuPanelStyle } from "./actionMenu";
-import { renderActivityIndicator } from "./activityBadge";
+import { renderActionActivityIndicator } from "./activityBadge";
import { activateSelectableRow, activateSelectableRowFromKeyboard } from "./selectableRow";
import { listStyles } from "./shared";
@@ -67,7 +67,8 @@ export class MachineList extends LitElement {
@keydown=${(event: KeyboardEvent) => { this.handleMachineKeydown(event, machine); }}
>
- ${this.renderActivity(machine)}${machine.name}${machine.kind === "local" ? "Local Pi Web" : machine.baseUrl ?? "Remote Pi Web"} · ${statusLabel}
+ ${machine.name}${machine.kind === "local" ? "Local Pi Web" : machine.baseUrl ?? "Remote Pi Web"} · ${statusLabel}
+ ${this.renderActivity(machine)}
${hasRemoveAction ? this.renderMachineMenu(machine) : null}
@@ -78,7 +79,7 @@ export class MachineList extends LitElement {
const status = this.statuses[machine.id]?.status ?? machine.status;
if (status === "offline" || status === "error") return undefined;
const kind = machineActivityIndicator(this.activities[machine.id]);
- return renderActivityIndicator(kind, kind === "terminal" ? "Machine terminal active" : "Machine active");
+ return renderActionActivityIndicator(kind, kind === "terminal" ? "Machine terminal active" : "Machine active");
}
private renderMachineMenu(machine: Machine) {
@@ -139,7 +140,6 @@ export class MachineList extends LitElement {
css`
.machine-row.no-actions .action-main { border-radius: 8px; }
.machine-primary { display: flex; align-items: baseline; gap: 6px; }
- .machine-primary .activity-indicator { flex: 0 0 auto; margin-right: 0; }
.machine-primary-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.machine-menu-panel button.danger { color: var(--pi-danger); }
.machine-menu-panel button.danger:hover, .machine-menu-panel button.danger:focus { background: color-mix(in srgb, var(--pi-danger) 14%, transparent); }
diff --git a/src/client/src/components/ProjectList.ts b/src/client/src/components/ProjectList.ts
index b494d2a..6c72c9a 100644
--- a/src/client/src/components/ProjectList.ts
+++ b/src/client/src/components/ProjectList.ts
@@ -3,7 +3,7 @@ import { customElement, property, state } from "lit/decorators.js";
import type { Project, Workspace, WorkspaceActivity } from "../api";
import { projectActivityIndicator } from "../workspaceActivity";
import { actionMenuPanelStyle } from "./actionMenu";
-import { renderActivityIndicator } from "./activityBadge";
+import { renderActionActivityIndicator } from "./activityBadge";
import { activateSelectableRow, activateSelectableRowFromKeyboard } from "./selectableRow";
import { listStyles } from "./shared";
@@ -55,7 +55,8 @@ export class ProjectList extends LitElement {
@keydown=${(event: KeyboardEvent) => { activateSelectableRowFromKeyboard(event, () => this.onSelect?.(project)); }}
>
- ${project.name}${this.renderActivity(project)}${project.path}
+ ${project.name}${project.path}
+ ${this.renderActivity(project)}