import { useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import type { TextPosition } from '@/types' export type BorderStyle = 'solid' | 'dashed' | 'dotted' | 'double' | 'none' export interface GroupRectFormData { label: string font: string text_color: string text_position: TextPosition border_color: string border_style: BorderStyle background_color: string z_order: number } const BORDER_STYLES: { value: BorderStyle; label: string; preview: string }[] = [ { value: 'solid', label: 'Solid', preview: '───' }, { value: 'dashed', label: 'Dashed', preview: '╌╌╌' }, { value: 'dotted', label: 'Dotted', preview: '···' }, { value: 'double', label: 'Double', preview: '═══' }, { value: 'none', label: 'None', preview: ' ' }, ] const DEFAULT_FORM: GroupRectFormData = { label: '', font: 'inter', text_color: '#e6edf3', text_position: 'top-left', border_color: '#00d4ff', border_style: 'solid', background_color: '#00d4ff0d', z_order: 1, } const FONTS = [ { value: 'inter', label: 'Inter (sans-serif)' }, { value: 'mono', label: 'JetBrains Mono' }, { value: 'serif', label: 'Serif' }, ] const TEXT_POSITIONS: { value: TextPosition; label: string }[] = [ { value: 'top-left', label: '↖' }, { value: 'top-center', label: '↑' }, { value: 'top-right', label: '↗' }, { value: 'middle-left', label: '←' }, { value: 'center', label: '·' }, { value: 'middle-right', label: '→' }, { value: 'bottom-left', label: '↙' }, { value: 'bottom-center', label: '↓' }, { value: 'bottom-right', label: '↘' }, ] interface GroupRectModalProps { open: boolean onClose: () => void onSubmit: (data: GroupRectFormData) => void onDelete?: () => void initial?: Partial title?: string } export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, title = 'Add Rectangle' }: GroupRectModalProps) { const [form, setForm] = useState({ ...DEFAULT_FORM, ...initial }) const set = (key: K, value: GroupRectFormData[K]) => setForm((f) => ({ ...f, [key]: value })) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() onSubmit(form) onClose() } const colorFields = [ { key: 'text_color' as const, label: 'Text' }, { key: 'border_color' as const, label: 'Border' }, { key: 'background_color' as const, label: 'Background' }, ] return ( !o && onClose()}> {title}
{/* Label */}
set('label', e.target.value)} placeholder="Zone name…" className="bg-[#21262d] border-[#30363d] text-sm h-8" />
{/* Font */}
{/* Text position 3×3 grid */}
{TEXT_POSITIONS.map(({ value, label }) => { const isSelected = form.text_position === value return ( ) })}
{/* Colors */}
{colorFields.map(({ key, label }) => (
{/* Border style */}
{BORDER_STYLES.map(({ value, label, preview }) => { const isSelected = form.border_style === value return ( ) })}
{/* Z-order */}
{onDelete && ( )}
) }