-
-
-
+
连接
+
-
+
外观
+
+
+
关于
+
-
@@ -637,6 +668,10 @@
v2.4.0 (macOS)
+
@@ -806,6 +841,90 @@
+
+
+
+
+
通知
+
+
+
+
+
重要2h
+
服务条款与隐私政策更新
+
我们更新了服务条款,请查阅最新内容。
+
+
+
+
+
+
功能1d
+
新增日本 · 大阪加速线路
+
三条低延迟线路已上线,欢迎体验。
+
+
+
+
+
+
新闻3d
+
邀请好友活动进行中
+
邀请好友注册,双方都可获得会员天数。
+
+
+
+
+
+
+
+
+
+
+
邀请好友
+
+
分享你的邀请码或链接,好友注册后双方都得会员天数。
+
+ PANGO-7F3A
+
+
+
+ https://pangolin.app/i/7F3A
+
+
+
+
+
奖励说明 · 双方都得
+
+
+
奖励进度
+
+
+ 已邀请好友
+ 3
+
+
+ 累计获得会员
+ +42d
+
+
+
+
+
@@ -882,6 +1001,26 @@ var I18N = {
'nav.contact':{zh:'联系',en:'Contact'}, 'nav.account':{zh:'账户',en:'Account'},
'nav.purchase':{zh:'升级 PRO',en:'Upgrade PRO'},
'nav.orders':{zh:'我的订单',en:'Orders'},
+ 'nav.account':{zh:'账户',en:'Account'},
+ 'nav.notifications':{zh:'通知',en:'Notifications'}, 'nav.invite':{zh:'邀请好友',en:'Invite friends'},
+ 'acc.billing':{zh:'购买 & 订单 & 兑换',en:'Buy · Orders · Redeem'},
+ 'acc.buy':{zh:'购买套餐',en:'Buy a plan'}, 'acc.buySub':{zh:'升级 PRO 会员',en:'Upgrade to PRO'},
+ 'acc.orders':{zh:'我的订单',en:'My orders'}, 'acc.ordersSub':{zh:'查看订单记录',en:'View order history'},
+ 'acc.redeem':{zh:'兑换码',en:'Redeem code'}, 'acc.redeemSub':{zh:'输入激活码开通',en:'Activate with a code'},
+ 'acc.invite':{zh:'邀请好友得会员',en:'Invite friends, earn membership'}, 'acc.inviteSub':{zh:'好友注册 · 双方都得会员天数',en:'Both sides earn membership days'},
+ 'nt.back':{zh:'返回',en:'Back'}, 'nt.title':{zh:'通知',en:'Notifications'},
+ 'nt.tImportant':{zh:'重要',en:'Important'}, 'nt.tFeature':{zh:'功能',en:'Feature'}, 'nt.tNews':{zh:'新闻',en:'News'},
+ 'nt.n1t':{zh:'服务条款与隐私政策更新',en:'Terms & privacy policy updated'}, 'nt.n1s':{zh:'我们更新了服务条款,请查阅最新内容。',en:'We have updated our terms — please review the latest version.'},
+ 'nt.n2t':{zh:'新增日本 · 大阪加速线路',en:'New Japan · Osaka lines added'}, 'nt.n2s':{zh:'三条低延迟线路已上线,欢迎体验。',en:'Three low-latency lines are now live.'},
+ 'nt.n3t':{zh:'邀请好友活动进行中',en:'Invite-a-friend event is live'}, 'nt.n3s':{zh:'邀请好友注册,双方都可获得会员天数。',en:'Invite friends to sign up — both sides earn membership days.'},
+ 'inv.back':{zh:'返回',en:'Back'}, 'inv.title':{zh:'邀请好友',en:'Invite friends'},
+ 'inv.lead':{zh:'分享你的邀请码或链接,好友注册后双方都得会员天数。',en:'Share your code or link — when a friend signs up, both of you earn membership days.'},
+ 'inv.rewardsHead':{zh:'奖励说明 · 双方都得',en:'Rewards · both sides earn'},
+ 'inv.r1':{zh:'好友注册',en:'Friend signs up'}, 'inv.r1s':{zh:'双方各得会员天数',en:'Both earn membership days'},
+ 'inv.r2':{zh:'好友首次购买',en:'Friend first purchase'}, 'inv.r2s':{zh:'双方各得更多天数',en:'Both earn more days'},
+ 'inv.r3':{zh:'加入 TG 频道',en:'Join the TG channel'}, 'inv.r3s':{zh:'额外获得会员天数',en:'Earn extra days'},
+ 'inv.progHead':{zh:'奖励进度',en:'Reward progress'},
+ 'inv.invited':{zh:'已邀请好友',en:'Friends invited'}, 'inv.earned':{zh:'累计获得会员',en:'Membership earned'},
'set.orders':{zh:'我的订单',en:'My orders'}, 'set.ordersSub':{zh:'查看订单记录',en:'View order history'},
'ord.back':{zh:'返回',en:'Back'}, 'ord.details':{zh:'明细',en:'Details'},
'ord.kOrderNo':{zh:'订单号',en:'Order No.'}, 'ord.kPlan':{zh:'套餐',en:'Plan'}, 'ord.kAmount':{zh:'金额',en:'Amount'},
@@ -933,7 +1072,8 @@ var I18N = {
'set.smart':{zh:'智能分流',en:'Smart routing'}, 'set.smartSub':{zh:'海外应用走加速,国内直连',en:'Accelerate abroad, direct at home'},
'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:'User Center (Web)'},
+ 'set.protocol':{zh:'协议',en:'Protocol'}, 'set.web':{zh:'网页版用户中心',en:'Web User Center'},
+ 'set.grpConn':{zh:'连接',en:'Connection'}, 'set.grpAppear':{zh:'外观',en:'Appearance'}, 'set.grpAbout':{zh:'关于',en:'About'},
'set.update':{zh:'检查更新',en:'Check for updates'},
'contact.intro':{zh:'遇到问题?通过以下任一渠道联系我们,通常数分钟内回复。',en:'Having trouble? Reach us on any channel below — usually a reply within minutes.'},
'contact.email':{zh:'邮箱客服',en:'Email support'}, 'contact.web':{zh:'官网',en:'Website'},
@@ -982,7 +1122,7 @@ var PLAN = {
};
/* ========= 全局状态 ========= */
-var S = { theme:'light', lang:'en', langLabel:'English', persp:'free', conn:'off', view:'connect', secs:0, timerId:null, connId:null, upd:true, statsDev:'all' };
+var S = { theme:'light', lang:'en', langLabel:'English', persp:'free', conn:'off', view:'connect', secs:0, timerId:null, connId:null, upd:true, statsDev:'all', notifFrom:'connect' };
/* ========= 主题 ========= */
function applyTheme(t){
@@ -1171,7 +1311,7 @@ function syncSegs(){
// langsel(6 语显示层)
document.getElementById('langSelLabel').textContent = S.langLabel;
document.querySelectorAll('#langSelMenu .menu-item').forEach(function(m){ m.classList.toggle('is-selected', m.dataset.langlabel===S.langLabel); });
- document.getElementById('accLangVal').textContent = S.langLabel;
+ var _accLang=document.getElementById('accLangVal'); if(_accLang) _accLang.textContent = S.langLabel;
}
/* ========= 连接状态机(仅 PRO 视角可用) ========= */
@@ -1480,6 +1620,16 @@ function ordRelabel(){ renderOrderList(); if(ORD.screen==='detail'&&ORD.curId){
var _ordersRow=document.getElementById('ordersRow'); if(_ordersRow) _ordersRow.addEventListener('click', function(){ openOrders('settings'); });
var _odBack=document.getElementById('odBack'); if(_odBack) _odBack.addEventListener('click', function(){ if(ORD.screen==='detail'){ ordShow('list'); } else { setView(ORD.from); } });
+/* ========= 账户新入口 / 通知铃铛 / 邀请(IA 重构) ========= */
+var _accBuy=document.getElementById('accBuyRow'); if(_accBuy) _accBuy.addEventListener('click', function(){ openPurchase('account'); });
+var _accOrders=document.getElementById('accOrdersRow'); if(_accOrders) _accOrders.addEventListener('click', function(){ openOrders('account'); });
+var _accRedeem=document.getElementById('accRedeemRow'); if(_accRedeem) _accRedeem.addEventListener('click', function(){ openPurchase('account'); });
+var _accInvite=document.getElementById('accInviteRow'); if(_accInvite) _accInvite.addEventListener('click', function(){ setView('invite'); });
+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'); });
+var _invBack=document.getElementById('invBack'); if(_invBack) _invBack.addEventListener('click', function(){ setView('account'); });
+document.querySelectorAll('.js-inv-copy').forEach(function(b){ b.addEventListener('click', function(){ pvToast((S.lang==='zh'?'已复制:':'Copied: ')+b.dataset.copy); }); });
+
/* ========= 初始化 ========= */
(function init(){
var saved='light'; try{ saved=localStorage.getItem('pangolin-ds-theme')||'light'; }catch(e){}
diff --git a/design/prototype/screens/ui-mobile.html b/design/prototype/screens/ui-mobile.html
index c5789c5..a242a93 100644
--- a/design/prototype/screens/ui-mobile.html
+++ b/design/prototype/screens/ui-mobile.html
@@ -302,6 +302,60 @@
transition:opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out); z-index:60; }
.ord-toast svg{ width:14px; height:14px; }
.ord-toast.show{ opacity:1; transform:translate(-50%, 0); }
+
+ /* 顶栏通知铃铛 + 未读红点 */
+ .bell-btn{ position:relative; border:none; background:transparent; cursor:pointer; color:var(--fg2);
+ padding:var(--space-1); border-radius:var(--radius-sm); display:inline-flex; }
+ .bell-btn:hover{ color:var(--accent); background:var(--accent-subtle); }
+ .bell-btn svg{ width:20px; height:20px; }
+ .bell-dot{ position:absolute; top:2px; right:2px; width:7px; height:7px; border-radius:var(--radius-full);
+ background:var(--danger); border:1.5px solid var(--surface); }
+
+ /* 通用子屏覆盖层(设置 / 联系 / 通知 / 邀请 / 兑换;命名空间 .sub-*) */
+ #subOverlay{ position:absolute; left:0; right:0; top:30px; bottom:0; z-index:45;
+ background:var(--bg); display:none; flex-direction:column; }
+ #subOverlay.is-open{ display:flex; }
+ .sub-top{ height:48px; flex:none; display:flex; align-items:center; gap:var(--space-2);
+ padding:0 var(--space-2); border-bottom:1px solid var(--border); background:var(--surface); }
+ .sub-back{ width:38px; height:38px; display:flex; align-items:center; justify-content:center;
+ border:none; background:transparent; color:var(--fg1); cursor:pointer; }
+ .sub-back svg{ width:20px; height:20px; }
+ .sub-ttl{ font-family:var(--font-sans); font-size:var(--text-h3); font-weight:700; color:var(--fg1); }
+ .sub-body{ flex:1; position:relative; overflow:hidden; }
+ .sub-screen{ position:absolute; inset:0; display:none; flex-direction:column; }
+ .sub-screen.is-active{ display:flex; }
+ .sub-scr{ flex:1; overflow:auto; padding:var(--space-5); }
+ .sub-stack > *{ margin-bottom:var(--space-4); }
+ .sub-stack > *:last-child{ margin-bottom:0; }
+ .sub-note{ font-size:var(--text-caption); color:var(--fg3); line-height:var(--leading-relaxed); text-align:center; }
+
+ /* 通知收件箱 · 未读点 */
+ .noti-dot{ width:8px; height:8px; border-radius:var(--radius-full); background:var(--danger); flex:none; display:block; }
+ .noti-item.is-read .noti-dot{ background:var(--border-strong); }
+ .noti-item.is-read .st-title{ color:var(--fg2); font-weight:600; }
+
+ /* 邀请好友 */
+ .inv-hero{ text-align:center; display:flex; flex-direction:column; align-items:center; gap:var(--space-2); }
+ .inv-ic{ width:56px; height:56px; border-radius:var(--radius-xl); color:var(--fg-on-accent);
+ background:linear-gradient(135deg,var(--clay-500),var(--clay-800));
+ display:flex; align-items:center; justify-content:center; box-shadow:var(--shadow-md); }
+ .inv-ic svg{ width:28px; height:28px; }
+ .inv-title{ font-family:var(--font-display); font-size:var(--text-h3); font-weight:700; color:var(--fg1); }
+ .inv-sub{ font-size:var(--text-sm); color:var(--fg2); line-height:var(--leading-relaxed); }
+ .inv-prog-row{ display:flex; align-items:baseline; justify-content:space-between; margin-bottom:var(--space-2); }
+ .inv-prog-v{ font-family:var(--font-mono); font-size:var(--text-sm); color:var(--fg1); font-weight:600; }
+ .inv-bar{ height:8px; border-radius:var(--radius-full); background:var(--bg-subtle); overflow:hidden; }
+ .inv-bar > i{ display:block; height:100%; border-radius:var(--radius-full);
+ background:linear-gradient(90deg,var(--clay-500),var(--clay-800)); }
+
+ /* 子屏 toast */
+ .sub-toast{ position:absolute; left:50%; bottom:var(--space-6); transform:translate(-50%, 12px);
+ background:var(--fg1); color:var(--bg); font-size:var(--text-caption); font-weight:600;
+ padding:var(--space-2) var(--space-4); border-radius:var(--radius-full); box-shadow:var(--shadow-lg);
+ display:flex; align-items:center; gap:var(--space-2); opacity:0; pointer-events:none;
+ transition:opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out); z-index:60; }
+ .sub-toast svg{ width:14px; height:14px; }
+ .sub-toast.show{ opacity:1; transform:translate(-50%, 0); }
@@ -365,7 +419,7 @@
@@ -478,7 +532,7 @@
me@pangolin.app
免费版
-