2026-01-07 09:31:02 +00:00
|
|
|
import React, { useState } from 'react';
|
|
|
|
|
import { Button } from '../../ui/button';
|
|
|
|
|
import { Input } from '../../ui/input';
|
|
|
|
|
import { X, Layers } from 'lucide-react';
|
|
|
|
|
|
|
|
|
|
interface CreateProjectModalProps {
|
|
|
|
|
onClose: () => void;
|
|
|
|
|
onCreate: (project: any) => void;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
export const CreateProjectModal: React.FC<CreateProjectModalProps> = ({
|
|
|
|
|
onClose,
|
|
|
|
|
onCreate,
|
|
|
|
|
}) => {
|
2026-01-07 09:31:02 +00:00
|
|
|
const [formData, setFormData] = useState({
|
|
|
|
|
name: '',
|
|
|
|
|
daw: 'Ableton',
|
|
|
|
|
bpm: '128',
|
|
|
|
|
key: 'C Min',
|
2026-01-13 18:47:57 +00:00
|
|
|
description: '',
|
2026-01-07 09:31:02 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const handleSubmit = () => {
|
|
|
|
|
if (!formData.name) return;
|
|
|
|
|
onCreate({
|
|
|
|
|
...formData,
|
|
|
|
|
progress: 0,
|
|
|
|
|
status: 'Idea',
|
|
|
|
|
collaborators: [],
|
2026-01-13 18:47:57 +00:00
|
|
|
modified: 'Just now',
|
2026-01-07 09:31:02 +00:00
|
|
|
});
|
|
|
|
|
onClose();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className="fixed inset-0 z-[100] flex items-center justify-center p-4">
|
2026-01-13 18:47:57 +00:00
|
|
|
<div
|
|
|
|
|
className="absolute inset-0 bg-kodo-void/90 backdrop-blur-sm"
|
|
|
|
|
onClick={onClose}
|
|
|
|
|
></div>
|
2026-01-07 09:31:02 +00:00
|
|
|
<div className="relative w-full max-w-lg bg-kodo-graphite border border-kodo-steel rounded-xl shadow-2xl animate-scaleIn overflow-hidden">
|
|
|
|
|
<div className="p-4 border-b border-kodo-steel bg-kodo-ink flex justify-between items-center">
|
|
|
|
|
<h3 className="font-bold text-white flex items-center gap-2">
|
|
|
|
|
<Layers className="w-5 h-5 text-kodo-cyan" /> New Project
|
|
|
|
|
</h3>
|
2026-01-13 18:47:57 +00:00
|
|
|
<button onClick={onClose}>
|
2026-01-16 00:56:34 +00:00
|
|
|
<X className="w-5 h-5 text-kodo-content-dim hover:text-white" />
|
2026-01-13 18:47:57 +00:00
|
|
|
</button>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="p-6 space-y-6">
|
2026-01-13 18:47:57 +00:00
|
|
|
<Input
|
|
|
|
|
label="Project Name"
|
|
|
|
|
placeholder="e.g. Neon Genesis"
|
|
|
|
|
value={formData.name}
|
|
|
|
|
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
|
|
|
|
|
autoFocus
|
|
|
|
|
/>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
<div>
|
2026-01-16 00:56:34 +00:00
|
|
|
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-2">
|
2026-01-13 18:47:57 +00:00
|
|
|
Primary Workstation (DAW)
|
|
|
|
|
</label>
|
|
|
|
|
<div className="grid grid-cols-3 gap-3">
|
|
|
|
|
{['Ableton', 'FL Studio', 'Logic Pro'].map((daw) => (
|
|
|
|
|
<button
|
|
|
|
|
key={daw}
|
|
|
|
|
onClick={() => setFormData({ ...formData, daw })}
|
2026-01-16 00:56:34 +00:00
|
|
|
className={`p-3 rounded-lg border text-sm font-bold transition-all ${formData.daw === daw ? 'bg-kodo-cyan/10 border-kodo-cyan text-white' : 'bg-kodo-void border-kodo-steel text-kodo-content-dim hover:border-kodo-steel'}`}
|
2026-01-13 18:47:57 +00:00
|
|
|
>
|
|
|
|
|
{daw}
|
|
|
|
|
</button>
|
|
|
|
|
))}
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
<div className="grid grid-cols-2 gap-4">
|
|
|
|
|
<Input
|
|
|
|
|
label="BPM"
|
|
|
|
|
type="number"
|
|
|
|
|
placeholder="128"
|
|
|
|
|
value={formData.bpm}
|
|
|
|
|
onChange={(e) =>
|
|
|
|
|
setFormData({ ...formData, bpm: e.target.value })
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
<Input
|
|
|
|
|
label="Key"
|
|
|
|
|
placeholder="C Minor"
|
|
|
|
|
value={formData.key}
|
|
|
|
|
onChange={(e) =>
|
|
|
|
|
setFormData({ ...formData, key: e.target.value })
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
<div>
|
2026-01-16 00:56:34 +00:00
|
|
|
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-2">
|
2026-01-13 18:47:57 +00:00
|
|
|
Description
|
|
|
|
|
</label>
|
|
|
|
|
<textarea
|
|
|
|
|
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-3 text-white focus:border-kodo-cyan outline-none text-sm resize-none h-24"
|
|
|
|
|
placeholder="Project goals, vibe, or reference tracks..."
|
|
|
|
|
value={formData.description}
|
|
|
|
|
onChange={(e) =>
|
|
|
|
|
setFormData({ ...formData, description: e.target.value })
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-3">
|
2026-01-13 18:47:57 +00:00
|
|
|
<Button variant="ghost" onClick={onClose}>
|
|
|
|
|
Cancel
|
|
|
|
|
</Button>
|
|
|
|
|
<Button
|
|
|
|
|
variant="primary"
|
|
|
|
|
onClick={handleSubmit}
|
|
|
|
|
disabled={!formData.name}
|
|
|
|
|
>
|
|
|
|
|
Create Project
|
|
|
|
|
</Button>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|