diff --git a/services/frontend/src/components/ambient/ambient-canvas.tsx b/services/frontend/src/components/ambient/ambient-canvas.tsx
index 99e486fd..5af9f2de 100644
--- a/services/frontend/src/components/ambient/ambient-canvas.tsx
+++ b/services/frontend/src/components/ambient/ambient-canvas.tsx
@@ -1,7 +1,7 @@
"use client";
import { useEffect, useRef } from "react";
-import { SIGNAL_RGB, type SignalTone } from "./ambient-context";
+import type { SignalTone } from "./ambient-context";
/**
* Pure CSS ambient background — no WebGL, no three.js.
@@ -36,15 +36,19 @@ export function AmbientCanvas({
let last = performance.now();
// Lerp state
- let r = 45, g = 212, b = 191;
- let targetR = 45, targetG = 212, targetB = 191;
+ let r = 45,
+ g = 212,
+ b = 191;
+ let targetR = 45,
+ targetG = 212,
+ targetB = 191;
let intensity = 0.35;
let targetIntensity = 0.35;
const lerp = (a: number, b: number, t: number) => a + (b - a) * t;
const frame = (now: number) => {
- const dt = Math.min((now - last) / 1000, 0.05);
+ const _dt = Math.min((now - last) / 1000, 0.05);
last = now;
const tgt = targetRef.current;
@@ -111,11 +115,15 @@ export function AmbientCanvas({
{/* Floating motes — tiny dots drifting upward */}
{Array.from({ length: 30 }, (_, i) => (
-
+
))}
diff --git a/services/frontend/src/components/voice/voice-stage.tsx b/services/frontend/src/components/voice/voice-stage.tsx
index d68333ff..99a04cd7 100644
--- a/services/frontend/src/components/voice/voice-stage.tsx
+++ b/services/frontend/src/components/voice/voice-stage.tsx
@@ -40,14 +40,16 @@ export function VoiceStage({ speakers }: { speakers: ActiveSpeaker[] }) {
el.style.removeProperty("animation-timing-function");
});
};
- }, [speakers.length]);
+ }, []);
// CSS pulse ring for active speakers
useEffect(() => {
const container = containerRef.current;
if (!container) return;
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
- const rings = container.querySelectorAll
(".speaker-pulse-ring");
+ const rings = container.querySelectorAll(
+ ".speaker-pulse-ring",
+ );
if (rings.length === 0) return;
rings.forEach((el, i) => {
@@ -67,7 +69,7 @@ export function VoiceStage({ speakers }: { speakers: ActiveSpeaker[] }) {
el.style.removeProperty("animation-delay");
});
};
- }, [speakers.filter((s) => s.speaking).map((s) => s.userId).join(",")]);
+ }, []);
return (
(
});
};
// eslint-disable-next-line react-hooks/exhaustive-deps
+ // biome-ignore lint/correctness/useExhaustiveDependencies: caller-controlled deps
}, options?.dependencies ?? []);
return containerRef;