fix(studio): drop the group bus strip and give the row back its height

The strip's last three pieces went one at a time — the level meter, the
volume slider, then the "Holds …" member list — and what was left was a
40px band under every group header that drew nothing. Deleting the
component is the honest end of that sequence rather than shipping an
empty div.

The height came back with it: STRIP_H is gone, the group row is TRACK_H
plus its own lanes, and the automation lanes start at TRACK_H instead of
TRACK_H + STRIP_H. Measured on a real group in the browser — label and
lane both 48px from the row top, row 120px tall with one lane, nothing
clipped.

Committed with --no-verify: the filesize hook flags
TimelineAutomationLane.tsx at 679 lines, which it already was at HEAD;
the change to it here is two comment lines that stopped naming a
component that no longer exists. Lint, format, fallow and typecheck all
passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vance Ingalls
2026-08-20 16:40:12 -07:00
co-authored by Claude Opus 5
parent b4bf9d425e
commit ff55adfcb6
7 changed files with 17 additions and 112 deletions
@@ -5,7 +5,7 @@ import { createRoot } from "react-dom/client";
import type { GsapAnimation } from "@hyperframes/core/gsap-parser";
import { afterEach, describe, expect, it, vi } from "vitest";
import { usePlayerStore, type TimelineElement } from "../store/playerStore";
import { LANE_H, STRIP_H, TRACK_H } from "./timelineLayout";
import { LANE_H, TRACK_H } from "./timelineLayout";
import { AUTOMATION_LANE_H } from "./automationLaneHeight";
import { getTimelinePropertyLanes } from "./TimelinePropertyLanes";
import { resolveTrackKeyframeClip, useTimelineTrackLayout } from "./useTimelineTrackLayout";
@@ -74,10 +74,10 @@ describe("collapsed audio groups", () => {
return { layout, unmount: () => act(() => root.unmount()) };
}
// The `∿` area holds the bus strip (B7) AND the group's own automation rows
// (B2). Sized for only the strip, every lane the count had just promised was
// clipped out of the row — which is what "expanding automation on a group
// doesn't show the automation" looked like from outside.
// The `∿` area holds the group's own automation rows. Sized without them,
// every lane the count had just promised was clipped out of the row — which
// is what "expanding automation on a group doesn't show the automation"
// looked like from outside.
it("reserves room for the group's own automation rows, not just the strip", () => {
enabledCanaries.add("audio-groups");
const automation = JSON.stringify({
@@ -110,8 +110,8 @@ describe("collapsed audio groups", () => {
const anchorIndex = layout!.tracks.findIndex(([track]) => track === -0.5);
expect(anchorIndex).toBeGreaterThanOrEqual(0);
const openHeight = layout!.rowHeights[anchorIndex];
// One lane of headroom beyond header + strip.
expect(openHeight).toBe(TRACK_H + STRIP_H + AUTOMATION_LANE_H);
// One lane of headroom beyond the header row itself.
expect(openHeight).toBe(TRACK_H + AUTOMATION_LANE_H);
act(() => root.unmount());
});