diff --git a/design/prototype/index.html b/design/prototype/index.html index 3c78cbe..0e4c155 100644 --- a/design/prototype/index.html +++ b/design/prototype/index.html @@ -621,6 +621,12 @@ 未登录 +
Task 3 原型(用 v2 真实设计系统重建:全走 atoms.css / tokens.css / icons.js,非独立 mockup)。让用户像 Shadowrocket 那样自定义"直连 / 走隧道 / 拒绝"。规则模型与实现见 配置说明文档。
{ "domain_suffix":
- ["git.51yanmei.com"],
- "outbound": "direct" }| 类型 | 值 | 动作 | 说明 | 启用 | |
|---|---|---|---|---|---|
| ≡ | 域名后缀 | git.51yanmei.com | 直连 | CI 源 | |
| ≡ | 域名后缀 | aliyun.com | 直连 | 镜像 | |
| ≡ | 域名后缀 | github.com | 走隧道 | — | |
| ≡ | GeoSite | category-ads | 拒绝 | 广告 | |
| ≡ | IP-CIDR | 35.190.0.0/16 | 走隧道 | — |
现在 Settings 里的「Smart routing」是个二元开关。改为渐进式披露入口:变成「分流规则」设置行(显示当前模式 + chevron),点进去就是上面的分流规则屏。休闲用户不用点,行为等价开关开着。
-确定性分层 + 顺序,不靠猜:系统强制层永远在最上(用户改不了)→ 用户规则(有序,首命中)→ 智能分流默认 → FINAL。UI 主动标记两类冲突:
-本屏所有组件(段选 .segswitch、设置行 .setting-row、开关 .toggle、卡片 .card、胶囊 .pill、按钮 .btn)都来自 v2 设计系统真原子,颜色全走 token,与线上 App 一致——不是独立 mockup。动作语义色(直连绿/走隧道橙/拒绝红)是原型内联,实现时收进 atoms。
①规则粒度够不够 ②要不要分应用代理(per-app,建议后置)③「从文本导入」Phase 1 还是 2 ④档案 per-user 还是 per-device。确认后出 Phase 1 实现计划。
遇到问题?通过以下任一渠道联系我们,通常数分钟内回复。
@@ -1228,6 +1262,8 @@ var I18N = { 'set.autostart':{zh:'开机自启',en:'Launch at startup'}, 'set.autostartSub':{zh:'系统启动时自动运行',en:'Run automatically on system start'}, 'set.autoconnect':{zh:'自动连接',en:'Auto-connect'}, 'set.autoconnectSub':{zh:'启动时自动连接节点',en:'Connect automatically on launch'}, 'set.smart':{zh:'智能分流',en:'Smart routing'}, 'set.smartSub':{zh:'海外应用走加速,国内直连',en:'Accelerate abroad, direct at home'}, + 'nav.routing':{zh:'分流规则',en:'Routing rules'}, + 'set.routing':{zh:'分流规则',en:'Routing rules'}, 'set.routingSub':{zh:'自定义直连 / 走隧道 / 拒绝',en:'Custom direct / proxy / reject'}, 'set.routeModeSmart':{zh:'智能分流',en:'Smart routing'}, 'set.kill':{zh:'断连保护 Kill Switch',en:'Kill Switch'}, 'set.killSub':{zh:'断线时阻断网络,防止数据泄露',en:'Block traffic if the link drops'}, 'set.lang':{zh:'语言',en:'Language'}, 'set.dark':{zh:'深色外观',en:'Dark appearance'}, 'set.protocol':{zh:'协议',en:'Protocol'}, 'set.web':{zh:'网页版用户中心',en:'Web User Center'}, @@ -1859,6 +1895,8 @@ var _accRedeem=document.getElementById('accRedeemRow'); if(_accRedeem) _accRedee var _accInvite=document.getElementById('accInviteRow'); if(_accInvite) _accInvite.addEventListener('click', function(){ setView('invite'); }); var _accDevices=document.getElementById('accDevicesRow'); if(_accDevices) _accDevices.addEventListener('click', function(){ setView('devices'); }); var _dvBack=document.getElementById('dvBack'); if(_dvBack) _dvBack.addEventListener('click', function(){ setView('account'); }); +var _routingRow=document.getElementById('routingRow'); if(_routingRow) _routingRow.addEventListener('click', function(){ setView('routing'); }); +var _rtBack=document.getElementById('rtBack'); if(_rtBack) _rtBack.addEventListener('click', function(){ setView('settings'); }); var _tbBell=document.getElementById('tbBell'); if(_tbBell) _tbBell.addEventListener('click', function(){ if(S.view!=='notifications'){ S.notifFrom=S.view; } setView('notifications'); }); var _ntBack=document.getElementById('ntBack'); if(_ntBack) _ntBack.addEventListener('click', function(){ setView(S.notifFrom||'connect'); }); document.querySelectorAll('.notif-row.is-expandable').forEach(function(row){ diff --git a/design/prototype/screens/ui-mobile.html b/design/prototype/screens/ui-mobile.html index a561ca3..9b301eb 100644 --- a/design/prototype/screens/ui-mobile.html +++ b/design/prototype/screens/ui-mobile.html @@ -856,10 +856,10 @@