From 43acb70ab96ad70b7f66f26db32b05f6dc18349f Mon Sep 17 00:00:00 2001 From: c0mrade Date: Mon, 1 Jun 2026 14:52:28 +0300 Subject: [PATCH] fix(admin-remnawave): lay node metrics in 3 fixed rows (processor/traffic/versions) The metrics sat in one flex-wrap, so when realtime speeds change width (Kb/s<->Mb/s, large values) elements reflowed and jumped between lines, and the card height shifted. Split into 3 fixed rows: processor (CPU load + RAM), traffic (down/up), versions (remnanode + xray). Traffic uses a 2-column grid so a wide value never pushes its sibling; tabular-nums keeps digit widths constant. --- src/pages/AdminRemnawave.tsx | 97 ++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 42 deletions(-) diff --git a/src/pages/AdminRemnawave.tsx b/src/pages/AdminRemnawave.tsx index 112a90d..dcd7eb4 100644 --- a/src/pages/AdminRemnawave.tsx +++ b/src/pages/AdminRemnawave.tsx @@ -325,62 +325,75 @@ function NodeCard({ node, providerName, realtime, onAction, isLoading }: NodeCar )} - {/* Live metrics: RAM · load · speeds · versions */} + {/* Live metrics in 3 fixed rows (processor · traffic · versions) so the + changing speed/value widths never reflow or jump between lines. */} {(ramPct !== null || loadAvg || rx > 0 || tx > 0 || node.versions) && ( -
- {ramPct !== null && ( - - - 85 - ? 'text-error-400' - : ramPct > 65 - ? 'text-warning-400' - : 'text-dark-400' - } - > - {ramPct}% - - - - - +
+ {/* Row 1 — Processor: CPU load + RAM */} + {(loadAvg || ramPct !== null) && ( +
+ {loadAvg && ( + + + {loadAvg} + + )} + {ramPct !== null && ( + + + 85 + ? 'text-error-400' + : ramPct > 65 + ? 'text-warning-400' + : 'text-dark-400' + } + > + {ramPct}% + + + + + + )} +
)} - {loadAvg && ( - - - {loadAvg} - + + {/* Row 2 — Traffic: down / up speeds (2 fixed columns so a wide value + never pushes the other) */} + {(rx > 0 || tx > 0) && ( +
+ + + {formatSpeed(rx)} + + + + {formatSpeed(tx)} + +
)} - - - - {formatSpeed(rx)} - - - - {formatSpeed(tx)} - - + + {/* Row 3 — Versions: remnanode + xray core */} {(node.versions?.node || node.versions?.xray) && ( - +
{node.versions?.node && ( - + {node.versions.node} )} {node.versions?.xray && ( - + {node.versions.xray} )} - +
)}
)}