mirror of
https://github.com/samvallad33/vestige.git
synced 2026-05-29 19:35:15 +02:00
10 lines
18 KiB
JavaScript
10 lines
18 KiB
JavaScript
|
|
import"../chunks/Bzak7iHL.js";import{o as Ve}from"../chunks/CNjeV5xa.js";import{p as Ye,e as a,d as n,g as e,f as Ze,t as y,r as t,u as S,a as qe,s as ue,h as I,c as et,n as tt}from"../chunks/CvjSAYrz.js";import{d as Ue,s as u,a as Ae}from"../chunks/FzvEaXMa.js";import{i as L}from"../chunks/ciN1mm2W.js";import{e as Q,i as pe}from"../chunks/DTnG8poT.js";import{c as at,a as v,f as m,b as Oe}from"../chunks/BsvCUYx-.js";import{s as Fe}from"../chunks/DPl3NjBv.js";import{a as Ee}from"../chunks/DNjM5a-l.js";import{s as M}from"../chunks/CNfQDikv.js";import{s as Re}from"../chunks/Bhad70Ss.js";import{p as st}from"../chunks/B_YDQCB6.js";import{N as rt}from"../chunks/DzfRjky4.js";const ze=1440*60*1e3;function xe(p){const o=typeof p=="string"?new Date(p):new Date(p);return o.setHours(0,0,0,0),o}function we(p,o){return Math.floor((xe(p).getTime()-xe(o).getTime())/ze)}function Be(p){const o=p.getFullYear(),f=String(p.getMonth()+1).padStart(2,"0"),N=String(p.getDate()).padStart(2,"0");return`${o}-${f}-${N}`}function He(p,o){if(!o)return"none";const f=new Date(o);if(Number.isNaN(f.getTime()))return"none";const N=we(f,p);return N<0?"overdue":N===0?"today":N<=7?"week":"future"}function Ke(p,o){if(!o)return null;const f=new Date(o);return Number.isNaN(f.getTime())?null:we(f,p)}function nt(p){if(p.length===0)return 0;let o=0;for(const f of p)o+=f.retentionStrength??0;return o/p.length}function it(p){const o=xe(p);return o.setDate(o.getDate()-14),o.setDate(o.getDate()-o.getDay()),o}function ot(p,o){let f=0,N=0,P=0,E=0,j=0,Z=0;const B=xe(p);for(const H of o){if(!H.nextReviewAt)continue;const K=new Date(H.nextReviewAt);if(Number.isNaN(K.getTime()))continue;const _=we(K,p);_<0&&f++,_<=0&&N++,_<=7&&P++,_<=30&&E++,_>=0&&(j+=(K.getTime()-B.getTime())/ze,Z++)}const w=Z>0?j/Z:0;return{overdue:f,dueToday:N,dueThisWeek:P,dueThisMonth:E,avgDays:w}}var dt=Oe('<line y1="0" stroke="rgba(129,140,248,0.5)" stroke-width="1"></line>'),lt=Oe('<path fill="none" stroke="var(--color-recall)" stroke-width="1.5" stroke-linejoin="round"></path>'),vt=Oe('<circle r="1.5" fill="var(--color-recall)"></circle>'),ct=m('<div class="text-[10px] text-muted font-mono uppercase tracking-wider text-center"> </div>'),ut=m('<span class="text-[9px] text-muted"> </span>'),pt=m('<span class="text-[9px] text-muted"> </span>'),xt=m('<div class="flex-1 flex flex-col items-center justify-center gap-0.5"><span class="text-base sm:text-lg font-bold leading-none"> </span> <!></div>'),gt=m('<button type="button"><div class="flex flex-col h-full"><div class="flex items-start justify-between"><span> </span> <!></div> <!></div></button>'),mt=m("<span> </span>"),ft=m('<span class="px-1 py-0.5 bg-white/[0.04] rounded text-muted"> </span>'),_t=m('<div class="flex items-start gap-3 p-2.5 rounded-lg bg-white/[0.02] hover:bg-white/[0.04] transition"><span class="w-2 h-2 mt-1.5 rounded-full flex-shrink-0"></span> <div class="flex-1 min-w-0"><p class="text-sm text-text leading-snug line-clamp-2"> </p> <div class="flex items-center gap-2 mt-1 text-[10px] text-muted"><span> </span> <!> <!></div></div> <div class="flex flex-col items-end gap-1 flex-shrink-0"><div class="w-12 h-1 bg-deep rounded-full overflow-hidden"><div class="h-full rounded-full"></div></div> <span class="text-[10px] text-muted"> </span></div></div>'),bt=m('<p class="text-xs text-muted text-center pt-2"> </p>'),ht=m('<div class="p-5 glass rounded-xl space-y-3 animate-panel-in svelte-rs1z7a"><div class="flex items-center justify-between"><div><h3 class="text-sm text-bright font-semibold"> </h3> <p class="text-xs text-dim mt-0.5"> </p></div> <button type="button" class="text-xs text-muted hover:text-dim px-2 py-1 rounded-lg hover:bg-white/[0.03]" aria-label="Close">close ×</button></div> <div class="space-y-2 max-h-96 overflow-y-auto pr-1"><!> <!></div></div>'),yt=m('<div class="space-y-4"><div class="p-4 glass-subtle rounded-xl"><div class="flex items-center justify-between mb-2"><span class="text-xs text-dim font-medium">Avg retention of memories due — last 2 weeks → next 4</span> <div class="flex items-center gap-3 text-[10px] te
|
|||
|
|
${e(s).inWindow?"opacity-100":"opacity-35"}
|
|||
|
|
${e(s).memories.length>0?"hover:scale-[1.03] cursor-pointer":"cursor-default"}
|
|||
|
|
${e(s).isToday?"ring-2 ring-synapse/60 shadow-[0_0_16px_rgba(99,102,241,0.3)]":""}
|
|||
|
|
${e(B)===e(s).key?"ring-2 ring-dream/60 shadow-[0_0_16px_rgba(168,85,247,0.3)]":""}`),Re(c,`background: ${e(i).bg??""}; border: 1px solid ${e(i).border??""};`),M(c,"title",b),Fe(A,1,`text-[10px] font-mono ${e(s).isToday?"text-synapse-glow font-bold":"text-dim"}`),u(he,l)},[()=>`${fe(e(s).date)} — ${e(s).memories.length} due`,()=>e(s).date.getDate()]),Ae("click",c,()=>H(e(s).key)),v(r,c)}),t(W);var q=n(W,4);{var te=r=>{var s=ht(),i=a(s),c=a(i),k=a(c),h=a(k,!0);t(k);var A=n(k,2),he=a(A);t(A),t(c);var de=n(c,2);t(i);var ae=n(i,2),le=a(ae);Q(le,17,()=>e(w).memories.slice(0,100),b=>b.id,(b,l)=>{var C=_t(),X=a(C),G=n(X,2),U=a(G),z=a(U,!0);t(U);var J=n(U,2),V=a(J),ye=a(V,!0);t(V);var Se=n(V,2);{var Ce=R=>{var F=mt(),O=a(F);t(F),y(()=>u(O,`· ${e(l).reviewCount??""} review${e(l).reviewCount===1?"":"s"}`)),v(R,F)};L(Se,R=>{e(l).reviewCount!==void 0&&R(Ce)})}var je=n(Se,2);Q(je,17,()=>e(l).tags.slice(0,2),pe,(R,F)=>{var O=ft(),De=a(O,!0);t(O),y(()=>u(De,e(F))),v(R,O)}),t(J),t(G);var $=n(G,2),T=a($),re=a(T);t(T);var ce=n(T,2),Me=a(ce);t(ce),t($),t(C),y(R=>{Re(X,`background: ${(rt[e(l).nodeType]||"#8B95A5")??""}`),u(z,e(l).content),u(ye,e(l).nodeType),Re(re,`width: ${e(l).retentionStrength*100}%; background: ${e(l).retentionStrength>.7?"var(--color-recall)":e(l).retentionStrength>.4?"var(--color-warning)":"var(--color-decay)"}`),u(Me,`${R??""}%`)},[()=>(e(l).retentionStrength*100).toFixed(0)]),v(b,C)});var ve=n(le,2);{var se=b=>{var l=bt(),C=a(l);t(l),y(()=>u(C,`+${e(w).memories.length-100} more`)),v(b,l)};L(ve,b=>{e(w).memories.length>100&&b(se)})}t(ae),t(s),y((b,l)=>{u(h,b),u(he,`${e(w).memories.length??""} memor${e(w).memories.length===1?"y":"ies"} due
|
|||
|
|
· avg retention ${l??""}%`)},[()=>fe(e(w).date),()=>(e(w).avgRetention*100).toFixed(0)]),Ae("click",de,()=>I(B,null)),v(r,s)};L(q,r=>{e(w)&&e(w).memories.length>0&&r(te)})}t(ne),v(p,ne),qe()}Ue(["click"]);var kt=m('<button type="button"> </button>'),$t=m('<div class="px-3 py-2 glass-subtle rounded-lg text-[11px] text-dim"> </div>'),St=m('<div class="aspect-square glass-subtle rounded-lg animate-pulse"></div>'),Dt=m('<div class="h-20 glass-subtle rounded-xl animate-pulse"></div>'),Tt=m('<div class="grid lg:grid-cols-[1fr_280px] gap-6"><div class="space-y-3"><div class="h-14 glass-subtle rounded-xl animate-pulse"></div> <div class="grid grid-cols-7 gap-2"></div></div> <div class="space-y-3"></div></div>'),Rt=m('<div class="p-10 glass rounded-xl text-center space-y-3"><p class="text-sm text-decay">API unavailable.</p> <p class="text-xs text-dim">Could not fetch memories from /api/memories.</p></div>'),At=m(`<div class="p-10 glass rounded-xl text-center space-y-4"><div class="text-4xl text-dream/40">◷</div> <p class="text-sm text-bright font-medium">FSRS review schedule not yet populated.</p> <p class="text-xs text-dim max-w-md mx-auto"> <code class="text-muted">nextReviewAt</code> timestamp yet. Run consolidation to compute
|
|||
|
|
next-review dates via FSRS-6.</p> <button type="button" class="px-4 py-2 bg-warning/20 border border-warning/40 text-warning text-sm rounded-xl hover:bg-warning/30 transition">Run Consolidation</button></div>`),Ft=m('<div class="flex items-baseline justify-between"><span class="text-xs text-dim">Overdue</span> <span class="text-2xl font-bold text-decay"> </span></div>'),Nt=m('<p class="text-xs text-muted italic">Nothing in this window.</p>'),Ct=m('<div class="p-2 rounded-lg bg-white/[0.02] hover:bg-white/[0.04] transition"><p class="text-xs text-text leading-snug line-clamp-2"> </p> <div class="flex items-center gap-2 mt-1 text-[10px]"><span> </span> <span class="text-muted"> </span></div></div>'),jt=m('<p class="text-[10px] text-muted text-center pt-1"> </p>'),Mt=m('<div class="space-y-2 max-h-96 overflow-y-auto pr-1"><!> <!></div>'),Lt=m('<div class="grid lg:grid-cols-[1fr_280px] gap-6"><div class="min-w-0"><!></div> <aside class="space-y-4"><div class="p-5 glass rounded-xl space-y-4"><h2 class="text-xs text-dim font-semibold uppercase tracking-wider">Queue</h2> <div class="space-y-3"><!> <div class="flex items-baseline justify-between"><span class="text-xs text-dim">Due today</span> <span class="text-2xl font-bold text-warning"> </span></div> <div class="flex items-baseline justify-between"><span class="text-xs text-dim">This week</span> <span class="text-2xl font-bold text-synapse-glow"> </span></div> <div class="flex items-baseline justify-between"><span class="text-xs text-dim">This month</span> <span class="text-2xl font-bold text-dream-glow"> </span></div></div> <div class="pt-3 border-t border-synapse/10"><div class="flex items-baseline justify-between"><span class="text-xs text-dim">Avg days until review</span> <span class="text-lg font-semibold text-text"> </span></div> <p class="text-[10px] text-muted mt-1"> </p></div></div> <div class="p-5 glass-subtle rounded-xl space-y-3"><div class="flex items-center justify-between"><h2 class="text-xs text-dim font-semibold uppercase tracking-wider"> </h2> <span class="text-xs text-muted"> </span></div> <!></div></aside></div>'),Wt=m('<div class="p-6 max-w-7xl mx-auto space-y-6"><div class="flex items-center justify-between flex-wrap gap-3"><div><h1 class="text-xl text-bright font-semibold">Review Schedule</h1> <p class="text-xs text-dim mt-1">FSRS-6 next-review dates across your memory corpus</p></div> <div class="flex gap-1 p-1 glass-subtle rounded-xl"></div></div> <!> <!></div>');function Gt(p,o){Ye(o,!0);let f=ue(et([])),N=ue(0),P=ue(!0),E=ue(!1),j=ue("week");const Z=2e3;async function B(){const d=await Ee.memories.list({limit:String(Z)});I(f,d.memories,!0),I(N,d.total,!0)}Ve(async()=>{try{await B()}catch{I(E,!0),I(f,[],!0)}finally{I(P,!1)}});let w=S(()=>e(f).filter(d=>!!d.nextReviewAt)),H=S(()=>new Date),K=S(()=>e(N)>e(f).length),_=S(()=>(()=>{const d=e(j);return d==="all"?e(w):e(w).filter(x=>{const g=He(e(H),x.nextReviewAt);if(g==="none")return!1;if(d==="today")return g==="overdue"||g==="today";if(d==="week")return g!=="future";const D=Ke(e(H),x.nextReviewAt);return D!==null&&D<=30})})()),Y=S(()=>ot(e(H),e(w)));async function ke(){I(P,!0);try{await Ee.consolidate(),await B(),I(E,!1)}catch{I(E,!0)}finally{I(P,!1)}}const ge=[{key:"today",label:"Due today"},{key:"week",label:"This week"},{key:"month",label:"This month"},{key:"all",label:"All upcoming"}];var ee=Wt(),me=a(ee),fe=n(a(me),2);Q(fe,21,()=>ge,pe,(d,x)=>{var g=kt(),D=a(g,!0);t(g),y(()=>{Fe(g,1,`px-3 py-1.5 text-xs rounded-lg transition-all
|
|||
|
|
${e(j)===e(x).key?"bg-synapse/20 text-synapse-glow border border-synapse/30":"text-dim hover:text-text hover:bg-white/[0.03] border border-transparent"}`),u(D,e(x).label)}),Ae("click",g,()=>I(j,e(x).key,!0)),v(d,g)}),t(fe),t(me);var ne=n(me,2);{var _e=d=>{var x=$t(),g=a(x);t(x),y((D,W)=>u(g,`Showing the first ${D??""} of ${W??""} memories.
|
|||
|
|
Schedule reflects this slice only.`),[()=>e(f).length.toLocaleString(),()=>e(N).toLocaleString()]),v(d,x)};L(ne,d=>{!e(P)&&!e(E)&&e(K)&&d(_e)})}var be=n(ne,2);{var ie=d=>{var x=Tt(),g=a(x),D=n(a(g),2);Q(D,20,()=>Array(42),pe,(q,te)=>{var r=St();v(q,r)}),t(D),t(g);var W=n(g,2);Q(W,20,()=>Array(5),pe,(q,te)=>{var r=Dt();v(q,r)}),t(W),t(x),v(d,x)},oe=d=>{var x=Rt();v(d,x)},$e=d=>{var x=At(),g=n(a(x),4),D=a(g);tt(2),t(g);var W=n(g,2);t(x),y(()=>u(D,`None of your ${e(f).length??""} memor${e(f).length===1?"y has":"ies have"} a `)),Ae("click",W,ke),v(d,x)},Ne=d=>{var x=Lt(),g=a(x),D=a(g);wt(D,{get memories(){return e(w)}}),t(g);var W=n(g,2),q=a(W),te=n(a(q),2),r=a(te);{var s=$=>{var T=Ft(),re=n(a(T),2),ce=a(re,!0);t(re),t(T),y(()=>u(ce,e(Y).overdue)),v($,T)};L(r,$=>{e(Y).overdue>0&&$(s)})}var i=n(r,2),c=n(a(i),2),k=a(c,!0);t(c),t(i);var h=n(i,2),A=n(a(h),2),he=a(A,!0);t(A),t(h);var de=n(h,2),ae=n(a(de),2),le=a(ae,!0);t(ae),t(de),t(te);var ve=n(te,2),se=a(ve),b=n(a(se),2),l=a(b,!0);t(b),t(se);var C=n(se,2),X=a(C);t(C),t(ve),t(q);var G=n(q,2),U=a(G),z=a(U),J=a(z,!0);t(z);var V=n(z,2),ye=a(V,!0);t(V),t(U);var Se=n(U,2);{var Ce=$=>{var T=Nt();v($,T)},je=$=>{var T=Mt(),re=a(T);Q(re,17,()=>e(_).slice().sort((R,F)=>(R.nextReviewAt??"").localeCompare(F.nextReviewAt??"")).slice(0,50),R=>R.id,(R,F)=>{const O=S(()=>He(e(H),e(F).nextReviewAt)),De=S(()=>Ke(e(H),e(F).nextReviewAt)??0);var Le=Ct(),We=a(Le),Qe=a(We,!0);t(We);var Ie=n(We,2),Te=a(Ie),Xe=a(Te,!0);t(Te);var Pe=n(Te,2),Ge=a(Pe);t(Pe),t(Ie),t(Le),y(Je=>{u(Qe,e(F).content),Fe(Te,1,e(O)==="overdue"?"text-decay":e(O)==="today"?"text-warning":e(O)==="week"?"text-synapse-glow":"text-dream-glow"),u(Xe,e(O)==="overdue"?`${-e(De)}d overdue`:e(O)==="today"?"today":`in ${e(De)}d`),u(Ge,`· ${Je??""}%`)},[()=>(e(F).retentionStrength*100).toFixed(0)]),v(R,Le)});var ce=n(re,2);{var Me=R=>{var F=jt(),O=a(F);t(F),y(()=>u(O,`+${e(_).length-50} more`)),v(R,F)};L(ce,R=>{e(_).length>50&&R(Me)})}t(T),v($,T)};L(Se,$=>{e(_).length===0?$(Ce):$(je,!1)})}t(G),t(W),t(x),y(($,T)=>{u(k,e(Y).dueToday),u(he,e(Y).dueThisWeek),u(le,e(Y).dueThisMonth),u(l,$),u(X,`Across ${e(w).length??""} scheduled memor${e(w).length===1?"y":"ies"}`),u(J,T),u(ye,e(_).length)},[()=>e(Y).avgDays.toFixed(1),()=>{var $;return($=ge.find(T=>T.key===e(j)))==null?void 0:$.label}]),v(d,x)};L(be,d=>{e(P)?d(ie):e(E)?d(oe,1):e(w).length===0?d($e,2):d(Ne,!1)})}t(ee),v(p,ee),qe()}Ue(["click"]);export{Gt as component};
|