'use client'; import { Reorder, motion, useDragControls } from 'motion/react'; import { Check, ChevronDown, ChevronRight, ChevronUp, GripVertical, Plus, Sparkles, Trash2, X, } from 'lucide-react'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useI18n } from '@/lib/hooks/use-i18n'; import { cn } from '@/lib/utils'; import type { QuizQuestion, QuizQuestionType } from '@/lib/types/stage'; import { MAX_OPTIONS, isChoice, optionLetter } from './quiz-edit-ops'; import { addQuizOption, deleteQuizOption, deleteQuizQuestion, reorderQuizOptions, setQuizQuestionType, toggleQuizCorrect, typeQuizOptionLabel, typeQuizQuestion, } from './use-quiz-surface'; const TYPES: QuizQuestionType[] = ['single', 'multiple', 'short_answer']; /** Per-type accent: a quiz scene's question types read at a glance by colour. */ const TYPE_ACCENT: Record = { single: { badge: 'bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300', rail: 'from-violet-400 to-violet-600', }, multiple: { badge: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-500/15 dark:text-indigo-300', rail: 'from-indigo-400 to-indigo-600', }, short_answer: { badge: 'bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300', rail: 'from-amber-400 to-amber-600', }, }; /** Brand-violet focus treatment shared by every text input in the form. */ const FOCUS = 'focus-visible:border-violet-400 focus-visible:ring-violet-400/25'; /** Stop a pointer event from reaching the Reorder.Item drag listener. */ const stopDrag = (e: React.PointerEvent) => e.stopPropagation(); interface Props { readonly question: QuizQuestion; readonly index: number; readonly expanded: boolean; readonly onToggle: () => void; } export function QuestionCard({ question: q, index, expanded, onToggle }: Props) { const { t } = useI18n(); const controls = useDragControls(); const choice = isChoice(q.type); const accent = TYPE_ACCENT[q.type]; return ( {/* Left accent rail — colours the active question by its type. */}
{/* Header — caret + summary toggles expansion; grip drags; trash deletes. */}
{q.points ?? 1}
{expanded && ( {/* Question text */}