From 97d436721ac5c180fd82af40e1267ffd97deda9f Mon Sep 17 00:00:00 2001 From: c0mrade Date: Mon, 1 Jun 2026 15:42:29 +0300 Subject: [PATCH] fix(admin-remnawave): node metrics 3-rows on mobile, original single row on desktop Jumping only happened on mobile (the wrap reshuffled when speeds changed width); desktop fits on one line and never jumped. So keep the 3 fixed rows for mobile (sm:hidden) and restore the original single flex-wrap row for desktop (hidden sm:flex). On mobile, download/upload now sit tight in a flex row (gap-4) instead of a full-width 2-col grid that looked too spread out. --- src/pages/AdminRemnawave.tsx | 168 ++++++++++++++++++++++------------- 1 file changed, 106 insertions(+), 62 deletions(-) diff --git a/src/pages/AdminRemnawave.tsx b/src/pages/AdminRemnawave.tsx index dcd7eb4..3c7c592 100644 --- a/src/pages/AdminRemnawave.tsx +++ b/src/pages/AdminRemnawave.tsx @@ -215,6 +215,15 @@ function NodeCard({ node, providerName, realtime, onAction, isLoading }: NodeCar const outbounds = realtime?.outbounds ?? []; const hasBreakdown = inbounds.length + outbounds.length > 0; + const ramColorClass = + ramPct === null + ? '' + : ramPct > 85 + ? 'text-error-400' + : ramPct > 65 + ? 'text-warning-400' + : 'text-dark-400'; + return (
- {/* Live metrics in 3 fixed rows (processor · traffic · versions) so the - changing speed/value widths never reflow or jump between lines. */} + {/* Live metrics — mobile: 3 fixed rows so wrapping speeds don't reflow; + desktop (sm+): the original single wrap row, wide enough not to jump. */} {(ramPct !== null || loadAvg || rx > 0 || tx > 0 || node.versions) && ( -
- {/* 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}% + <> + {/* Mobile: processor · traffic · versions */} +
+ {(loadAvg || ramPct !== null) && ( +
+ {loadAvg && ( + + + {loadAvg} - - + )} + {ramPct !== null && ( + + + {ramPct}% + + + + )} +
+ )} + {(rx > 0 || tx > 0) && ( +
+ + + {formatSpeed(rx)} - )} -
- )} + + + {formatSpeed(tx)} + +
+ )} + {(node.versions?.node || node.versions?.xray) && ( +
+ {node.versions?.node && ( + + + {node.versions.node} + + )} + {node.versions?.xray && ( + + + {node.versions.xray} + + )} +
+ )} +
- {/* Row 2 — Traffic: down / up speeds (2 fixed columns so a wide value - never pushes the other) */} - {(rx > 0 || tx > 0) && ( -
- - + {/* Desktop: single wrap row (original) */} +
+ {ramPct !== null && ( + + + {ramPct}% + + + + + )} + {loadAvg && ( + + + {loadAvg} + + )} + + + {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} - - )} -
- )} -
+ + {(node.versions?.node || node.versions?.xray) && ( + + {node.versions?.node && ( + + + {node.versions.node} + + )} + {node.versions?.xray && ( + + + {node.versions.xray} + + )} + + )} +
+ )} {/* Per-node traffic accordion (merged from the former Traffic tab) */}