From b566a3472532a8ee24f83f5b11fe9823ce26a839 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Thu, 28 May 2026 13:09:55 +0300 Subject: [PATCH] fix: mark depleted traffic on webapp home --- frontend/src/styles/webapp.css | 27 +++++++++++++++++++ frontend/src/webapp/screens/HomeScreen.svelte | 20 ++++++++++++-- locales/en.json | 1 + locales/ru.json | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/frontend/src/styles/webapp.css b/frontend/src/styles/webapp.css index 84a8331..68f497a 100644 --- a/frontend/src/styles/webapp.css +++ b/frontend/src/styles/webapp.css @@ -337,6 +337,33 @@ a { cursor: pointer; } +.traffic-card-depleted { + border-color: var(--danger-border); + background: + linear-gradient( + 135deg, + color-mix(in srgb, var(--danger) 16%, var(--surface-sheen-soft)), + var(--surface-sheen-soft) + ), + var(--panel); +} + +.traffic-card-depleted .traffic-top span, +.traffic-card-depleted .traffic-top strong, +.traffic-card-depleted .traffic-meta, +.traffic-card-depleted .traffic-percent { + color: var(--danger-text); +} + +.traffic-card-depleted .progress { + background: color-mix(in srgb, var(--danger) 18%, transparent); +} + +.traffic-card-depleted .progress span { + background: linear-gradient(90deg, var(--danger), color-mix(in srgb, var(--danger) 68%, white)); + box-shadow: 0 0 18px color-mix(in srgb, var(--danger) 40%, transparent); +} + .card-click-target { position: absolute; z-index: 6; diff --git a/frontend/src/webapp/screens/HomeScreen.svelte b/frontend/src/webapp/screens/HomeScreen.svelte index 49a2888..f901ae1 100644 --- a/frontend/src/webapp/screens/HomeScreen.svelte +++ b/frontend/src/webapp/screens/HomeScreen.svelte @@ -51,6 +51,22 @@ function trafficResetLabel(sub) { return trafficResetLabelFn(sub, t); } + function regularTrafficDepleted(sub = subscription) { + const used = Number(sub?.traffic_used_bytes || 0); + const limit = Number(sub?.traffic_limit_bytes || 0); + return limit > 0 && used >= limit; + } + function regularTrafficCardClass(sub = subscription) { + return [ + regularTrafficTopupBarClickable ? "traffic-card-clickable" : "", + regularTrafficDepleted(sub) ? "traffic-card-depleted" : "", + ] + .filter(Boolean) + .join(" "); + } + function regularTrafficMetaLabel(sub = subscription) { + return regularTrafficDepleted(sub) ? t("wa_traffic_depleted") : trafficResetLabel(sub); + } function premiumTrafficPercent(sub) { return premiumTrafficPercentFn(sub); } @@ -140,7 +156,7 @@ {#if subscription.active} - + {#if regularTrafficTopupBarClickable}