import { computed } from 'vue'; import { clamp } from '@robonen/stdlib'; import { fmtKcal } from '../domain/format'; const SIZE = 216; const RADIUS = 92; const STROKE = 11; const CIRCUMFERENCE = 2 * Math.PI * RADIUS; /** * Главный индикатор дня: съедено против цели, в центре — остаток. * При переборе дуга замыкается и меняет цвет, остаток становится «сверх цели». */ export default function ProgressRing(props: { eaten: number; target: number }) { const over = computed(() => props.eaten > props.target); const fraction = computed(() => (props.target > 0 ? clamp(props.eaten / props.target, 0, 1) : 0)); const dashOffset = computed(() => CIRCUMFERENCE * (1 - fraction.value)); const remaining = computed(() => Math.abs(props.target - props.eaten)); return (
{fmtKcal(remaining.value)}
{over.value ? 'ккал сверх цели' : 'ккал осталось'}
{`${fmtKcal(props.eaten)} из ${fmtKcal(props.target)}`}
); }