import {useRef } from "react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { Trash2, Type, Image as ImageIcon, Upload, Bold, Italic, Underline, AlignLeft, AlignCenter, AlignRight, ChevronDown, Info } from "lucide-react"; import { toast } from "sonner"; import Block from '@uiw/react-color-block'; import type { AnnotationRegion, AnnotationType, ArrowDirection, FigureData } from "./types"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { Slider } from "@/components/ui/slider"; import { cn } from "@/lib/utils"; import { getArrowComponent } from "./ArrowSvgs"; interface AnnotationSettingsPanelProps { annotation: AnnotationRegion; onContentChange: (content: string) => void; onTypeChange: (type: AnnotationType) => void; onStyleChange: (style: Partial) => void; onFigureDataChange?: (figureData: FigureData) => void; onDelete: () => void; } const FONT_FAMILIES = [ { value: 'system-ui, -apple-system, sans-serif', label: 'Classic' }, { value: 'Georgia, serif', label: 'Editor' }, { value: 'Impact, Arial Black, sans-serif', label: 'Strong' }, { value: 'Courier New, monospace', label: 'Typewriter' }, { value: 'Brush Script MT, cursive', label: 'Deco' }, { value: 'Arial, sans-serif', label: 'Simple' }, { value: 'Verdana, sans-serif', label: 'Modern' }, { value: 'Trebuchet MS, sans-serif', label: 'Clean' }, ]; const FONT_SIZES = [12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 96, 128]; export function AnnotationSettingsPanel({ annotation, onContentChange, onTypeChange, onStyleChange, onFigureDataChange, onDelete, }: AnnotationSettingsPanelProps) { const fileInputRef = useRef(null); const colorPalette = [ '#FF0000', // Red '#FFD700', // Yellow/Gold '#00FF00', // Green '#FFFFFF', // White '#0000FF', // Blue '#FF6B00', // Orange '#9B59B6', // Purple '#E91E63', // Pink '#00BCD4', // Cyan '#FF5722', // Deep Orange '#8BC34A', // Light Green '#FFC107', // Amber '#34B27B', // Brand Green '#000000', // Black '#607D8B', // Blue Grey '#795548', // Brown ]; const handleImageUpload = (event: React.ChangeEvent) => { const files = event.target.files; if (!files || files.length === 0) return; const file = files[0]; // Validate file type const validTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp']; if (!validTypes.includes(file.type)) { toast.error('Invalid file type', { description: 'Please upload a JPG, PNG, GIF, or WebP image file.', }); event.target.value = ''; return; } const reader = new FileReader(); reader.onload = (e) => { const dataUrl = e.target?.result as string; if (dataUrl) { onContentChange(dataUrl); toast.success('Image uploaded successfully!'); } }; reader.onerror = () => { toast.error('Failed to upload image', { description: 'There was an error reading the file.', }); }; reader.readAsDataURL(file); event.target.value = ''; }; return (
Annotation Settings Active
{/* Type Selector */} onTypeChange(value as AnnotationType)} className="mb-6"> Text Image Arrow {/* Text Content */}