veza/apps/web/src/components/studio/projects/CreateProjectModal.tsx
senke 6974c12a25 aesthetic-improvements: align spacing to 8px grid (Action 11.2.1.3)
- Created automated script (scripts/align-8px-grid.py) to align all spacing to 8px grid
- Replaced non-8px-aligned spacing: gap-3/p-3/m-3 (12px) → gap-4/p-4/m-4 (16px), gap-5/p-5/m-5 (20px) → gap-6/p-6/m-6 (24px), gap-10/p-10/m-10 (40px) → gap-12/p-12/m-12 (48px), gap-20/p-20/m-20 (80px) → gap-24/p-24/m-24 (96px)
- Preserved: 4px values (gap-1, p-1, m-1) as they may be intentional fine-tuning, responsive breakpoints (sm:, md:, lg:), test files, documentation
- Modified files across all components to ensure consistent 8px grid alignment
- Action 11.2.1.3: Align all elements to 8px grid - COMPLETE
2026-01-16 11:50:46 +01:00

127 lines
4.1 KiB
TypeScript

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;
}
export const CreateProjectModal: React.FC<CreateProjectModalProps> = ({
onClose,
onCreate,
}) => {
const [formData, setFormData] = useState({
name: '',
daw: 'Ableton',
bpm: '128',
key: 'C Min',
description: '',
});
const handleSubmit = () => {
if (!formData.name) return;
onCreate({
...formData,
progress: 0,
status: 'Idea',
collaborators: [],
modified: 'Just now',
});
onClose();
};
return (
<div className="fixed inset-0 z-[100] flex items-center justify-center p-4">
<div
className="absolute inset-0 bg-kodo-void/90 backdrop-blur-sm"
onClick={onClose}
></div>
<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-steel" /> New Project
</h3>
<button onClick={onClose}>
<X className="w-5 h-5 text-kodo-content-dim hover:text-white" />
</button>
</div>
<div className="p-6 space-y-6">
<Input
label="Project Name"
placeholder="e.g. Neon Genesis"
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
autoFocus
/>
<div>
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-2">
Primary Workstation (DAW)
</label>
<div className="grid grid-cols-3 gap-4">
{['Ableton', 'FL Studio', 'Logic Pro'].map((daw) => (
<button
key={daw}
onClick={() => setFormData({ ...formData, daw })}
className={`p-4 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'}`}
>
{daw}
</button>
))}
</div>
</div>
<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>
<div>
<label className="block text-xs font-bold text-kodo-content-dim uppercase mb-2">
Description
</label>
<textarea
className="w-full bg-kodo-void border border-kodo-steel rounded-lg p-4 text-white focus:border-kodo-steel 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>
</div>
<div className="p-4 border-t border-kodo-steel bg-kodo-ink flex justify-end gap-4">
<Button variant="ghost" onClick={onClose}>
Cancel
</Button>
<Button
variant="primary"
onClick={handleSubmit}
disabled={!formData.name}
>
Create Project
</Button>
</div>
</div>
</div>
);
};