"use client"; import { useState } from "react"; interface Props { value: number; label: "high" | "medium" | "low"; breakdown?: Record; caveats?: string[]; } const LABEL_RU: Record = { high: "высокая", medium: "средняя", low: "низкая", }; const COLOR: Record< Props["label"], { bg: string; fg: string; border: string } > = { high: { bg: "#dcfce7", fg: "#15803d", border: "#86efac" }, medium: { bg: "#fef9c3", fg: "#a16207", border: "#fde68a" }, low: { bg: "#fee2e2", fg: "#b91c1c", border: "#fca5a5" }, }; const BREAKDOWN_RU: Record = { poi_freshness: "Свежесть OSM POI", geom_source: "Точность геометрии", district: "Известность района", market_trend: "Глубина ДДУ", competitors: "Покрытие конкурентами", environment: "Экологические данные", zoning: "ПЗЗ / зонирование", }; export function ConfidenceBadge({ value, label, breakdown, caveats }: Props) { const [expanded, setExpanded] = useState(false); const c = COLOR[label]; const pct = Math.round(value * 100); const hasDetails = (caveats && caveats.length > 0) || (breakdown && Object.keys(breakdown).length > 0); return (
Достоверность {pct}% · {LABEL_RU[label]}
{hasDetails && ( )}
{/* Caveats — показываем сразу для low, под toggle для medium/high */} {caveats && caveats.length > 0 && (label === "low" || expanded) && (
    {caveats.map((cv, i) => (
  • {cv}
  • ))}
)} {/* Breakdown — под toggle */} {expanded && breakdown && Object.keys(breakdown).length > 0 && (
{Object.entries(breakdown).map(([k, v]) => (
{BREAKDOWN_RU[k] ?? k} {Math.round(v * 100)}%
))}
)}
); }