- {/* Left: Track Control Panel (Fixed Width) */}
+ {/* Left: Track Control Panel (Fixed Width) - Ableton Style */}
e.stopPropagation()}
>
- {/* Track Name & Collapse Toggle */}
-
+ {/* Track Name (Full Width) */}
+
@@ -445,19 +437,22 @@ export function Track({
onChange={(e) => setNameInput(e.target.value)}
onBlur={handleNameBlur}
onKeyDown={handleNameKeyDown}
- className="w-full px-2 py-1 text-sm font-medium bg-background border border-border rounded"
+ className="w-full px-1 py-0.5 text-xs font-medium bg-background border border-border rounded"
/>
) : (
{String(track.name || 'Untitled Track')}
)}
+
+ {/* Compact Button Row */}
+
{/* Record Enable Button */}
{onToggleRecordEnable && (
)}
@@ -480,9 +481,12 @@ export function Track({
size="icon-sm"
onClick={onToggleSolo}
title="Solo track"
- className={cn(track.solo && 'bg-yellow-500/20 hover:bg-yellow-500/30')}
+ className={cn(
+ 'h-6 w-6 text-[10px] font-bold',
+ track.solo && 'bg-yellow-500/20 hover:bg-yellow-500/30 text-yellow-500'
+ )}
>
-
+ S
{/* Mute Button */}
@@ -491,13 +495,12 @@ export function Track({
size="icon-sm"
onClick={onToggleMute}
title="Mute track"
- className={cn(track.mute && 'bg-red-500/20 hover:bg-red-500/30')}
- >
- {track.mute ? (
-
- ) : (
-
+ className={cn(
+ 'h-6 w-6 text-[10px] font-bold',
+ track.mute && 'bg-red-500/20 hover:bg-red-500/30 text-red-500'
)}
+ >
+ M
{/* Remove Button */}
@@ -506,105 +509,37 @@ export function Track({
size="icon-sm"
onClick={onRemove}
title="Remove track"
- className="text-destructive hover:text-destructive hover:bg-destructive/10"
+ className="h-6 w-6 text-destructive hover:text-destructive hover:bg-destructive/10"
>
-
+
{/* Track Controls - Only show when not collapsed */}
{!track.collapsed && (
- <>
- {/* Volume */}
-
-
-
-
-
-
- {Math.round(track.volume * 100)}%
-
-
+
+ {/* Pan Knob */}
+
- {/* Pan */}
-
-
-
-
-
-
- {track.pan === 0
- ? 'C'
- : track.pan < 0
- ? `L${Math.abs(Math.round(track.pan * 100))}`
- : `R${Math.round(track.pan * 100)}`}
-
-
-
- {/* Level Meter (shows input when recording, output level otherwise) */}
-
-
-
-
-
-
- {(() => {
- const level = track.recordEnabled || isRecording ? recordingLevel : playbackLevel;
- // Convert normalized (0-1) back to dB
- // normalized = (dB - (-60)) / 60, so dB = (normalized * 60) - 60
- const db = (level * 60) - 60;
- return level === 0 ? '-∞' : `${db.toFixed(0)}`;
- })()}
-
-
-
- {/* Recording Settings - Show when track is armed */}
- {track.recordEnabled && recordingSettings && onInputGainChange && onRecordMonoChange && onSampleRateChange && (
-
- )}
- >
+ {/* Vertical Volume Fader with integrated meter */}
+
+
)}
diff --git a/components/tracks/TrackList.tsx b/components/tracks/TrackList.tsx
index ab31bd4..6875a34 100644
--- a/components/tracks/TrackList.tsx
+++ b/components/tracks/TrackList.tsx
@@ -7,7 +7,6 @@ import { Track } from './Track';
import { ImportTrackDialog } from './ImportTrackDialog';
import type { Track as TrackType } from '@/types/track';
import { createEffect, type EffectType, EFFECT_NAMES } from '@/lib/audio/effects/chain';
-import type { RecordingSettings } from '@/lib/hooks/useRecording';
export interface TrackListProps {
tracks: TrackType[];
@@ -26,10 +25,6 @@ export interface TrackListProps {
recordingTrackId?: string | null;
recordingLevel?: number;
trackLevels?: Record