Attachments (optional)
-
setReviewFiles(Array.from(e.target.files || []))}
- />
+
{ setReviewFiles(prev => [...prev, ...Array.from(e.target.files)]); e.target.value = ''; }} />
+
{ e.preventDefault(); reviewDragCounter.current++; setReviewDragging(true); }}
+ onDragLeave={e => { e.preventDefault(); reviewDragCounter.current--; if (reviewDragCounter.current === 0) setReviewDragging(false); }}
+ onDragOver={e => e.preventDefault()}
+ onDrop={e => { e.preventDefault(); reviewDragCounter.current = 0; setReviewDragging(false); setReviewFiles(prev => [...prev, ...Array.from(e.dataTransfer.files)]); }}
+ onClick={() => reviewFileRef.current?.click()}
+ style={{ border: `2px dashed ${reviewDragging ? 'var(--accent)' : reviewFiles.length > 0 ? 'var(--accent)' : 'var(--border)'}`, borderRadius: 8, padding: '16px', textAlign: 'center', background: reviewDragging ? 'color-mix(in srgb, var(--accent) 8%, var(--bg))' : 'transparent', transition: 'all 160ms', cursor: 'pointer' }}
+ >
+
{reviewDragging ? '📂' : '📎'}
+
+ {reviewDragging ? 'Drop files here' : reviewFiles.length > 0 ? `${reviewFiles.length} file${reviewFiles.length !== 1 ? 's' : ''} attached — click or drag to add more` : 'Click or drag files here'}
+
+
Any file type accepted
+
{reviewFiles.length > 0 && (
-
+
{reviewFiles.map((f, i) => (
-
-
{f.name}
-
+
+ {f.name}
+
))}
)}
-
-
+
+