"use client"; import { useId, type ChangeEvent } from "react"; import { Crosshair } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { AIM_TRAINER_CROSSHAIR_SCALE_MAX, AIM_TRAINER_CROSSHAIR_SCALE_MIN, AIM_TRAINER_CROSSHAIR_SCALE_STEP, AIM_TRAINER_CROSSHAIR_STYLES, normalizeAimTrainerCrosshairScale, type AimTrainerCrosshairPrefs, type AimTrainerCrosshairStyle, } from "./crosshair"; const STYLE_LABELS: Record = { classic: "Classic", dot: "Dot", cross: "Cross", circle: "Circle", chevron: "Chevron", }; const COLOR_PRESETS = [ "#d8d3b6", "#4ade80", "#f87171", "#22d3ee", "#e879f9", "#ffffff", ] as const; function CrosshairPreview({ style }: { style: AimTrainerCrosshairStyle }) { const lineProps = { stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "butt" as const, strokeLinejoin: "miter" as const, }; switch (style) { case "classic": return ( ); case "dot": return ( ); case "cross": return ( ); case "circle": return ( ); case "chevron": return ( ); } } export function CrosshairSettings({ value, onPrefsChangeAction, }: { readonly value: AimTrainerCrosshairPrefs; readonly onPrefsChangeAction: (prefs: AimTrainerCrosshairPrefs) => void; }) { const colorInputId = useId(); const handleCustomColorChange = (event: ChangeEvent) => { onPrefsChangeAction({ ...value, color: event.target.value }); }; const handleScaleChange = (event: ChangeEvent) => { onPrefsChangeAction({ ...value, scale: normalizeAimTrainerCrosshairScale(Number(event.target.value)), }); }; return (
Crosshair style
{AIM_TRAINER_CROSSHAIR_STYLES.map((style) => ( ))}
Crosshair color
{COLOR_PRESETS.map((color) => { const selected = value.color.toLowerCase() === color.toLowerCase(); return ( ); })}
Crosshair scale {value.scale.toFixed(1)}x
); }