@mashkovd/pelican-vue 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
(function(B,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(B=typeof globalThis<"u"?globalThis:B||self,e(B.PelicanLibertexSocial={},B.Vue))})(this,function(B,e){"use strict";function me(t,n){let a=null;const l=(...d)=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,t(...d)},n)},s=()=>{a&&(clearTimeout(a),a=null)};return e.onScopeDispose(s),{wrapped:l,cancel:s}}const ue=20,fe=350,pe=2e3,ge=2e4,he=30,H=["return-desc","return-asc","copiers-desc","copiers-asc","aum-desc","aum-asc","dd-asc","dd-desc","fee-asc","fee-desc","age-desc","age-asc","balance-desc","balance-asc","winrate-desc","winrate-asc","trades-desc","trades-asc","monthly-desc","monthly-asc"],W={"return-desc":"Return ↓","return-asc":"Return ↑","copiers-desc":"Copiers ↓","copiers-asc":"Copiers ↑","aum-desc":"Copiers AUM ↓","aum-asc":"Copiers AUM ↑","dd-asc":"Drawdown ↑","dd-desc":"Drawdown ↓","fee-asc":"Fee ↑","fee-desc":"Fee ↓","age-desc":"Age ↓","age-asc":"Age ↑","balance-desc":"Balance ↓","balance-asc":"Balance ↑","winrate-desc":"Win Rate ↓","winrate-asc":"Win Rate ↑","trades-desc":"Trades ↓","trades-asc":"Trades ↑","monthly-desc":"Monthly Profit ↓","monthly-asc":"Monthly Profit ↑"},q={return:["return-desc","return-asc"],copiers:["copiers-desc","copiers-asc"],aum:["aum-desc","aum-asc"],dd:["dd-asc","dd-desc"],fee:["fee-asc","fee-desc"],age:["age-desc","age-asc"],balance:["balance-desc","balance-asc"]},ye={class:"pelican-toolbar"},ke={class:"counts"},Me=["value"],Ne={class:"sort"},Ee=["value"],be=["value"],xe=e.defineComponent({__name:"Toolbar",props:{search:{},sortKey:{},total:{},filteredTotal:{},page:{},totalPages:{}},emits:["update:search","update:sortKey","refresh","toggle-filters"],setup(t,{emit:n}){const a=t,l=n,s=e.ref(a.search);e.watch(()=>a.search,c=>{c!==s.value&&(s.value=c)});const{wrapped:d}=me(c=>l("update:search",c),fe);function o(c){const u=c.target.value;s.value=u,d(u)}function r(c){l("update:sortKey",c.target.value)}return(c,u)=>(e.openBlock(),e.createElementBlock("div",ye,[e.createElementVNode("button",{class:"btn-flat filters-toggle",type:"button",onClick:u[0]||(u[0]=p=>l("toggle-filters"))}," Filters "),e.createElementVNode("div",ke,[u[2]||(u[2]=e.createTextVNode(" Showing ",-1)),e.createElementVNode("b",null,e.toDisplayString(t.filteredTotal.toLocaleString("en-US")),1),u[3]||(u[3]=e.createTextVNode(" of ",-1)),e.createElementVNode("b",null,e.toDisplayString(t.total.toLocaleString("en-US")),1),u[4]||(u[4]=e.createTextVNode(" · page ",-1)),e.createElementVNode("b",null,e.toDisplayString(t.page),1),e.createTextVNode(" / "+e.toDisplayString(t.totalPages),1)]),e.createElementVNode("input",{class:"search",type:"search",placeholder:"Search by signal name…",autocomplete:"off",value:s.value,onInput:o},null,40,Me),e.createElementVNode("div",Ne,[u[5]||(u[5]=e.createElementVNode("label",null,"Sort:",-1)),e.createElementVNode("select",{value:t.sortKey,onChange:r},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(H),p=>(e.openBlock(),e.createElementBlock("option",{key:p,value:p},e.toDisplayString(e.unref(W)[p]),9,be))),128))],40,Ee)]),e.createElementVNode("button",{class:"btn-flat",type:"button",title:"reload",onClick:u[1]||(u[1]=p=>l("refresh"))}," ↻ reload ")]))}}),w=(t,n)=>{const a=t.__vccOpts||t;for(const[l,s]of n)a[l]=s;return a},Ve=w(xe,[["__scopeId","data-v-9803823c"]]),we={class:"pelican-chips"},$e=["onClick"],Se=w(e.defineComponent({__name:"RiskChips",props:{modelValue:{}},emits:["update:modelValue"],setup(t,{emit:n}){const a=t,l=n,s=["Low","Medium","High"];function d(o){const r=new Set(a.modelValue);r.has(o)?r.delete(o):r.add(o),l("update:modelValue",r)}return(o,r)=>(e.openBlock(),e.createElementBlock("div",we,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(s,c=>e.createElementVNode("button",{key:c,type:"button",class:e.normalizeClass(["chip",["risk-"+c.toLowerCase(),{on:t.modelValue.has(c)}]]),onClick:u=>d(c)},e.toDisplayString(c),11,$e)),64))]))}}),[["__scopeId","data-v-742a6c3b"]]),Be={class:"pelican-fgroup"},_e={class:"title-row"},Ce={class:"title"},De={class:"val"},Ie=["min","max","step","value"],I=w(e.defineComponent({__name:"RangeSingle",props:{label:{},modelValue:{},min:{},max:{},step:{default:1},format:{},anyAt:{},inverted:{type:Boolean}},emits:["update:modelValue"],setup(t,{emit:n}){const a=t,l=n,s=e.computed(()=>a.anyAt??a.min),d=e.computed(()=>!!a.inverted),o=e.computed(()=>a.modelValue==null?d.value?a.max:s.value:a.modelValue),r=e.computed(()=>a.modelValue==null?"any":a.format?a.format(a.modelValue):String(a.modelValue));function c(u){const p=parseInt(u.target.value,10);isNaN(p)||(d.value&&p>=a.max||!d.value&&p<=s.value?l("update:modelValue",null):l("update:modelValue",p))}return(u,p)=>(e.openBlock(),e.createElementBlock("div",Be,[e.createElementVNode("div",_e,[e.createElementVNode("label",Ce,e.toDisplayString(t.label),1),e.createElementVNode("span",De,e.toDisplayString(r.value),1)]),e.createElementVNode("input",{type:"range",class:"range",min:t.min,max:t.max,step:t.step,value:o.value,onInput:c,onChange:c},null,40,Ie)]))}}),[["__scopeId","data-v-10c5fe1c"]]),Te={class:"pelican-fgroup"},Re={class:"title-row"},Pe={class:"title"},Ae={class:"val"},Fe={class:"dual-track"},Le=["min","max","value"],Ue=["min","max","value"],Oe={key:0,class:"scale"},X=w(e.defineComponent({__name:"RangeDual",props:{label:{},modelValueMin:{},modelValueMax:{},rawMin:{},rawMax:{},formatRaw:{type:Function},rawToDomain:{type:Function},scaleHints:{},minLabel:{},maxLabel:{}},emits:["update:modelValueMin","update:modelValueMax"],setup(t,{emit:n}){const a=t,l=n,s=e.computed(()=>a.rawMin??0),d=e.computed(()=>a.rawMax??100),o=e.computed(()=>a.modelValueMin??s.value),r=e.computed(()=>a.modelValueMax??d.value),c=e.computed(()=>o.value<=s.value?a.minLabel??"any":a.formatRaw(a.rawToDomain(o.value))),u=e.computed(()=>r.value>=d.value?a.maxLabel??"any":a.formatRaw(a.rawToDomain(r.value))),p=e.computed(()=>o.value<=s.value&&r.value>=d.value?"any":`${c.value} – ${u.value}`);function f(i){let k=parseInt(i.target.value,10);isNaN(k)||(k>r.value&&(k=r.value),l("update:modelValueMin",k<=s.value?null:k))}function m(i){let k=parseInt(i.target.value,10);isNaN(k)||(k<o.value&&(k=o.value),l("update:modelValueMax",k>=d.value?null:k))}return(i,k)=>{var N;return e.openBlock(),e.createElementBlock("div",Te,[e.createElementVNode("div",Re,[e.createElementVNode("label",Pe,e.toDisplayString(t.label),1),e.createElementVNode("span",Ae,e.toDisplayString(p.value),1)]),e.createElementVNode("div",Fe,[e.createElementVNode("input",{type:"range",class:"range-dual",min:s.value,max:d.value,value:o.value,style:e.normalizeStyle({zIndex:o.value<=s.value||o.value>=r.value?5:4}),onInput:f,onChange:f},null,44,Le),e.createElementVNode("input",{type:"range",class:"range-dual",min:s.value,max:d.value,value:r.value,style:e.normalizeStyle({zIndex:o.value<=s.value||o.value>=r.value?4:5}),onInput:m,onChange:m},null,44,Ue)]),(N=t.scaleHints)!=null&&N.length?(e.openBlock(),e.createElementBlock("div",Oe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.scaleHints,E=>(e.openBlock(),e.createElementBlock("span",{key:E},e.toDisplayString(E),1))),128))])):e.createCommentVNode("",!0)])}}}),[["__scopeId","data-v-0bf11d26"]]);function Z(t,n=2){if(t==null||isNaN(Number(t)))return null;const a=Number(t);return{text:`${a.toFixed(n)}%`,positive:a>=0}}function J(t,n="en-US"){if(t==null||isNaN(Number(t)))return"—";const a=Number(t),l=a<0?"-":"",s=Math.abs(a);let d;return s>=1e6?d=(s/1e6).toFixed(2)+"M":s>=1e3?d=Math.round(s).toLocaleString(n):d=s.toFixed(2),`${l}$${d}`}function T(t,n="en-US"){if(t==null||isNaN(Number(t)))return"—";const a=Number(t);return`${a<0?"-":""}$${Math.abs(a).toLocaleString(n,{minimumFractionDigits:2,maximumFractionDigits:2})}`}function Q(t,n="en-US"){return t==null?"—":Number(t).toLocaleString(n)}function ze(t){return t.Fee==null?t._meta?"free":"—":`${(t.Fee*100).toFixed(0)}%`}function v(t,n="en-US"){if(!t)return"—";const a=new Date(t);return isNaN(a.getTime())?"—":a.toLocaleString(n,{year:"2-digit",month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1})}function Ke(t){if(t==null)return"—";if(t<30)return`${t}d`;const n=Math.floor(t/30);if(n<12)return`${n}mo`;const a=Math.floor(t/365),l=Math.floor((t-a*365)/30);return l?`${a}y ${l}mo`:`${a}y`}function O(t){return t>=1e6?"$"+(t/1e6).toFixed(2)+"M":t>=1e3?"$"+Math.round(t/1e3)+"K":"$"+Math.round(t)}function Ye(t){return t>=1e3?(t/1e3).toFixed(1).replace(/\.0$/,"")+"K%":Math.round(t)+"%"}function Ge(t){return t&&t.trim().split(/\s+/).slice(0,2).map(a=>a.charAt(0).toUpperCase()).join("")||"?"}function R(t){if(!t)return null;const n=new Date(t);return isNaN(n.getTime())?null:Math.floor((Date.now()-n.getTime())/864e5)}const z=t=>t<=0?0:Math.round(Math.pow(10,1+(t-1)/99*6)),ee=t=>t<=0?0:Math.max(1,Math.min(100,Math.round(1+(Math.log10(t)-1)*99/6))),K=t=>t<=0?0:Math.round(Math.pow(10,(t-1)/99*4.7)),je={class:"pelican-fgroup"},He={class:"title-row"},We={class:"val"},qe=["value"],Xe=w(e.defineComponent({__name:"InvestAmount",props:{modelValue:{}},emits:["update:modelValue","apply"],setup(t,{emit:n}){const a=t,l=n,s=e.computed(()=>a.modelValue==null?"any":O(a.modelValue));function d(o){const r=o.target.value.trim();if(!r){l("update:modelValue",null),l("apply",null);return}const c=parseInt(r,10);if(isNaN(c)||c<=0){l("update:modelValue",null),l("apply",null);return}l("update:modelValue",c),l("apply",{min:ee(50),max:ee(c)})}return(o,r)=>(e.openBlock(),e.createElementBlock("div",je,[e.createElementVNode("div",He,[r[0]||(r[0]=e.createElementVNode("label",{class:"title"},"Your Investment Amount, $",-1)),e.createElementVNode("span",We,e.toDisplayString(s.value),1)]),e.createElementVNode("input",{type:"number",min:50,step:50,placeholder:"e.g. 5000",autocomplete:"off",value:t.modelValue??"",onChange:d},null,40,qe)]))}}),[["__scopeId","data-v-a76acc6c"]]),Ze={class:"ftitle-row"},Je=w(e.defineComponent({__name:"FiltersPanel",props:{filters:{},investAmount:{},open:{type:Boolean}},emits:["update:filters","update:investAmount","reset"],setup(t,{emit:n}){const a=t,l=n,s=e.ref(0),d=e.ref(100),o=e.ref(0),r=e.ref(100);e.watch(s,f=>{l("update:filters",{retMin:f<=0?null:K(f)})}),e.watch(d,f=>{l("update:filters",{retMax:f>=100?null:K(f)})}),e.watch(o,f=>{l("update:filters",{balanceMin:f<=0?null:z(f)})}),e.watch(r,f=>{l("update:filters",{balanceMax:f>=100?null:z(f)})}),e.watch(()=>[a.filters.retMin,a.filters.retMax],([f,m])=>{f==null&&(s.value=0),m==null&&(d.value=100)}),e.watch(()=>[a.filters.balanceMin,a.filters.balanceMax],([f,m])=>{f==null&&(o.value=0),m==null&&(r.value=100)});function c(f){l("update:filters",f)}function u(f){c({risk:f})}function p(f){f==null?(c({balanceMin:null,balanceMax:null}),o.value=0,r.value=100):(o.value=f.min,r.value=f.max)}return(f,m)=>(e.openBlock(),e.createElementBlock("aside",{class:e.normalizeClass(["pelican-filters",{open:t.open}])},[e.createElementVNode("div",Ze,[m[13]||(m[13]=e.createElementVNode("label",{class:"ftitle"},"Risk",-1)),e.createElementVNode("button",{class:"btn-reset",type:"button",onClick:m[0]||(m[0]=i=>l("reset"))},"reset filters")]),e.createVNode(Se,{"model-value":t.filters.risk,"onUpdate:modelValue":u},null,8,["model-value"]),e.createVNode(Xe,{"model-value":t.investAmount,"onUpdate:modelValue":m[1]||(m[1]=i=>l("update:investAmount",i)),onApply:p},null,8,["model-value"]),e.createVNode(X,{label:"Return %","model-value-min":s.value,"model-value-max":d.value,"format-raw":i=>e.unref(Ye)(i),"raw-to-domain":i=>e.unref(K)(i),"scale-hints":["0%","200%","50K%+"],"max-label":"50K%+","onUpdate:modelValueMin":m[2]||(m[2]=i=>s.value=i??0),"onUpdate:modelValueMax":m[3]||(m[3]=i=>d.value=i??100)},null,8,["model-value-min","model-value-max","format-raw","raw-to-domain"]),e.createVNode(I,{label:"Max Drawdown ≤","model-value":t.filters.ddMax,min:0,max:100,step:5,"any-at":100,inverted:!0,format:i=>i+"%","onUpdate:modelValue":m[4]||(m[4]=i=>c({ddMax:i==null||i>=100?null:i}))},null,8,["model-value","format"]),e.createVNode(X,{label:"Balance","model-value-min":o.value,"model-value-max":r.value,"format-raw":i=>e.unref(O)(i),"raw-to-domain":i=>e.unref(z)(i),"scale-hints":["$0","$10K","$10M"],"max-label":"$10M+","onUpdate:modelValueMin":m[5]||(m[5]=i=>o.value=i??0),"onUpdate:modelValueMax":m[6]||(m[6]=i=>r.value=i??100)},null,8,["model-value-min","model-value-max","format-raw","raw-to-domain"]),e.createVNode(I,{label:"Mgmt Fee ≤","model-value":t.filters.feeMax,min:0,max:100,step:5,"any-at":100,inverted:!0,format:i=>i+"%","onUpdate:modelValue":m[7]||(m[7]=i=>c({feeMax:i==null||i>=100?null:i}))},null,8,["model-value","format"]),e.createVNode(I,{label:"Copiers AUM ≥","model-value":t.filters.aumMin,min:0,max:5e6,step:5e4,format:i=>"≥ "+e.unref(O)(i),"onUpdate:modelValue":m[8]||(m[8]=i=>c({aumMin:i&&i>0?i:null}))},null,8,["model-value","format"]),e.createVNode(I,{label:"Copiers ≥","model-value":t.filters.copiersMin,min:0,max:3e3,step:10,format:i=>"≥ "+i,"onUpdate:modelValue":m[9]||(m[9]=i=>c({copiersMin:i&&i>0?i:null}))},null,8,["model-value","format"]),e.createVNode(I,{label:"Age ≥ (days)","model-value":t.filters.ageMin,min:0,max:3e3,step:10,format:i=>"≥ "+i+"d","onUpdate:modelValue":m[10]||(m[10]=i=>c({ageMin:i&&i>0?i:null}))},null,8,["model-value","format"]),e.createVNode(I,{label:"Trades ≥","model-value":t.filters.tradesMin,min:0,max:1e4,step:50,format:i=>"≥ "+i,"onUpdate:modelValue":m[11]||(m[11]=i=>c({tradesMin:i&&i>0?i:null}))},null,8,["model-value","format"]),e.createVNode(I,{label:"Win Rate ≥","model-value":t.filters.winrateMin,min:0,max:100,step:5,format:i=>"≥ "+i+"%","onUpdate:modelValue":m[12]||(m[12]=i=>c({winrateMin:i&&i>0?i:null}))},null,8,["model-value","format"])],2))}}),[["__scopeId","data-v-67cc5448"]]),te=["#f97316","#3b82f6","#10b981","#a855f7","#ef4444","#eab308","#06b6d4","#ec4899","#14b8a6","#8b5cf6","#f59e0b","#22c55e"];function Qe(t,n=140,a=34){if(!t||t.length<2)return{hasData:!1,width:n,height:a,zeroY:a/2,areaPath:"",linePath:"",positive:!0,startX:1,endX:n-1};const l=t.map(b=>Date.parse(b.Timestamp)),s=l[0],d=l[l.length-1],o=d-s||1,r=t.map(b=>b.AccountReturn),c=Math.min(0,...r),p=Math.max(0,...r)-c||1,f=b=>(b-s)/o*(n-2)+1,m=b=>a-2-(b-c)/p*(a-4),i=t.map((b,y)=>`${f(l[y]).toFixed(1)},${m(b.AccountReturn).toFixed(1)}`),k=r[r.length-1],N=m(0),E=f(s),g=f(d),x=`M ${i.join(" L ")}`,_=`M ${i[0]} `+i.slice(1).map(b=>`L ${b}`).join(" ")+` L ${g.toFixed(1)},${N.toFixed(1)} L ${E.toFixed(1)},${N.toFixed(1)} Z`;return{hasData:!0,width:n,height:a,zeroY:N,areaPath:_,linePath:x,positive:k>=0,startX:E,endX:g}}function ve(t,n=520,a=280){const l=t.slice().sort((m,i)=>(i.c||0)-(m.c||0)),s=l.reduce((m,i)=>m+(i.c||0),0)||1,d=n/2,o=a/2,r=90,c=52,u=r+10;let p=-Math.PI/2;const f=[];return l.forEach((m,i)=>{const k=(m.c||0)/s,N=k*Math.PI*2,E=p,g=p+N;p=g;const x=(E+g)/2,_=N>Math.PI?1:0,b=d+r*Math.cos(E),y=o+r*Math.sin(E),M=d+r*Math.cos(g),h=o+r*Math.sin(g),V=d+c*Math.cos(E),C=o+c*Math.sin(E),D=d+c*Math.cos(g),S=o+c*Math.sin(g),$=`M ${b.toFixed(2)} ${y.toFixed(2)} A ${r} ${r} 0 ${_} 1 ${M.toFixed(2)} ${h.toFixed(2)} L ${D.toFixed(2)} ${S.toFixed(2)} A ${c} ${c} 0 ${_} 0 ${V.toFixed(2)} ${C.toFixed(2)} Z`,Wn=te[i%te.length];let re=null,ie=0,ce=0,de="start";if(k>=.015){const G=Math.cos(x)<0,qn=d+r*Math.cos(x),Xn=o+r*Math.sin(x),F=d+u*Math.cos(x),j=o+u*Math.sin(x),Zn=G?F-4:F+4;re=`${qn.toFixed(1)},${Xn.toFixed(1)} ${F.toFixed(1)},${j.toFixed(1)} ${Zn.toFixed(1)},${j.toFixed(1)}`,ie=G?F-6:F+6,ce=j+4,de=G?"end":"start"}f.push({marketName:m.n,count:m.c,fraction:k,color:Wn,arcPath:$,labelLine:re,labelX:ie,labelY:ce,labelAnchor:de})}),{width:n,height:a,cx:d,cy:o,outerR:r,innerR:c,slices:f}}const et=["width","height"],tt=["width","height","viewBox"],nt=["x2","y1","y2"],at=["d","fill"],lt=["d","stroke"],ot=w(e.defineComponent({__name:"Sparkline",props:{history:{},width:{default:140},height:{default:34}},setup(t){const n=t,a=e.computed(()=>Qe(n.history,n.width,n.height));return(l,s)=>a.value.hasData?(e.openBlock(),e.createElementBlock("svg",{key:1,class:"pelican-spark",width:a.value.width,height:a.value.height,viewBox:`0 0 ${a.value.width} ${a.value.height}`,preserveAspectRatio:"none",role:"img","aria-label":"Equity curve"},[e.createElementVNode("line",{x1:"0",x2:a.value.width,y1:a.value.zeroY,y2:a.value.zeroY,stroke:"var(--grid-line)","stroke-dasharray":"2 3","stroke-width":"1","vector-effect":"non-scaling-stroke"},null,8,nt),e.createElementVNode("path",{d:a.value.areaPath,fill:a.value.positive?"var(--area-green)":"var(--area-red)",stroke:"none"},null,8,at),e.createElementVNode("path",{d:a.value.linePath,fill:"none",stroke:a.value.positive?"var(--green)":"var(--red)","stroke-width":"1.6","stroke-linejoin":"round","stroke-linecap":"round","vector-effect":"non-scaling-stroke"},null,8,lt)],8,tt)):(e.openBlock(),e.createElementBlock("svg",{key:0,class:"pelican-spark",width:a.value.width,height:a.value.height,role:"img","aria-label":"No equity data"},[...s[0]||(s[0]=[e.createElementVNode("text",{x:"2",y:"20","font-size":"11",fill:"var(--spark-no-data)"},"no data",-1)])],8,et))}}),[["__scopeId","data-v-a9b85847"]]),st={key:0,class:"dim"},rt=["viewBox"],it=["d","fill"],ct=["points","stroke"],dt=["x","y","text-anchor"],mt={fill:"var(--muted)","font-weight":"400"},ut=w(e.defineComponent({__name:"MarketsDonut",props:{markets:{},width:{default:520},height:{default:280}},setup(t){const n=t,a=e.computed(()=>!n.markets||n.markets.length===0),l=e.computed(()=>ve(n.markets,n.width,n.height));return(s,d)=>a.value?(e.openBlock(),e.createElementBlock("span",st,"no market data")):(e.openBlock(),e.createElementBlock("svg",{key:1,class:"pelican-donut",viewBox:`0 0 ${l.value.width} ${l.value.height}`,width:"100%",preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":"Markets donut chart"},[e.createElementVNode("g",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.slices,o=>(e.openBlock(),e.createElementBlock("path",{key:o.marketName+o.fraction,d:o.arcPath,fill:o.color,stroke:"var(--card)","stroke-width":"1.5"},null,8,it))),128))]),e.createElementVNode("g",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.slices,o=>e.withDirectives((e.openBlock(),e.createElementBlock("polyline",{key:`l-${o.marketName}`,points:o.labelLine??"",stroke:o.color,"stroke-width":"1",fill:"none"},null,8,ct)),[[e.vShow,o.labelLine]])),128))]),e.createElementVNode("g",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.slices,o=>e.withDirectives((e.openBlock(),e.createElementBlock("text",{key:`t-${o.marketName}`,x:o.labelX,y:o.labelY,"text-anchor":o.labelAnchor,"font-size":"11",fill:"var(--text)","font-weight":"500"},[e.createTextVNode(e.toDisplayString(o.marketName)+" ",1),e.createElementVNode("tspan",mt,e.toDisplayString(o.count),1)],8,dt)),[[e.vShow,o.labelLine]])),128))])],8,rt))}}),[["__scopeId","data-v-c514d53f"]]),ft={class:"pelican-trades"},pt={class:"hd"},gt={key:0,class:"dim"},ht={key:1,class:"dim"},yt={key:2,class:"list"},kt={class:"market"},Mt={class:"trade-time"},ne=w(e.defineComponent({__name:"TradesPanel",props:{kind:{},trades:{},loading:{type:Boolean},locale:{}},setup(t){const n=t,a=e.computed(()=>n.kind==="open"?"Open Trades":"Trade History (30d)"),l=e.computed(()=>!n.loading&&(n.trades==null||n.trades.length===0));return(s,d)=>(e.openBlock(),e.createElementBlock("div",ft,[e.createElementVNode("div",pt,e.toDisplayString(a.value),1),t.loading?(e.openBlock(),e.createElementBlock("div",gt,"Loading…")):l.value?(e.openBlock(),e.createElementBlock("div",ht,"No trades.")):(e.openBlock(),e.createElementBlock("ul",yt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.trades??[],(o,r)=>(e.openBlock(),e.createElementBlock("li",{key:r},[e.createElementVNode("span",kt,e.toDisplayString(o.MarketName??"—"),1),e.createElementVNode("span",{class:e.normalizeClass(["dir",o.Direction==="Sell"?"red":"green"])},e.toDisplayString(o.Direction??""),3),e.createElementVNode("span",Mt,[e.createTextVNode(e.toDisplayString(e.unref(v)(o.OpenTimestamp,t.locale))+" ",1),o.CloseTimestamp?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createTextVNode(" → "+e.toDisplayString(e.unref(v)(o.CloseTimestamp,t.locale)),1)],64)):e.createCommentVNode("",!0)]),o.Pnl!=null?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["pnl",o.Pnl>=0?"green":"red"])},e.toDisplayString(e.unref(T)(o.Pnl,t.locale)),3)):e.createCommentVNode("",!0)]))),128))]))]))}}),[["__scopeId","data-v-aa7cbcd7"]]);function P(t){const n=t.Wins??0,a=t.Losses??0,l=n+a;return l?n/l*100:-1}const Nt=Symbol("pelican.apiBase"),Et=Symbol("pelican.catalogBase"),ae=Symbol("pelican.locale"),bt=["data-id"],xt={class:"name"},Vt={class:"avatar"},wt={class:"avatar-fallback"},$t=["src"],St={class:"nm"},Bt={class:"title"},_t={key:0,class:"free-badge"},Ct={class:"by"},Dt={class:"c-spark","data-label":"Equity curve"},It={class:"c-num","data-label":"Return"},Tt={key:1},Rt={class:"c-num","data-label":"Copiers"},Pt={class:"c-num","data-label":"Copiers AUM"},At={class:"c-num","data-label":"Max DD"},Ft={key:1},Lt={class:"c-num","data-label":"Age"},Ut={class:"c-num","data-label":"Balance"},Ot={class:"c-num","data-label":"Fee"},zt=["href"],Kt={class:"grid"},Yt={class:"col-stats"},Gt={class:"field"},jt={class:"value"},Ht={class:"field"},Wt={class:"value"},qt={class:"field"},Xt={class:"value"},Zt={class:"field"},Jt={class:"value"},Qt={class:"field"},vt={class:"value"},en={class:"field"},tn={class:"value"},nn={class:"field"},an={class:"value"},ln={class:"field"},on={class:"value"},sn={key:0},rn={key:1,class:"dim"},cn={class:"col-donut"},dn={class:"trade-toggles"},mn=w(e.defineComponent({__name:"StrategyRow",props:{s:{},expanded:{type:Boolean},openTrades:{},closedTrades:{}},emits:["toggle","load-trades","select"],setup(t,{emit:n}){const a=t,l=n,s=e.inject(ae,"en-US"),d=e.computed(()=>Z(a.s.Return,1)),o=e.computed(()=>a.s.MaxDD!=null?Z(a.s.MaxDD,2):null),r=e.computed(()=>R(a.s.Inception)),c=e.computed(()=>P(a.s)),u=e.computed(()=>c.value>=0?100-c.value:-1),p=e.computed(()=>{var E,g;return((E=a.s.Profile)==null?void 0:E.Name)??((g=a.s.Profile)!=null&&g.Id?"#"+a.s.Profile.Id:"")}),f=e.computed(()=>`https://libertex.copy-trade.io/strategy/${a.s.Id}`),m=e.ref(!1),i=e.ref(!1);function k(){m.value=!m.value,m.value&&!a.openTrades&&l("load-trades","open")}function N(){i.value=!i.value,i.value&&!a.closedTrades&&l("load-trades","closed")}return(E,g)=>{var x,_,b,y;return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("div",{class:e.normalizeClass(["pelican-row",{open:t.expanded}]),"data-id":t.s.Id,onClick:g[3]||(g[3]=M=>l("toggle"))},[e.createElementVNode("div",xt,[e.createElementVNode("div",Vt,[e.createElementVNode("span",wt,e.toDisplayString(e.unref(Ge)(t.s.Name)),1),t.s.ImageUploaded?(e.openBlock(),e.createElementBlock("img",{key:0,class:"avatar-img",src:`https://assets.copy-trade.io/images/strategies/thumbnails/${t.s.Id}`,alt:"",loading:"lazy",decoding:"async",onError:g[0]||(g[0]=M=>M.target.remove())},null,40,$t)):e.createCommentVNode("",!0)]),e.createElementVNode("div",St,[e.createElementVNode("div",Bt,[e.createTextVNode(e.toDisplayString(t.s.Name||"#"+t.s.Id)+" ",1),t.s._meta&&t.s.Fee==null?(e.openBlock(),e.createElementBlock("span",_t,"free")):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ct,e.toDisplayString(p.value),1)])]),e.createElementVNode("div",Dt,[e.createVNode(ot,{history:t.s.History},null,8,["history"])]),e.createElementVNode("div",It,[d.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(d.value.positive?"green":"red")},e.toDisplayString(d.value.text),3)):(e.openBlock(),e.createElementBlock("span",Tt,"—"))]),e.createElementVNode("div",Rt,e.toDisplayString(e.unref(Q)(t.s.NumCopiers,e.unref(s))),1),e.createElementVNode("div",Pt,e.toDisplayString(e.unref(J)(t.s.CopiersAUM,e.unref(s))),1),e.createElementVNode("div",At,[o.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(o.value.positive?"green":"red")},e.toDisplayString(o.value.text),3)):(e.openBlock(),e.createElementBlock("span",Ft,"—"))]),e.createElementVNode("div",Lt,e.toDisplayString(e.unref(Ke)(r.value)),1),e.createElementVNode("div",Ut,e.toDisplayString(e.unref(J)(t.s.AccountBalance,e.unref(s))),1),e.createElementVNode("div",Ot,e.toDisplayString(e.unref(ze)(t.s)),1),e.createElementVNode("div",{class:"c-link",onClick:g[2]||(g[2]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("a",{class:"signal-link",href:f.value,target:"_blank",rel:"noopener",onClick:g[1]||(g[1]=e.withModifiers(()=>{},["stop"]))}," Get connected ",8,zt),e.renderSlot(E.$slots,"row-actions",{strategy:t.s},void 0,!0)])],10,bt),t.expanded?(e.openBlock(),e.createElementBlock("div",{key:0,class:"pelican-row-expanded",onClick:g[4]||(g[4]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",Kt,[e.createElementVNode("div",Yt,[e.createElementVNode("div",Gt,[g[5]||(g[5]=e.createElementVNode("div",{class:"label"},"Currency",-1)),e.createElementVNode("div",jt,e.toDisplayString(t.s.Currency??"USD"),1)]),e.createElementVNode("div",Ht,[g[6]||(g[6]=e.createElementVNode("div",{class:"label"},"Monthly profit",-1)),e.createElementVNode("div",Wt,e.toDisplayString(e.unref(T)(t.s.MonthlyProfit,e.unref(s))),1)]),e.createElementVNode("div",qt,[g[7]||(g[7]=e.createElementVNode("div",{class:"label"},"Yearly profit",-1)),e.createElementVNode("div",Xt,e.toDisplayString(e.unref(T)(t.s.YearlyProfit,e.unref(s))),1)]),e.createElementVNode("div",Zt,[g[8]||(g[8]=e.createElementVNode("div",{class:"label"},"Balance",-1)),e.createElementVNode("div",Jt,e.toDisplayString(e.unref(T)(t.s.AccountBalance,e.unref(s))),1)]),e.createElementVNode("div",Qt,[g[9]||(g[9]=e.createElementVNode("div",{class:"label"},"Realized P/L",-1)),e.createElementVNode("div",vt,e.toDisplayString(e.unref(T)(t.s.RealisedPnl,e.unref(s))),1)]),e.createElementVNode("div",en,[g[10]||(g[10]=e.createElementVNode("div",{class:"label"},"Unrealized P/L",-1)),e.createElementVNode("div",tn,e.toDisplayString(e.unref(T)(t.s.UnrealisedPnl,e.unref(s))),1)]),e.createElementVNode("div",nn,[g[11]||(g[11]=e.createElementVNode("div",{class:"label"},"Trades total",-1)),e.createElementVNode("div",an,e.toDisplayString(e.unref(Q)(t.s.TradesTotal,e.unref(s))),1)]),e.createElementVNode("div",ln,[g[12]||(g[12]=e.createElementVNode("div",{class:"label"},"Win rate",-1)),e.createElementVNode("div",on,[c.value>=0?(e.openBlock(),e.createElementBlock("span",sn,e.toDisplayString(c.value.toFixed(1))+"% / "+e.toDisplayString(u.value.toFixed(1))+"%",1)):(e.openBlock(),e.createElementBlock("span",rn,"—"))])])]),e.createElementVNode("div",cn,[g[13]||(g[13]=e.createElementVNode("div",{class:"hd"},"Markets",-1)),e.createVNode(ut,{markets:t.s.Markets},null,8,["markets"])])]),e.createElementVNode("div",dn,[e.createElementVNode("button",{class:e.normalizeClass(["pill",{on:m.value}]),type:"button",onClick:k},e.toDisplayString(m.value?"Hide":"Open Trades"),3),e.createElementVNode("button",{class:e.normalizeClass(["pill",{on:i.value}]),type:"button",onClick:N},e.toDisplayString(i.value?"Hide":"Trade History"),3)]),m.value?(e.openBlock(),e.createBlock(ne,{key:0,kind:"open",trades:((x=t.openTrades)==null?void 0:x.trades)??null,loading:!!((_=t.openTrades)!=null&&_.loading),locale:e.unref(s)},null,8,["trades","loading","locale"])):e.createCommentVNode("",!0),i.value?(e.openBlock(),e.createBlock(ne,{key:1,kind:"closed",trades:((b=t.closedTrades)==null?void 0:b.trades)??null,loading:!!((y=t.closedTrades)!=null&&y.loading),locale:e.unref(s)},null,8,["trades","loading","locale"])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],64)}}}),[["__scopeId","data-v-61c1236b"]]),un={key:0,class:"pelican-pager"},fn=["disabled"],pn={key:0,class:"gap"},gn=["onClick"],hn=["disabled"],yn={class:"info"},kn=["max","value"],Mn=w(e.defineComponent({__name:"Pager",props:{page:{},totalPages:{},range:{}},emits:["go"],setup(t,{emit:n}){const a=t,l=n;function s(o){l("go",o)}function d(o){const r=parseInt(o.target.value,10);isNaN(r)||l("go",r)}return(o,r)=>a.totalPages>1?(e.openBlock(),e.createElementBlock("nav",un,[e.createElementVNode("button",{disabled:t.page<=1,onClick:r[0]||(r[0]=c=>s("prev"))},"‹ prev",8,fn),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.range,(c,u)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:u},[c==="…"?(e.openBlock(),e.createElementBlock("span",pn,"…")):(e.openBlock(),e.createElementBlock("button",{key:1,class:e.normalizeClass(["page",{cur:c===t.page}]),onClick:p=>s(c)},e.toDisplayString(c),11,gn))],64))),128)),e.createElementVNode("button",{disabled:t.page>=t.totalPages,onClick:r[1]||(r[1]=c=>s("next"))},"next ›",8,hn),e.createElementVNode("span",yn,[r[2]||(r[2]=e.createTextVNode(" go to ",-1)),e.createElementVNode("input",{type:"number",min:1,max:t.totalPages,value:t.page,onChange:d},null,40,kn)])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-42928155"]]),Nn={class:"pelican-table"},En={class:"row head"},bn=["onClick"],xn={key:0,class:"empty"},Vn=w(e.defineComponent({__name:"StrategyTable",props:{pageItems:{},expanded:{},sortKey:{},page:{},totalPages:{},pageRange:{},openSignals:{},closedSignals:{}},emits:["toggle-row","toggle-sort","load-trades","select","go"],setup(t,{emit:n}){const a=t,l=n,s=[{key:"return",label:"Return %"},{key:"copiers",label:"Copiers"},{key:"aum",label:"Copiers AUM"},{key:"dd",label:"Max Drawdown"},{key:"age",label:"Age"},{key:"balance",label:"Balance"},{key:"fee",label:"Mgmt Fee %"}];function d(o){return a.sortKey===`${o}-asc`?"active-asc":a.sortKey===`${o}-desc`?"active-desc":""}return(o,r)=>(e.openBlock(),e.createElementBlock("section",Nn,[e.createElementVNode("div",En,[r[1]||(r[1]=e.createElementVNode("div",null,"Name",-1)),r[2]||(r[2]=e.createElementVNode("div",null,"Equity curve",-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(s,c=>e.createElementVNode("div",{key:c.key,class:e.normalizeClass(["c-num sortable",d(c.key)]),onClick:u=>l("toggle-sort",c.key)},e.toDisplayString(c.label),11,bn)),64)),r[3]||(r[3]=e.createElementVNode("div",null,null,-1))]),t.pageItems.length===0?(e.openBlock(),e.createElementBlock("div",xn,[e.renderSlot(o.$slots,"empty",{},()=>[r[4]||(r[4]=e.createTextVNode("No matches.",-1))],!0)])):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(t.pageItems,c=>(e.openBlock(),e.createBlock(mn,{key:c.Id,s:c,expanded:t.expanded.has(c.Id),"open-trades":t.openSignals.get(c.Id)??null,"closed-trades":t.closedSignals.get(c.Id)??null,onToggle:u=>l("toggle-row",c.Id),onLoadTrades:u=>l("load-trades",{id:c.Id,kind:u}),onSelect:u=>l("select",c)},{"row-actions":e.withCtx(u=>[e.renderSlot(o.$slots,"row-actions",e.mergeProps({ref_for:!0},u),void 0,!0)]),_:3},8,["s","expanded","open-trades","closed-trades","onToggle","onLoadTrades","onSelect"]))),128)),e.createVNode(Mn,{page:t.page,"total-pages":t.totalPages,range:t.pageRange,onGo:r[0]||(r[0]=c=>l("go",c))},null,8,["page","total-pages","range"])]))}}),[["__scopeId","data-v-c61b9ce8"]]),wn={key:0,class:"pelican-progress"},$n={class:"bar"},Sn={class:"caption"},Bn={class:"hint"},_n=w(e.defineComponent({__name:"ProgressBar",props:{loaded:{},total:{},active:{type:Boolean}},setup(t){const n=t,a=e.computed(()=>n.total>0?Math.min(100,n.loaded/n.total*100):0);return(l,s)=>t.active?(e.openBlock(),e.createElementBlock("div",wn,[e.createElementVNode("div",$n,[e.createElementVNode("span",{style:e.normalizeStyle({width:a.value.toFixed(1)+"%"})},null,4)]),e.createElementVNode("div",Sn,[s[0]||(s[0]=e.createTextVNode(" Building full catalog: ",-1)),e.createElementVNode("b",null,e.toDisplayString(t.loaded.toLocaleString("en-US")),1),e.createTextVNode(" / "+e.toDisplayString(t.total.toLocaleString("en-US"))+" strategies ("+e.toDisplayString(a.value.toFixed(0))+"%) · ",1),s[1]||(s[1]=e.createElementVNode("i",null,"upstream rate-limited",-1))]),e.createElementVNode("div",Bn," All "+e.toDisplayString(t.total.toLocaleString("en-US"))+" strategies are visible. Stats fill in as the build progresses; refresh of data every 20 sec. ",1)])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-8767a909"]]),le="pelican-theme";function Cn(t="auto"){const n=Dn(),a=e.ref(n??t),l=e.ref("dark"),s=typeof window<"u"&&window.matchMedia?window.matchMedia("(prefers-color-scheme: dark)"):null,d=()=>{const u=a.value;l.value=u==="dark"?"dark":u==="light"?"light":s!=null&&s.matches?"dark":"light"},o=()=>{a.value==="auto"&&d()};s&&(s.addEventListener?s.addEventListener("change",o):s.addListener(o)),e.watch(a,u=>{try{localStorage.setItem(le,u)}catch{}d()}),d(),e.onScopeDispose(()=>{s&&(s.removeEventListener?s.removeEventListener("change",o):s.removeListener(o))});function r(u){a.value=u}function c(){a.value=a.value==="dark"?"light":a.value==="light"?"auto":"dark"}return{mode:a,resolved:l,setMode:r,cycle:c}}function Dn(){try{const t=localStorage.getItem(le);return t==="dark"||t==="light"||t==="auto"?t:null}catch{return null}}function A(t,n,a){const l=new Error(n);return l.code=t,a!==void 0&&(l.status=a),l}async function Y(t,n){const a=L(n,t);let l;try{l=await fetch(a)}catch(s){throw A("fetch_failed",s.message??"fetch failed")}if(l.status===401||l.status===503)throw A("no_token","Proxy has no token yet",l.status);if(!l.ok){const s=await l.text().catch(()=>"");throw A("http_error",`${l.status}: ${s.slice(0,120)}`,l.status)}return await l.json()}function L(t,n){if(!t)return n;const a=t.endsWith("/")?t.slice(0,-1):t,l=n.startsWith("/")?n:"/"+n;return a+l}function In({apiBase:t,catalogBase:n,onError:a}){const l=e.shallowRef(new Map),s=e.ref(!1),d=e.ref(!1),o=e.ref(0),r=e.ref(0),c=e.ref(null),u=e.computed(()=>Array.from(l.value.values()));let p=!1;const f=h=>{a?a(h):console.warn("[pelican-vue]",h)},m=()=>{const h=n==null?void 0:n.value;return!!h&&h!==t.value},i=()=>(n==null?void 0:n.value)||t.value;async function k(h){try{const C=await Y(h?"/api/strategies-full?partial=1":"/api/strategies-full",i());r.value=C.length;const D=l.value;for(const S of C)D.set(S.Id,{...D.get(S.Id),...S});e.triggerRef(l)}catch(V){f(V)}}async function N(){try{const h=await Y("/api/strategies-full/progress",i());return o.value=h.loaded,r.value=h.total||r.value,d.value=h.building,c.value=h.built_at,h}catch(h){return f(h),null}}async function E(){if(m()){await k(!1),N(),s.value=!0;return}await k(!0);let h=Date.now();for(;!p;){const V=await N();if(!V){await se(1500);continue}if(V.ready)break;Date.now()-h>ge&&(await k(!0),h=Date.now()),await se(pe)}p||(await k(!1),s.value=!0)}const g=new Set;async function x(h){if(g.has(h))return;const V=l.value.get(h);if(!(V!=null&&V._enrichAttempted&&V._meta&&V._stats)){g.add(h);try{const[C,D]=await Promise.all([oe(L(t.value,`/api/strategies/${h}`)),oe(L(t.value,`/api/strategies/${h}/stats`))]),S=l.value,$=S.get(h)??{Id:h};Tn($,C),Rn($,D),$._enrichAttempted=!0,$.IsEnabled===!1?S.delete(h):S.set(h,$),e.triggerRef(l)}finally{g.delete(h)}}}async function _(h){if(!(!h||!s.value))try{const V=await Y(`/api/strategies?filter=${encodeURIComponent(h)}`,t.value),C=l.value,D=[];let S=0;for(const $ of V)C.has($.Id)||(C.set($.Id,{...$,_stats:!1,_meta:!1}),D.push($.Id),S++);S&&(r.value+=S,e.triggerRef(l));for(const $ of D)x($)}catch(V){f(V)}}function b(){p=!1,E()}function y(){p=!0}async function M(){y(),l.value=new Map,s.value=!1,o.value=0,r.value=0,c.value=null,b()}return e.onScopeDispose(y),{catalog:u,ready:s,building:d,loaded:o,total:r,builtAt:c,enrichOne:x,searchExtra:_,refresh:M,start:b,stop:y}}async function oe(t){try{const n=await fetch(t);return n.ok?await n.json():null}catch{return null}}function Tn(t,n){n&&(t.Name=n.Name??t.Name,t.NumCopiers=n.NumCopiers??null,t.Fee=n.Fee??null,t.RiskProfile=n.RiskProfile??null,t.IsSimulated=n.IsSimulated??!1,n.IsEnabled!==void 0&&(t.IsEnabled=n.IsEnabled),n.ImageUploaded!==void 0&&(t.ImageUploaded=n.ImageUploaded),t.Profile=n.Profile??t.Profile,t._meta=!0)}function Rn(t,n){var r,c,u,p,f,m;if(!n)return;const a=((r=n.Profitability)==null?void 0:r.Inception)??{},l=((c=n.Trades)==null?void 0:c.Inception)??{},s=a.History??[],d=s.length>60?Math.ceil(s.length/60):1,o=s.filter((i,k)=>k%d===0||k===s.length-1).map(i=>({Timestamp:i.Timestamp,AccountReturn:i.AccountReturn}));t.Inception=n.Inception??t.Inception,t.Currency=n.CurrencyCode||"USD",t.Return=a.UnrealisedReturn!=null?a.UnrealisedReturn*100:a.RealisedReturn!=null?a.RealisedReturn*100:null,t.MaxDD=a.MaxDrawdown!=null?a.MaxDrawdown*100:null,t.RealisedPnl=a.RealisedPnl??null,t.UnrealisedPnl=a.UnrealisedPnl??null,t.History=o,t.TradesTotal=l.Total??0,t.Wins=l.Wins??0,t.Losses=l.Losses??0,t.Markets=Array.isArray(l.Markets)?l.Markets.slice(0,12).map(i=>({n:i.MarketName,c:i.Count})):[],t.AccountBalance=((u=n.Status)==null?void 0:u.Balance)??null,t.CopiersAUM=((p=n.CopiersBalance)==null?void 0:p.Balance)??null,t.MonthlyProfit=((f=n.CopiersProfit)==null?void 0:f.Month)??null,t.YearlyProfit=((m=n.CopiersProfit)==null?void 0:m.Year)??null,t._stats=!0}function se(t){return new Promise(n=>setTimeout(n,t))}function U(){return{risk:new Set,retMin:null,retMax:null,ddMax:null,aumMin:null,copiersMin:null,ageMin:null,tradesMin:null,winrateMin:null,feeMax:null,balanceMin:null,balanceMax:null,search:""}}function Pn(t,n={}){const a=U(),l=e.reactive({...a,...n,risk:new Set(n.risk??a.risk)}),s=e.computed(()=>t.value.filter(o=>An(o,l)));function d(){const o=U();l.risk=o.risk,l.retMin=null,l.retMax=null,l.ddMax=null,l.aumMin=null,l.copiersMin=null,l.ageMin=null,l.tradesMin=null,l.winrateMin=null,l.feeMax=null,l.balanceMin=null,l.balanceMax=null,l.search=""}return{filters:l,filtered:s,reset:d}}function An(t,n){var s;if(n.search){const d=n.search.toLowerCase();if(!(t.Name||"").toLowerCase().includes(d)&&!(((s=t.Profile)==null?void 0:s.Name)||"").toLowerCase().includes(d))return!1}if(n.risk.size&&t.RiskProfile&&!n.risk.has(t.RiskProfile)||t.IsSimulated||t._stats&&!t.TradesTotal||n.copiersMin!=null&&(t.NumCopiers??0)<n.copiersMin||n.aumMin!=null&&(t.CopiersAUM??0)<n.aumMin||n.balanceMin!=null&&(t.AccountBalance??0)<n.balanceMin||n.balanceMax!=null&&(t.AccountBalance??1/0)>n.balanceMax||n.feeMax!=null&&t.Fee!=null&&t.Fee*100>n.feeMax||n.tradesMin!=null&&(t.TradesTotal??0)<n.tradesMin)return!1;const a=P(t);if(n.winrateMin!=null&&(a<0||a<n.winrateMin))return!1;const l=R(t.Inception);return!(n.ageMin!=null&&(l==null||l<n.ageMin)||n.retMin!=null&&(t.Return==null||t.Return<n.retMin)||n.retMax!=null&&(t.Return==null||t.Return>n.retMax)||n.ddMax!=null&&t.MaxDD!=null&&Math.abs(t.MaxDD)>n.ddMax)}const Fn={"return-desc":(t,n)=>(n.Return??-1e18)-(t.Return??-1e18),"return-asc":(t,n)=>(t.Return??1e18)-(n.Return??1e18),"dd-asc":(t,n)=>Math.abs(t.MaxDD??1e9)-Math.abs(n.MaxDD??1e9),"dd-desc":(t,n)=>Math.abs(n.MaxDD??-1e9)-Math.abs(t.MaxDD??-1e9),"aum-desc":(t,n)=>(n.CopiersAUM??-1)-(t.CopiersAUM??-1),"aum-asc":(t,n)=>(t.CopiersAUM??1/0)-(n.CopiersAUM??1/0),"copiers-desc":(t,n)=>(n.NumCopiers??-1)-(t.NumCopiers??-1),"copiers-asc":(t,n)=>(t.NumCopiers??1/0)-(n.NumCopiers??1/0),"fee-asc":(t,n)=>(t.Fee??1/0)-(n.Fee??1/0),"fee-desc":(t,n)=>(n.Fee??-1)-(t.Fee??-1),"age-desc":(t,n)=>(R(n.Inception)??-1)-(R(t.Inception)??-1),"age-asc":(t,n)=>(R(t.Inception)??1/0)-(R(n.Inception)??1/0),"balance-desc":(t,n)=>(n.AccountBalance??-1)-(t.AccountBalance??-1),"balance-asc":(t,n)=>(t.AccountBalance??1/0)-(n.AccountBalance??1/0),"winrate-desc":(t,n)=>P(n)-P(t),"winrate-asc":(t,n)=>P(t)-P(n),"trades-desc":(t,n)=>(n.TradesTotal??-1)-(t.TradesTotal??-1),"trades-asc":(t,n)=>(t.TradesTotal??1/0)-(n.TradesTotal??1/0),"monthly-desc":(t,n)=>(n.MonthlyProfit??-1e18)-(t.MonthlyProfit??-1e18),"monthly-asc":(t,n)=>(t.MonthlyProfit??1e18)-(n.MonthlyProfit??1e18)};function Ln(t,n="return-desc"){const a=e.ref(n),l=e.computed(()=>{const d=Fn[a.value]??(()=>0);return t.value.slice().sort(d)});function s(d){const[o,r]=q[d];a.value=a.value===o?r:o}return{sortKey:a,sorted:l,toggleColumn:s,setKey:d=>{a.value=d}}}function Un(t,n){const a=e.ref(1),l=e.computed(()=>Math.max(1,Math.ceil(t.value.length/n)));e.watch(l,o=>{a.value>o&&(a.value=o),a.value<1&&(a.value=1)});const s=e.computed(()=>{const o=(a.value-1)*n;return t.value.slice(o,o+n)}),d=e.computed(()=>{const o=a.value,r=l.value;if(r<=1)return[];const u=[...new Set([1,r,o,o-1,o+1,o-2,o+2,2,r-1])].filter(f=>f>=1&&f<=r).sort((f,m)=>f-m),p=[];for(let f=0;f<u.length;f++)f&&u[f]-u[f-1]>1&&p.push("…"),p.push(u[f]);return p});return{page:a,totalPages:l,pageItems:s,pageRange:d,setPage:o=>{a.value=Math.max(1,Math.min(l.value,o))},next:()=>{a.value<l.value&&(a.value+=1)},prev:()=>{a.value>1&&(a.value-=1)}}}function On(t){const n=e.ref(new Map),a=e.ref(new Map);function l(d,o){return(o==="open"?n.value:a.value).get(d)??null}async function s(d,o){const r=o==="open"?n:a,c=r.value.get(d);if(c&&(c.loading||c.trades!==null))return;const u=new Map(r.value);u.set(d,{loading:!0,trades:null,error:null}),r.value=u;let p="";if(o==="closed"){const N=new Date,E=new Date(Date.now()-he*864e5),g=x=>x.toISOString().replace(/\.\d+Z$/,"Z");p=`?startDate=${encodeURIComponent(g(E))}&endDate=${encodeURIComponent(g(N))}`}const f=L(t.value,`/api/strategies/${d}/signals/${o}${p}`);let m=[],i=null;try{const N=await fetch(f);if(!N.ok)throw A("http_error",`${N.status}`);m=await N.json()}catch(N){i=N.code?N:A("fetch_failed",N.message),m=[]}const k=new Map(r.value);k.set(d,{loading:!1,trades:m,error:i}),r.value=k}return{open:n,closed:a,load:s,get:l}}const zn=["data-theme"],Kn={class:"brand-row"},Yn=["title"],Gn={"aria-hidden":"true"},jn={class:"pelican-main"},Hn=w(e.defineComponent({__name:"PelicanLibertexSocial",props:{apiBase:{},catalogBase:{},theme:{default:"auto"},defaultSort:{default:"return-desc"},defaultFilters:{},columns:{},locale:{default:"en-US"},pageSize:{default:ue}},emits:["update:theme","select-strategy","error"],setup(t,{emit:n}){const a=t,l=n;e.provide(Nt,a.apiBase),e.provide(Et,a.catalogBase??a.apiBase),e.provide(ae,a.locale);const s=e.toRef(a,"apiBase"),d=e.toRef(a,"catalogBase"),o=Cn(a.theme);e.watch(o.mode,y=>l("update:theme",y)),e.watch(()=>a.theme,y=>o.setMode(y));const r=In({apiBase:s,catalogBase:d,onError:y=>l("error",y)}),c=Pn(r.catalog,a.defaultFilters??{}),u=Ln(c.filtered,a.defaultSort),p=Un(u.sorted,a.pageSize),f=On(s),m=e.reactive(new Set),i=e.ref(!1),k=e.ref(null);function N(y){m.has(y)?m.delete(y):m.add(y);const M=r.catalog.value.find(h=>h.Id===y);M&&((!M._meta||!M._stats)&&!M._enrichAttempted&&r.enrichOne(y),l("select-strategy",M))}function E(y){u.toggleColumn(y),p.setPage(1)}function g(y){Object.assign(c.filters,y),p.setPage(1)}function x(){const y=U();Object.assign(c.filters,y),c.filters.risk=y.risk,k.value=null,p.setPage(1)}function _({id:y,kind:M}){f.load(y,M)}function b(y){y==="prev"?p.prev():y==="next"?p.next():p.setPage(y)}return e.onMounted(()=>r.start()),(y,M)=>(e.openBlock(),e.createElementBlock("div",{class:"pelican-libsoc","data-theme":e.unref(o).resolved.value},[e.createElementVNode("header",Kn,[e.renderSlot(y.$slots,"brand",{},()=>[M[6]||(M[6]=e.createElementVNode("div",{class:"default-brand"},"Libertex Social — Copy Trading",-1))],!0),e.createElementVNode("button",{class:"theme-toggle",type:"button",title:e.unref(o).mode.value,onClick:M[0]||(M[0]=(...h)=>e.unref(o).cycle&&e.unref(o).cycle(...h))},[e.createElementVNode("span",Gn,e.toDisplayString(e.unref(o).resolved.value==="dark"?"🌙":"☀️"),1)],8,Yn)]),e.createVNode(Ve,{search:e.unref(c).filters.search,"sort-key":e.unref(u).sortKey.value,total:e.unref(r).total.value,"filtered-total":e.unref(c).filtered.value.length,page:e.unref(p).page.value,"total-pages":e.unref(p).totalPages.value,"onUpdate:search":M[1]||(M[1]=h=>g({search:h})),"onUpdate:sortKey":M[2]||(M[2]=h=>e.unref(u).setKey(h)),onRefresh:e.unref(r).refresh,onToggleFilters:M[3]||(M[3]=h=>i.value=!i.value)},null,8,["search","sort-key","total","filtered-total","page","total-pages","onRefresh"]),e.createVNode(_n,{loaded:e.unref(r).loaded.value,total:e.unref(r).total.value,active:e.unref(r).building.value&&!e.unref(r).ready.value},null,8,["loaded","total","active"]),e.createElementVNode("main",jn,[e.createVNode(Je,{filters:e.unref(c).filters,"invest-amount":k.value,open:i.value,"onUpdate:filters":g,"onUpdate:investAmount":M[4]||(M[4]=h=>k.value=h),onReset:x},null,8,["filters","invest-amount","open"]),e.createVNode(Vn,{"page-items":e.unref(p).pageItems.value,expanded:m,"sort-key":e.unref(u).sortKey.value,page:e.unref(p).page.value,"total-pages":e.unref(p).totalPages.value,"page-range":e.unref(p).pageRange.value,"open-signals":e.unref(f).open.value,"closed-signals":e.unref(f).closed.value,onToggleRow:N,onToggleSort:E,onLoadTrades:_,onSelect:M[5]||(M[5]=h=>l("select-strategy",h)),onGo:b},{empty:e.withCtx(()=>[e.renderSlot(y.$slots,"empty",{},()=>[M[7]||(M[7]=e.createTextVNode("No matches.",-1))],!0)]),"row-actions":e.withCtx(h=>[e.renderSlot(y.$slots,"row-actions",e.normalizeProps(e.guardReactiveProps(h)),void 0,!0)]),_:3},8,["page-items","expanded","sort-key","page","total-pages","page-range","open-signals","closed-signals"])])],8,zn))}}),[["__scopeId","data-v-33b03803"]]);B.PelicanLibertexSocial=Hn,B.SORT_KEYS=H,B.SORT_LABELS=W,B.SORT_TOGGLE=q,B.defaultFilters=U,Object.defineProperty(B,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(B,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(B=typeof globalThis<"u"?globalThis:B||self,e(B.PelicanLibertexSocial={},B.Vue))})(this,function(B,e){"use strict";function ue(t,n){let a=null;const l=(...d)=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,t(...d)},n)},s=()=>{a&&(clearTimeout(a),a=null)};return e.onScopeDispose(s),{wrapped:l,cancel:s}}const fe=20,pe=350,ge=2e3,he=2e4,ye=30,W=["return-desc","return-asc","copiers-desc","copiers-asc","aum-desc","aum-asc","dd-asc","dd-desc","fee-asc","fee-desc","age-desc","age-asc","balance-desc","balance-asc","winrate-desc","winrate-asc","trades-desc","trades-asc","monthly-desc","monthly-asc"],q={"return-desc":"Return ↓","return-asc":"Return ↑","copiers-desc":"Copiers ↓","copiers-asc":"Copiers ↑","aum-desc":"Copiers AUM ↓","aum-asc":"Copiers AUM ↑","dd-asc":"Drawdown ↑","dd-desc":"Drawdown ↓","fee-asc":"Fee ↑","fee-desc":"Fee ↓","age-desc":"Age ↓","age-asc":"Age ↑","balance-desc":"Balance ↓","balance-asc":"Balance ↑","winrate-desc":"Win Rate ↓","winrate-asc":"Win Rate ↑","trades-desc":"Trades ↓","trades-asc":"Trades ↑","monthly-desc":"Monthly Profit ↓","monthly-asc":"Monthly Profit ↑"},X={return:["return-desc","return-asc"],copiers:["copiers-desc","copiers-asc"],aum:["aum-desc","aum-asc"],dd:["dd-asc","dd-desc"],fee:["fee-asc","fee-desc"],age:["age-desc","age-asc"],balance:["balance-desc","balance-asc"]},ke={class:"pelican-toolbar"},Me={class:"counts"},Ne=["value"],be={class:"sort"},Ee=["value"],xe=["value"],Ve=e.defineComponent({__name:"Toolbar",props:{search:{},sortKey:{},total:{},filteredTotal:{},page:{},totalPages:{}},emits:["update:search","update:sortKey","refresh","toggle-filters"],setup(t,{emit:n}){const a=t,l=n,s=e.ref(a.search);e.watch(()=>a.search,i=>{i!==s.value&&(s.value=i)});const{wrapped:d}=ue(i=>l("update:search",i),pe);function o(i){const u=i.target.value;s.value=u,d(u)}function r(i){l("update:sortKey",i.target.value)}return(i,u)=>(e.openBlock(),e.createElementBlock("div",ke,[e.createElementVNode("button",{class:"btn-flat filters-toggle",type:"button",onClick:u[0]||(u[0]=g=>l("toggle-filters"))}," Filters "),e.createElementVNode("div",Me,[u[2]||(u[2]=e.createTextVNode(" Showing ",-1)),e.createElementVNode("b",null,e.toDisplayString(t.filteredTotal.toLocaleString("en-US")),1),u[3]||(u[3]=e.createTextVNode(" of ",-1)),e.createElementVNode("b",null,e.toDisplayString(t.total.toLocaleString("en-US")),1),u[4]||(u[4]=e.createTextVNode(" · page ",-1)),e.createElementVNode("b",null,e.toDisplayString(t.page),1),e.createTextVNode(" / "+e.toDisplayString(t.totalPages),1)]),e.createElementVNode("input",{class:"search",type:"search",placeholder:"Search by signal name…",autocomplete:"off",value:s.value,onInput:o},null,40,Ne),e.createElementVNode("div",be,[u[5]||(u[5]=e.createElementVNode("label",null,"Sort:",-1)),e.createElementVNode("select",{value:t.sortKey,onChange:r},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(W),g=>(e.openBlock(),e.createElementBlock("option",{key:g,value:g},e.toDisplayString(e.unref(q)[g]),9,xe))),128))],40,Ee)]),e.createElementVNode("button",{class:"btn-flat",type:"button",title:"reload",onClick:u[1]||(u[1]=g=>l("refresh"))}," ↻ reload ")]))}}),w=(t,n)=>{const a=t.__vccOpts||t;for(const[l,s]of n)a[l]=s;return a},we=w(Ve,[["__scopeId","data-v-9803823c"]]),$e={class:"pelican-chips"},Se=["onClick"],Be=w(e.defineComponent({__name:"RiskChips",props:{modelValue:{}},emits:["update:modelValue"],setup(t,{emit:n}){const a=t,l=n,s=["Low","Medium","High"];function d(o){const r=new Set(a.modelValue);r.has(o)?r.delete(o):r.add(o),l("update:modelValue",r)}return(o,r)=>(e.openBlock(),e.createElementBlock("div",$e,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(s,i=>e.createElementVNode("button",{key:i,type:"button",class:e.normalizeClass(["chip",["risk-"+i.toLowerCase(),{on:t.modelValue.has(i)}]]),onClick:u=>d(i)},e.toDisplayString(i),11,Se)),64))]))}}),[["__scopeId","data-v-742a6c3b"]]),_e={class:"pelican-fgroup"},Ce={class:"title-row"},Ie={class:"title"},De={class:"val"},Te=["min","max","step","value"],D=w(e.defineComponent({__name:"RangeSingle",props:{label:{},modelValue:{},min:{},max:{},step:{default:1},format:{},anyAt:{},inverted:{type:Boolean}},emits:["update:modelValue"],setup(t,{emit:n}){const a=t,l=n,s=e.computed(()=>a.anyAt??a.min),d=e.computed(()=>!!a.inverted),o=e.computed(()=>a.modelValue==null?d.value?a.max:s.value:a.modelValue),r=e.computed(()=>a.modelValue==null?"any":a.format?a.format(a.modelValue):String(a.modelValue));function i(u){const g=parseInt(u.target.value,10);isNaN(g)||(d.value&&g>=a.max||!d.value&&g<=s.value?l("update:modelValue",null):l("update:modelValue",g))}return(u,g)=>(e.openBlock(),e.createElementBlock("div",_e,[e.createElementVNode("div",Ce,[e.createElementVNode("label",Ie,e.toDisplayString(t.label),1),e.createElementVNode("span",De,e.toDisplayString(r.value),1)]),e.createElementVNode("input",{type:"range",class:"range",min:t.min,max:t.max,step:t.step,value:o.value,onInput:i,onChange:i},null,40,Te)]))}}),[["__scopeId","data-v-10c5fe1c"]]),Re={class:"pelican-fgroup"},Pe={class:"title-row"},Ae={class:"title"},Fe={class:"val"},Le=["min","max","value"],Ue=["min","max","value"],Oe={key:0,class:"scale"},Z=w(e.defineComponent({__name:"RangeDual",props:{label:{},modelValueMin:{},modelValueMax:{},rawMin:{},rawMax:{},formatRaw:{type:Function},rawToDomain:{type:Function},scaleHints:{},minLabel:{},maxLabel:{}},emits:["update:modelValueMin","update:modelValueMax"],setup(t,{emit:n}){const a=t,l=n,s=e.computed(()=>a.rawMin??0),d=e.computed(()=>a.rawMax??100),o=e.computed(()=>a.modelValueMin??s.value),r=e.computed(()=>a.modelValueMax??d.value),i=e.computed(()=>o.value<=s.value?a.minLabel??"any":a.formatRaw(a.rawToDomain(o.value))),u=e.computed(()=>r.value>=d.value?a.maxLabel??"any":a.formatRaw(a.rawToDomain(r.value))),g=e.computed(()=>o.value<=s.value&&r.value>=d.value?"any":`${i.value} – ${u.value}`),p=e.computed(()=>(o.value-s.value)/(d.value-s.value)*100),m=e.computed(()=>(r.value-s.value)/(d.value-s.value)*100),c=e.computed(()=>({background:`linear-gradient(to right,
|
|
2
|
+
var(--track-bg, #e2e8f0) 0%,
|
|
3
|
+
var(--track-bg, #e2e8f0) ${p.value}%,
|
|
4
|
+
var(--accent, #3b82f6) ${p.value}%,
|
|
5
|
+
var(--accent, #3b82f6) ${m.value}%,
|
|
6
|
+
var(--track-bg, #e2e8f0) ${m.value}%,
|
|
7
|
+
var(--track-bg, #e2e8f0) 100%)`}));function N(b){let f=parseInt(b.target.value,10);isNaN(f)||(f>r.value&&(f=r.value),l("update:modelValueMin",f<=s.value?null:f))}function M(b){let f=parseInt(b.target.value,10);isNaN(f)||(f<o.value&&(f=o.value),l("update:modelValueMax",f>=d.value?null:f))}return(b,f)=>{var x;return e.openBlock(),e.createElementBlock("div",Re,[e.createElementVNode("div",Pe,[e.createElementVNode("label",Ae,e.toDisplayString(t.label),1),e.createElementVNode("span",Fe,e.toDisplayString(g.value),1)]),e.createElementVNode("div",{class:"dual-track",style:e.normalizeStyle(c.value)},[e.createElementVNode("input",{type:"range",class:"range-dual",min:s.value,max:d.value,value:o.value,style:e.normalizeStyle({zIndex:o.value<=s.value||o.value>=r.value?5:4}),onInput:N,onChange:N},null,44,Le),e.createElementVNode("input",{type:"range",class:"range-dual",min:s.value,max:d.value,value:r.value,style:e.normalizeStyle({zIndex:o.value<=s.value||o.value>=r.value?4:5}),onInput:M,onChange:M},null,44,Ue)],4),(x=t.scaleHints)!=null&&x.length?(e.openBlock(),e.createElementBlock("div",Oe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.scaleHints,$=>(e.openBlock(),e.createElementBlock("span",{key:$},e.toDisplayString($),1))),128))])):e.createCommentVNode("",!0)])}}}),[["__scopeId","data-v-dde22e60"]]);function J(t,n=2){if(t==null||isNaN(Number(t)))return null;const a=Number(t);return{text:`${a.toFixed(n)}%`,positive:a>=0}}function Q(t,n="en-US"){if(t==null||isNaN(Number(t)))return"—";const a=Number(t),l=a<0?"-":"",s=Math.abs(a);let d;return s>=1e6?d=(s/1e6).toFixed(2)+"M":s>=1e3?d=Math.round(s).toLocaleString(n):d=s.toFixed(2),`${l}$${d}`}function R(t,n="en-US"){if(t==null||isNaN(Number(t)))return"—";const a=Number(t);return`${a<0?"-":""}$${Math.abs(a).toLocaleString(n,{minimumFractionDigits:2,maximumFractionDigits:2})}`}function v(t,n="en-US"){return t==null?"—":Number(t).toLocaleString(n)}function ze(t){return t.Fee==null?t._meta?"free":"—":`${(t.Fee*100).toFixed(0)}%`}function ee(t,n="en-US"){if(!t)return"—";const a=new Date(t);return isNaN(a.getTime())?"—":a.toLocaleString(n,{year:"2-digit",month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1})}function Ke(t){if(t==null)return"—";if(t<30)return`${t}d`;const n=Math.floor(t/30);if(n<12)return`${n}mo`;const a=Math.floor(t/365),l=Math.floor((t-a*365)/30);return l?`${a}y ${l}mo`:`${a}y`}function z(t){return t>=1e6?"$"+(t/1e6).toFixed(2)+"M":t>=1e3?"$"+Math.round(t/1e3)+"K":"$"+Math.round(t)}function Ye(t){return t>=1e3?(t/1e3).toFixed(1).replace(/\.0$/,"")+"K%":Math.round(t)+"%"}function Ge(t){return t&&t.trim().split(/\s+/).slice(0,2).map(a=>a.charAt(0).toUpperCase()).join("")||"?"}function P(t){if(!t)return null;const n=new Date(t);return isNaN(n.getTime())?null:Math.floor((Date.now()-n.getTime())/864e5)}const K=t=>t<=0?0:Math.round(Math.pow(10,1+(t-1)/99*6)),te=t=>t<=0?0:Math.max(1,Math.min(100,Math.round(1+(Math.log10(t)-1)*99/6))),Y=t=>t<=0?0:Math.round(Math.pow(10,(t-1)/99*4.7)),He={class:"pelican-fgroup"},je={class:"title-row"},We={class:"val"},qe=["value"],Xe=w(e.defineComponent({__name:"InvestAmount",props:{modelValue:{}},emits:["update:modelValue","apply"],setup(t,{emit:n}){const a=t,l=n,s=e.computed(()=>a.modelValue==null?"any":z(a.modelValue));function d(o){const r=o.target.value.trim();if(!r){l("update:modelValue",null),l("apply",null);return}const i=parseInt(r,10);if(isNaN(i)||i<=0){l("update:modelValue",null),l("apply",null);return}l("update:modelValue",i),l("apply",{min:te(50),max:te(i)})}return(o,r)=>(e.openBlock(),e.createElementBlock("div",He,[e.createElementVNode("div",je,[r[0]||(r[0]=e.createElementVNode("label",{class:"title"},"Your Investment Amount, $",-1)),e.createElementVNode("span",We,e.toDisplayString(s.value),1)]),e.createElementVNode("input",{type:"number",min:50,step:50,placeholder:"e.g. 5000",autocomplete:"off",value:t.modelValue??"",onChange:d},null,40,qe)]))}}),[["__scopeId","data-v-a76acc6c"]]),Ze={class:"ftitle-row"},Je=w(e.defineComponent({__name:"FiltersPanel",props:{filters:{},investAmount:{},open:{type:Boolean}},emits:["update:filters","update:investAmount","reset"],setup(t,{emit:n}){const a=t,l=n,s=e.ref(0),d=e.ref(100),o=e.ref(0),r=e.ref(100);e.watch(s,p=>{l("update:filters",{retMin:p<=0?null:Y(p)})}),e.watch(d,p=>{l("update:filters",{retMax:p>=100?null:Y(p)})}),e.watch(o,p=>{l("update:filters",{balanceMin:p<=0?null:K(p)})}),e.watch(r,p=>{l("update:filters",{balanceMax:p>=100?null:K(p)})}),e.watch(()=>[a.filters.retMin,a.filters.retMax],([p,m])=>{p==null&&(s.value=0),m==null&&(d.value=100)}),e.watch(()=>[a.filters.balanceMin,a.filters.balanceMax],([p,m])=>{p==null&&(o.value=0),m==null&&(r.value=100)});function i(p){l("update:filters",p)}function u(p){i({risk:p})}function g(p){p==null?(i({balanceMin:null,balanceMax:null}),o.value=0,r.value=100):(o.value=p.min,r.value=p.max)}return(p,m)=>(e.openBlock(),e.createElementBlock("aside",{class:e.normalizeClass(["pelican-filters",{open:t.open}])},[e.createElementVNode("div",Ze,[m[13]||(m[13]=e.createElementVNode("label",{class:"ftitle"},"Risk",-1)),e.createElementVNode("button",{class:"btn-reset",type:"button",onClick:m[0]||(m[0]=c=>l("reset"))},"reset filters")]),e.createVNode(Be,{"model-value":t.filters.risk,"onUpdate:modelValue":u},null,8,["model-value"]),e.createVNode(Xe,{"model-value":t.investAmount,"onUpdate:modelValue":m[1]||(m[1]=c=>l("update:investAmount",c)),onApply:g},null,8,["model-value"]),e.createVNode(Z,{label:"Return %","model-value-min":s.value,"model-value-max":d.value,"format-raw":c=>e.unref(Ye)(c),"raw-to-domain":c=>e.unref(Y)(c),"scale-hints":["0%","200%","50K%+"],"max-label":"50K%+","onUpdate:modelValueMin":m[2]||(m[2]=c=>s.value=c??0),"onUpdate:modelValueMax":m[3]||(m[3]=c=>d.value=c??100)},null,8,["model-value-min","model-value-max","format-raw","raw-to-domain"]),e.createVNode(D,{label:"Max Drawdown ≤","model-value":t.filters.ddMax,min:0,max:100,step:5,"any-at":100,inverted:!0,format:c=>c+"%","onUpdate:modelValue":m[4]||(m[4]=c=>i({ddMax:c==null||c>=100?null:c}))},null,8,["model-value","format"]),e.createVNode(Z,{label:"Balance","model-value-min":o.value,"model-value-max":r.value,"format-raw":c=>e.unref(z)(c),"raw-to-domain":c=>e.unref(K)(c),"scale-hints":["$0","$10K","$10M"],"max-label":"$10M+","onUpdate:modelValueMin":m[5]||(m[5]=c=>o.value=c??0),"onUpdate:modelValueMax":m[6]||(m[6]=c=>r.value=c??100)},null,8,["model-value-min","model-value-max","format-raw","raw-to-domain"]),e.createVNode(D,{label:"Mgmt Fee ≤","model-value":t.filters.feeMax,min:0,max:100,step:5,"any-at":100,inverted:!0,format:c=>c+"%","onUpdate:modelValue":m[7]||(m[7]=c=>i({feeMax:c==null||c>=100?null:c}))},null,8,["model-value","format"]),e.createVNode(D,{label:"Copiers AUM ≥","model-value":t.filters.aumMin,min:0,max:5e6,step:5e4,format:c=>"≥ "+e.unref(z)(c),"onUpdate:modelValue":m[8]||(m[8]=c=>i({aumMin:c&&c>0?c:null}))},null,8,["model-value","format"]),e.createVNode(D,{label:"Copiers ≥","model-value":t.filters.copiersMin,min:0,max:3e3,step:10,format:c=>"≥ "+c,"onUpdate:modelValue":m[9]||(m[9]=c=>i({copiersMin:c&&c>0?c:null}))},null,8,["model-value","format"]),e.createVNode(D,{label:"Age ≥ (days)","model-value":t.filters.ageMin,min:0,max:3e3,step:10,format:c=>"≥ "+c+"d","onUpdate:modelValue":m[10]||(m[10]=c=>i({ageMin:c&&c>0?c:null}))},null,8,["model-value","format"]),e.createVNode(D,{label:"Trades ≥","model-value":t.filters.tradesMin,min:0,max:1e4,step:50,format:c=>"≥ "+c,"onUpdate:modelValue":m[11]||(m[11]=c=>i({tradesMin:c&&c>0?c:null}))},null,8,["model-value","format"]),e.createVNode(D,{label:"Win Rate ≥","model-value":t.filters.winrateMin,min:0,max:100,step:5,format:c=>"≥ "+c+"%","onUpdate:modelValue":m[12]||(m[12]=c=>i({winrateMin:c&&c>0?c:null}))},null,8,["model-value","format"])],2))}}),[["__scopeId","data-v-67cc5448"]]),ne=["#f97316","#3b82f6","#10b981","#a855f7","#ef4444","#eab308","#06b6d4","#ec4899","#14b8a6","#8b5cf6","#f59e0b","#22c55e"];function Qe(t,n=140,a=34){if(!t||t.length<2)return{hasData:!1,width:n,height:a,zeroY:a/2,areaPath:"",linePath:"",positive:!0,startX:1,endX:n-1};const l=t.map(E=>Date.parse(E.Timestamp)),s=l[0],d=l[l.length-1],o=d-s||1,r=t.map(E=>E.AccountReturn),i=Math.min(0,...r),g=Math.max(0,...r)-i||1,p=E=>(E-s)/o*(n-2)+1,m=E=>a-2-(E-i)/g*(a-4),c=t.map((E,y)=>`${p(l[y]).toFixed(1)},${m(E.AccountReturn).toFixed(1)}`),N=r[r.length-1],M=m(0),b=p(s),f=p(d),x=`M ${c.join(" L ")}`,$=`M ${c[0]} `+c.slice(1).map(E=>`L ${E}`).join(" ")+` L ${f.toFixed(1)},${M.toFixed(1)} L ${b.toFixed(1)},${M.toFixed(1)} Z`;return{hasData:!0,width:n,height:a,zeroY:M,areaPath:$,linePath:x,positive:N>=0,startX:b,endX:f}}function ve(t,n=520,a=280){const l=t.slice().sort((m,c)=>(c.c||0)-(m.c||0)),s=l.reduce((m,c)=>m+(c.c||0),0)||1,d=n/2,o=a/2,r=90,i=52,u=r+10;let g=-Math.PI/2;const p=[];return l.forEach((m,c)=>{const N=(m.c||0)/s,M=N*Math.PI*2,b=g,f=g+M;g=f;const x=(b+f)/2,$=M>Math.PI?1:0,E=d+r*Math.cos(b),y=o+r*Math.sin(b),k=d+r*Math.cos(f),h=o+r*Math.sin(f),V=d+i*Math.cos(b),C=o+i*Math.sin(b),I=d+i*Math.cos(f),_=o+i*Math.sin(f),S=`M ${E.toFixed(2)} ${y.toFixed(2)} A ${r} ${r} 0 ${$} 1 ${k.toFixed(2)} ${h.toFixed(2)} L ${I.toFixed(2)} ${_.toFixed(2)} A ${i} ${i} 0 ${$} 0 ${V.toFixed(2)} ${C.toFixed(2)} Z`,T=ne[c%ne.length];let ie=null,ce=0,de=0,me="start";if(N>=.015){const H=Math.cos(x)<0,jn=d+r*Math.cos(x),Wn=o+r*Math.sin(x),L=d+u*Math.cos(x),j=o+u*Math.sin(x),qn=H?L-4:L+4;ie=`${jn.toFixed(1)},${Wn.toFixed(1)} ${L.toFixed(1)},${j.toFixed(1)} ${qn.toFixed(1)},${j.toFixed(1)}`,ce=H?L-6:L+6,de=j+4,me=H?"end":"start"}p.push({marketName:m.n,count:m.c,fraction:N,color:T,arcPath:S,labelLine:ie,labelX:ce,labelY:de,labelAnchor:me})}),{width:n,height:a,cx:d,cy:o,outerR:r,innerR:i,slices:p}}const et=["width","height"],tt=["width","height","viewBox"],nt=["x2","y1","y2"],at=["d","fill"],lt=["d","stroke"],ot=w(e.defineComponent({__name:"Sparkline",props:{history:{},width:{default:140},height:{default:34}},setup(t){const n=t,a=e.computed(()=>Qe(n.history,n.width,n.height));return(l,s)=>a.value.hasData?(e.openBlock(),e.createElementBlock("svg",{key:1,class:"pelican-spark",width:a.value.width,height:a.value.height,viewBox:`0 0 ${a.value.width} ${a.value.height}`,preserveAspectRatio:"none",role:"img","aria-label":"Equity curve"},[e.createElementVNode("line",{x1:"0",x2:a.value.width,y1:a.value.zeroY,y2:a.value.zeroY,stroke:"var(--grid-line)","stroke-dasharray":"2 3","stroke-width":"1","vector-effect":"non-scaling-stroke"},null,8,nt),e.createElementVNode("path",{d:a.value.areaPath,fill:a.value.positive?"var(--area-green)":"var(--area-red)",stroke:"none"},null,8,at),e.createElementVNode("path",{d:a.value.linePath,fill:"none",stroke:a.value.positive?"var(--green)":"var(--red)","stroke-width":"1.6","stroke-linejoin":"round","stroke-linecap":"round","vector-effect":"non-scaling-stroke"},null,8,lt)],8,tt)):(e.openBlock(),e.createElementBlock("svg",{key:0,class:"pelican-spark",width:a.value.width,height:a.value.height,role:"img","aria-label":"No equity data"},[...s[0]||(s[0]=[e.createElementVNode("text",{x:"2",y:"20","font-size":"11",fill:"var(--spark-no-data)"},"no data",-1)])],8,et))}}),[["__scopeId","data-v-a9b85847"]]),st={key:0,class:"dim"},rt=["viewBox"],it=["d","fill"],ct=["points","stroke"],dt=["x","y","text-anchor"],mt={fill:"var(--muted)","font-weight":"400"},ut=w(e.defineComponent({__name:"MarketsDonut",props:{markets:{},width:{default:520},height:{default:280}},setup(t){const n=t,a=e.computed(()=>!n.markets||n.markets.length===0),l=e.computed(()=>ve(n.markets,n.width,n.height));return(s,d)=>a.value?(e.openBlock(),e.createElementBlock("span",st,"no market data")):(e.openBlock(),e.createElementBlock("svg",{key:1,class:"pelican-donut",viewBox:`0 0 ${l.value.width} ${l.value.height}`,width:"100%",preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":"Markets donut chart"},[e.createElementVNode("g",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.slices,o=>(e.openBlock(),e.createElementBlock("path",{key:o.marketName+o.fraction,d:o.arcPath,fill:o.color,stroke:"var(--card)","stroke-width":"1.5"},null,8,it))),128))]),e.createElementVNode("g",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.slices,o=>e.withDirectives((e.openBlock(),e.createElementBlock("polyline",{key:`l-${o.marketName}`,points:o.labelLine??"",stroke:o.color,"stroke-width":"1",fill:"none"},null,8,ct)),[[e.vShow,o.labelLine]])),128))]),e.createElementVNode("g",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.slices,o=>e.withDirectives((e.openBlock(),e.createElementBlock("text",{key:`t-${o.marketName}`,x:o.labelX,y:o.labelY,"text-anchor":o.labelAnchor,"font-size":"11",fill:"var(--text)","font-weight":"500"},[e.createTextVNode(e.toDisplayString(o.marketName)+" ",1),e.createElementVNode("tspan",mt,e.toDisplayString(o.count),1)],8,dt)),[[e.vShow,o.labelLine]])),128))])],8,rt))}}),[["__scopeId","data-v-c514d53f"]]),ft={class:"pelican-trades"},pt={class:"hd"},gt={key:0,class:"dim"},ht={key:1,class:"dim"},yt={key:2,class:"list"},kt={class:"market"},Mt={class:"trade-time"},ae=w(e.defineComponent({__name:"TradesPanel",props:{kind:{},trades:{},loading:{type:Boolean},locale:{}},setup(t){const n=t,a=e.computed(()=>n.kind==="open"?"Open Trades":"Trade History (30d)"),l=e.computed(()=>!n.loading&&(n.trades==null||n.trades.length===0));return(s,d)=>(e.openBlock(),e.createElementBlock("div",ft,[e.createElementVNode("div",pt,e.toDisplayString(a.value),1),t.loading?(e.openBlock(),e.createElementBlock("div",gt,"Loading…")):l.value?(e.openBlock(),e.createElementBlock("div",ht,"No trades.")):(e.openBlock(),e.createElementBlock("ul",yt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.trades??[],(o,r)=>(e.openBlock(),e.createElementBlock("li",{key:r},[e.createElementVNode("span",kt,e.toDisplayString(o.MarketName??"—"),1),e.createElementVNode("span",{class:e.normalizeClass(["dir",o.Direction==="Sell"?"red":"green"])},e.toDisplayString(o.Direction??""),3),e.createElementVNode("span",Mt,[e.createTextVNode(e.toDisplayString(e.unref(ee)(o.OpenTimestamp,t.locale))+" ",1),o.CloseTimestamp?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createTextVNode(" → "+e.toDisplayString(e.unref(ee)(o.CloseTimestamp,t.locale)),1)],64)):e.createCommentVNode("",!0)]),o.Pnl!=null?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["pnl",o.Pnl>=0?"green":"red"])},e.toDisplayString(e.unref(R)(o.Pnl,t.locale)),3)):e.createCommentVNode("",!0)]))),128))]))]))}}),[["__scopeId","data-v-aa7cbcd7"]]);function A(t){const n=t.Wins??0,a=t.Losses??0,l=n+a;return l?n/l*100:-1}const Nt=Symbol("pelican.apiBase"),bt=Symbol("pelican.catalogBase"),le=Symbol("pelican.locale"),Et=["data-id"],xt={class:"name"},Vt={class:"avatar"},wt={class:"avatar-fallback"},$t=["src"],St={class:"nm"},Bt={class:"title"},_t={key:0,class:"free-badge"},Ct={class:"by"},It={class:"c-spark","data-label":"Equity curve"},Dt={class:"c-num","data-label":"Return"},Tt={key:1},Rt={class:"c-num","data-label":"Copiers"},Pt={class:"c-num","data-label":"Copiers AUM"},At={class:"c-num","data-label":"Max DD"},Ft={key:1},Lt={class:"c-num","data-label":"Age"},Ut={class:"c-num","data-label":"Balance"},Ot={class:"c-num","data-label":"Fee"},zt=["href"],Kt={class:"grid"},Yt={class:"col-stats"},Gt={class:"field"},Ht={class:"value"},jt={class:"field"},Wt={class:"value"},qt={class:"field"},Xt={class:"value"},Zt={class:"field"},Jt={class:"value"},Qt={class:"field"},vt={class:"value"},en={class:"field"},tn={class:"value"},nn={class:"field"},an={class:"value"},ln={class:"field"},on={class:"value"},sn={key:0},rn={key:1,class:"dim"},cn={class:"col-donut"},dn={class:"trade-toggles"},mn=w(e.defineComponent({__name:"StrategyRow",props:{s:{},expanded:{type:Boolean},openTrades:{},closedTrades:{}},emits:["toggle","load-trades","select"],setup(t,{emit:n}){const a=t,l=n,s=e.inject(le,"en-US"),d=e.computed(()=>J(a.s.Return,1)),o=e.computed(()=>a.s.MaxDD!=null?J(a.s.MaxDD,2):null),r=e.computed(()=>P(a.s.Inception)),i=e.computed(()=>A(a.s)),u=e.computed(()=>i.value>=0?100-i.value:-1),g=e.computed(()=>{var b,f;return((b=a.s.Profile)==null?void 0:b.Name)??((f=a.s.Profile)!=null&&f.Id?"#"+a.s.Profile.Id:"")}),p=e.computed(()=>`https://libertex.copy-trade.io/strategy/${a.s.Id}`),m=e.ref(!1),c=e.ref(!1);function N(){m.value=!m.value,m.value&&!a.openTrades&&l("load-trades","open")}function M(){c.value=!c.value,c.value&&!a.closedTrades&&l("load-trades","closed")}return(b,f)=>{var x,$,E,y;return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("div",{class:e.normalizeClass(["pelican-row",{open:t.expanded}]),"data-id":t.s.Id,onClick:f[3]||(f[3]=k=>l("toggle"))},[e.createElementVNode("div",xt,[e.createElementVNode("div",Vt,[e.createElementVNode("span",wt,e.toDisplayString(e.unref(Ge)(t.s.Name)),1),t.s.ImageUploaded?(e.openBlock(),e.createElementBlock("img",{key:0,class:"avatar-img",src:`https://assets.copy-trade.io/images/strategies/thumbnails/${t.s.Id}`,alt:"",loading:"lazy",decoding:"async",onError:f[0]||(f[0]=k=>k.target.remove())},null,40,$t)):e.createCommentVNode("",!0)]),e.createElementVNode("div",St,[e.createElementVNode("div",Bt,[e.createTextVNode(e.toDisplayString(t.s.Name||"#"+t.s.Id)+" ",1),t.s._meta&&t.s.Fee==null?(e.openBlock(),e.createElementBlock("span",_t,"free")):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ct,e.toDisplayString(g.value),1)])]),e.createElementVNode("div",It,[e.createVNode(ot,{history:t.s.History},null,8,["history"])]),e.createElementVNode("div",Dt,[d.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(d.value.positive?"green":"red")},e.toDisplayString(d.value.text),3)):(e.openBlock(),e.createElementBlock("span",Tt,"—"))]),e.createElementVNode("div",Rt,e.toDisplayString(e.unref(v)(t.s.NumCopiers,e.unref(s))),1),e.createElementVNode("div",Pt,e.toDisplayString(e.unref(Q)(t.s.CopiersAUM,e.unref(s))),1),e.createElementVNode("div",At,[o.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(o.value.positive?"green":"red")},e.toDisplayString(o.value.text),3)):(e.openBlock(),e.createElementBlock("span",Ft,"—"))]),e.createElementVNode("div",Lt,e.toDisplayString(e.unref(Ke)(r.value)),1),e.createElementVNode("div",Ut,e.toDisplayString(e.unref(Q)(t.s.AccountBalance,e.unref(s))),1),e.createElementVNode("div",Ot,e.toDisplayString(e.unref(ze)(t.s)),1),e.createElementVNode("div",{class:"c-link",onClick:f[2]||(f[2]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("a",{class:"signal-link",href:p.value,target:"_blank",rel:"noopener",onClick:f[1]||(f[1]=e.withModifiers(()=>{},["stop"]))}," Get connected ",8,zt),e.renderSlot(b.$slots,"row-actions",{strategy:t.s},void 0,!0)])],10,Et),t.expanded?(e.openBlock(),e.createElementBlock("div",{key:0,class:"pelican-row-expanded",onClick:f[4]||(f[4]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",Kt,[e.createElementVNode("div",Yt,[e.createElementVNode("div",Gt,[f[5]||(f[5]=e.createElementVNode("div",{class:"label"},"Currency",-1)),e.createElementVNode("div",Ht,e.toDisplayString(t.s.Currency??"USD"),1)]),e.createElementVNode("div",jt,[f[6]||(f[6]=e.createElementVNode("div",{class:"label"},"Monthly profit",-1)),e.createElementVNode("div",Wt,e.toDisplayString(e.unref(R)(t.s.MonthlyProfit,e.unref(s))),1)]),e.createElementVNode("div",qt,[f[7]||(f[7]=e.createElementVNode("div",{class:"label"},"Yearly profit",-1)),e.createElementVNode("div",Xt,e.toDisplayString(e.unref(R)(t.s.YearlyProfit,e.unref(s))),1)]),e.createElementVNode("div",Zt,[f[8]||(f[8]=e.createElementVNode("div",{class:"label"},"Balance",-1)),e.createElementVNode("div",Jt,e.toDisplayString(e.unref(R)(t.s.AccountBalance,e.unref(s))),1)]),e.createElementVNode("div",Qt,[f[9]||(f[9]=e.createElementVNode("div",{class:"label"},"Realized P/L",-1)),e.createElementVNode("div",vt,e.toDisplayString(e.unref(R)(t.s.RealisedPnl,e.unref(s))),1)]),e.createElementVNode("div",en,[f[10]||(f[10]=e.createElementVNode("div",{class:"label"},"Unrealized P/L",-1)),e.createElementVNode("div",tn,e.toDisplayString(e.unref(R)(t.s.UnrealisedPnl,e.unref(s))),1)]),e.createElementVNode("div",nn,[f[11]||(f[11]=e.createElementVNode("div",{class:"label"},"Trades total",-1)),e.createElementVNode("div",an,e.toDisplayString(e.unref(v)(t.s.TradesTotal,e.unref(s))),1)]),e.createElementVNode("div",ln,[f[12]||(f[12]=e.createElementVNode("div",{class:"label"},"Win rate",-1)),e.createElementVNode("div",on,[i.value>=0?(e.openBlock(),e.createElementBlock("span",sn,e.toDisplayString(i.value.toFixed(1))+"% / "+e.toDisplayString(u.value.toFixed(1))+"%",1)):(e.openBlock(),e.createElementBlock("span",rn,"—"))])])]),e.createElementVNode("div",cn,[f[13]||(f[13]=e.createElementVNode("div",{class:"hd"},"Markets",-1)),e.createVNode(ut,{markets:t.s.Markets},null,8,["markets"])])]),e.createElementVNode("div",dn,[e.createElementVNode("button",{class:e.normalizeClass(["pill",{on:m.value}]),type:"button",onClick:N},e.toDisplayString(m.value?"Hide":"Open Trades"),3),e.createElementVNode("button",{class:e.normalizeClass(["pill",{on:c.value}]),type:"button",onClick:M},e.toDisplayString(c.value?"Hide":"Trade History"),3)]),m.value?(e.openBlock(),e.createBlock(ae,{key:0,kind:"open",trades:((x=t.openTrades)==null?void 0:x.trades)??null,loading:!!(($=t.openTrades)!=null&&$.loading),locale:e.unref(s)},null,8,["trades","loading","locale"])):e.createCommentVNode("",!0),c.value?(e.openBlock(),e.createBlock(ae,{key:1,kind:"closed",trades:((E=t.closedTrades)==null?void 0:E.trades)??null,loading:!!((y=t.closedTrades)!=null&&y.loading),locale:e.unref(s)},null,8,["trades","loading","locale"])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],64)}}}),[["__scopeId","data-v-61c1236b"]]),un={key:0,class:"pelican-pager"},fn=["disabled"],pn={key:0,class:"gap"},gn=["onClick"],hn=["disabled"],yn={class:"info"},kn=["max","value"],Mn=w(e.defineComponent({__name:"Pager",props:{page:{},totalPages:{},range:{}},emits:["go"],setup(t,{emit:n}){const a=t,l=n;function s(o){l("go",o)}function d(o){const r=parseInt(o.target.value,10);isNaN(r)||l("go",r)}return(o,r)=>a.totalPages>1?(e.openBlock(),e.createElementBlock("nav",un,[e.createElementVNode("button",{disabled:t.page<=1,onClick:r[0]||(r[0]=i=>s("prev"))},"‹ prev",8,fn),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.range,(i,u)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:u},[i==="…"?(e.openBlock(),e.createElementBlock("span",pn,"…")):(e.openBlock(),e.createElementBlock("button",{key:1,class:e.normalizeClass(["page",{cur:i===t.page}]),onClick:g=>s(i)},e.toDisplayString(i),11,gn))],64))),128)),e.createElementVNode("button",{disabled:t.page>=t.totalPages,onClick:r[1]||(r[1]=i=>s("next"))},"next ›",8,hn),e.createElementVNode("span",yn,[r[2]||(r[2]=e.createTextVNode(" go to ",-1)),e.createElementVNode("input",{type:"number",min:1,max:t.totalPages,value:t.page,onChange:d},null,40,kn)])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-42928155"]]),Nn={class:"pelican-table"},bn={class:"row head"},En=["onClick"],xn={key:0,class:"empty"},Vn=w(e.defineComponent({__name:"StrategyTable",props:{pageItems:{},expanded:{},sortKey:{},page:{},totalPages:{},pageRange:{},openSignals:{},closedSignals:{}},emits:["toggle-row","toggle-sort","load-trades","select","go"],setup(t,{emit:n}){const a=t,l=n,s=[{key:"return",label:"Return %"},{key:"copiers",label:"Copiers"},{key:"aum",label:"Copiers AUM"},{key:"dd",label:"Max Drawdown"},{key:"age",label:"Age"},{key:"balance",label:"Balance"},{key:"fee",label:"Mgmt Fee %"}];function d(o){return a.sortKey===`${o}-asc`?"active-asc":a.sortKey===`${o}-desc`?"active-desc":""}return(o,r)=>(e.openBlock(),e.createElementBlock("section",Nn,[e.createElementVNode("div",bn,[r[1]||(r[1]=e.createElementVNode("div",null,"Name",-1)),r[2]||(r[2]=e.createElementVNode("div",null,"Equity curve",-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(s,i=>e.createElementVNode("div",{key:i.key,class:e.normalizeClass(["c-num sortable",d(i.key)]),onClick:u=>l("toggle-sort",i.key)},e.toDisplayString(i.label),11,En)),64)),r[3]||(r[3]=e.createElementVNode("div",null,null,-1))]),t.pageItems.length===0?(e.openBlock(),e.createElementBlock("div",xn,[e.renderSlot(o.$slots,"empty",{},()=>[r[4]||(r[4]=e.createTextVNode("No matches.",-1))],!0)])):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(t.pageItems,i=>(e.openBlock(),e.createBlock(mn,{key:i.Id,s:i,expanded:t.expanded.has(i.Id),"open-trades":t.openSignals.get(i.Id)??null,"closed-trades":t.closedSignals.get(i.Id)??null,onToggle:u=>l("toggle-row",i.Id),onLoadTrades:u=>l("load-trades",{id:i.Id,kind:u}),onSelect:u=>l("select",i)},{"row-actions":e.withCtx(u=>[e.renderSlot(o.$slots,"row-actions",e.mergeProps({ref_for:!0},u),void 0,!0)]),_:3},8,["s","expanded","open-trades","closed-trades","onToggle","onLoadTrades","onSelect"]))),128)),e.createVNode(Mn,{page:t.page,"total-pages":t.totalPages,range:t.pageRange,onGo:r[0]||(r[0]=i=>l("go",i))},null,8,["page","total-pages","range"])]))}}),[["__scopeId","data-v-c61b9ce8"]]),wn={key:0,class:"pelican-progress"},$n={class:"bar"},Sn={class:"caption"},Bn=w(e.defineComponent({__name:"ProgressBar",props:{loaded:{},total:{},active:{type:Boolean}},setup(t){const n=t,a=e.computed(()=>n.total>0?Math.min(100,n.loaded/n.total*100):0);return(l,s)=>t.active?(e.openBlock(),e.createElementBlock("div",wn,[e.createElementVNode("div",$n,[e.createElementVNode("span",{style:e.normalizeStyle({width:a.value.toFixed(1)+"%"})},null,4)]),e.createElementVNode("div",Sn,"Refreshing strategy data · "+e.toDisplayString(a.value.toFixed(0))+"%",1)])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-032fb4e2"]]),oe="pelican-theme";function _n(t="auto"){const n=Cn(),a=e.ref(n??t),l=e.ref("dark"),s=typeof window<"u"&&window.matchMedia?window.matchMedia("(prefers-color-scheme: dark)"):null,d=()=>{const u=a.value;l.value=u==="dark"?"dark":u==="light"?"light":s!=null&&s.matches?"dark":"light"},o=()=>{a.value==="auto"&&d()};s&&(s.addEventListener?s.addEventListener("change",o):s.addListener(o)),e.watch(a,u=>{try{localStorage.setItem(oe,u)}catch{}d()}),d(),e.onScopeDispose(()=>{s&&(s.removeEventListener?s.removeEventListener("change",o):s.removeListener(o))});function r(u){a.value=u}function i(){a.value=a.value==="dark"?"light":a.value==="light"?"auto":"dark"}return{mode:a,resolved:l,setMode:r,cycle:i}}function Cn(){try{const t=localStorage.getItem(oe);return t==="dark"||t==="light"||t==="auto"?t:null}catch{return null}}function F(t,n,a){const l=new Error(n);return l.code=t,a!==void 0&&(l.status=a),l}async function G(t,n){const a=U(n,t);let l;try{l=await fetch(a)}catch(s){throw F("fetch_failed",s.message??"fetch failed")}if(l.status===401||l.status===503)throw F("no_token","Proxy has no token yet",l.status);if(!l.ok){const s=await l.text().catch(()=>"");throw F("http_error",`${l.status}: ${s.slice(0,120)}`,l.status)}return await l.json()}function U(t,n){if(!t)return n;const a=t.endsWith("/")?t.slice(0,-1):t,l=n.startsWith("/")?n:"/"+n;return a+l}function In({apiBase:t,catalogBase:n,onError:a}){const l=e.shallowRef(new Map),s=e.ref(!1),d=e.ref(!1),o=e.ref(0),r=e.ref(0),i=e.ref(null),u=e.computed(()=>Array.from(l.value.values()));let g=!1;const p=h=>{a?a(h):console.warn("[pelican-vue]",h)},m=()=>{const h=n==null?void 0:n.value;return!!h&&h!==t.value},c=()=>(n==null?void 0:n.value)||t.value;async function N(h){try{const C=await G(h?"/api/strategies-full?partial=1":"/api/strategies-full",c());r.value=C.length;const I=l.value;for(const _ of C)I.set(_.Id,{...I.get(_.Id),..._});e.triggerRef(l)}catch(V){p(V)}}async function M(){try{const h=await G("/api/strategies-full/progress",c());return o.value=h.loaded,r.value=h.total||r.value,d.value=h.building,i.value=h.built_at,h}catch(h){return p(h),null}}async function b(){if(m()){await N(!1),M(),s.value=!0;return}await N(!0);let h=Date.now();for(;!g;){const V=await M();if(!V){await re(1500);continue}if(V.ready)break;Date.now()-h>he&&(await N(!0),h=Date.now()),await re(ge)}g||(await N(!1),s.value=!0)}const f=new Set;async function x(h){var C;if(f.has(h))return;const V=l.value.get(h);if(!(V!=null&&V._enrichAttempted&&V._meta&&V._stats&&((C=V.History)!=null&&C.length))){f.add(h);try{const[I,_]=await Promise.all([se(U(t.value,`/api/strategies/${h}`)),se(U(t.value,`/api/strategies/${h}/stats`))]),S=l.value,T=S.get(h)??{Id:h};Dn(T,I),Tn(T,_),T._enrichAttempted=!0,T.IsEnabled===!1?S.delete(h):S.set(h,T),e.triggerRef(l)}finally{f.delete(h)}}}async function $(h){if(!(!h||!s.value))try{const V=await G(`/api/strategies?filter=${encodeURIComponent(h)}`,t.value),C=l.value,I=[];let _=0;for(const S of V)C.has(S.Id)||(C.set(S.Id,{...S,_stats:!1,_meta:!1}),I.push(S.Id),_++);_&&(r.value+=_,e.triggerRef(l));for(const S of I)x(S)}catch(V){p(V)}}function E(){g=!1,b()}function y(){g=!0}async function k(){y(),l.value=new Map,s.value=!1,o.value=0,r.value=0,i.value=null,E()}return e.onScopeDispose(y),{catalog:u,ready:s,building:d,loaded:o,total:r,builtAt:i,enrichOne:x,searchExtra:$,refresh:k,start:E,stop:y}}async function se(t){try{const n=await fetch(t);return n.ok?await n.json():null}catch{return null}}function Dn(t,n){n&&(t.Name=n.Name??t.Name,t.NumCopiers=n.NumCopiers??null,t.Fee=n.Fee??null,t.RiskProfile=n.RiskProfile??null,t.IsSimulated=n.IsSimulated??!1,n.IsEnabled!==void 0&&(t.IsEnabled=n.IsEnabled),n.ImageUploaded!==void 0&&(t.ImageUploaded=n.ImageUploaded),t.Profile=n.Profile??t.Profile,t._meta=!0)}function Tn(t,n){var r,i,u,g,p,m;if(!n)return;const a=((r=n.Profitability)==null?void 0:r.Inception)??{},l=((i=n.Trades)==null?void 0:i.Inception)??{},s=a.History??[],d=s.length>60?Math.ceil(s.length/60):1,o=s.filter((c,N)=>N%d===0||N===s.length-1).map(c=>({Timestamp:c.Timestamp,AccountReturn:c.AccountReturn}));t.Inception=n.Inception??t.Inception,t.Currency=n.CurrencyCode||"USD",t.Return=a.UnrealisedReturn!=null?a.UnrealisedReturn*100:a.RealisedReturn!=null?a.RealisedReturn*100:null,t.MaxDD=a.MaxDrawdown!=null?a.MaxDrawdown*100:null,t.RealisedPnl=a.RealisedPnl??null,t.UnrealisedPnl=a.UnrealisedPnl??null,t.History=o,t.TradesTotal=l.Total??0,t.Wins=l.Wins??0,t.Losses=l.Losses??0,t.Markets=Array.isArray(l.Markets)?l.Markets.slice(0,12).map(c=>({n:c.MarketName,c:c.Count})):[],t.AccountBalance=((u=n.Status)==null?void 0:u.Balance)??null,t.CopiersAUM=((g=n.CopiersBalance)==null?void 0:g.Balance)??null,t.MonthlyProfit=((p=n.CopiersProfit)==null?void 0:p.Month)??null,t.YearlyProfit=((m=n.CopiersProfit)==null?void 0:m.Year)??null,t._stats=!0}function re(t){return new Promise(n=>setTimeout(n,t))}function O(){return{risk:new Set,retMin:null,retMax:null,ddMax:null,aumMin:null,copiersMin:null,ageMin:null,tradesMin:null,winrateMin:null,feeMax:null,balanceMin:null,balanceMax:null,search:""}}function Rn(t,n={}){const a=O(),l=e.reactive({...a,...n,risk:new Set(n.risk??a.risk)}),s=e.computed(()=>t.value.filter(o=>Pn(o,l)));function d(){const o=O();l.risk=o.risk,l.retMin=null,l.retMax=null,l.ddMax=null,l.aumMin=null,l.copiersMin=null,l.ageMin=null,l.tradesMin=null,l.winrateMin=null,l.feeMax=null,l.balanceMin=null,l.balanceMax=null,l.search=""}return{filters:l,filtered:s,reset:d}}function Pn(t,n){var s;if(n.search){const d=n.search.toLowerCase();if(!(t.Name||"").toLowerCase().includes(d)&&!(((s=t.Profile)==null?void 0:s.Name)||"").toLowerCase().includes(d))return!1}if(n.risk.size&&t.RiskProfile&&!n.risk.has(t.RiskProfile)||t.IsSimulated||t._stats&&!t.TradesTotal||n.copiersMin!=null&&(t.NumCopiers??0)<n.copiersMin||n.aumMin!=null&&(t.CopiersAUM??0)<n.aumMin||n.balanceMin!=null&&(t.AccountBalance??0)<n.balanceMin||n.balanceMax!=null&&(t.AccountBalance??1/0)>n.balanceMax||n.feeMax!=null&&t.Fee!=null&&t.Fee*100>n.feeMax||n.tradesMin!=null&&(t.TradesTotal??0)<n.tradesMin)return!1;const a=A(t);if(n.winrateMin!=null&&(a<0||a<n.winrateMin))return!1;const l=P(t.Inception);return!(n.ageMin!=null&&(l==null||l<n.ageMin)||n.retMin!=null&&(t.Return==null||t.Return<n.retMin)||n.retMax!=null&&(t.Return==null||t.Return>n.retMax)||n.ddMax!=null&&t.MaxDD!=null&&Math.abs(t.MaxDD)>n.ddMax)}const An={"return-desc":(t,n)=>(n.Return??-1e18)-(t.Return??-1e18),"return-asc":(t,n)=>(t.Return??1e18)-(n.Return??1e18),"dd-asc":(t,n)=>Math.abs(t.MaxDD??1e9)-Math.abs(n.MaxDD??1e9),"dd-desc":(t,n)=>Math.abs(n.MaxDD??-1e9)-Math.abs(t.MaxDD??-1e9),"aum-desc":(t,n)=>(n.CopiersAUM??-1)-(t.CopiersAUM??-1),"aum-asc":(t,n)=>(t.CopiersAUM??1/0)-(n.CopiersAUM??1/0),"copiers-desc":(t,n)=>(n.NumCopiers??-1)-(t.NumCopiers??-1),"copiers-asc":(t,n)=>(t.NumCopiers??1/0)-(n.NumCopiers??1/0),"fee-asc":(t,n)=>(t.Fee??1/0)-(n.Fee??1/0),"fee-desc":(t,n)=>(n.Fee??-1)-(t.Fee??-1),"age-desc":(t,n)=>(P(n.Inception)??-1)-(P(t.Inception)??-1),"age-asc":(t,n)=>(P(t.Inception)??1/0)-(P(n.Inception)??1/0),"balance-desc":(t,n)=>(n.AccountBalance??-1)-(t.AccountBalance??-1),"balance-asc":(t,n)=>(t.AccountBalance??1/0)-(n.AccountBalance??1/0),"winrate-desc":(t,n)=>A(n)-A(t),"winrate-asc":(t,n)=>A(t)-A(n),"trades-desc":(t,n)=>(n.TradesTotal??-1)-(t.TradesTotal??-1),"trades-asc":(t,n)=>(t.TradesTotal??1/0)-(n.TradesTotal??1/0),"monthly-desc":(t,n)=>(n.MonthlyProfit??-1e18)-(t.MonthlyProfit??-1e18),"monthly-asc":(t,n)=>(t.MonthlyProfit??1e18)-(n.MonthlyProfit??1e18)};function Fn(t,n="return-desc"){const a=e.ref(n),l=e.computed(()=>{const d=An[a.value]??(()=>0);return t.value.slice().sort(d)});function s(d){const[o,r]=X[d];a.value=a.value===o?r:o}return{sortKey:a,sorted:l,toggleColumn:s,setKey:d=>{a.value=d}}}function Ln(t,n){const a=e.ref(1),l=e.computed(()=>Math.max(1,Math.ceil(t.value.length/n)));e.watch(l,o=>{a.value>o&&(a.value=o),a.value<1&&(a.value=1)});const s=e.computed(()=>{const o=(a.value-1)*n;return t.value.slice(o,o+n)}),d=e.computed(()=>{const o=a.value,r=l.value;if(r<=1)return[];const u=[...new Set([1,r,o,o-1,o+1,o-2,o+2,2,r-1])].filter(p=>p>=1&&p<=r).sort((p,m)=>p-m),g=[];for(let p=0;p<u.length;p++)p&&u[p]-u[p-1]>1&&g.push("…"),g.push(u[p]);return g});return{page:a,totalPages:l,pageItems:s,pageRange:d,setPage:o=>{a.value=Math.max(1,Math.min(l.value,o))},next:()=>{a.value<l.value&&(a.value+=1)},prev:()=>{a.value>1&&(a.value-=1)}}}function Un(t){const n=e.ref(new Map),a=e.ref(new Map);function l(d,o){return(o==="open"?n.value:a.value).get(d)??null}async function s(d,o){const r=o==="open"?n:a,i=r.value.get(d);if(i&&(i.loading||i.trades!==null))return;const u=new Map(r.value);u.set(d,{loading:!0,trades:null,error:null}),r.value=u;let g="";if(o==="closed"){const M=new Date,b=new Date(Date.now()-ye*864e5),f=x=>x.toISOString().replace(/\.\d+Z$/,"Z");g=`?startDate=${encodeURIComponent(f(b))}&endDate=${encodeURIComponent(f(M))}`}const p=U(t.value,`/api/strategies/${d}/signals/${o}${g}`);let m=[],c=null;try{const M=await fetch(p);if(!M.ok)throw F("http_error",`${M.status}`);m=await M.json()}catch(M){c=M.code?M:F("fetch_failed",M.message),m=[]}const N=new Map(r.value);N.set(d,{loading:!1,trades:m,error:c}),r.value=N}return{open:n,closed:a,load:s,get:l}}const On=["data-theme"],zn={class:"brand-row"},Kn=["title"],Yn={"aria-hidden":"true"},Gn={class:"pelican-main"},Hn=w(e.defineComponent({__name:"PelicanLibertexSocial",props:{apiBase:{},catalogBase:{},theme:{default:"auto"},defaultSort:{default:"return-desc"},defaultFilters:{},columns:{},locale:{default:"en-US"},pageSize:{default:fe}},emits:["update:theme","select-strategy","error"],setup(t,{emit:n}){const a=t,l=n;e.provide(Nt,a.apiBase),e.provide(bt,a.catalogBase??a.apiBase),e.provide(le,a.locale);const s=e.toRef(a,"apiBase"),d=e.toRef(a,"catalogBase"),o=_n(a.theme);e.watch(o.mode,y=>l("update:theme",y)),e.watch(()=>a.theme,y=>o.setMode(y));const r=In({apiBase:s,catalogBase:d,onError:y=>l("error",y)}),i=Rn(r.catalog,a.defaultFilters??{}),u=Fn(i.filtered,a.defaultSort),g=Ln(u.sorted,a.pageSize),p=Un(s);e.watch(g.pageItems,y=>{y.forEach(k=>{var h;(h=k.History)!=null&&h.length||r.enrichOne(k.Id)})},{immediate:!0});const m=e.reactive(new Set),c=e.ref(!1),N=e.ref(null);function M(y){m.has(y)?m.delete(y):m.add(y);const k=r.catalog.value.find(h=>h.Id===y);k&&((!k._meta||!k._stats)&&!k._enrichAttempted&&r.enrichOne(y),l("select-strategy",k))}function b(y){u.toggleColumn(y),g.setPage(1)}function f(y){Object.assign(i.filters,y),g.setPage(1)}function x(){const y=O();Object.assign(i.filters,y),i.filters.risk=y.risk,N.value=null,g.setPage(1)}function $({id:y,kind:k}){p.load(y,k)}function E(y){y==="prev"?g.prev():y==="next"?g.next():g.setPage(y)}return e.onMounted(()=>r.start()),(y,k)=>(e.openBlock(),e.createElementBlock("div",{class:"pelican-libsoc","data-theme":e.unref(o).resolved.value},[e.createElementVNode("header",zn,[e.renderSlot(y.$slots,"brand",{},()=>[k[6]||(k[6]=e.createElementVNode("div",{class:"default-brand"},"Libertex Social — Copy Trading",-1))],!0),e.createElementVNode("button",{class:"theme-toggle",type:"button",title:e.unref(o).mode.value,onClick:k[0]||(k[0]=(...h)=>e.unref(o).cycle&&e.unref(o).cycle(...h))},[e.createElementVNode("span",Yn,e.toDisplayString(e.unref(o).resolved.value==="dark"?"🌙":"☀️"),1)],8,Kn)]),e.createVNode(we,{search:e.unref(i).filters.search,"sort-key":e.unref(u).sortKey.value,total:e.unref(r).total.value,"filtered-total":e.unref(i).filtered.value.length,page:e.unref(g).page.value,"total-pages":e.unref(g).totalPages.value,"onUpdate:search":k[1]||(k[1]=h=>f({search:h})),"onUpdate:sortKey":k[2]||(k[2]=h=>e.unref(u).setKey(h)),onRefresh:e.unref(r).refresh,onToggleFilters:k[3]||(k[3]=h=>c.value=!c.value)},null,8,["search","sort-key","total","filtered-total","page","total-pages","onRefresh"]),e.createVNode(Bn,{loaded:e.unref(r).loaded.value,total:e.unref(r).total.value,active:e.unref(r).building.value&&!e.unref(r).ready.value},null,8,["loaded","total","active"]),e.createElementVNode("main",Gn,[e.createVNode(Je,{filters:e.unref(i).filters,"invest-amount":N.value,open:c.value,"onUpdate:filters":f,"onUpdate:investAmount":k[4]||(k[4]=h=>N.value=h),onReset:x},null,8,["filters","invest-amount","open"]),e.createVNode(Vn,{"page-items":e.unref(g).pageItems.value,expanded:m,"sort-key":e.unref(u).sortKey.value,page:e.unref(g).page.value,"total-pages":e.unref(g).totalPages.value,"page-range":e.unref(g).pageRange.value,"open-signals":e.unref(p).open.value,"closed-signals":e.unref(p).closed.value,onToggleRow:M,onToggleSort:b,onLoadTrades:$,onSelect:k[5]||(k[5]=h=>l("select-strategy",h)),onGo:E},{empty:e.withCtx(()=>[e.renderSlot(y.$slots,"empty",{},()=>[k[7]||(k[7]=e.createTextVNode("No matches.",-1))],!0)]),"row-actions":e.withCtx(h=>[e.renderSlot(y.$slots,"row-actions",e.normalizeProps(e.guardReactiveProps(h)),void 0,!0)]),_:3},8,["page-items","expanded","sort-key","page","total-pages","page-range","open-signals","closed-signals"])])],8,On))}}),[["__scopeId","data-v-e2cce41d"]]);B.PelicanLibertexSocial=Hn,B.SORT_KEYS=W,B.SORT_LABELS=q,B.SORT_TOGGLE=X,B.defaultFilters=O,Object.defineProperty(B,Symbol.toStringTag,{value:"Module"})});
|
|
2
8
|
//# sourceMappingURL=pelican-libertex-social.umd.cjs.map
|