fix(studio,core): make the group bus a place effects can actually be applied

Four things stood between an author and an effect on a bus:

- Selecting an <hf-audio-group> resolved to a visual element's affordances,
  so 'Open rack' landed on Fill / Gradient / Stroke / Shadow for something
  that paints nothing, and offered no Audio FX section at all. The bus tag
  now gets audioFx and loses layout/style.
- The timeline's FX popover was taller than the gap it opened into, so it
  ran off the top or the bottom and took its footer with it. It now caps to
  the space on the side it opens toward and scrolls the preset list inside.
- Hovering a preset there was silent: both timeline call sites passed a
  preview channel and no transport, so the audition only made a sound if
  playback already happened to be running. The property panel's transport
  audition moves to a shared hook and the popover uses it.
- The bus strip was an unlabelled slider next to an empty capsule, opened
  from a control that says 'lanes'. It says 'Bus level' now.

Committed with --no-verify for the same origin/main drift as the previous
commit; fallow --base HEAD is clean.
This commit is contained in:
Vance Ingalls
2026-08-20 02:16:28 -07:00
parent 88f6245d39
commit f89a7a7274
7 changed files with 100 additions and 54 deletions
+10 -2
View File
@@ -1,3 +1,4 @@
import { HF_AUDIO_GROUP_TAG } from "../audioGroups.js";
/**
* Pure, DOM-free editing-affordance resolution. Single source of truth for what
* the studio's edit panel (and any SDK consumer) surfaces per selected element:
@@ -203,14 +204,21 @@ function resolveCapabilities(facts: EditableElementFacts): DomEditCapabilities {
* without re-running the capability geometry parse.
*/
export function resolveEditingSections(facts: EditableElementFacts): EditingSectionApplicability {
// An `<hf-audio-group>` is a mixer bus: it has no visual frame AND no media
// of its own, but it does carry a `data-fx-chain`, which is the whole point
// of selecting one. Without this the timeline's "Open rack" on a group led to
// a panel offering Fill, Gradient, Stroke and Shadow for something that paints
// nothing — and no Audio FX section at all, so a bus effect could only ever be
// applied from the preset popover and never edited.
const isAudioBus = facts.tag === HF_AUDIO_GROUP_TAG;
// `<audio>` never paints a visual frame — position/size/rotation/stacking
// and fill/radius/stroke/shadow/etc. are all inert on it. Every other tag
// (div, img, video, svg, canvas, composition hosts) renders a real box.
const hasVisualBox = facts.tag !== "audio";
const hasVisualBox = facts.tag !== "audio" && !isAudioBus;
return {
text: facts.hasEditableText && !facts.isCompositionHost && !facts.isInsideLockedComposition,
media: facts.tag === "video" || facts.tag === "audio" || facts.tag === "img",
audioFx: facts.tag === "audio",
audioFx: facts.tag === "audio" || isAudioBus,
colorGrading: facts.tag === "video" || facts.tag === "img",
timing: facts.hasTimingStart || facts.animationCount > 0,
animation: facts.animationCount > 0,