feat(studio): add a preview volume control (#3282)

This commit is contained in:
Akshar Patel
2026-08-15 11:53:56 -04:00
committed by GitHub
parent b9a4dfcbe5
commit fecaf72d1f
13 changed files with 398 additions and 66 deletions
@@ -23,6 +23,7 @@ describe("studio UI preferences", () => {
writeStudioUiPreferences({ leftWidth: 384, rightWidth: 424 }, storage);
writeStudioUiPreferences({ playbackRate: 1.5 }, storage);
writeStudioUiPreferences({ audioMuted: true }, storage);
writeStudioUiPreferences({ audioVolume: 0.4 }, storage);
writeStudioUiPreferences({ previewZoom: { zoomPercent: 160, panX: -20, panY: 12 } }, storage);
expect(readStudioUiPreferences(storage)).toEqual({
@@ -31,6 +32,7 @@ describe("studio UI preferences", () => {
rightWidth: 424,
playbackRate: 1.5,
audioMuted: true,
audioVolume: 0.4,
previewZoom: { zoomPercent: 160, panX: -20, panY: 12 },
});
});
@@ -46,6 +48,7 @@ describe("studio UI preferences", () => {
timelineVisible: true,
playbackRate: Number.NaN,
audioMuted: "false",
audioVolume: 2,
previewZoom: { zoomPercent: 150, panX: 0, panY: "bad" },
}),
);
@@ -14,6 +14,7 @@ export interface StudioUiPreferences {
timelineHeight?: number;
playbackRate?: number;
audioMuted?: boolean;
audioVolume?: number;
thumbnailMode?: "adaptive" | "hidden";
previewZoom?: StoredPreviewZoomState;
recentBlocks?: string[];
@@ -81,6 +82,14 @@ function readStorage(storage: Storage | null): StudioUiPreferences {
if (typeof parsed.audioMuted === "boolean") {
preferences.audioMuted = parsed.audioMuted;
}
if (
typeof parsed.audioVolume === "number" &&
Number.isFinite(parsed.audioVolume) &&
parsed.audioVolume >= 0 &&
parsed.audioVolume <= 1
) {
preferences.audioVolume = parsed.audioVolume;
}
if (parsed.thumbnailMode === "adaptive" || parsed.thumbnailMode === "hidden") {
preferences.thumbnailMode = parsed.thumbnailMode;
} else if (typeof parsed.thumbnailsEnabled === "boolean") {