feat: show waveform in collapsed state
Changes: - Waveform canvas now displays even when track is collapsed - Only the upload placeholder is hidden when collapsed - Gives better visual overview when tracks are minimized - Similar to DAWs like Ableton Live 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -81,7 +81,7 @@ export function Track({
|
|||||||
|
|
||||||
// Draw waveform
|
// Draw waveform
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (!track.audioBuffer || !canvasRef.current || track.collapsed) return;
|
if (!track.audioBuffer || !canvasRef.current) return;
|
||||||
|
|
||||||
const canvas = canvasRef.current;
|
const canvas = canvasRef.current;
|
||||||
const ctx = canvas.getContext('2d');
|
const ctx = canvas.getContext('2d');
|
||||||
@@ -387,43 +387,41 @@ export function Track({
|
|||||||
className="flex-1 relative bg-slate-900 border-b border-border cursor-pointer"
|
className="flex-1 relative bg-slate-900 border-b border-border cursor-pointer"
|
||||||
onClick={onSelect}
|
onClick={onSelect}
|
||||||
>
|
>
|
||||||
{!track.collapsed && (
|
{track.audioBuffer ? (
|
||||||
<>
|
<canvas
|
||||||
{track.audioBuffer ? (
|
ref={canvasRef}
|
||||||
<canvas
|
className="absolute inset-0 w-full h-full cursor-pointer"
|
||||||
ref={canvasRef}
|
onClick={handleCanvasClick}
|
||||||
className="absolute inset-0 w-full h-full cursor-pointer"
|
/>
|
||||||
onClick={handleCanvasClick}
|
) : (
|
||||||
|
!track.collapsed && (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
className={cn(
|
||||||
|
"absolute inset-0 flex flex-col items-center justify-center text-sm text-muted-foreground hover:text-foreground transition-colors cursor-pointer group",
|
||||||
|
isDragging ? "bg-primary/20 text-primary border-2 border-primary border-dashed" : "hover:bg-accent/50"
|
||||||
|
)}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
handleLoadAudioClick();
|
||||||
|
}}
|
||||||
|
onDragOver={handleDragOver}
|
||||||
|
onDragLeave={handleDragLeave}
|
||||||
|
onDrop={handleDrop}
|
||||||
|
>
|
||||||
|
<Upload className="h-6 w-6 mb-2 opacity-50 group-hover:opacity-100" />
|
||||||
|
<p>{isDragging ? 'Drop audio file here' : 'Click to load audio file'}</p>
|
||||||
|
<p className="text-xs opacity-75 mt-1">or drag & drop</p>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
ref={fileInputRef}
|
||||||
|
type="file"
|
||||||
|
accept="audio/*"
|
||||||
|
onChange={handleFileChange}
|
||||||
|
className="hidden"
|
||||||
/>
|
/>
|
||||||
) : (
|
</>
|
||||||
<>
|
)
|
||||||
<div
|
|
||||||
className={cn(
|
|
||||||
"absolute inset-0 flex flex-col items-center justify-center text-sm text-muted-foreground hover:text-foreground transition-colors cursor-pointer group",
|
|
||||||
isDragging ? "bg-primary/20 text-primary border-2 border-primary border-dashed" : "hover:bg-accent/50"
|
|
||||||
)}
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
handleLoadAudioClick();
|
|
||||||
}}
|
|
||||||
onDragOver={handleDragOver}
|
|
||||||
onDragLeave={handleDragLeave}
|
|
||||||
onDrop={handleDrop}
|
|
||||||
>
|
|
||||||
<Upload className="h-6 w-6 mb-2 opacity-50 group-hover:opacity-100" />
|
|
||||||
<p>{isDragging ? 'Drop audio file here' : 'Click to load audio file'}</p>
|
|
||||||
<p className="text-xs opacity-75 mt-1">or drag & drop</p>
|
|
||||||
</div>
|
|
||||||
<input
|
|
||||||
ref={fileInputRef}
|
|
||||||
type="file"
|
|
||||||
accept="audio/*"
|
|
||||||
onChange={handleFileChange}
|
|
||||||
className="hidden"
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user