(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{2456:(e,t,a)=>{Promise.resolve().then(a.bind(a,6919))},6919:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>u});var l=a(5155),n=a(2115),r=a(8226),i=a.n(r);let o=/^\d{6}$/;function s(e){let t=`20${e.slice(0,2)}`,a=e.slice(2,4),l=e.slice(4,6);return`${t}-${a}-${l}`}function c(e){let t=new Date,a=[];for(let l=e-1;l>=0;l-=1){let e=new Date(t);e.setDate(t.getDate()-l),a.push(function(e){let t=String(e.getFullYear()).slice(-2),a=String(e.getMonth()+1).padStart(2,"0"),l=String(e.getDate()).padStart(2,"0");return`${t}${a}${l}`}(e))}return a}function d(){let e={};for(let t=0;t0&&(e[a]=n)}return e}function u(){let[e,t]=(0,n.useState)(""),[a,r]=(0,n.useState)({}),[u,m]=(0,n.useState)(null),[h,g]=(0,n.useState)(!0),[p,x]=(0,n.useState)(5),[f,M]=(0,n.useState)(900),_=(0,n.useRef)(null),w=(0,n.useRef)(null),b=(0,n.useRef)(null),y=(0,n.useMemo)(()=>Object.entries(a).filter(([e])=>o.test(e)).sort(([e],[t])=>e.localeCompare(t)),[a]),v=(0,n.useMemo)(()=>c(p),[p]),j=(0,n.useMemo)(()=>{let e=new Set(v);return y.filter(([t])=>e.has(t))},[y,v]),N=(0,n.useMemo)(()=>{let e=new Map;return y.forEach(([t],a)=>{let l=Math.max(0,a-29),n=y.slice(l,a+1).map(([,e])=>e),r=n.reduce((e,t)=>e+t,0);e.set(t,r/n.length)}),e},[y]),S=(0,n.useMemo)(()=>{let e=j.flatMap(([e,t])=>{let a=N.get(e);return void 0===a?[t]:[t,a]}),t=e.length>0?Math.min(...e):0,a=e.length>0?Math.max(...e):1,l=Math.floor(100*t)/100-.1,n=Math.ceil(100*a)/100+.1,r=1,i=l,o=n,s=1/0;for(let e of[1,.5,.2,.1]){let t=Math.floor(l/e)*e,a=Math.ceil(n/e)*e;t=Math.round(100*t)/100;let c=Math.round(((a=Math.round(100*a)/100)-t)/e)+1;c>=5&&cMath.round((t-e)/.1)+1;for(;5>a();)e=Math.round((e-.1)*100)/100,t=Math.round((t+.1)*100)/100;r=.1,i=e,o=t,s=a()}let c=Math.max(o-i,.1);return{minWithMargin:i,maxWithMargin:o,safeRange:c,step:r}},[j,N]),k=(0,n.useMemo)(()=>Number.parseFloat((12/(Math.max(f,1)/900)).toFixed(2)),[f]),L=(0,n.useMemo)(()=>0===j.length?3:Math.max(...[S.minWithMargin.toFixed(1),S.maxWithMargin.toFixed(1)].map(e=>e.length)),[j,S]),Y=(0,n.useMemo)(()=>Math.pow(Math.min(1,Math.max(0,(900-Math.max(1,Math.min(f,900)))/540)),1.35),[f]),$=(0,n.useMemo)(()=>{let e=64+Math.max(0,L*k*.62+.5*k-64)*Y*.7;return{top:18,right:20,bottom:Math.max(36,52-14*Y),left:e}},[k,L,Y]),F=(0,n.useMemo)(()=>Math.min(26+14*Y,Math.max(19,$.bottom)),[$.bottom,Y]),D=(0,n.useMemo)(()=>900-$.left-$.right,[$.left,$.right]),C=(0,n.useMemo)(()=>Math.max(v.length-1,1),[v.length]),E=(0,n.useMemo)(()=>D/900*Math.max(f,1)/C,[f,D,C]),W=(0,n.useCallback)(e=>{let t=new Set,a="u">typeof document?(()=>{let e=document.createElement("canvas").getContext("2d");if(!e)return null;let t=document.body?window.getComputedStyle(document.body).fontFamily:"sans-serif";return e.font=`12px ${t}`,e})():null,l=e=>a?a.measureText(e).width+6:12*e.length*.62+6,n=v.map(a=>{let l,n,r,i=(l=a.slice(0,2),n=a.slice(2,4),r=a.slice(4,6),"YYYY"===e?`20${l}`:"YYMM"===e?`${l}${n}`:`${n}${r}`);if("MMDD"!==e){if(t.has(i))return{show:!1,label:i};t.add(i)}return{show:!0,label:i}}),r=n.map((e,t)=>e.show?t:-1).filter(e=>e>=0),i=!1;for(let e=1;e{let e=W("MMDD");if(!e.hasOverlap)return{mode:"MMDD",meta:e.meta};let t=W("YYMM");return t.hasOverlap?{mode:"YYYY",meta:W("YYYY").meta}:{mode:"YYMM",meta:t.meta}},[W]),T=R.mode,I=R.meta,B=(0,n.useMemo)(()=>"YYYY"===T?1:"YYMM"===T?4:8,[T]),O=(0,n.useCallback)(e=>{x(t=>Math.min(730,Math.max(5,t+e)))},[]),z=(0,n.useCallback)(e=>{e.preventDefault(),O(e.deltaY<0?-5:5)},[O]);(0,n.useEffect)(()=>{let e=window,t=()=>{let e=d();if(0===Object.keys(e).length){let e,t,a,l,n=(e=c(60),t={},a=[0,.2,.4,.6,.8,1],l=[60,59.2,56.9,55.6,52.1,50],e.forEach((n,r)=>{let i=e.length<=1?0:r/(e.length-1),o=a.length-2;for(let e=0;e{window.localStorage.setItem(e,t.toFixed(2))}),r(n)}else r(e);g(!1)};if(e.requestIdleCallback){let a=e.requestIdleCallback(t);return()=>{e.cancelIdleCallback&&e.cancelIdleCallback(a)}}let a=window.setTimeout(t,0);return()=>window.clearTimeout(a)},[]),(0,n.useEffect)(()=>{let e=w.current;if(e)return e.addEventListener("wheel",z,{passive:!1}),()=>{e.removeEventListener("wheel",z)}},[z]),(0,n.useEffect)(()=>{let e=b.current;if(!e)return;let t=()=>{let t=e.clientWidth;t>0&&M(t)};if(t(),"u">typeof ResizeObserver){let a=new ResizeObserver(()=>{t()});return a.observe(e),()=>a.disconnect()}return window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[]);let A=(0,n.useMemo)(()=>{if(0===j.length||0===v.length)return[];let e=320-$.top-$.bottom;return j.map(([t,a])=>{let l=v.indexOf(t),n=$.left+l/C*D,r=(a-S.minWithMargin)/S.safeRange;return{key:t,x:n,y:$.top+(1-r)*e,value:a}})},[j,v,D,C,$,S]),H=(0,n.useMemo)(()=>{let e=320-$.top-$.bottom,t=S.minWithMargin,a=S.maxWithMargin,l=a-t,n=S.step,r=[],i=Math.max(5,Math.round((a-t)/n)+1);for(let o=0;ov.map((e,t)=>({key:e,x:$.left+t/C*D})),[v,C,D,$]),q=(0,n.useMemo)(()=>{if(0===A.length)return[];let e=320-$.top-$.bottom;return A.map(t=>{let a=((N.get(t.key)??t.value)-S.minWithMargin)/S.safeRange,l=$.top+(1-a)*e;return{x:t.x,y:l}})},[A,N,$,S]),G=(0,n.useMemo)(()=>{if(0===y.length)return null;let e=Math.max(0,y.length-30),t=y.slice(e).map(([,e])=>e);return t.reduce((e,t)=>e+t,0)/t.length},[y]),P=q.map(({x:e,y:t})=>`${e},${t}`).join(" "),J=A.map(({x:e,y:t})=>`${e},${t}`).join(" ");return(0,l.jsx)("div",{className:i().page,children:(0,l.jsxs)("main",{className:i().main,children:[(0,l.jsxs)("header",{className:i().header,children:[(0,l.jsxs)("div",{className:i().symbolBadge,"aria-label":"for me Log symbol",style:{display:"inline-flex",whiteSpace:"nowrap"},children:[(0,l.jsx)("span",{className:i().symbolFor,children:"for"}),(0,l.jsx)("span",{className:i().symbolMe,children:"me"}),(0,l.jsx)("span",{className:i().symbolLog,children:"Log"})]}),(0,l.jsx)("h1",{className:i().title,children:"Weight.ForMeLog"})]}),(0,l.jsx)("p",{className:i().muted,children:"Free personal weight tracker — log your daily weight, visualize changes on a responsive chart, and monitor a 30-day moving average trend. All data is stored locally in your browser; no account or sign-up required."}),(0,l.jsxs)("section",{className:i().card,children:[(0,l.jsx)("h2",{children:"Today's Weight"}),(0,l.jsx)("p",{children:"Enter today's value and save."}),(0,l.jsxs)("div",{className:i().inputRow,children:[(0,l.jsx)("input",{value:e,onChange:e=>t(e.target.value),inputMode:"decimal",placeholder:"e.g. 72.35","aria-label":"Numeric weight value"}),(0,l.jsx)("button",{type:"button",onClick:()=>{let t,a,l,n,i=e.trim();if(!/^\d+(\.\d{1,2})?$/.test(i))return void window.alert("Enter a valid positive number with up to 2 decimals.");let o=Number.parseFloat(i);if(!Number.isFinite(o)||o<=0)return void window.alert("Weight must be a positive value.");let s=(a=String((t=new Date).getFullYear()).slice(-2),l=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0"),`${a}${l}${n}`),c=o.toFixed(2);try{window.localStorage.setItem(s,c),r(e=>({...e,[s]:Number.parseFloat(c)}))}catch{window.alert("Failed to save data. Check browser storage availability.")}},children:"Save Today"})]})]}),(0,l.jsxs)("section",{className:i().card,children:[(0,l.jsx)("div",{className:i().cardHeader,children:(0,l.jsx)("h2",{children:"Daily Trend"})}),h?(0,l.jsx)("p",{className:i().muted,children:"Loading data…"}):null,(0,l.jsx)("div",{ref:w,className:i().chartWrap,onTouchStart:e=>{if(2===e.touches.length){let[t,a]=[e.touches[0],e.touches[1]];_.current=Math.hypot(t.clientX-a.clientX,t.clientY-a.clientY)}},onTouchMove:e=>{if(2!==e.touches.length||null===_.current)return;let[t,a]=[e.touches[0],e.touches[1]],l=Math.hypot(t.clientX-a.clientX,t.clientY-a.clientY),n=l-_.current;Math.abs(n)>=6&&(O(n>0?-5:5),_.current=l)},onTouchEnd:()=>{_.current=null},children:(0,l.jsxs)("svg",{ref:b,viewBox:"0 0 900 320",role:"img","aria-label":"Weight trend line chart",onClick:()=>m(null),children:[(0,l.jsx)("line",{className:i().axisLine,x1:$.left,y1:320-$.bottom,x2:900-$.right,y2:320-$.bottom}),(0,l.jsx)("line",{className:i().axisLine,x1:$.left,y1:$.top,x2:$.left,y2:320-$.bottom}),H.map(e=>(0,l.jsxs)("g",{children:[(0,l.jsx)("line",{className:i().gridLine,x1:$.left,y1:e.y,x2:900-$.right,y2:e.y}),(0,l.jsx)("text",{className:i().axisText,x:$.left-8,y:e.y,textAnchor:"end",dominantBaseline:"middle",style:{fontSize:`${k}px`},children:e.value})]},`y-${e.y}`)),X.map((e,t)=>{let a=t===X.length-1;return(0,l.jsxs)("g",{children:[(0,l.jsx)("line",{className:i().tickLine,x1:e.x,y1:320-$.bottom,x2:e.x,y2:320-$.bottom+6}),I[t]?.show?(0,l.jsx)("text",{className:i().axisText,x:a?e.x-4:e.x,y:320-$.bottom+F,textAnchor:a?"end":"middle",style:{fontSize:`${k}px`},children:I[t].label}):null]},`x-${e.key}`)}),q.length>0?(0,l.jsx)("polyline",{className:i().averageLine,points:P}):null,A.length>0?(0,l.jsx)("polyline",{className:i().trendLine,points:J}):null,A.map(e=>(0,l.jsx)("g",{children:(0,l.jsx)("circle",{className:e.key===u?i().pointSelected:i().point,cx:e.x,cy:e.y,r:B,onClick:t=>{t.stopPropagation(),m(e.key)}})},e.key))]})}),0===y.length?(0,l.jsx)("p",{className:i().muted,children:"No saved data yet. Save a value to draw the chart."}):null,q.length>0?(0,l.jsxs)("p",{className:i().muted,children:["Dashed line: 30-point moving average (latest ",G?.toFixed(2),")."]}):null,(0,l.jsxs)("div",{className:i().selectedInfo,children:[(0,l.jsx)("span",{children:u?`Selected: ${s(u)} (${a[u].toFixed(2)})`:"Selected: none"}),(0,l.jsxs)("div",{className:i().actionRow,children:[u?(0,l.jsx)("button",{type:"button",onClick:()=>{u?window.confirm(`Delete selected record for ${s(u)}?`)&&(window.localStorage.removeItem(u),r(e=>{let t={...e};return delete t[u],t}),m(null)):window.alert("Select a chart point first.")},children:"Delete Selected Day"}):null,(0,l.jsx)("button",{type:"button",onClick:()=>{window.confirm("Delete all saved weight records?")&&(Object.keys(d()).forEach(e=>window.localStorage.removeItem(e)),r({}),m(null))},className:i().criticalButton,children:"Delete All Data"})]})]})]})]})})}},8226:e=>{e.exports={footer:"page_footer__F3MD0",footerRight:"page_footerRight__A7LMy",footerLabel:"page_footerLabel__tsLrw",footerLink:"page_footerLink__ntXAe",page:"page_page__556_G",main:"page_main__nw1Wk",header:"page_header__oRW75",symbolBadge:"page_symbolBadge__Z1r3H",symbolFor:"page_symbolFor__dS1wM",symbolMe:"page_symbolMe__R_nPi",symbolLog:"page_symbolLog__xBmBr",title:"page_title__po7na",card:"page_card__Cf__u",muted:"page_muted__78oLp",cardHeader:"page_cardHeader__GSUA9",inputRow:"page_inputRow__SjOM0",actionRow:"page_actionRow__Gkjl6",criticalButton:"page_criticalButton__7cj9b",chartWrap:"page_chartWrap__Y47ov",axisLine:"page_axisLine__wm0Qe",gridLine:"page_gridLine__Tw9eo",tickLine:"page_tickLine__dTFiJ",axisText:"page_axisText__JLjbl",averageLine:"page_averageLine__5uj6g",trendLine:"page_trendLine__H8SsI",point:"page_point__g2HZB",pointSelected:"page_pointSelected__CmH2o",selectedInfo:"page_selectedInfo__TEgrB"}}},e=>{e.O(0,[210,441,794,358],()=>e(e.s=2456)),_N_E=e.O()}]);