IP 纯净度标题行重新排版:置信度改为浅色小字,完整报告、刷新、收起并成一组按钮
- 置信度不再是带框徽章,改为标题旁的 12pt 浅灰文字,百分比按高低着色(confidenceTone → confidenceColor) - “查看完整报告 / 完整报告”文字链接与 ReportLink、ReportStyle、ViewThatFits 三档标题行一并去掉,改为外链图标 - 新增 HeaderActionGroup:一组小图标按钮在 macOS 26 上合成一颗玻璃胶囊,更早系统为浅灰胶囊;组内的 MiniIconButton 不再各自带玻璃 - 译文与更新日志同步
This commit is contained in:
1 parent
4099ec636e
commit
84542374bc
7 files changed
+59
-69
No files matched your search
@@ -11,6 +11,7 @@
|
||||
|
||||
- 主窗口在 macOS 26 上改用液态玻璃:侧边栏是一块浮在窗口里的玻璃面板,红绿灯按钮落在面板里,选中项垫一块淡蓝色圆角底并随切换滑动;顶栏右侧“在菜单栏显示”一组收进玻璃胶囊。主按钮是蓝色玻璃胶囊、次要按钮与图标按钮是透明玻璃,风扇模式等快捷切换是玻璃胶囊,开关换成系统开关(拖动时滑块变成玻璃)。设置分组与数据卡片保持实色,与系统设置一致。macOS 14、15 上保持原来的样式。
|
||||
- 菜单栏弹窗改为紧凑排版,参照 Stats:区块不再是灰底卡片,改成一条细分隔线隔开,行距收紧,顶栏按钮缩小;网络弹窗的 IP 纯净度与 DNS 默认收起成一行(纯净度显示分数与等级,DNS 显示正在使用的地址),点一下展开、标题栏右侧的箭头收起,状态会记住;流量图变矮,连接探测改为两行细格。网络弹窗从约 1520pt 降到约 950pt,其他弹窗矮了一到两成。主窗口的详情页保持原样,照常完整显示。
|
||||
- IP 纯净度的标题行重新排版:置信度不再是带框的绿色徽章,改成标题旁一行浅灰小字,百分比按高低着色;“查看完整报告”文字链接换成外链图标,与刷新、收起并成一组按钮,macOS 26 上合成一颗玻璃胶囊。分数右侧的 cleanip.io 字标照旧可以打开完整报告。
|
||||
- 连接探测只用来看网络通不通:格子通了是绿色、不通是红色(不再用橙色表示延迟偏高),固定 60 格,弹窗排成 3 行、主窗口排成 2 行;去掉格子下面的延迟、抖动、丢包三项。打开网络详情时固定每秒探测一次,「设置 · 网络」里的“探测间隔”选项随之去掉,后台低频探测仍是每 10 秒。
|
||||
- 分段切换改为苹果标准样式:灰色圆角底槽,各段等宽铺满,选中的一段是实心蓝色、白字,切换时蓝块滑过去;网络详情的 IPv4 / IPv6 切换同样是灰底蓝选中。
|
||||
|
||||
|
||||
@@ -84,6 +84,7 @@ VPN / 代理 VPN / Proxy
|
||||
VPN 隧道 VPN Tunnel
|
||||
Xcode 归档 Xcode Archives
|
||||
Xcode 编译缓存 Xcode Build Cache
|
||||
cleanip.io 对这次评分的把握:各数据源结论越一致越高 How sure cleanip.io is about this score: the more its sources agree, the higher
|
||||
macOS 系统目录(系统组件) macOS system folder (system component)
|
||||
npm 缓存 npm Cache
|
||||
{} {} 英寸 {} {}-inch
|
||||
@@ -394,7 +395,6 @@ npm 缓存 npm Cache
|
||||
安装失败:{} Install failed: {}
|
||||
安装辅助工具 Install Helper
|
||||
安静 Quiet
|
||||
完整报告 Full report
|
||||
定时 ping 一个地址,记录网络是否通畅 Pings an address regularly to record whether the network is reachable
|
||||
定时探测网络 Connectivity Probe
|
||||
家目录 Home folder
|
||||
@@ -642,7 +642,6 @@ npm 缓存 npm Cache
|
||||
查看 View
|
||||
查看全部进程 All Processes
|
||||
查看包含的项目 Show items
|
||||
查看完整报告 View full report
|
||||
查看完整更新日志 Full Changelog
|
||||
查看清理日志 View Cleanup Log
|
||||
查询中… Looking up…
|
||||
@@ -871,7 +870,7 @@ npm 缓存 npm Cache
|
||||
网络:{} Network: {}
|
||||
网页数据 Web Data
|
||||
网页缓存与脚本缓存,不涉及 Cookie、历史记录和密码 Web and script caches; cookies, history and passwords are untouched
|
||||
置信度 {}% Confidence {}%
|
||||
置信度 Confidence
|
||||
联动 Wired
|
||||
能效核 Efficiency
|
||||
腾讯 DNSPod Tencent
|
||||
|
||||
@@ -336,9 +336,6 @@ private struct PuritySection: View {
|
||||
@Environment(AppModel.self) private var model
|
||||
@Environment(\.isPopover) private var isPopover
|
||||
|
||||
/// 标题行里“查看完整报告”链接的三种长度
|
||||
enum ReportStyle { case full, short, icon }
|
||||
|
||||
var body: some View {
|
||||
// 菜单栏弹窗里默认收起成一行,只显示分数与等级
|
||||
if isPopover, !model.settings.isExpanded(.networkPurity) {
|
||||
@@ -369,12 +366,7 @@ private struct PuritySection: View {
|
||||
let hint = tr("纯净度看信誉、来路、邻居与网络类型四项;机房 IP 常见信誉高、来路和类型偏低。数据来自 cleanip.io")
|
||||
|
||||
Card(padding: DS.Space.s3, spacing: DS.Space.s2) {
|
||||
// 标题、地址族徽章、置信度、报告链接、刷新按钮排成一行;宽度不够时报告链接依次缩成“完整报告”、只剩图标
|
||||
ViewThatFits(in: .horizontal) {
|
||||
header(addresses, report: .full)
|
||||
header(addresses, report: .short)
|
||||
header(addresses, report: .icon)
|
||||
}
|
||||
header(addresses)
|
||||
if let purity = addresses?.purity {
|
||||
// 分数在左、cleanip.io 字标在右,色带在下占满整行
|
||||
HStack(spacing: DS.Space.s2) {
|
||||
@@ -420,44 +412,54 @@ private struct PuritySection: View {
|
||||
}
|
||||
}
|
||||
|
||||
/// 标题行:IP 纯净度 · [IPv4] · [置信度 92%] · 查看完整报告 ↗ ……… ⟳
|
||||
private func header(_ addresses: PublicAddresses?, report: ReportStyle) -> some View {
|
||||
/// 标题行:IP 纯净度 [IPv4] 置信度 92% ……… [↗ ⟳ ⌃]
|
||||
/// 置信度是标题旁的一行浅色小字,不再用带框徽章;右侧的完整报告、刷新、收起并成一组按钮
|
||||
private func header(_ addresses: PublicAddresses?) -> some View {
|
||||
let network = model.network
|
||||
// 320 宽的弹窗里这一行很挤:标题与徽章之间只留最小间距,右侧刷新按钮自带留白
|
||||
return HStack(spacing: DS.Space.s1) {
|
||||
return HStack(spacing: DS.Space.s2) {
|
||||
Text(PopoverSection.networkPurity.title)
|
||||
.dsFont(.xs, weight: .semibold)
|
||||
.foregroundStyle(DS.Palette.textSecondary)
|
||||
.lineLimit(1)
|
||||
.fixedSize()
|
||||
HStack(spacing: DS.Space.s1) {
|
||||
if let family = network.shownFamily {
|
||||
TagBadge(text: family.title, tone: .primary, compact: true)
|
||||
}
|
||||
if let confidence = addresses?.purity?.confidence {
|
||||
TagBadge(text: tr("置信度 \(confidence)%"), tone: Self.confidenceTone(confidence), compact: true)
|
||||
}
|
||||
if let family = network.shownFamily {
|
||||
TagBadge(text: family.title, tone: .primary, compact: true)
|
||||
}
|
||||
if let url = addresses?.reportURL {
|
||||
ReportLink(url: url, style: report).padding(.leading, DS.Space.s1)
|
||||
if let confidence = addresses?.purity?.confidence {
|
||||
HStack(spacing: DS.Space.s1 / 2) {
|
||||
Text(tr("置信度")).foregroundStyle(DS.Palette.textTertiary)
|
||||
Text(verbatim: "\(confidence)%")
|
||||
.fontWeight(.medium)
|
||||
.foregroundStyle(Self.confidenceColor(confidence))
|
||||
.monospacedDigit()
|
||||
}
|
||||
.dsFont(.xs)
|
||||
.lineLimit(1)
|
||||
.fixedSize()
|
||||
.help(tr("cleanip.io 对这次评分的把握:各数据源结论越一致越高"))
|
||||
}
|
||||
Spacer(minLength: 0)
|
||||
if isPopover {
|
||||
HeaderActionGroup {
|
||||
if let url = addresses?.reportURL {
|
||||
MiniIconButton(systemName: "arrow.up.forward", help: tr("在 cleanip.io 查看这个 IP 的完整报告")) {
|
||||
NSWorkspace.shared.open(url)
|
||||
}
|
||||
}
|
||||
RefreshButton(loading: network.isLookingUpPublic, help: tr("强制刷新:忽略缓存,立即重新查询公网 IP 与归属地")) {
|
||||
network.lookUpPublicAddresses(force: true)
|
||||
}
|
||||
.collapseButton(.networkPurity, settings: model.settings)
|
||||
} else {
|
||||
RefreshButton(loading: network.isLookingUpPublic, help: tr("强制刷新:忽略缓存,立即重新查询公网 IP 与归属地")) {
|
||||
network.lookUpPublicAddresses(force: true)
|
||||
if isPopover {
|
||||
MiniIconButton(systemName: "chevron.up", help: tr("收起")) {
|
||||
withAnimation(DS.Motion.quick) { model.settings.setExpanded(.networkPurity, false) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 置信度高的绿、中等的灰、低的黄
|
||||
static func confidenceTone(_ confidence: Int) -> TagBadge.Tone {
|
||||
confidence >= 80 ? .success : confidence >= 50 ? .neutral : .warning
|
||||
static func confidenceColor(_ confidence: Int) -> Color {
|
||||
confidence >= 80 ? DS.Palette.success : confidence >= 50 ? DS.Palette.textSecondary : DS.Palette.warning
|
||||
}
|
||||
|
||||
static func riskLabel(_ raw: String) -> String {
|
||||
@@ -652,33 +654,3 @@ private struct NetworkProcessesSection: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 纯净度标题行里的“查看完整报告”链接;`icon` 只剩一个外链图标
|
||||
private struct ReportLink: View {
|
||||
let url: URL
|
||||
let style: PuritySection.ReportStyle
|
||||
@State private var hovering = false
|
||||
|
||||
var body: some View {
|
||||
let help = tr("在 cleanip.io 查看这个 IP 的完整报告")
|
||||
if style == .icon {
|
||||
MiniIconButton(systemName: "arrow.up.forward.square", help: help) { NSWorkspace.shared.open(url) }
|
||||
} else {
|
||||
Button { NSWorkspace.shared.open(url) } label: {
|
||||
HStack(spacing: DS.Space.s1 / 2) {
|
||||
Text(style == .full ? tr("查看完整报告") : tr("完整报告"))
|
||||
.dsFont(.xs, weight: .medium)
|
||||
Image(systemName: "arrow.up.forward.square")
|
||||
.font(.system(size: DS.TextSize.xs.rawValue, weight: .semibold))
|
||||
}
|
||||
.foregroundStyle(hovering ? DS.Palette.primaryHover : DS.Palette.primary)
|
||||
.lineLimit(1)
|
||||
.fixedSize()
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.onHover { hovering = $0 }
|
||||
.help(help)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,12 +246,13 @@ struct MiniIconButton: View {
|
||||
}
|
||||
}
|
||||
|
||||
/// macOS 26 上是一颗小玻璃圆钮,更早的系统只有悬停底色
|
||||
/// macOS 26 上是一颗小玻璃圆钮,更早的系统、或已经在一组玻璃按钮里时只有悬停底色
|
||||
private struct MiniIconSurface: ViewModifier {
|
||||
let hovering: Bool
|
||||
@Environment(\.isInsideGlass) private var isInsideGlass
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
if DS.Glass.isAvailable {
|
||||
if DS.Glass.isAvailable, !isInsideGlass {
|
||||
content.dsGlass(in: Circle(), interactive: true)
|
||||
} else {
|
||||
content.background(hovering ? DS.Palette.surfaceHover : .clear, in: RoundedRectangle(cornerRadius: DS.Radius.sm))
|
||||
@@ -259,6 +260,21 @@ private struct MiniIconSurface: ViewModifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// 区块标题栏右侧的一组小图标按钮:macOS 26 上合成一颗玻璃胶囊(与访达工具栏的按钮分组一致),
|
||||
/// 里面的按钮不再各自带玻璃;更早的系统是一条浅灰胶囊
|
||||
struct HeaderActionGroup<Content: View>: View {
|
||||
@ViewBuilder var content: Content
|
||||
|
||||
var body: some View {
|
||||
HStack(spacing: 0) {
|
||||
content
|
||||
}
|
||||
.padding(.horizontal, DS.Space.s1 / 2)
|
||||
.environment(\.isInsideGlass, true)
|
||||
.dsGlass(in: Capsule(), fallback: DS.Palette.track)
|
||||
}
|
||||
}
|
||||
|
||||
/// 区块标题栏里的刷新按钮:查询进行中换成系统的转圈,查完自动变回图标
|
||||
struct RefreshButton: View {
|
||||
var loading: Bool
|
||||
|
||||
@@ -59,15 +59,16 @@ system language by default; switch it in Settings → General → Language.
|
||||
<!-- changelog:start -->
|
||||
<!-- Generated from CHANGELOG.md by Scripts/sync_changelog.py. Do not edit by hand. -->
|
||||
|
||||
Latest release **0.3.2** (2026-09-16) · **5** changes in development · [full changelog](CHANGELOG.md) (kept in Chinese)
|
||||
Latest release **0.3.2** (2026-09-16) · **6** changes in development · [full changelog](CHANGELOG.md) (kept in Chinese)
|
||||
|
||||
<details open>
|
||||
<summary><b>2026-09-16</b> · Unreleased · 4 style · 1 added</summary>
|
||||
<summary><b>2026-09-16</b> · Unreleased · 5 style · 1 added</summary>
|
||||
|
||||
**Style**
|
||||
|
||||
- 主窗口在 macOS 26 上改用液态玻璃:侧边栏是一块浮在窗口里的玻璃面板,红绿灯按钮落在面板里,选中项垫一块淡蓝色圆角底并随切换滑动;顶栏右侧“在菜单栏显示”一组收进玻璃胶囊。主按钮是蓝色玻璃胶囊、次要按钮与图标按钮是透明玻璃,风扇模式等快捷切换是玻璃胶囊,开关换成系统开关(拖动时滑块变成玻璃)。设置分组与数据卡片保持实色,与系统设置一致。macOS 14、15 上保持原来的样式。
|
||||
- 菜单栏弹窗改为紧凑排版,参照 Stats:区块不再是灰底卡片,改成一条细分隔线隔开,行距收紧,顶栏按钮缩小;网络弹窗的 IP 纯净度与 DNS 默认收起成一行(纯净度显示分数与等级,DNS 显示正在使用的地址),点一下展开、标题栏右侧的箭头收起,状态会记住;流量图变矮,连接探测改为两行细格。网络弹窗从约 1520pt 降到约 950pt,其他弹窗矮了一到两成。主窗口的详情页保持原样,照常完整显示。
|
||||
- IP 纯净度的标题行重新排版:置信度不再是带框的绿色徽章,改成标题旁一行浅灰小字,百分比按高低着色;“查看完整报告”文字链接换成外链图标,与刷新、收起并成一组按钮,macOS 26 上合成一颗玻璃胶囊。分数右侧的 cleanip.io 字标照旧可以打开完整报告。
|
||||
- 连接探测只用来看网络通不通:格子通了是绿色、不通是红色(不再用橙色表示延迟偏高),固定 60 格,弹窗排成 3 行、主窗口排成 2 行;去掉格子下面的延迟、抖动、丢包三项。打开网络详情时固定每秒探测一次,「设置 · 网络」里的“探测间隔”选项随之去掉,后台低频探测仍是每 10 秒。
|
||||
- 分段切换改为苹果标准样式:灰色圆角底槽,各段等宽铺满,选中的一段是实心蓝色、白字,切换时蓝块滑过去;网络详情的 IPv4 / IPv6 切换同样是灰底蓝选中。
|
||||
|
||||
|
||||
+3
-2
@@ -55,15 +55,16 @@ CPU 不分性能核与能效核,部分功耗与频率读数可能不显示。
|
||||
<!-- changelog:start -->
|
||||
<!-- 由 Scripts/sync_changelog.py 从 CHANGELOG.md 生成,请勿手改。 -->
|
||||
|
||||
最新版本 **0.3.2**(2026-09-16) · 开发中 **5** 项改动尚未发布 · [完整更新日志](CHANGELOG.md)
|
||||
最新版本 **0.3.2**(2026-09-16) · 开发中 **6** 项改动尚未发布 · [完整更新日志](CHANGELOG.md)
|
||||
|
||||
<details open>
|
||||
<summary><b>2026-09-16</b> · 未发布 · 样式 4 · 新增 1</summary>
|
||||
<summary><b>2026-09-16</b> · 未发布 · 样式 5 · 新增 1</summary>
|
||||
|
||||
**样式**
|
||||
|
||||
- 主窗口在 macOS 26 上改用液态玻璃:侧边栏是一块浮在窗口里的玻璃面板,红绿灯按钮落在面板里,选中项垫一块淡蓝色圆角底并随切换滑动;顶栏右侧“在菜单栏显示”一组收进玻璃胶囊。主按钮是蓝色玻璃胶囊、次要按钮与图标按钮是透明玻璃,风扇模式等快捷切换是玻璃胶囊,开关换成系统开关(拖动时滑块变成玻璃)。设置分组与数据卡片保持实色,与系统设置一致。macOS 14、15 上保持原来的样式。
|
||||
- 菜单栏弹窗改为紧凑排版,参照 Stats:区块不再是灰底卡片,改成一条细分隔线隔开,行距收紧,顶栏按钮缩小;网络弹窗的 IP 纯净度与 DNS 默认收起成一行(纯净度显示分数与等级,DNS 显示正在使用的地址),点一下展开、标题栏右侧的箭头收起,状态会记住;流量图变矮,连接探测改为两行细格。网络弹窗从约 1520pt 降到约 950pt,其他弹窗矮了一到两成。主窗口的详情页保持原样,照常完整显示。
|
||||
- IP 纯净度的标题行重新排版:置信度不再是带框的绿色徽章,改成标题旁一行浅灰小字,百分比按高低着色;“查看完整报告”文字链接换成外链图标,与刷新、收起并成一组按钮,macOS 26 上合成一颗玻璃胶囊。分数右侧的 cleanip.io 字标照旧可以打开完整报告。
|
||||
- 连接探测只用来看网络通不通:格子通了是绿色、不通是红色(不再用橙色表示延迟偏高),固定 60 格,弹窗排成 3 行、主窗口排成 2 行;去掉格子下面的延迟、抖动、丢包三项。打开网络详情时固定每秒探测一次,「设置 · 网络」里的“探测间隔”选项随之去掉,后台低频探测仍是每 10 秒。
|
||||
- 分段切换改为苹果标准样式:灰色圆角底槽,各段等宽铺满,选中的一段是实心蓝色、白字,切换时蓝块滑过去;网络详情的 IPv4 / IPv6 切换同样是灰底蓝选中。
|
||||
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ settings:
|
||||
SWIFT_VERSION: "6.0"
|
||||
MARKETING_VERSION: "0.3.2"
|
||||
# 构建号四位数字,每次 make build 加一;营销版本只在发布时用 Scripts/version.sh patch / minor 修改
|
||||
CURRENT_PROJECT_VERSION: "0070"
|
||||
CURRENT_PROJECT_VERSION: "0078"
|
||||
MACOSX_DEPLOYMENT_TARGET: "14.0"
|
||||
# 本地开发使用 ad-hoc 签名;发布时改为 Developer ID(见 docs/PLAN.md)
|
||||
CODE_SIGN_STYLE: Manual
|
||||
|
||||
Reference in new issue
Block a user