/* ============================================================ Динамика веса — overview + detail ============================================================ */ /* Reusable weight line chart. data: [{x:'Янв', kg:29}] markers:[{i, L, c}] vertical event lines W/H in svg units; y-domain fixed 23..33 */ function WeightChart({ data, markers, yMax=31, openIdx, lastHollow }){ const W=320, H=190, padL=26, padR=14, padT=24, padB=26; const yMin=23; const x=i=> padL + (W-padL-padR)*(i/(data.length-1)); const y=kg=> padT + (H-padT-padB)*(1-(kg-yMin)/(yMax-yMin)); const pts=data.map((d,i)=>[x(i),y(d.kg)]); const gridVals=[]; for(let v=yMin;v<=yMax;v+=2) gridVals.push(v); const mColor={A:"#F06455",S:"#2A6FDB",V:"#20A83A"}; return ( кг {gridVals.map(v=>( {v} ))} {/* event vertical dashed lines + letter badges */} {markers.map((m,k)=>( {m.L} ))} p.join(",")).join(" ")} fill="none" stroke="#20A83A" strokeWidth="2.6" strokeLinecap="round" strokeLinejoin="round"/> {pts.map((p,i)=>{ const hollow = lastHollow && i===pts.length-1; const open = openIdx===i; return {open && } ; })} {data.map((d,i)=> {d.x})} ); } const data6=[{x:"Янв",kg:28.8},{x:"Фев",kg:28.4},{x:"Мар",kg:27.6},{x:"Апр",kg:26.2},{x:"Май",kg:26.9},{x:"Июн",kg:26.8}]; const markers6=[{i:3,L:"A"},{i:4,L:"S"},{i:5,L:"V"}]; const data12=[{x:"Июл",kg:31},{x:"Авг",kg:30.6},{x:"Сен",kg:30.2},{x:"Окт",kg:30.3},{x:"Ноя",kg:30},{x:"Дек",kg:29.8},{x:"Янв",kg:29.6},{x:"Фев",kg:29},{x:"Мар",kg:28.2},{x:"Апр",kg:27.4},{x:"Май",kg:28},{x:"Июн",kg:27.6}]; const markers12=[{i:9,L:"A"},{i:10,L:"S"},{i:11,L:"V"}]; function WHeader({ go }){ return ( go("home")} right={} title={null} /> ); } function WTitle(){ return ( Динамика веса Лилу · Корги · 3 года ); } function Segmented({ value, onChange }){ const opts=["1м","3м","6м","1г"]; return ( {opts.map(o=>( onChange(o)} style={{flex:1,height:42,borderRadius:12,fontSize:16,fontWeight:700, background:o===value?"#fff":"transparent",color:o===value?"var(--ink)":"var(--gray)", boxShadow:o===value?"var(--shadow-soft)":"none"}}>{o} ))} ); } function LegendPill({ L, c, children }){ return {L}{children} ; } /* ---------- Overview ---------- */ function WeightScreen({ go }){ const [range,setRange]=useState("6м"); return ( AI-комментарий Вес менялся незначительно. После эпизода аллергии в апреле динамика стабилизировалась. Текущий вес 28 кг в пределах нормы Изменение −1,2 кг за 6 месяцев аллергия смена корма приём у врача Ключевые события {[["A","#F06455","12 апр","аллергия"],["S","#2A6FDB","20 апр","смена корма"],["V","#20A83A","05 мая","контроль у врача"]].map((e,i)=>( go("weight2")} className="tap" style={{display:"flex",alignItems:"center",gap:13,width:"100%",padding:"13px 0",borderTop:"1px solid var(--line)",textAlign:"left"}}> {e[0]} {e[2]} {e[3]} ))} ); } window.WeightScreen = WeightScreen; /* ---------- Detail ---------- */ function WeightDetailScreen({ go }){ const [range,setRange]=useState("1г"); return ( 12 апр 27,4 кг A 12 апреля · аллергия Вес в этот день 27,4 кг Примечание снижение аппетита, зуд Связанные события приём у дерматолога элиминационная диета улучшение через 2 недели AI-комментарий Небольшое снижение веса совпало с эпизодом аллергии. После лечения вес постепенно стабилизировался. go("weight")}> Добавить измерение ); } window.WeightDetailScreen = WeightDetailScreen;