fix(client): 额度卡「今日剩余」标签不再被省略 + 短「免费版」标签(1.0.45+46)

连接页额度卡头部一行放不下「今日剩余 X 分钟 + 免费版·每日10分钟」时,此前 Flexible
落在标签上,导致「今日剩余」被挤成「今日…」。改为:标签固定绝不省略,数值作最后收缩项;
右上角标签缩短为「免费版」(每日额度由卡片本身「今日剩余 X 分钟」表达,不再挤进胶囊)。
新增 planFreeTag l10n(zh 免费版 / en Free),quotaFree 仍保留供账户页 plan_badge_card。
golden 基线(quota_low/exhausted)在 Linux 权威环境重生成。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-07-02 01:40:50 +08:00
parent fc8c03f2c3
commit a274cc40c8
10 changed files with 19 additions and 10 deletions
+1
View File
@@ -45,6 +45,7 @@ abstract class AppText {
String get quotaToday;
String get minutes;
String get quotaFree;
String get planFreeTag; // 额度卡右上短标签「免费版」(不含「每日10分钟」,避免挤占行宽)
String get watchAd;
String get adUnlocked;
// 免费版 10 分钟卡控 + 看广告加时(累加式)
+2
View File
@@ -53,6 +53,8 @@ class StringsEn extends AppText {
@override
String get quotaFree => 'Free · 10 min/day';
@override
String get planFreeTag => 'Free';
@override
String get watchAd => 'Watch ad to start';
@override
String get adUnlocked => 'Unlocked for today';
+2
View File
@@ -52,6 +52,8 @@ class StringsZh extends AppText {
@override
String get quotaFree => '免费版 · 每日 10 分钟';
@override
String get planFreeTag => '免费版';
@override
String get watchAd => '看广告开始使用';
@override
String get adUnlocked => '已解锁 · 今日可用';
+12 -8
View File
@@ -77,21 +77,25 @@ class QuotaCard extends StatelessWidget {
Row(children: [
Icon(PangolinIcons.clock, size: 15, color: exhausted ? c.danger : c.accent),
const SizedBox(width: 7),
Flexible(
child: Text(label,
overflow: TextOverflow.ellipsis,
style: PangolinText.caption.copyWith(color: c.fg2, fontWeight: FontWeight.w600, fontSize: 12)),
),
// 标签固定、绝不省略(此前用 Flexible 让「今日剩余」被挤成「今日…」)。
Text(label,
style: PangolinText.caption.copyWith(color: c.fg2, fontWeight: FontWeight.w600, fontSize: 12)),
if (value.isNotEmpty) ...[
const SizedBox(width: 7),
Text(value,
style: PangolinText.mono.copyWith(color: c.fg1, fontSize: 14, fontWeight: FontWeight.w600)),
// 数值可作为最后收缩项(极端窄屏/三位数分钟才会省略)。
Flexible(
child: Text(value,
overflow: TextOverflow.ellipsis,
style: PangolinText.mono.copyWith(color: c.fg1, fontSize: 14, fontWeight: FontWeight.w600)),
),
],
const SizedBox(width: 8),
const Spacer(),
// 短标签「免费版」——每日额度由卡片本身表达,不再挤进右上角。
Container(
padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 3),
decoration: BoxDecoration(color: c.bgSubtle, borderRadius: BorderRadius.circular(PangolinRadius.full)),
child: Text(t.quotaFree,
child: Text(t.planFreeTag,
style: PangolinText.caption.copyWith(color: c.fg3, fontWeight: FontWeight.w600, fontSize: 10.5)),
),
]),
+1 -1
View File
@@ -1,7 +1,7 @@
name: pangolin_vpn
description: 穿山甲 · Pangolin — 极简、稳定、跨平台网络加速客户端。
publish_to: "none"
version: 1.0.44+45
version: 1.0.45+46
environment:
sdk: ^3.5.0
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

+1 -1
View File
@@ -3,7 +3,7 @@
; 前置: 先在 client/ 跑 `flutter build windows`(Release),产物在
; ..\..\build\windows\x64\runner\Release
#define MyAppName "穿山甲 Pangolin"
#define MyAppVersion "1.0.44"
#define MyAppVersion "1.0.45"
#define MyAppPublisher "Pangolin"
#define MyAppExeName "pangolin_vpn.exe"
#define BuildDir "..\..\build\windows\x64\runner\Release"