import { motion } from "framer-motion"; import { EASE_EXPO, inView } from "../../../lib/motion"; import { useReducedMotion } from "../../../lib/useReducedMotion"; // Serie fija: doce meses con tendencia al alza y ruido creíble. Determinista a // propósito, para que el audit visual capture siempre la misma gráfica. const SERIE = [38, 44, 41, 52, 58, 54, 66, 71, 68, 79, 86, 94]; const W = 520; const H = 200; const PAD = 12; const MAX = Math.max(...SERIE); const MIN = Math.min(...SERIE); function yDe(v: number): number { return H - PAD - ((v - MIN) / (MAX - MIN)) * (H - PAD * 2); } function pathFrom(serie: number[]): string { const dx = (W - PAD * 2) / (serie.length - 1); return serie .map((v, i) => `${i === 0 ? "M" : "L"}${(PAD + i * dx).toFixed(1)} ${yDe(v).toFixed(1)}`) .join(" "); } /** Línea de ingresos que se traza sola. El "antes/después" no se explica: se ve. */ export function RevenueLineVisual({ className = "" }: { className?: string }) { const reduced = useReducedMotion(); const d = pathFrom(SERIE); const area = `${d} L${W - PAD} ${H - PAD} L${PAD} ${H - PAD} Z`; return ( {/* Rejilla base: tres guías en #eef0f4, el mismo `CartesianGrid` que usa la gráfica de ingresos del panel. Dan escala sin competir. */} {[0.25, 0.5, 0.75].map((f) => ( ))} {/* Punto final: la marca del "hoy". Aterriza cuando la línea termina. */} ); }