"use client"; import { motion } from "framer-motion"; import { cn } from "@/lib/utils"; import type { PointerState } from "@/lib/visualizations/types"; interface PointerProps { pointer: PointerState; elementWidth: number; gap: number; value?: number; /** Hide the value to save space when pointers are close */ hideValue?: boolean; /** Horizontal offset when multiple pointers at same position */ horizontalOffset?: number; className?: string; } const COLOR_CLASSES = { left: "text-blue-500 fill-blue-500", right: "text-orange-500 fill-orange-500", mid: "text-purple-500 fill-purple-500", default: "text-blue-500 fill-blue-500", } as const; export function Pointer({ pointer, elementWidth, gap, value, hideValue = false, horizontalOffset = 0, className, }: PointerProps) { // Calculate center of element: index * (width + gap) + width / 2, plus any offset for overlapping const offset = pointer.index * (elementWidth + gap) + elementWidth / 2 + horizontalOffset; return ( {/* Label - centered above the arrow */} {pointer.name} {!hideValue && pointer.showValue && value !== undefined && ( = {value} )} {/* Arrow - centered at position */} ); }