"use client"; import Image from "@/components/ui/resilient-image"; import { GripVerticalIcon, HeartPulseIcon, PlusIcon, SparklesIcon, Trash2Icon } from "lucide-react"; import { useState, type ReactNode } from "react"; import { closestCenter, DndContext, KeyboardSensor, PointerSensor, useSensor, useSensors, type DragEndEvent } from "@dnd-kit/core"; import { arrayMove, rectSortingStrategy, SortableContext, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { saveArtifactSection } from "@/app/admin/actions"; import { AutosaveStatus } from "@/components/admin/autosave-status"; import { DeleteConfirmationDialog } from "@/components/admin/ui/delete-confirmation-dialog"; import { ArtifactSelect } from "@/components/admin/ui/catalog-select"; import { Button } from "@/components/ui/button"; import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList } from "@/components/ui/combobox"; import { Field, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSet } from "@/components/ui/field"; import { ClearableInput as Input } from "@/components/admin/ui/clearable-input"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { useAutosave } from "@/hooks/use-autosave"; import { adminDraftKey } from "@/lib/editor/local-draft"; import { artifactSectionSchema, mainStatOptions, substatOptions, talentLevelOptions } from "@/lib/guides/schemas"; import { normalizeTargetStat, recommendedStatElement, recommendedStatIconName, recommendedStatOptionConflicts, targetStatDefaults, targetStatIconName, targetStatOptions, statPriorityColorClass } from "@/lib/guides/stats"; import { elementIconFilter } from "@/lib/catalog/element"; import { normalizeTalentPriorities, reorderTalentPriorities, type TalentPriority, type TalentRelation } from "@/lib/guides/talents"; import { finalizePercentInput, normalizePercentInput } from "@/lib/guides/percent-input"; import { formatGuideValidationIssues } from "@/lib/guides/validation-messages"; import { cn } from "@/lib/utils"; import { type CatalogTalent, type EditorBase, hasIssuePrefix, parseEditorDraft, createClientId, ConditionControls, reorderConditions, ConditionRenameDialog, SELECTED_TOGGLE_CLASS } from "./shared"; export function StatSelect({ label, options, value, onChange, elementIconUrls, priorityColors = false, }: { label: string; options: readonly string[]; value: string[]; onChange: (value: string[]) => void; elementIconUrls: Record; priorityColors?: boolean; }) { return ( {label} ); } export function StatIcons({ values, elementIconUrls = {}, }: { values: readonly string[]; elementIconUrls?: Record; }) { const icons = values.flatMap((value) => { const element = recommendedStatElement(value); if (element && elementIconUrls[element]) { return [{ name: element, src: elementIconUrls[element], element }]; } const targetIcon = targetStatIconName(value); if (targetIcon) { return [{ name: targetIcon, src: `/icon/stats/${targetIcon}.webp` }]; } const recommendedIcon = recommendedStatIconName(value); return recommendedIcon ? [{ name: recommendedIcon, src: `/icon/stats/${recommendedIcon}.${recommendedIcon === "elemental-bonus" ? "svg" : "webp"}`, }] : []; }); if (!icons.length) return null; return ( ); } export function StatIcon({ name, src, element, }: { name: string; src: string; element?: string; }) { const [hasError, setHasError] = useState(false); if (hasError) { const PlaceholderIcon = name === "healing-bonus" ? HeartPulseIcon : SparklesIcon; return (