mirror of
https://github.com/pyMC-dev/pyMC_Repeater.git
synced 2026-08-10 19:03:22 +02:00
1 line
50 KiB
JavaScript
1 line
50 KiB
JavaScript
import{C as e,D as t,N as n,P as r,T as i,U as a,X as o,_t as s,c,f as l,gt as u,h as d,ht as f,j as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,x,y as S,z as C}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as w,l as T}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as ee}from"./packets-BoR1a5V0.js";import{t as E}from"./system-BmJnUIFH.js";import{t as D}from"./dataService-DRVYk7u4.js";import{t as O}from"./Spinner-CMJUE3iy.js";import{t as k}from"./websocket-CNooJnNy.js";import{c as A,d as j,s as te,t as M}from"./index-DF7On1cp.js";import{d as N,f as P,g as F,l as ne,n as I,o as re,s as ie,t as ae,u as oe}from"./ChartCard-CqRDi7sc.js";import{n as se,t as ce}from"./SignalBars-DPqSedo4.js";import{t as le}from"./PacketDetailsModal-76H_BUYF.js";var ue={class:`sparkline-card`},de={class:`card-header`},L={class:`card-title`},R={class:`card-values`},z={class:`card-chart`},B=j(d({name:`ChartSparkline`,__name:`ChartSparkline`,props:{title:{},value:{},color:{},data:{default:()=>[]},showChart:{type:Boolean,default:!0},secondaryValue:{default:void 0},secondaryLabel:{default:``},secondaryColor:{default:``},secondaryData:{default:()=>[]}},setup(t){ie.register(re,N,P,oe,ne,F);let n=t,r=a(null),o=a(null),c=e=>{let t=e.trim();if(typeof window>`u`)return t;let n=t;for(let e=0;e<4&&n.startsWith(`var(`);e++){let e=n.match(/^var\(\s*(--[\w-]+)\s*(?:,\s*([^\)]+))?\s*\)$/);if(!e)break;let[,t,r]=e;n=window.getComputedStyle(document.documentElement).getPropertyValue(t).trim()||(r?.trim()??n)}return n},l=e=>{if(e.length<3)return e;let t=Math.min(15,Math.max(3,Math.floor(e.length*.2))),n=[];for(let r=0;r<e.length;r++){let i=Math.floor(t/2),a=Math.max(0,r-i),o=Math.min(e.length,r+i+1),s=e.slice(a,o);n.push(s.reduce((e,t)=>e+t,0)/s.length)}let r=Math.min(12,n.length),i=n.length/r,a=[];for(let e=0;e<r;e++){let t=Math.floor(e*i);a.push(n[t])}return a},d=g(()=>!n.data||n.data.length===0?[]:l(n.data)),f=g(()=>!n.secondaryData||n.secondaryData.length===0?[]:l(n.secondaryData)),h=()=>{if(!r.value)return;let e=r.value.getContext(`2d`);if(!e)return;o.value&&=(o.value.destroy(),null);let t=d.value;if(t.length<2)return;let i=[{data:t,borderColor:c(n.color),borderWidth:2.5,fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}],a=f.value;a.length>=2&&n.secondaryColor&&i.push({data:a,borderColor:c(n.secondaryColor),borderWidth:2,borderDash:[4,3],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}),o.value=C(new ie(e,{type:`line`,data:{labels:t.map((e,t)=>t.toString()),datasets:i},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:800,easing:`easeOutQuart`},plugins:{legend:{display:!1},tooltip:{enabled:!1}},scales:{x:{display:!1,grid:{display:!1}},y:{display:!1,grid:{display:!1},grace:`10%`}},elements:{line:{capBezierPoints:!0}}}}))},_=()=>{if(!o.value){h();return}let e=d.value;if(e.length<2)return;o.value.data.labels=e.map((e,t)=>t.toString()),o.value.data.datasets[0].data=e;let t=f.value;t.length>=2&&n.secondaryColor&&(o.value.data.datasets.length<2?o.value.data.datasets.push({data:t,borderColor:c(n.secondaryColor),borderWidth:2,borderDash:[4,3],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}):o.value.data.datasets[1].data=t),o.value.update(`default`)};return p(()=>n.data,()=>{S(()=>_())},{deep:!0}),p(()=>n.color,()=>{o.value&&(o.value.data.datasets[0].borderColor=c(n.color),o.value.update(`none`))}),p(()=>n.secondaryColor,()=>{o.value&&o.value.data.datasets.length>1&&(o.value.data.datasets[1].borderColor=c(n.secondaryColor),o.value.update(`none`))}),e(()=>{S(()=>h())}),x(()=>{o.value&&=(o.value.destroy(),null)}),(e,n)=>(i(),b(`div`,ue,[y(`div`,de,[y(`p`,L,s(t.title),1),y(`div`,R,[y(`span`,{class:`card-value`,style:u({color:t.color})},s(typeof t.value==`number`?t.value.toLocaleString():t.value),5),t.secondaryValue===void 0?m(``,!0):(i(),b(`span`,{key:0,class:`card-secondary-value`,style:u({color:t.secondaryColor})},s(t.secondaryLabel)+s(typeof t.secondaryValue==`number`?t.secondaryValue.toLocaleString():t.secondaryValue),5))])]),y(`div`,z,[t.showChart?(i(),b(`canvas`,{key:0,ref_key:`canvasRef`,ref:r},null,512)):m(``,!0)])]))}}),[[`__scopeId`,`data-v-9b0980f5`]]),fe={class:`grid grid-cols-2 md:grid-cols-3 lg:grid-cols-7 gap-3 lg:gap-4 mb-5 stats-cards-container`},pe=j(d({name:`StatsCards`,__name:`StatsCards`,setup(t){let n={uptime:`var(--color-primary)`,rx:`var(--color-primary)`,forward:`var(--color-secondary)`,dropped:`var(--color-accent-red)`,policy:`var(--color-accent-cyan)`,crcErrors:`var(--color-accent-red)`,hashCache:`var(--color-secondary)`},r=ee(),a=E(),o=D(),s=e=>{let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h`:n>0?`${n}h ${r}m`:`${r}m`},c=g(()=>{let e=r.packetStats,t=a.stats?.uptime_seconds||0,n=e?.total_packets||0,i=e?.dropped_packets||0,o=e?.drop_reasons?.reduce((e,t)=>typeof t?.reason==`string`&&t.reason.startsWith(`Policy blocked packet`)?e+(t.count||0):e,0)||0;return{packetsReceived:n,packetsForwarded:e?.transmitted_packets||0,uptimeFormatted:s(t),droppedPackets:i,policyEvents:o,crcErrorCount:r.crcErrorCount,hashCacheSize:r.systemStats?.duplicate_cache_size??0}}),l=g(()=>r.sparklineData);return e(()=>{o.ensure(`sparklines`)}),(e,t)=>(i(),b(`div`,fe,[h(B,{title:`Up Time`,value:c.value.uptimeFormatted,color:n.uptime,data:[],showChart:!1,class:`stat-card`},null,8,[`value`,`color`]),h(B,{title:`RX Packets`,value:c.value.packetsReceived,color:n.rx,data:l.value.totalPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Forward`,value:c.value.packetsForwarded,color:n.forward,data:l.value.transmittedPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Dropped`,value:c.value.droppedPackets,color:n.dropped,data:l.value.droppedPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Policy Events`,value:c.value.policyEvents,color:n.policy,data:l.value.policyEvents,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`CRC Errors`,value:c.value.crcErrorCount,color:n.crcErrors,data:l.value.crcErrors,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Hash Cache`,value:c.value.hashCacheSize,color:n.hashCache,showChart:!1,class:`stat-card`},null,8,[`value`,`color`])]))}}),[[`__scopeId`,`data-v-c0acbf34`]]),V={class:`glass-card rounded-[10px] p-4 lg:p-6`},H={key:0,class:`absolute inset-0 flex items-center justify-center`},U={key:1,class:`h-full flex flex-col`},me={key:0,class:`absolute top-2 left-1/2 -translate-x-1/2 bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke rounded-lg px-3 py-2 z-10 pointer-events-none min-w-48`},W={class:`text-content-primary text-sm font-medium mb-1`},he={class:`text-content-primary`},ge={class:`flex-1 flex items-end justify-evenly gap-4 px-4`},_e=[`onMouseenter`],ve={class:`text-content-primary text-xs sm:text-sm font-semibold text-center w-full pb-1`},G={class:`text-content-secondary dark:text-content-muted text-xs mt-2 text-center`},ye={key:0,class:`mt-4 flex flex-wrap justify-center gap-3 sm:gap-4 px-2 sm:px-4 text-[10px] sm:text-xs text-content-secondary dark:text-content-muted`},be={class:`truncate text-left`},xe={key:1,class:`mt-3 text-xs text-content-secondary dark:text-content-muted text-center`},K=j(d({name:`PacketTypesChart`,__name:`PacketTypesChart`,setup(r){let o=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,c=a([]),l=ee(),d=k(),f=a(!0),_=a(!1),x=a(null),S=a(`Connecting...`),C=a(null),w=[{name:`Payload`,types:[`Plain Text Message`,`Group Text Message`,`Group Datagram`,`Multi-part Packet`],subColors:[o(`--color-primary`,`deepskyblue`),o(`--openhop-blue-light`,`lightskyblue`),o(`--color-badge-cyan-text`,`dodgerblue`),o(`--color-badge-cyan-bg`,`lightblue`)]},{name:`Requests`,types:[`Request`,`Response`,`Anonymous Request`],subColors:[o(`--color-accent-green`,`limegreen`),o(`--color-accent-green-bg`,`lightgreen`),o(`--color-glass-green-border`,`mediumseagreen`)]},{name:`Control`,types:[`Node Advertisement`,`Acknowledgment`,`Returned Path`],subColors:[o(`--color-accent-cyan`,`cyan`),o(`--color-accent-cyan-bg`,`paleturquoise`),o(`--color-primary-bg`,`khaki`)]},{name:`Routing`,types:[`Trace`],subColors:[o(`--color-secondary`,`violet`)]},{name:`Reserved`,types:[`Reserved Type 11`,`Reserved Type 12`,`Reserved Type 13`],subColors:[o(`--color-text-muted`,`gray`),o(`--color-border-hover`,`darkgray`),o(`--color-border`,`silver`)]}],T=g(()=>w.map(e=>{let t=c.value.filter(t=>e.types.some(e=>t.name.includes(e)||t.name===e)).sort((e,t)=>t.count-e.count).map((t,n)=>({...t,color:e.subColors[n%e.subColors.length]}));return{name:e.name,color:e.subColors[0],items:t,total:t.reduce((e,t)=>e+t.count,0)}}).filter(e=>e.total>0)),E=g(()=>Math.max(...T.value.map(e=>e.total),1)),D=g(()=>T.value.reduce((e,t)=>e+t.total,0)),O=async()=>{S.value=`Connecting...`,x.value=null,f.value||(_.value=!0);try{let e=await I(`/packet_type_graph_data`,void 0,{onPhaseChange:e=>{S.value=e===`receiving`?`Receiving data...`:`Connecting...`}});if(e?.success&&e?.data){let t=e.data;if(t?.series){let e=[];t.series.forEach((t,n)=>{let r=0;t.data&&Array.isArray(t.data)&&(r=t.data.reduce((e,t)=>e+(t[1]||0),0)),r>0&&e.push({name:t.name||`Type ${t.type}`,type:t.type,count:r,color:``})}),c.value=e,f.value=!1,_.value=!1}else x.value=`No series data in server response`,f.value=!1,_.value=!1}else x.value=`Invalid response from server`,f.value=!1,_.value=!1}catch(e){x.value=e instanceof Error?e.message:`Failed to load data`,f.value=!1,_.value=!1}},A={0:`Request`,1:`Response`,2:`Plain Text Message`,3:`Acknowledgment`,4:`Node Advertisement`,5:`Group Text Message`,6:`Group Datagram`,7:`Anonymous Request`,8:`Returned Path`,9:`Trace`,10:`Multi-part Packet`,15:`Custom Packet`},j=()=>{let e=l.packetTypeBreakdown;!e||e.length===0||(c.value=e.map(e=>({name:A[Number(e.type)]||`Type ${e.type}`,type:e.type,count:e.count,color:``})),f.value=!1,x.value=null)},te=e=>Math.max(e/E.value*90,2),N=(e,t)=>t===0?0:e/t*100;return e(()=>{O()}),p(()=>l.packetTypeBreakdown,()=>j(),{deep:!0,immediate:!0}),M(O,{intervalMs:3e4,enabled:()=>!d.isConnected,immediate:!0}),(e,r)=>(i(),b(`div`,V,[r[2]||=y(`div`,{class:`flex items-baseline justify-between mb-3 lg:mb-4`},[y(`h3`,{class:`text-content-primary text-lg lg:text-xl font-semibold`},` Packet Types `),y(`p`,{class:`text-content-secondary dark:text-content-muted text-xs lg:text-sm uppercase`},` Distribution by Type `)],-1),h(ae,{class:`h-48 lg:h-56`,"is-loading":f.value,"is-updating":_.value,error:x.value,status:S.value,onRetry:O},{default:n(()=>[T.value.length===0&&!f.value&&!x.value?(i(),b(`div`,H,[...r[1]||=[y(`div`,{class:`text-content-secondary dark:text-content-primary text-sm lg:text-base`},` No packet data available `,-1)]])):m(``,!0),T.value.length>0?(i(),b(`div`,U,[C.value?(i(),b(`div`,me,[y(`div`,W,s(C.value.name)+` · `+s(C.value.total.toLocaleString()),1),(i(!0),b(v,null,t(C.value.items,e=>(i(),b(`div`,{key:e.type,class:`flex justify-between gap-4 text-xs text-content-secondary dark:text-content-muted`},[y(`span`,null,s(e.name),1),y(`span`,he,s(e.count.toLocaleString()),1)]))),128))])):m(``,!0),y(`div`,ge,[(i(!0),b(v,null,t(T.value,e=>(i(),b(`div`,{key:e.name,class:`flex flex-col items-center flex-1 max-w-32 h-full justify-end cursor-pointer`,onMouseenter:t=>C.value=e,onMouseleave:r[0]||=e=>C.value=null},[y(`span`,ve,s(e.total.toLocaleString()),1),y(`div`,{class:`w-full rounded-[5px] transition-all duration-300 ease-out hover:opacity-90 overflow-hidden flex flex-col-reverse`,style:u({height:te(e.total)+`%`,minHeight:`8px`})},[(i(!0),b(v,null,t(e.items,t=>(i(),b(`div`,{key:t.type,style:u({height:N(t.count,e.total)+`%`,backgroundColor:t.color})},null,4))),128))],4),y(`span`,G,s(e.name),1)],40,_e))),128))])])):m(``,!0)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`]),T.value.length>0?(i(),b(`div`,ye,[(i(!0),b(v,null,t(T.value,e=>(i(),b(`div`,{key:`legend-`+e.name,class:`flex flex-col gap-0.5 min-w-[100px] max-w-[140px] flex-shrink-0`},[(i(!0),b(v,null,t(e.items,e=>(i(),b(`div`,{key:e.type,class:`flex items-center gap-1.5`},[y(`span`,{class:`w-2 h-2 rounded-sm shrink-0`,style:u({backgroundColor:e.color})},null,4),y(`span`,be,s(e.name),1)]))),128))]))),128))])):m(``,!0),T.value.length>0?(i(),b(`div`,xe,` Total: `+s(D.value.toLocaleString())+` packets `,1)):m(``,!0)]))}}),[[`__scopeId`,`data-v-b302d2e6`]]),Se={class:`glass-card rounded-[10px] p-4 lg:p-6`},Ce={class:`mt-3 lg:mt-4 grid grid-cols-2 gap-3 lg:gap-4`},we={class:`text-center`},Te={class:`text-lg lg:text-2xl font-bold text-content-primary`},q={class:`text-center`},Ee={class:`text-lg lg:text-2xl font-bold text-content-primary`},J={class:`mt-2 lg:mt-3 grid grid-cols-3 gap-2 lg:gap-3 text-center`},De={class:`text-xs lg:text-sm font-semibold text-accent-purple flex items-center justify-center gap-1`},Oe={key:0,class:`inline-block w-1.5 h-1.5 rounded-full bg-secondary opacity-70`,title:`Early data - limited uptime`},ke={class:`text-xs text-content-secondary dark:text-content-muted`},Ae={class:`text-xs lg:text-sm font-semibold text-accent-red flex items-center justify-center gap-1`},je={key:0,class:`inline-block w-1.5 h-1.5 rounded-full bg-secondary opacity-70`,title:`Early data - limited uptime`},Me={class:`text-xs text-content-secondary dark:text-content-muted`},Ne={class:`text-xs lg:text-sm font-semibold text-accent-red`},Y=null,Pe=12e4,Fe=j(d({name:`AirtimeUtilizationChart`,__name:`AirtimeUtilizationChart`,setup(t){let r=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,c={rx:r(`--color-secondary`,`violet`),tx:r(`--color-accent-red`,`tomato`)},u=()=>({gridLine:r(`--color-border-subtle`,`lightgray`),axisLabel:r(`--color-text-muted`,`gray`)}),d=ee(),f=E(),p=a(null),v=a([]),C=a(!1),w=a(!0),T=a(!1),D=a(null),O=a(`Connecting...`),k=a(30),A=a({totalReceived:0,totalTransmitted:0,dropped:0,firstPacketTime:0}),j=a({sf:9,bwHz:62500,cr:5,preamble:17}),te=(e,t=60)=>{if(e.length===0)return[];let n=1-.5**(1/t),r=Math.min(e.length,Math.max(10,Math.floor(t/3))),i=0,a=0;for(let t=0;t<r;t++)i+=e[t].rxUtil,a+=e[t].txUtil;return i/=r,a/=r,e.map(e=>(i=n*e.rxUtil+(1-n)*i,a=n*e.txUtil+(1-n)*a,{...e,rxUtil:i,txUtil:a}))},N=g(()=>{let e=d.packetStats?.total_packets||0,t=d.packetStats?.transmitted_packets||0,n=f.stats?.uptime_seconds||0,r=e||A.value.totalReceived,i=t||A.value.totalTransmitted,a=A.value.firstPacketTime>0?Math.floor(Date.now()/1e3)-A.value.firstPacketTime:0,o=n||a,s=Math.max(o/3600,.1);if(s<1){let e=Math.max(o/60,1);return{rxRate:{value:Math.round(r/e*100)/100,label:s<.5?`RX/min (early)`:`RX/min`},txRate:{value:Math.round(i/e*100)/100,label:s<.5?`TX/min (early)`:`TX/min`},confidence:`low`}}let c=Math.round(r/s*100)/100,l=Math.round(i/s*100)/100,u,p;return s<6?(u=`RX/hr (${Math.round(s)}h)`,p=`medium`):s<24?(u=`RX/hr (${Math.round(s)}h)`,p=`high`):(u=`RX/hr`,p=`high`),{rxRate:{value:c,label:u},txRate:{value:l,label:u.replace(`RX`,`TX`)},confidence:p}}),P=async()=>{O.value=`Connecting...`,D.value=null,w.value||(T.value=!0);try{let e=60*1e3,t=Math.floor(Date.now()/1e3),n=t-24*3600,r=f.stats?.config?.radio;r&&(j.value={sf:r.spreading_factor??9,bwHz:r.bandwidth??62500,cr:r.coding_rate??5,preamble:r.preamble_length??17});let i=await I(`/airtime_chart_data`,{start_timestamp:n,end_timestamp:t,bucket_seconds:60,sf:j.value.sf,bw_hz:j.value.bwHz,cr:j.value.cr,preamble:j.value.preamble},{onPhaseChange:e=>{O.value=e===`receiving`?`Receiving data...`:`Connecting...`}});if(!i.success){v.value=[],C.value=!1,w.value=!1,T.value=!1,S(()=>F());return}let a=i.data,o=a.buckets||[];A.value={totalReceived:a.rx_total||0,totalTransmitted:a.tx_total||0,dropped:d.packetStats?.dropped_packets??0,firstPacketTime:o.length>0?o[0].timestamp:t};let s=24*3600/60,c=new Float64Array(s),l=new Float64Array(s);for(let t of o){let r=Math.floor((t.timestamp-n)/60);r>=0&&r<s&&(c[r]=t.rx_ms/e*100,l[r]=t.tx_ms/e*100)}let u=[];for(let e=0;e<s;e++)u.push({timestamp:n+e*60,rxUtil:c[e],txUtil:l[e]});let p=te(u,10),m=Math.max(1,Math.floor(p.length/400)),h=[];for(let e=0;e<p.length;e+=m){let t=0,n=0,r=0,i=p[e].timestamp;for(let i=e;i<Math.min(e+m,p.length);i++)t+=p[i].rxUtil,n+=p[i].txUtil,r++;h.push({timestamp:i,rxUtil:t/r,txUtil:n/r})}v.value=h;let g=Math.max(...h.flatMap(e=>[e.rxUtil,e.txUtil]))*1.05;k.value=Math.max(5,Math.ceil(g/5)*5),Y={data:h,yAxisMax:k.value,fetchedAt:Date.now()},C.value=!1,w.value=!1,T.value=!1,D.value=null,S(()=>F())}catch(e){console.error(`Failed to fetch airtime data:`,e),v.value=[],C.value=!1,w.value=!1,T.value=!1,D.value=e instanceof Error?e.message:`Failed to load chart data`,S(()=>F())}},F=()=>{if(!p.value)return;let e=p.value,t=e.getContext(`2d`);if(!t)return;let n=e.parentElement;if(!n)return;let r=n.getBoundingClientRect(),i=r.width,a=r.height;if(e.width=i*window.devicePixelRatio,e.height=a*window.devicePixelRatio,e.style.width=i+`px`,e.style.height=a+`px`,t.scale(window.devicePixelRatio,window.devicePixelRatio),t.clearRect(0,0,i,a),C.value){t.fillStyle=u().axisLabel,t.font=`16px system-ui`,t.textAlign=`center`,t.fillText(`Loading chart data...`,i/2,a/2);return}if(v.value.length===0){t.fillStyle=u().axisLabel,t.font=`16px system-ui`,t.textAlign=`center`,t.fillText(`No data available`,i/2,a/2);return}let o=i-45-20,s=a-40,l=k.value,d=k.value,f=u();t.strokeStyle=f.gridLine,t.lineWidth=1,t.font=`10px system-ui`,t.textAlign=`right`;for(let e=0;e<=5;e++){let n=20+s*e/5;t.beginPath(),t.moveTo(45,n),t.lineTo(i-20,n),t.stroke();let r=l-e/5*d;t.fillStyle=f.axisLabel,t.fillText(`${r.toFixed(0)}%`,40,n+3)}for(let e=0;e<=6;e++){let n=45+o*e/6;t.beginPath(),t.moveTo(n,20),t.lineTo(n,a-20),t.stroke()}v.value.length>1&&(t.strokeStyle=c.rx,t.lineWidth=2,t.beginPath(),v.value.forEach((e,n)=>{let r=45+o*n/(v.value.length-1),i=a-20-Math.min(e.rxUtil,k.value)/d*s;n===0?t.moveTo(r,i):t.lineTo(r,i)}),t.stroke()),v.value.length>1&&(t.strokeStyle=c.tx,t.lineWidth=2,t.beginPath(),v.value.forEach((e,n)=>{let r=45+o*n/(v.value.length-1),i=a-20-Math.min(e.txUtil,k.value)/d*s;n===0?t.moveTo(r,i):t.lineTo(r,i)}),t.stroke())};return M(P,{intervalMs:12e4,immediate:!1}),e(()=>{Y&&Date.now()-Y.fetchedAt<Pe?(v.value=Y.data,k.value=Y.yAxisMax,w.value=!1):P(),S(()=>{F(),setTimeout(()=>F(),100)}),window.addEventListener(`resize`,F)}),x(()=>{window.removeEventListener(`resize`,F)}),(e,t)=>(i(),b(`div`,Se,[t[3]||=l(`<h3 class="text-content-primary text-lg lg:text-xl font-semibold mb-3 lg:mb-4" data-v-dff649e7> Airtime Utilization </h3><p class="text-content-secondary dark:text-content-primary text-xs lg:text-sm uppercase mb-3 lg:mb-4" data-v-dff649e7> Activity (Last 24 Hours) </p><div class="flex items-center gap-4 lg:gap-6 mb-3 lg:mb-4" data-v-dff649e7><div class="flex items-center gap-2" data-v-dff649e7><div class="w-5 lg:w-7 h-2 rounded bg-accent-purple" data-v-dff649e7></div><span class="text-content-secondary dark:text-content-primary text-xs lg:text-sm" data-v-dff649e7>Rx Util</span></div><div class="flex items-center gap-2" data-v-dff649e7><div class="w-5 lg:w-7 h-2 rounded bg-accent-red" data-v-dff649e7></div><span class="text-content-secondary dark:text-content-primary text-xs lg:text-sm" data-v-dff649e7>Tx Util</span></div></div>`,3),h(ae,{class:`h-40 lg:h-48`,"is-loading":w.value,"is-updating":T.value,error:D.value,status:O.value,onRetry:P},{default:n(()=>[y(`canvas`,{ref_key:`chartRef`,ref:p,class:`absolute inset-0 w-full h-full`},null,512)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`]),y(`div`,Ce,[y(`div`,we,[y(`div`,Te,s(o(d).packetStats?.total_packets||A.value.totalReceived),1),t[0]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted uppercase tracking-wide`},` Total Received `,-1)]),y(`div`,q,[y(`div`,Ee,s(o(d).packetStats?.transmitted_packets||A.value.totalTransmitted),1),t[1]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted uppercase tracking-wide`},` Total Transmitted `,-1)])]),y(`div`,J,[y(`div`,null,[y(`div`,De,[_(s(N.value.rxRate.value)+` `,1),N.value.confidence===`low`?(i(),b(`span`,Oe)):m(``,!0)]),y(`div`,ke,s(N.value.rxRate.label),1)]),y(`div`,null,[y(`div`,Ae,[_(s(N.value.txRate.value)+` `,1),N.value.confidence===`low`?(i(),b(`span`,je)):m(``,!0)]),y(`div`,Me,s(N.value.txRate.label),1)]),y(`div`,null,[y(`div`,Ne,s(o(d).packetStats?.dropped_packets||A.value.dropped),1),t[2]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted`},`Dropped`,-1)])])]))}}),[[`__scopeId`,`data-v-dff649e7`]]),Ie={},Le={viewBox:`0 0 20 16`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,"aria-hidden":`true`};function Re(e,t){return i(),b(`svg`,Le,[...t[0]||=[l(`<ellipse cx="3" cy="12" rx="1.5" ry="2.5" fill="currentColor"></ellipse><ellipse cx="9" cy="9" rx="4" ry="3" fill="currentColor"></ellipse><circle cx="13" cy="7" r="3" fill="currentColor"></circle><ellipse cx="12" cy="2" rx="1.5" ry="3" fill="currentColor"></ellipse><ellipse cx="14" cy="2" rx="1.5" ry="3" fill="currentColor"></ellipse><ellipse cx="16" cy="11" rx="1.5" ry="2" fill="currentColor"></ellipse><circle cx="5" cy="8" r="2" fill="currentColor" opacity="0.8"></circle>`,7)]])}var ze=j(Ie,[[`render`,Re]]),Be=j(d({__name:`HopConnector`,props:{status:{default:`received`}},setup(e){return(t,n)=>(i(),b(`span`,{class:f([`hop-connector`,`hop-connector-${e.status}`]),title:`Rabbit hop`},[h(ze,{class:`hop-rabbit`})],2))}}),[[`__scopeId`,`data-v-5fc98e84`]]),Ve={class:`glass-card w-full max-w-none rounded-[20px] p-6`},He={class:`flex flex-col lg:flex-row lg:justify-between lg:items-center mb-6 gap-4 filter-container`},Ue={class:`flex items-center gap-2 header-info relative`},We={class:`text-content-secondary dark:text-content-muted text-sm packet-count`},Ge=[`title`],Ke={class:`hidden sm:inline`},qe={key:1,class:`text-accent-red text-sm error-indicator`},Je={class:`flex items-center gap-3 lg:flex filter-controls`},Ye={class:`flex flex-col`},Xe=[`value`],Ze={class:`flex flex-col`},Qe=[`value`],$e={class:`flex flex-col`},et={class:`flex flex-col reset-container`},tt=[`disabled`],nt={class:`space-y-4 w-full`},rt=[`onClick`],it={key:0,class:`duplicate-group-banner mb-2 flex items-center justify-between gap-2 rounded-[8px] px-2 py-1`},at={class:`text-[10px] text-content-secondary dark:text-content-muted`},ot={class:`hidden lg:block w-full space-y-2`},st={class:`grid w-full grid-cols-11 gap-2 items-center`},ct={class:`col-span-1 text-content-primary text-sm`},lt={class:`col-span-1 flex items-center gap-2`},ut={class:`flex flex-col`},dt={class:`text-content-primary text-xs`},ft=[`title`],pt={class:`col-span-2`},mt={class:`col-span-1 text-content-primary text-xs`},ht={class:`col-span-1 text-content-primary text-xs`},gt={class:`col-span-1 text-content-primary text-xs flex items-center gap-1`},_t={class:`col-span-1 text-content-primary text-xs`},vt={class:`col-span-1 text-content-primary text-xs`},yt={key:0,class:`flex items-center gap-1`},bt={class:`col-span-2`},xt={class:`flex items-center gap-1`},St={key:0,class:`inline-flex items-center text-[10px] font-medium text-accent-amber`,title:`Policy blocked`},Ct={key:0,class:`mt-1 flex items-center gap-2`},wt=[`onClick`],Tt={key:1,class:`mt-1 text-[10px] text-content-secondary dark:text-content-muted`},Et={key:2,class:`text-accent-red text-[8px] italic truncate`},Dt={class:`grid w-full grid-cols-11 gap-2 items-start`},Ot={class:`col-span-11`},kt={class:`space-y-1`},At={class:`flex items-center gap-2`},jt={class:`text-[9px] text-content-muted`},Mt={class:`flex items-center gap-0.5 flex-wrap`},Nt=[`title`],Pt={key:1,class:`flex items-center gap-1`},Ft={class:`inline-block px-2 py-0.5 rounded bg-badge-cyan-bg text-badge-cyan-text text-xs font-mono`},It={class:`lg:hidden space-y-2`},Lt={class:`mobile-packet-card space-y-3 rounded-[16px] p-4`},Rt={class:`flex items-start justify-between gap-3`},zt={class:`flex items-start gap-3 min-w-0`},Bt={class:`min-w-0`},Vt={class:`flex items-center gap-2 flex-wrap`},Ht={class:`text-content-primary text-xl font-semibold tracking-wide`},Ut={key:0,class:`text-content-secondary dark:text-content-muted text-[10px] font-medium leading-tight`},Wt=[`title`],Gt={class:`flex items-start gap-2 flex-shrink-0`},Kt={class:`flex flex-col items-end`},qt={class:`text-content-secondary dark:text-content-muted text-xs`},Jt={class:`mt-1 flex items-center gap-1 justify-end`},Yt={key:0,class:`inline-flex items-center text-[10px] font-medium text-accent-amber`,title:`Policy blocked`},Xt=[`title`,`aria-label`,`onClick`],Zt={class:`absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-surface dark:bg-surface-elevated border border-primary/opacity-heavy text-[10px] leading-none font-semibold text-primary flex items-center justify-center`},Qt={class:`space-y-2`},$t={class:`flex items-center gap-2`},en={class:`text-content-muted text-xs`},tn={key:0,class:`flex flex-wrap items-center gap-1.5`},nn=[`title`],rn={key:1,class:`flex items-center gap-1`},an={class:`inline-block px-2 py-0.5 rounded bg-badge-cyan-bg text-badge-cyan-text text-xs font-mono font-semibold`},on={class:`pt-3 border-t border-stroke-subtle/70 dark:border-stroke/opacity-heavy`},sn={class:`mobile-metrics-grid grid gap-0`},cn={class:`mobile-metric-cell`},ln={class:`text-content-primary text-base font-semibold`},un={class:`mobile-metric-cell`},dn={class:`text-content-primary text-base font-semibold`},fn={class:`mobile-metric-cell`},pn={class:`flex items-center gap-1 min-w-0`},mn={class:`text-content-primary text-[11px] font-medium leading-tight`},hn={class:`mobile-metric-cell`},gn={class:`flex items-center gap-1`},_n={class:`text-content-primary text-base font-semibold`},vn={key:0,class:`text-accent-red text-xs italic`},yn={key:0,class:`flex justify-between items-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke pagination-container`},bn={class:`flex items-center gap-4 pagination-info`},xn={class:`text-content-secondary dark:text-content-muted text-sm`},Sn={class:`text-xs`},Cn={key:0,class:`flex items-center gap-2 load-more-section`},wn=[`disabled`],Tn={class:`text-content-secondary dark:text-content-muted text-xs load-more-count`},En={class:`flex items-center gap-2 pagination-controls`},Dn=[`disabled`],On={class:`flex items-center gap-1 page-numbers`},kn={key:1,class:`text-content-secondary dark:text-content-muted text-sm px-2 ellipsis`},An=[`onClick`],jn={key:2,class:`text-content-secondary dark:text-content-muted text-sm px-2 ellipsis`},Mn=[`disabled`],Nn={key:1,class:`flex justify-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke`},Pn={class:`flex items-center gap-4`},Fn={class:`text-content-secondary dark:text-content-muted text-sm`},In={class:`text-content-secondary dark:text-content-muted text-xs`},Ln={key:2,class:`flex justify-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke`},Rn={class:`flex items-center gap-2`},X=10,Z=1e3,zn=j(d({name:`PacketTable`,__name:`PacketTable`,setup(n){let u=ee(),{getSignalQualityFromSNR:d}=se(),S=D(),C=a(1),E=a(100),k=a(!1),j=a(!1),M=null;p(()=>u.isLoading,e=>{e?(M&&=(clearTimeout(M),null),j.value=!0):M=window.setTimeout(()=>{j.value=!1,M=null},600)});let N=a(null),P=a(!1),F=a(null),ne=a(0),I=(e,t)=>!e||!t?!1:e.packet_hash===t.packet_hash&&e.timestamp===t.timestamp&&e.type===t.type&&e.route===t.route&&e.src_hash===t.src_hash&&e.dst_hash===t.dst_hash&&e.length===t.length,re=async(e,t)=>{if((e.id||e.packet_hash)&&(!e.header||!e.raw_packet)){let n=++ne.value;try{let r=e.id==null?await u.getPacketByHash(e.packet_hash):await u.getPacketById(e.id);r&&ne.value===n&&N.value&&I(N.value,e)&&F.value===t&&(N.value={...N.value,...r})}catch{}}},ie=async e=>{let t=W.value.findIndex(t=>I(t,e));F.value=t>=0?t:null,N.value=e,P.value=!0,await re(e,F.value)},ae=async e=>{let t=W.value[e];t&&(F.value=e,N.value=t,P.value=!0,await re(t,e))},oe=async()=>{F.value==null||F.value<=0||await ae(F.value-1)},ue=async()=>{F.value==null||F.value>=W.value.length-1||await ae(F.value+1)},de=()=>{P.value=!1,N.value=null,F.value=null,ne.value+=1},L=a(te(`packetTable_selectedType`,`all`)),R=a(te(`packetTable_selectedRoute`,`all`)),z=a(!1),B=a(null),fe=[`all`,`0`,`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`],pe=[`all`,`1`,`2`],V=a(new Set);p(L,e=>{A(`packetTable_selectedType`,e),C.value=1}),p(R,e=>{A(`packetTable_selectedRoute`,e),C.value=1}),p(z,()=>{C.value=1});let H=g(()=>{let e=u.recentPackets;if(L.value!==`all`){let t=parseInt(L.value);e=e.filter(e=>e.type===t)}if(R.value!==`all`){let t=parseInt(R.value);e=e.filter(e=>e.route===t)}return z.value&&B.value!==null&&(e=e.filter(e=>e.timestamp>=B.value)),e}),U=g(()=>{let e=new Map,t=[];return H.value.forEach((n,r)=>{let i=n.packet_hash?.trim(),a=i?`hash:${i}`:`nohash:${n.timestamp}:${r}`,o=e.get(a);if(o){o.packets.push(n);return}let s={key:a,packetHash:i??``,packets:[n],primary:n,duplicates:[],duplicateCount:0,hasDuplicates:!1};e.set(a,s),t.push(s)}),t.map(e=>{let t=e.packets.findIndex(e=>!e.is_duplicate),n=t>=0?t:e.packets.findIndex(e=>e.transmitted&&!e.drop_reason),r=n>=0?n:e.packets.findIndex(e=>e.transmitted),i=r>=0?r:0,a=e.packets[i],o=e.packets.filter((e,t)=>t!==i);return{...e,primary:a,duplicates:o,duplicateCount:o.length,hasDuplicates:o.length>0}})}),me=g(()=>{let e=(C.value-1)*X,t=e+X;return U.value.slice(e,t)}),W=g(()=>U.value.flatMap(e=>[e.primary,...e.duplicates])),he=g(()=>{let e=N.value;return e?U.value.find(t=>t.packets.some(t=>I(t,e)))?.packets??[]:[]}),ge=g(()=>F.value!=null&&F.value>0),_e=g(()=>F.value!=null&&F.value<W.value.length-1),ve=g(()=>{let e=new Map;for(let t of me.value)e.set(t.primary,{group:t,isPrimary:!0,duplicateIndex:0}),t.duplicates.forEach((n,r)=>{e.set(n,{group:t,isPrimary:!1,duplicateIndex:r+1})});return e}),G=g(()=>Math.ceil(U.value.length/X));p(U,e=>{let t=new Set(e.filter(e=>e.hasDuplicates).map(e=>e.key)),n=new Set([...V.value].filter(e=>t.has(e)));n.size!==V.value.size&&(V.value=n),G.value>0&&C.value>G.value&&(C.value=G.value)},{immediate:!0}),p([W,N,P],([e,t,n])=>{if(!n||!t)return;let r=e.findIndex(e=>I(e,t));F.value=r>=0?r:null},{immediate:!0});let ye=g(()=>C.value===G.value),be=g(()=>u.recentPackets.length>=E.value&&E.value<Z),xe=g(()=>ye.value&&be.value&&!k.value),K=e=>ve.value.get(e),Se=e=>K(e)?.isPrimary??!0,Ce=e=>!Se(e),we=e=>Te(e)&&J(e),Te=e=>{let t=K(e);return!!(t?.isPrimary&&t.group.hasDuplicates)},q=e=>{let t=K(e);return t?.isPrimary?t.group.duplicateCount:0},Ee=e=>{let t=q(e);return`${J(e)?`Hide`:`Show`} ${t} duplicate${t===1?``:`s`}`},J=e=>{let t=K(e);return t?.isPrimary?V.value.has(t.group.key):!1},De=e=>{let t=K(e);return!t||t.isPrimary?0:t.duplicateIndex},Oe=e=>K(e)?.group.packets.length??1,ke=e=>De(e)===1,Ae=e=>e.hasDuplicates&&V.value.has(e.key)?[e.primary,...e.duplicates]:[e.primary],je=e=>{let t=K(e);if(!t?.isPrimary||!t.group.hasDuplicates)return;let n=new Set(V.value);n.has(t.group.key)?n.delete(t.group.key):n.add(t.group.key),V.value=n},Me=e=>new Date(e*1e3).toLocaleTimeString(void 0,{hour12:!0}),Ne=e=>({0:`REQ`,1:`RESPONSE`,2:`TXT_MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MULTI_PART`,11:`CONTROL`})[e]||`TYPE_${e}`,Y=e=>({0:`T-Flood`,1:`Flood`,2:`Direct`,3:`T-Direct`})[e]||`Route ${e}`,Pe=e=>e.transmitted?`text-accent-green`:`text-primary`,Fe=e=>e.drop_reason?`Dropped`:e.transmitted?`Forward`:`Received`,Ie=e=>{let t=e.drop_reason?.toLowerCase();return!!(t&&t.includes(`policy blocked`))},Le=e=>(Ie(e),``),Re=e=>e===1?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-badge-neutral-bg text-badge-neutral-text`,ze=e=>({0:`bg-primary`,1:`bg-accent-green`,2:`bg-secondary`,3:`bg-accent-purple`,4:`bg-accent-red`,5:`bg-accent-cyan`,6:`bg-primary`,7:`bg-accent-purple`,8:`bg-accent-green`,9:`bg-secondary`})[e]||`bg-background-mute`,zn=e=>({0:`border-l-primary`,1:`border-l-accent-green`,2:`border-l-accent-amber`,3:`border-l-accent-purple`,4:`border-l-accent-red`,5:`border-l-accent-cyan`,6:`border-l-primary`,7:`border-l-accent-purple`,8:`border-l-accent-green`,9:`border-l-accent-amber`})[e]||`border-l-gray-500`,Bn=e=>!e.transmitted||!e.lbt_attempts||e.lbt_attempts===0?`status-dot-green`:e.lbt_attempts===1?`status-dot-muted`:e.lbt_attempts===2?`status-dot-amber`:`status-dot-red`,Vn=e=>e>=1e3?(e/1e3).toFixed(2)+`s`:e.toFixed(1)+`ms`,Hn=e=>{if(!e)return[];if(Array.isArray(e))return e;if(typeof e==`string`)try{let t=JSON.parse(e);return typeof t==`string`?JSON.parse(t):Array.isArray(t)?t:[]}catch{return[]}return[]},Q=e=>{let t=Hn(e.original_path),n=Hn(e.forwarded_path),r=e.transmitted&&n.length>0?n:t.length>0?t:n;return r.length===0?null:{hops:r.length-1,nodes:r.map(e=>e.toUpperCase())}},Un=e=>e<=0?`Direct`:`${e} hop${e>1?`s`:``}`,$=e=>{if(e.type!==4||!e.payload)return null;try{let t=e.payload.replace(/\s+/g,``).toUpperCase(),n=t,r=0;if(t.length/2>=100)if(t.length>200)n=t.slice(200),r=0;else return null;if(n.length>=2){let e=parseInt(n.slice(0,2),16);r+=2;let t=!!(e&16),i=!!(e&32),a=!!(e&64);if(!(e&128))return null;if(t&&n.length>=r+16&&(r+=16),i&&n.length>=r+4&&(r+=4),a&&n.length>=r+4&&(r+=4),n.length>r){let e=(n.slice(r).match(/.{2}/g)||[]).map(e=>{let t=parseInt(e,16);return t>=32&&t<=126?String.fromCharCode(t):`.`}).join(``).replace(/\.*$/,``);return e.length>0?e:null}}}catch(e){console.error(`Error parsing ADVERT node name:`,e)}return null},Wn=()=>{L.value=`all`,R.value=`all`,z.value=!1,B.value=null,C.value=1},Gn=()=>{z.value?(z.value=!1,B.value=null):(z.value=!0,B.value=Date.now()/1e3),C.value=1},Kn=g(()=>B.value?new Date(B.value*1e3).toLocaleTimeString(void 0,{hour12:!0}):``),qn=async e=>{try{let t=e||E.value;await u.fetchRecentPackets({limit:t})}catch(e){console.error(`Error fetching packet data:`,e)}},Jn=async()=>{if(!(k.value||E.value>=Z)){k.value=!0;try{let e=Math.min(E.value+200,Z);E.value=e,await qn(e)}catch(e){console.error(`Error loading more records:`,e)}finally{k.value=!1}}};return e(()=>{S.ensure(`recentPackets`)}),x(()=>{M&&clearTimeout(M)}),(e,n)=>(i(),b(v,null,[y(`div`,Ve,[y(`div`,He,[y(`div`,Ue,[n[7]||=y(`h3`,{class:`text-content-primary text-xl font-semibold`},` Recent Packets `,-1),y(`span`,We,` (`+s(H.value.length)+` of `+s(o(u).recentPackets.length)+`) `,1),z.value?(i(),b(`span`,{key:0,class:`text-primary text-xs sm:text-sm bg-primary/opacity-light px-2 py-1 rounded-md border border-primary/opacity-medium live-mode-badge whitespace-nowrap`,title:`Filter activated at ${Kn.value}`},[y(`span`,Ke,`Live Mode (since `+s(Kn.value)+`)`,1),n[6]||=y(`span`,{class:`sm:hidden`},`Live`,-1)],8,Ge)):m(``,!0),o(u).error?(i(),b(`span`,qe,s(o(u).error),1)):m(``,!0)]),y(`div`,Je,[y(`div`,Ye,[n[8]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Type`,-1),r(y(`select`,{"onUpdate:modelValue":n[0]||=e=>L.value=e,class:`glass-card border border-stroke-subtle dark:border-stroke rounded-[10px] px-3 py-2 text-content-primary text-sm focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium transition-all duration-200 min-w-[120px] cursor-pointer hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`},[(i(),b(v,null,t(fe,e=>y(`option`,{key:e,value:e,class:`bg-surface dark:bg-surface-elevated text-content-primary`},s(e===`all`?`All Types`:`Type ${e} (${Ne(parseInt(e))})`),9,Xe)),64))],512),[[w,L.value]])]),y(`div`,Ze,[n[9]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Route`,-1),r(y(`select`,{"onUpdate:modelValue":n[1]||=e=>R.value=e,class:`glass-card border border-stroke-subtle dark:border-stroke rounded-[10px] px-3 py-2 text-content-primary text-sm focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium transition-all duration-200 min-w-[120px] cursor-pointer hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`},[(i(),b(v,null,t(pe,e=>y(`option`,{key:e,value:e,class:`bg-surface dark:bg-surface-elevated text-content-primary`},s(e===`all`?`All Routes`:`Route ${e} (${Y(parseInt(e))})`),9,Qe)),64))],512),[[w,R.value]])]),y(`div`,$e,[n[10]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Filter`,-1),y(`button`,{onClick:Gn,class:f([`glass-card border rounded-[10px] px-4 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium min-w-[120px]`,{"border-primary bg-primary/opacity-light text-primary":z.value,"border-stroke-subtle dark:border-stroke text-content-secondary dark:text-content-muted hover:border-primary dark:hover:border-primary hover:text-content-primary dark:hover:text-content-primary hover:bg-primary/opacity-light":!z.value}])},s(z.value?`New Only`:`Show New`),3)]),y(`div`,et,[n[11]||=y(`label`,{class:`text-transparent text-xs mb-1`},`.`,-1),y(`button`,{onClick:Wn,class:f([`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[10px] px-4 py-2 text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary text-sm transition-all duration-200 focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium`,{"opacity-50 cursor-not-allowed hover:border-stroke-subtle dark:hover:border-stroke hover:text-content-secondary dark:hover:text-content-muted":L.value===`all`&&R.value===`all`&&!z.value,"hover:bg-primary/opacity-light":L.value!==`all`||R.value!==`all`||z.value}]),disabled:L.value===`all`&&R.value===`all`&&!z.value},` Reset `,10,tt)])])]),n[30]||=l(`<div class="hidden lg:block w-full pb-3 border-b border-stroke-subtle dark:border-stroke text-content-secondary dark:text-content-muted text-xs uppercase mb-4" data-v-e7af1e37><div class="grid w-full grid-cols-11 gap-2" data-v-e7af1e37><div class="col-span-1" data-v-e7af1e37>Time</div><div class="col-span-1" data-v-e7af1e37>Type</div><div class="col-span-2" data-v-e7af1e37>Route</div><div class="col-span-1" data-v-e7af1e37>LEN</div><div class="col-span-1" data-v-e7af1e37>RSSI</div><div class="col-span-1" data-v-e7af1e37>SNR</div><div class="col-span-1" data-v-e7af1e37>Score</div><div class="col-span-1" data-v-e7af1e37>TX Delay</div><div class="col-span-2" data-v-e7af1e37>Status</div></div><div class="grid w-full grid-cols-11 gap-2 mt-2 pt-2 border-t border-stroke-subtle/70 dark:border-stroke/opacity-heavy" data-v-e7af1e37><div class="col-span-11" data-v-e7af1e37>Path/Hashes</div></div></div>`,1),y(`div`,nt,[(i(!0),b(v,null,t(me.value,e=>(i(),b(`div`,{key:e.key,class:f([`space-y-2 w-full`,e.hasDuplicates?`duplicate-group-container rounded-[12px] overflow-hidden`:``])},[(i(!0),b(v,null,t(Ae(e),(r,a)=>(i(),b(`div`,{key:`${e.key}_${r.packet_hash}_${r.timestamp}_${a}`,class:f([`packet-row w-full border-b border-stroke-subtle dark:border-dark-border/50 pb-4 hover:bg-background-mute dark:hover:bg-stroke/opacity-subtle transition-colors duration-150 cursor-pointer rounded-[10px] p-2 border-l-4`,[zn(r.type),Le(r),Ce(r)?`duplicate-packet-row`:``,we(r)?`duplicate-group-expanded-row`:``]]),onClick:e=>ie(r)},[ke(r)?(i(),b(`div`,it,[n[12]||=y(`span`,{class:`text-[10px] font-semibold uppercase tracking-wide text-primary`},`Duplicate Group`,-1),y(`span`,at,s(Oe(r)-1)+` duplicate`+s(Oe(r)-1==1?``:`s`),1)])):m(``,!0),y(`div`,ot,[y(`div`,st,[y(`div`,ct,s(Me(r.timestamp)),1),y(`div`,lt,[y(`div`,{class:f([`w-2 h-2 rounded-full`,ze(r.type)])},null,2),y(`div`,ut,[y(`span`,dt,s(Ne(r.type)),1),r.type===4&&$(r)?(i(),b(`span`,{key:0,class:`text-accent-red/opacity-heavy text-[10px] font-medium max-w-[80px] truncate`,title:$(r)||void 0},s($(r)),9,ft)):m(``,!0)])]),y(`div`,pt,[y(`span`,{class:f([`inline-block px-2 py-1 rounded text-xs font-medium`,Re(r.route)])},s(Y(r.route)),3)]),y(`div`,mt,s(r.length)+`B `,1),y(`div`,ht,s(r.rssi==null?`N/A`:r.rssi.toFixed(0)+` dBm`),1),y(`div`,gt,[r.rssi==null?m(``,!0):(i(),c(ce,{key:0,bars:o(d)(r.snr).bars,color:o(d)(r.snr).color},null,8,[`bars`,`color`])),_(` `+s(r.snr==null?`N/A`:r.snr.toFixed(1)+`dB`),1)]),y(`div`,_t,s(r.score==null?`N/A`:r.score.toFixed(2)),1),y(`div`,vt,[Number(r.tx_delay_ms)>0?(i(),b(`div`,yt,[r.transmitted?(i(),b(`div`,{key:0,class:f([`w-1.5 h-1.5 rounded-full flex-shrink-0`,Bn(r)])},null,2)):m(``,!0),y(`span`,null,s(Vn(Number(r.tx_delay_ms))),1)])):m(``,!0)]),y(`div`,bt,[y(`div`,null,[y(`div`,xt,[y(`span`,{class:f([`text-xs font-medium`,Pe(r)])},s(Fe(r)),3),Ie(r)?(i(),b(`span`,St,[...n[13]||=[y(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 3l7 4v5c0 5-3.5 8-7 9-3.5-1-7-4-7-9V7l7-4z`}),y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 8l8 8`})],-1)]])):m(``,!0)]),Te(r)?(i(),b(`div`,Ct,[y(`button`,{type:`button`,class:`inline-flex items-center gap-1 rounded-md px-2 py-1 text-[10px] font-semibold transition-all duration-200 border bg-primary/opacity-medium hover:bg-primary/opacity-medium border-primary/opacity-heavy text-primary`,onClick:T(e=>je(r),[`stop`])},[(i(),b(`svg`,{class:f([`w-2.5 h-2.5 transition-transform duration-200`,{"rotate-180":J(r)}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[14]||=[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M19 9l-7 7-7-7`},null,-1)]],2)),_(` `+s(J(r)?`Hide`:`Show`)+` `+s(q(r))+` duplicate`+s(q(r)===1?``:`s`),1)],8,wt)])):Ce(r)?(i(),b(`div`,Tt,` Duplicate #`+s(K(r)?.duplicateIndex),1)):m(``,!0),r.drop_reason?(i(),b(`p`,Et,s(r.drop_reason),1)):m(``,!0)])])]),y(`div`,Dt,[y(`div`,Ot,[y(`div`,kt,[Q(r)?(i(),b(v,{key:0},[y(`div`,At,[n[15]||=y(`span`,{class:`text-[9px] uppercase tracking-wide text-content-muted font-semibold`},` Path `,-1),y(`span`,jt,s(Un(Q(r).hops)),1)]),y(`div`,Mt,[(i(!0),b(v,null,t(Q(r).nodes,(e,t)=>(i(),b(v,{key:t},[y(`span`,{class:f([`inline-block max-w-full truncate px-1.5 py-0.5 rounded text-[9px] font-mono font-semibold leading-tight tracking-tight`,t===0?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-background-mute/opacity-medium text-content-muted`]),title:e},s(e),11,Nt),t<Q(r).nodes.length-1?(i(),c(Be,{key:0,status:r.drop_reason?`drop`:r.transmitted?`forward`:`received`},null,8,[`status`])):m(``,!0)],64))),128))])],64)):(i(),b(`div`,Pt,[y(`span`,Ft,s(r.src_hash?.slice(-4).toUpperCase()||`????`),1),n[16]||=y(`svg`,{class:`w-3 h-3 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M9 5l7 7-7 7`})],-1),y(`span`,{class:f([`inline-block px-2 py-0.5 rounded text-xs font-mono`,r.dst_hash?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-accent-amber/opacity-medium text-accent-amber`])},s(r.dst_hash?r.dst_hash.slice(-4).toUpperCase():`BCAST`),3)]))])])])]),y(`div`,It,[y(`div`,Lt,[y(`div`,Rt,[y(`div`,zt,[y(`div`,{class:f([`w-2 h-2 rounded-full flex-shrink-0 mt-2`,ze(r.type)])},null,2),y(`div`,Bt,[y(`div`,Vt,[y(`span`,Ht,s(Ne(r.type)),1),y(`span`,{class:f([`inline-block px-2.5 py-1 rounded text-xs font-medium`,Re(r.route)])},s(Y(r.route)),3)]),Ce(r)?(i(),b(`span`,Ut,` Duplicate #`+s(K(r)?.duplicateIndex),1)):m(``,!0),r.type===4&&$(r)?(i(),b(`span`,{key:1,class:`block text-accent-red/opacity-heavy text-[10px] font-medium leading-tight mt-0.5`,title:$(r)||void 0},s($(r)),9,Wt)):m(``,!0)])]),y(`div`,Gt,[y(`div`,Kt,[y(`span`,qt,s(Me(r.timestamp)),1),y(`div`,Jt,[y(`span`,{class:f([`text-sm font-medium`,Pe(r)])},s(Fe(r)),3),Ie(r)?(i(),b(`span`,Yt,[...n[17]||=[y(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 3l7 4v5c0 5-3.5 8-7 9-3.5-1-7-4-7-9V7l7-4z`}),y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 8l8 8`})],-1)]])):m(``,!0)])]),Te(r)?(i(),b(`button`,{key:0,type:`button`,class:f([`mobile-duplicate-icon-btn relative inline-flex h-11 w-11 items-center justify-center rounded-xl border border-primary/opacity-heavy bg-primary/opacity-medium text-primary transition-colors duration-200 hover:bg-primary/opacity-medium focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`,{"border-primary text-primary":J(r)}]),title:Ee(r),"aria-label":Ee(r),onClick:T(e=>je(r),[`stop`])},[n[18]||=y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[y(`rect`,{x:`9`,y:`9`,width:`11`,height:`11`,rx:`2`,ry:`2`,"stroke-width":`2`}),y(`path`,{d:`M6 15H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v1`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),y(`span`,Zt,s(q(r)),1)],10,Xt)):m(``,!0)])]),y(`div`,Qt,[y(`div`,$t,[n[19]||=y(`span`,{class:`text-primary text-xs font-semibold uppercase tracking-wide`},`Path`,-1),y(`span`,en,s(Q(r)?Un(Q(r).hops):`Unknown`),1)]),Q(r)?(i(),b(`div`,tn,[(i(!0),b(v,null,t(Q(r).nodes,(e,t)=>(i(),b(v,{key:`mobile-path-${t}`},[y(`span`,{class:f([`mobile-path-chip inline-flex items-center px-2 py-1 rounded-lg text-xs font-mono font-semibold leading-tight`,t===0?`bg-badge-cyan-bg text-badge-cyan-text`:`text-content-secondary dark:text-content-muted`]),title:e},s(e),11,nn),t<Q(r).nodes.length-1?(i(),c(Be,{key:0,status:r.drop_reason?`drop`:r.transmitted?`forward`:`received`},null,8,[`status`])):m(``,!0)],64))),128))])):(i(),b(`div`,rn,[y(`span`,an,s(r.src_hash?.slice(-4)||`????`),1),n[20]||=y(`svg`,{class:`w-3 h-3 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M9 5l7 7-7 7`})],-1),y(`span`,{class:f([`inline-block px-2 py-0.5 rounded text-xs font-mono font-semibold`,r.dst_hash?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-accent-amber/opacity-medium text-accent-amber`])},s(r.dst_hash?r.dst_hash.slice(-4).toUpperCase():`BCAST`),3)]))]),y(`div`,on,[y(`div`,sn,[y(`div`,cn,[n[21]||=y(`div`,{class:`text-content-muted uppercase tracking-wide text-[10px] mb-1`},`Size`,-1),y(`div`,ln,s(r.length)+`B`,1)]),y(`div`,un,[n[22]||=y(`div`,{class:`text-content-muted uppercase tracking-wide text-[10px] mb-1`},`SNR`,-1),y(`div`,dn,s(r.snr==null?`N/A`:r.snr.toFixed(1)+` dB`),1)]),y(`div`,fn,[n[23]||=y(`div`,{class:`text-content-muted uppercase tracking-wide text-[10px] mb-1`},`RSSI`,-1),y(`div`,pn,[r.rssi==null?m(``,!0):(i(),c(ce,{key:0,bars:o(d)(r.snr).bars,color:o(d)(r.snr).color},null,8,[`bars`,`color`])),y(`span`,mn,s(r.rssi==null?`TX`:r.rssi.toFixed(0)+` dBm`),1)])]),y(`div`,hn,[n[24]||=y(`div`,{class:`text-content-muted uppercase tracking-wide text-[10px] mb-1`},`Latency`,-1),y(`div`,gn,[Number(r.tx_delay_ms)>0&&r.transmitted?(i(),b(`div`,{key:0,class:f([`w-1.5 h-1.5 rounded-full flex-shrink-0`,Bn(r)])},null,2)):m(``,!0),y(`span`,_n,s(Number(r.tx_delay_ms)>0?Vn(Number(r.tx_delay_ms)):`--`),1)])])])]),r.drop_reason?(i(),b(`div`,vn,s(r.drop_reason),1)):m(``,!0)])])],10,rt))),128))],2))),128))]),G.value>1?(i(),b(`div`,yn,[y(`div`,bn,[y(`span`,xn,[_(` Showing `+s((C.value-1)*X+1)+` - `+s(Math.min(C.value*X,U.value.length))+` of `+s(U.value.length)+` hash groups `,1),y(`span`,Sn,`(`+s(H.value.length)+` packets)`,1)]),xe.value?(i(),b(`div`,Cn,[n[25]||=y(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`•`,-1),y(`button`,{onClick:Jn,disabled:k.value,class:f([`glass-card border border-primary rounded-[8px] px-3 py-1.5 text-xs transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium hover:bg-primary/opacity-light`,{"text-primary border-primary cursor-pointer":!k.value,"text-content-secondary dark:text-content-muted border-stroke-subtle dark:border-stroke cursor-not-allowed opacity-50":k.value}])},s(k.value?`Loading...`:`Load ${Math.min(200,Z-E.value)} more`),11,wn),y(`span`,Tn,`(`+s(E.value)+`/`+s(Z)+` max)`,1)])):m(``,!0)]),y(`div`,En,[y(`button`,{onClick:n[2]||=e=>--C.value,disabled:C.value<=1,class:f([`glass-card border rounded-[10px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium prev-next-btn`,{"border-stroke-subtle dark:border-stroke text-content-muted cursor-not-allowed opacity-50":C.value<=1,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value>1}])},[...n[26]||=[y(`span`,{class:`hidden sm:inline`},`Previous`,-1),y(`span`,{class:`sm:hidden`},`‹`,-1)]],10,Dn),y(`div`,On,[C.value>3?(i(),b(`button`,{key:0,onClick:n[3]||=e=>C.value=1,class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[8px] px-3 py-2 text-sm text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`},` 1 `)):m(``,!0),C.value>4?(i(),b(`span`,kn,`...`)):m(``,!0),(i(!0),b(v,null,t(Array.from({length:Math.min(5,G.value)},(e,t)=>Math.max(1,Math.min(C.value-2,G.value-4))+t).filter(e=>e<=G.value),e=>(i(),b(`button`,{key:e,onClick:t=>C.value=e,class:f([`glass-card border rounded-[8px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium page-number`,{"border-primary bg-primary/opacity-light text-primary":C.value===e,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value!==e}])},s(e),11,An))),128)),C.value<G.value-3?(i(),b(`span`,jn,`...`)):m(``,!0),C.value<G.value-2?(i(),b(`button`,{key:3,onClick:n[4]||=e=>C.value=G.value,class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[8px] px-3 py-2 text-sm text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`},s(G.value),1)):m(``,!0)]),y(`button`,{onClick:n[5]||=e=>C.value+=1,disabled:C.value>=G.value,class:f([`glass-card border rounded-[10px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium prev-next-btn`,{"border-stroke-subtle dark:border-stroke text-content-muted cursor-not-allowed opacity-50":C.value>=G.value,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value<G.value}])},[...n[27]||=[y(`span`,{class:`hidden sm:inline`},`Next`,-1),y(`span`,{class:`sm:inline`},`›`,-1)]],10,Mn)])])):be.value&&!k.value?(i(),b(`div`,Nn,[y(`div`,Pn,[y(`span`,Fn,` Showing `+s(H.value.length)+` packets `,1),n[28]||=y(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`•`,-1),y(`button`,{onClick:Jn,class:`glass-card border border-primary rounded-[8px] px-4 py-2 text-sm text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`},` Load `+s(Math.min(200,Z-E.value))+` more records `,1),y(`span`,In,`(`+s(E.value)+`/`+s(Z)+` max)`,1)])])):k.value?(i(),b(`div`,Ln,[y(`div`,Rn,[h(O,{size:`sm`}),n[29]||=y(`span`,{class:`text-primary text-sm`},`Loading more records...`,-1)])])):m(``,!0)]),h(le,{packet:N.value,packets:W.value,linkedDuplicatePackets:he.value,currentIndex:F.value,canGoPrevious:ge.value,canGoNext:_e.value,isOpen:P.value,onPrevious:oe,onNext:ue,onClose:de},null,8,[`packet`,`packets`,`linkedDuplicatePackets`,`currentIndex`,`canGoPrevious`,`canGoNext`,`isOpen`])],64))}}),[[`__scopeId`,`data-v-e7af1e37`]]),Bn={class:`grid grid-cols-1 lg:grid-cols-2 gap-4 mb-2`},Vn=d({name:`DashboardView`,__name:`Dashboard`,setup(e){return(e,t)=>(i(),b(`div`,null,[h(pe),y(`div`,Bn,[h(Fe),h(K)]),h(zn)]))}});export{Vn as default}; |