import type { CoverageResult } from "./coverage"; type CoveragePanelProps = { /** Покрытие только забронированным набором. null — покрытие недоступно (нет геометрии/0 сэмплов). */ booked: CoverageResult | null; /** Покрытие union(забронированное ∪ выбранное галочками). */ withSelection: CoverageResult | null; /** Есть ли выбор сверх брони (показывать второй сегмент «с выбором»). */ hasSelection: boolean; /** Геометрия заявки пригодна для расчёта (false → «недоступно»). */ available: boolean; /** Тумблер следа покрытия на карте (D4 — локальный, вкл. по умолчанию). */ coverageOn: boolean; onToggleCoverage: (on: boolean) => void; /** Тумблер подсветки конфликтов выбора (тусклый слой) — рядом со следом на карте. */ showConflicts: boolean; onToggleConflicts: (on: boolean) => void; }; // Панель покрытия над списком слотов (D-D1): «забронировано NN% · с выбором MM%» + двухсегментный // бар + явные состояния. Цвет = цвет слоя coverage на карте (violet) — единый язык «покрыто». export function CoveragePanel({ booked, withSelection, hasSelection, available, coverageOn, onToggleCoverage, showConflicts, onToggleConflicts, }: CoveragePanelProps) { const bookedPct = booked?.percent ?? 0; const withPct = withSelection?.percent ?? bookedPct; // Прирост от выбора (второй сегмент) — поверх забронированного. const gainPct = Math.max(0, withPct - bookedPct); const lowPrecision = !!(booked?.lowPrecision || withSelection?.lowPrecision); return (