Files
pyMC_Repeater/repeater/web/html/assets/Dashboard-xKklmf4x.js
T
2026-07-12 22:35:57 +01:00

1 line
50 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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};