l.parameterId === track.automation.selectedParameterId)?.visible
+ ? '164px' // 32px header + 132px automation lane
+ : track.automation?.showAutomation
+ ? '32px' // Just header
+ : '0px'
+ }}
+ >
+ {/* Effects Header - Always visible */}
+
{
+ onUpdateTrack(track.id, { effectsExpanded: !track.effectsExpanded });
+ }}
+ >
+
+ {track.effectsExpanded ? (
+
+ ) : (
+
+ )}
+ Effects
+
+ ({track.effectChain.effects.length})
+
+
+
+
+ {/* Effects Content - Collapsible */}
+ {track.effectsExpanded && (
+
+ {
+ const updatedChain = {
+ ...track.effectChain,
+ effects: track.effectChain.effects.map((e) =>
+ e.id === effectId ? { ...e, enabled: !e.enabled } : e
+ ),
+ };
+ onUpdateTrack(track.id, { effectChain: updatedChain });
+ }}
+ onRemoveEffect={(effectId) => {
+ const updatedChain = {
+ ...track.effectChain,
+ effects: track.effectChain.effects.filter((e) => e.id !== effectId),
+ };
+ onUpdateTrack(track.id, { effectChain: updatedChain });
+ }}
+ onUpdateEffect={(effectId, parameters) => {
+ const updatedChain = {
+ ...track.effectChain,
+ effects: track.effectChain.effects.map((e) =>
+ e.id === effectId ? { ...e, parameters } : e
+ ),
+ };
+ onUpdateTrack(track.id, { effectChain: updatedChain });
+ }}
+ onAddEffect={(effectType) => {
+ const newEffect = createEffect(
+ effectType,
+ EFFECT_NAMES[effectType]
+ );
+ const updatedChain = {
+ ...track.effectChain,
+ effects: [...track.effectChain.effects, newEffect],
+ };
+ onUpdateTrack(track.id, { effectChain: updatedChain });
+ }}
+ />
+
+ )}
)}