diff --git a/src/renderer/src/features/workspace/canvasStacking.ts b/src/renderer/src/features/workspace/canvasStacking.ts index bf9415c6..4a8ee179 100644 --- a/src/renderer/src/features/workspace/canvasStacking.ts +++ b/src/renderer/src/features/workspace/canvasStacking.ts @@ -1,7 +1,7 @@ import type { CameraState, SessionBounds } from "../../../../shared/contracts"; export function reconcileCanvasLayerOrder( - current: readonly string[], + current: string[], active: readonly string[] ): string[] { const activeSet = new Set(active); @@ -9,7 +9,7 @@ export function reconcileCanvasLayerOrder( for (const id of active) { if (!next.includes(id)) next.push(id); } - return next; + return next.length === current.length && next.every((id, index) => id === current[index]) ? current : next; } export function bringCanvasLayerToFront(current: readonly string[], id: string): string[] { diff --git a/tests/canvas-stacking.test.mjs b/tests/canvas-stacking.test.mjs index 804ded57..2329bc0a 100644 --- a/tests/canvas-stacking.test.mjs +++ b/tests/canvas-stacking.test.mjs @@ -32,6 +32,12 @@ test("layer reconciliation keeps user order and appends only new live windows", ); }); +test("an unchanged layer order reconciles to the same array", () => { + const order = ["browser", "terminal:a", "note:n"]; + assert.equal(reconcileCanvasLayerOrder(order, ["note:n", "terminal:a", "browser"]), order); + assert.notEqual(reconcileCanvasLayerOrder(order, ["terminal:a", "browser"]), order); +}); + test("the native Browser surface is hidden only under a higher overlapping layer", () => { const map = new Map([ ["browser", bounds(0, 0)],