diff --git a/web/e2e/netgraph-3d.spec.ts b/web/e2e/netgraph-3d.spec.ts
index 6b5f8c7..40935f6 100644
--- a/web/e2e/netgraph-3d.spec.ts
+++ b/web/e2e/netgraph-3d.spec.ts
@@ -71,6 +71,10 @@ test('3D starts top-down, frames neighbours, inspects the drawn curve and preser
await page.screenshot({ path: info.outputPath(`netgraph-3d-${scene}.png`) });
}
const midpoint = (await stage.getAttribute('data-selected-route-screen'))!.split(',').map(Number);
+ if (info.project.name === 'mobile') {
+ expect((await page.locator('.controls').boundingBox())!.height).toBeLessThanOrEqual(100);
+ expect(midpoint[1]).toBeLessThan((await inspector.boundingBox())!.y - 8);
+ }
await page.getByRole('button', { name: 'Close connection details' }).click();
await expect(inspector).toBeHidden(); await expect(stage).toHaveAttribute('data-render-state', 'idle');
await stage.click({ position: { x: midpoint[0]!, y: midpoint[1]! } });
diff --git a/web/src/netgraph/follow.ts b/web/src/netgraph/follow.ts
index 322836a..3261170 100644
--- a/web/src/netgraph/follow.ts
+++ b/web/src/netgraph/follow.ts
@@ -4,7 +4,7 @@ import type { NetgraphRenderer } from './renderer';
/** Same live-only queue and ten-second dwell as Map. No animation is replayed. */
export function mountGraphFollow(graph: NetgraphRenderer, select: (id: string) => void) {
- const button=document.createElement('button');button.type='button';button.className='control-button';button.textContent='◎ Follow';button.setAttribute('aria-pressed','false');
+ const button=document.createElement('button');button.type='button';button.className='control-button';button.innerHTML='Follow';button.setAttribute('aria-label','Follow');button.setAttribute('aria-pressed','false');
document.querySelector('.controls')!.append(button);
const card=document.createElement('section');card.id='follow-card';card.className='follow-card glass';card.hidden=true;card.setAttribute('aria-label','Live Follow activity');
card.innerHTML='