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 type LabelPosition = 'inside' | 'outside' export interface GroupRectFormData { label: string font: string text_color: string text_position: TextPosition text_size: number label_position: LabelPosition border_color: string border_style: BorderStyle border_width: number 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 TEXT_SIZES: { value: number; label: string }[] = [ { value: 10, label: '10' }, { value: 12, label: '12' }, { value: 14, label: '14' }, { value: 16, label: '16' }, { value: 18, label: '18' }, { value: 20, label: '20' }, ] const LABEL_POSITIONS: { value: LabelPosition; label: string }[] = [ { value: 'inside', label: 'Inside' }, { value: 'outside', label: 'Outside' }, ] const BORDER_WIDTHS: { value: number; label: string }[] = [ { value: 1, label: '1px' }, { value: 2, label: '2px' }, { value: 3, label: '3px' }, { value: 4, label: '4px' }, { value: 5, label: '5px' }, ] const DEFAULT_FORM: GroupRectFormData = { label: '', font: 'inter', text_color: '#e6edf3', text_position: 'top-left', text_size: 12, label_position: 'inside', border_color: '#00d4ff', border_style: 'solid', border_width: 2, 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 Zone' }: 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 ( ) })}
{/* Label position */}
{LABEL_POSITIONS.map(({ value, label }) => { const isSelected = form.label_position === value return ( ) })}
{/* Colors */}
{colorFields.map(({ key, label }) => (
{/* Text size */}
{TEXT_SIZES.map(({ value, label }) => { const isSelected = form.text_size === value return ( ) })}
{/* Border style */}
{BORDER_STYLES.map(({ value, label, preview }) => { const isSelected = form.border_style === value return ( ) })}
{/* Border width */}
{BORDER_WIDTHS.map(({ value, label }) => { const isSelected = form.border_width === value return ( ) })}
{/* Z-order */}
{onDelete && ( )}
) }