diff --git a/docs/index.html b/docs/index.html
index 229724f0..7b8b137c 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -879,7 +879,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
🌊
diff --git a/server/sites/portal/index.html b/server/sites/portal/index.html
index c0bf45d7..89fdd98f 100644
--- a/server/sites/portal/index.html
+++ b/server/sites/portal/index.html
@@ -64,37 +64,48 @@ a:hover{color:var(--glow-purple)}
.hero-badge{
display:inline-flex;align-items:center;gap:8px;
background:var(--glass);border:1px solid var(--glass-border);
- border-radius:30px;padding:6px 18px;margin-bottom:24px;font-size:12px;color:var(--text-secondary)}
+ border-radius:30px;padding:6px 18px;margin-bottom:24px;font-size:12px;color:var(--text-secondary);
+ animation:fadeSlideUp .8s ease backwards}
.hero-badge .dot{width:6px;height:6px;border-radius:50%;background:var(--glow-emerald);
animation:pulse-dot 2s ease-in-out infinite}
@keyframes pulse-dot{0%,100%{opacity:1}50%{opacity:.3}}
+@keyframes fadeSlideUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}
+@keyframes fadeSlideIn{from{opacity:0;transform:translateY(30px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}
+@keyframes glowPulse{0%,100%{box-shadow:0 4px 24px rgba(34,211,238,0.3)}50%{box-shadow:0 4px 36px rgba(167,139,250,0.4)}}
+@keyframes shimmer{0%{background-position:-200% center}100%{background-position:200% center}}
+@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
.hero h1{
font-size:clamp(2.5rem,6vw,4.5rem);font-weight:800;line-height:1.15;margin-bottom:20px;
background:linear-gradient(135deg,#fff 0%,var(--glow-cyan) 40%,var(--glow-purple) 70%,var(--glow-rose) 100%);
- -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
-.hero p{font-size:clamp(1rem,2vw,1.25rem);color:var(--text-secondary);max-width:640px;margin:0 auto 40px}
-.hero-actions{display:flex;justify-content:center;gap:16px;flex-wrap:wrap}
+ -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
+ animation:fadeSlideUp .8s ease .15s backwards}
+.hero p{font-size:clamp(1rem,2vw,1.25rem);color:var(--text-secondary);max-width:640px;margin:0 auto 40px;
+ animation:fadeSlideUp .8s ease .3s backwards}
+.hero-actions{display:flex;justify-content:center;gap:16px;flex-wrap:wrap;animation:fadeSlideUp .8s ease .45s backwards}
.btn{
padding:12px 28px;border-radius:12px;font-size:15px;font-weight:600;
cursor:pointer;border:none;transition:all .3s;display:inline-flex;align-items:center;gap:8px}
.btn-primary{
background:linear-gradient(135deg,var(--glow-cyan),var(--glow-purple));
- color:#0a0e1a;box-shadow:0 4px 24px rgba(34,211,238,0.3)}
-.btn-primary:hover{transform:translateY(-2px);box-shadow:0 8px 32px rgba(34,211,238,0.4)}
+ color:#0a0e1a;box-shadow:0 4px 24px rgba(34,211,238,0.3);
+ animation:glowPulse 4s ease-in-out infinite}
+.btn-primary:hover{transform:translateY(-3px) scale(1.03);box-shadow:0 8px 40px rgba(34,211,238,0.5)}
.btn-secondary{
background:var(--glass);border:1px solid var(--glass-border);color:var(--text-primary)}
-.btn-secondary:hover{border-color:var(--glow-cyan);background:rgba(34,211,238,0.08)}
+.btn-secondary:hover{border-color:var(--glow-cyan);background:rgba(34,211,238,0.08);transform:translateY(-2px)}
/* ═══ 系统状态横幅 ═══ */
.status-ticker{
background:var(--glass);border:1px solid var(--glass-border);
border-radius:var(--radius);padding:16px 24px;margin:0 auto 60px;max-width:900px;
- display:flex;align-items:center;gap:20px;overflow-x:auto;flex-wrap:wrap;justify-content:center}
-.status-item{display:flex;align-items:center;gap:8px;white-space:nowrap}
+ display:flex;align-items:center;gap:20px;overflow-x:auto;flex-wrap:wrap;justify-content:center;
+ animation:fadeSlideIn .8s ease .5s backwards}
+.status-item{display:flex;align-items:center;gap:8px;white-space:nowrap;transition:transform .3s}
+.status-item:hover{transform:scale(1.05)}
.status-dot{width:8px;height:8px;border-radius:50%}
-.status-dot.green{background:var(--glow-emerald);box-shadow:0 0 8px var(--glow-emerald)}
-.status-dot.amber{background:var(--glow-amber);box-shadow:0 0 8px var(--glow-amber)}
-.status-dot.red{background:var(--glow-rose);box-shadow:0 0 8px var(--glow-rose)}
+.status-dot.green{background:var(--glow-emerald);box-shadow:0 0 8px var(--glow-emerald);animation:pulse-dot 2s ease-in-out infinite}
+.status-dot.amber{background:var(--glow-amber);box-shadow:0 0 8px var(--glow-amber);animation:pulse-dot 2s ease-in-out infinite}
+.status-dot.red{background:var(--glow-rose);box-shadow:0 0 8px var(--glow-rose);animation:pulse-dot 2s ease-in-out infinite}
.status-label{font-size:13px;color:var(--text-secondary)}
.status-val{font-size:13px;font-weight:600;color:var(--text-primary)}
@@ -107,45 +118,77 @@ a:hover{color:var(--glow-purple)}
.card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px;margin-bottom:80px}
.card{
background:var(--bg-card);border:1px solid var(--glass-border);border-radius:var(--radius);
- padding:32px 28px;position:relative;overflow:hidden;transition:all .3s;cursor:pointer}
-.card:hover{border-color:var(--glow-cyan);transform:translateY(-4px);
- box-shadow:0 12px 40px rgba(34,211,238,0.1)}
-.card-icon{font-size:36px;margin-bottom:16px;display:block}
+ padding:32px 28px;position:relative;overflow:hidden;transition:all .4s cubic-bezier(.4,0,.2,1);cursor:pointer}
+.card:hover{border-color:var(--glow-cyan);transform:translateY(-6px);
+ box-shadow:0 16px 48px rgba(34,211,238,0.12)}
+.card-icon{font-size:36px;margin-bottom:16px;display:block;transition:transform .4s;animation:float 4s ease-in-out infinite}
+.card:hover .card-icon{transform:scale(1.15)}
.card h3{font-size:18px;font-weight:700;margin-bottom:8px;color:var(--text-primary)}
.card p{font-size:14px;color:var(--text-secondary);line-height:1.7}
.card .card-tag{
display:inline-block;margin-top:16px;font-size:11px;
background:rgba(34,211,238,0.1);color:var(--glow-cyan);
- padding:3px 10px;border-radius:20px;border:1px solid rgba(34,211,238,0.2)}
+ padding:3px 10px;border-radius:20px;border:1px solid rgba(34,211,238,0.2);transition:all .3s}
+.card:hover .card-tag{background:rgba(34,211,238,0.2);border-color:var(--glow-cyan)}
.card::after{
content:'';position:absolute;top:0;left:0;width:100%;height:3px;
background:linear-gradient(90deg,var(--glow-cyan),var(--glow-purple));
- transform:scaleX(0);transition:transform .3s;transform-origin:left}
+ transform:scaleX(0);transition:transform .4s cubic-bezier(.4,0,.2,1);transform-origin:left}
.card:hover::after{transform:scaleX(1)}
+.card::before{
+ content:'';position:absolute;top:-50%;left:-50%;width:200%;height:200%;
+ background:radial-gradient(circle,rgba(34,211,238,0.04) 0%,transparent 70%);
+ opacity:0;transition:opacity .4s;pointer-events:none}
+.card:hover::before{opacity:1}
-/* ═══ 数字地球架构图 ═══ */
-.arch-section{margin-bottom:80px}
-.arch-layers{display:flex;flex-direction:column;gap:8px;max-width:700px;margin:0 auto}
-.arch-layer{
- display:flex;align-items:center;gap:16px;padding:14px 20px;
+/* ═══ 公告栏 ═══ */
+.bulletin-section{margin-bottom:80px}
+.bulletin-board{max-width:750px;margin:0 auto;display:flex;flex-direction:column;gap:10px}
+.bulletin-item{
+ display:flex;align-items:flex-start;gap:14px;padding:16px 20px;
border-radius:var(--radius-sm);border:1px solid var(--glass-border);
- background:var(--glass);transition:all .3s}
-.arch-layer:hover{border-color:var(--glow-cyan);background:rgba(34,211,238,0.05)}
-.arch-layer .layer-id{
- font-size:11px;font-weight:700;font-family:var(--font-mono);
- color:var(--glow-cyan);min-width:24px;text-align:center}
-.arch-layer .layer-name{font-size:14px;font-weight:600;flex:1}
-.arch-layer .layer-desc{font-size:12px;color:var(--text-dim);flex:2;text-align:right}
+ background:var(--glass);transition:all .4s;position:relative;overflow:hidden}
+.bulletin-item::before{content:'';position:absolute;left:0;top:0;width:3px;height:100%;
+ background:linear-gradient(180deg,var(--glow-cyan),var(--glow-purple));opacity:0;transition:opacity .3s}
+.bulletin-item:hover{border-color:var(--glow-cyan);background:rgba(34,211,238,0.04);transform:translateX(4px)}
+.bulletin-item:hover::before{opacity:1}
+.bulletin-icon{font-size:18px;flex-shrink:0;margin-top:2px}
+.bulletin-content{flex:1;min-width:0}
+.bulletin-title{font-size:14px;font-weight:600;margin-bottom:4px;color:var(--text-primary)}
+.bulletin-desc{font-size:12px;color:var(--text-secondary);line-height:1.6}
+.bulletin-meta{display:flex;align-items:center;gap:8px;margin-top:6px}
+.bulletin-time{font-size:10px;color:var(--text-dim);font-family:var(--font-mono)}
+.bulletin-tag{font-size:10px;padding:2px 8px;border-radius:10px;font-weight:600}
+.bulletin-tag.sys{background:rgba(34,211,238,0.1);color:var(--glow-cyan);border:1px solid rgba(34,211,238,0.2)}
+.bulletin-tag.dev{background:rgba(167,139,250,0.1);color:var(--glow-purple);border:1px solid rgba(167,139,250,0.2)}
+.bulletin-tag.deploy{background:rgba(52,211,153,0.1);color:var(--glow-emerald);border:1px solid rgba(52,211,153,0.2)}
+.bulletin-tag.hot{background:rgba(244,114,182,0.1);color:var(--glow-rose);border:1px solid rgba(244,114,182,0.2)}
+@keyframes bulletin-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}
+.bulletin-item{animation:bulletin-in .5s ease backwards}
+.bulletin-item:nth-child(2){animation-delay:.08s}
+.bulletin-item:nth-child(3){animation-delay:.16s}
+.bulletin-item:nth-child(4){animation-delay:.24s}
+.bulletin-item:nth-child(5){animation-delay:.32s}
+.bulletin-item:nth-child(6){animation-delay:.4s}
+.bulletin-loading{text-align:center;padding:24px;color:var(--text-dim);font-size:13px}
/* ═══ 团队频道 ═══ */
.channel-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;margin-bottom:80px}
.channel-card{
background:var(--glass);border:1px solid var(--glass-border);border-radius:var(--radius-sm);
- padding:20px;text-align:center;transition:all .3s}
-.channel-card:hover{border-color:var(--glow-purple);transform:translateY(-2px)}
+ padding:20px;text-align:center;transition:all .4s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden}
+.channel-card:hover{border-color:var(--glow-purple);transform:translateY(-4px) scale(1.02);
+ box-shadow:0 12px 36px rgba(167,139,250,0.12)}
+.channel-card::after{
+ content:'';position:absolute;bottom:0;left:0;width:100%;height:2px;
+ background:linear-gradient(90deg,var(--glow-purple),var(--glow-cyan));
+ transform:scaleX(0);transition:transform .4s;transform-origin:center}
+.channel-card:hover::after{transform:scaleX(1)}
.channel-avatar{width:48px;height:48px;border-radius:50%;
background:linear-gradient(135deg,var(--glow-cyan),var(--glow-purple));
- display:flex;align-items:center;justify-content:center;font-size:22px;margin:0 auto 12px}
+ display:flex;align-items:center;justify-content:center;font-size:22px;margin:0 auto 12px;
+ transition:transform .4s,box-shadow .4s}
+.channel-card:hover .channel-avatar{transform:scale(1.1);box-shadow:0 4px 20px rgba(34,211,238,0.25)}
.channel-name{font-size:14px;font-weight:600;margin-bottom:4px}
.channel-role{font-size:11px;color:var(--text-dim)}
.channel-status{
@@ -159,8 +202,9 @@ a:hover{color:var(--glow-purple)}
border-radius:50%;border:none;cursor:pointer;z-index:200;
background:linear-gradient(135deg,var(--glow-cyan),var(--glow-purple));
color:#0a0e1a;font-size:24px;display:flex;align-items:center;justify-content:center;
- box-shadow:0 4px 24px rgba(34,211,238,0.4);transition:all .3s}
-.chat-fab:hover{transform:scale(1.1);box-shadow:0 8px 32px rgba(34,211,238,0.5)}
+ box-shadow:0 4px 24px rgba(34,211,238,0.4);transition:all .3s;
+ animation:glowPulse 3s ease-in-out infinite}
+.chat-fab:hover{transform:scale(1.15) rotate(10deg);box-shadow:0 8px 40px rgba(34,211,238,0.6)}
.chat-panel{
position:fixed;bottom:96px;right:28px;width:400px;max-height:560px;
background:var(--bg-card);border:1px solid var(--glass-border);border-radius:var(--radius);
@@ -250,7 +294,7 @@ a:hover{color:var(--glow-purple)}