fix(a11y,ui): resolve 29 P1 issues found by dogfood UI/UX/UE audit

Dogfood 审计(31 路由 × 多视口,Playwright 9 维探针)发现的阻断级问题全部闭环:
P1 29 → 0,对比度违规页 29 → 0。

对比度
- footer: text-gray-500 硬编码 → text-text-hint 令牌(#6B7280 在 #0A0E14 上仅
  4:1,需 4.5:1),1 行改动全站 29 页生效
- brand-content / team-content 副文案 text-text-secondary/70 → /80
  (4.35:1 → 5.74:1,视觉几乎无变化)
- brand-content 里程碑标签在 bg-tertiary 上 text-text-muted → text-text-secondary
  (4.34:1 → 9.45:1)

装饰元素豁免
- 大号服务编号(about 01-03、team 01-05 等)加 aria-hidden="true",WCAG 1.4.3
  对装饰内容不适用,无需强行提亮
- 同时补修 product-detail / solution-detail 的客户名首字占位(同类
  text-text-muted/10,因容器为渐变背景属探针盲区、从未报出)
- 副文案与里程碑标签属真实语义内容,走提对比度而非 aria-hidden —— 隐藏它们
  等于把公司简介与成立年份从屏幕阅读器中删除

移动端布局
- MobileTabBar 为 fixed bottom-0 高 64px,给 main / [role="main"] / footer
  补 calc(64px + env(safe-area-inset-bottom)) 安全区,解决正文与页脚被遮挡
- 注意 marketing layout 使用 div[role="main"] 而非真 <main> 元素,选择器须
  同时匹配两者

触控与令牌
- ERP 专题链接加 py-0.5(23px → 27px,达 WCAG 2.2 AA 2.5.8 的 24px)
- solution-service-card: shadow-blue-500/20 → shadow-brand(纳入 --shadow-* 令牌)

Refs: UI_UX_UE_AUDIT_2026-09-01.md
This commit is contained in:
2026-09-01 16:12:45 +08:00
parent 7df2dde438
commit 152eef9da0
8 changed files with 30 additions and 13 deletions
+6 -4
View File
@@ -79,7 +79,9 @@ function StrengthCard({ strength, index }: { strength: StrengthData; index: numb
<div className="w-12 h-12 flex items-center justify-center border border-brand/30 bg-brand/[0.08] text-brand">
<Icon className="w-5 h-5" />
</div>
<span className="text-4xl font-bold text-text-muted/10 font-mono">{strength.number}</span>
{/* 纯装饰序号:与右侧 h3 标题并列,无独立语义。
aria-hidden 让 WCAG 1.4.3 对比度要求不适用于装饰内容(1.13:1 无需强行提亮) */}
<span aria-hidden="true" className="text-4xl font-bold text-text-muted/10 font-mono">{strength.number}</span>
</div>
<h3 className="text-xl font-bold text-ink mb-3">{strength.title}</h3>
@@ -112,7 +114,7 @@ function CultureCard({ culture, index }: { culture: CultureData; index: number }
<Icon className="w-7 h-7" />
</div>
<span className="block text-6xl font-bold text-text-muted/10 font-mono mb-4">{culture.number}</span>
<span aria-hidden="true" className="block text-6xl font-bold text-text-muted/10 font-mono mb-4">{culture.number}</span>
<h3 className="text-2xl font-bold text-ink mb-4">{culture.title}</h3>
<p className="text-text-secondary leading-relaxed">{culture.description}</p>
@@ -197,13 +199,13 @@ export default function TeamContentV3({ data }: { data: Record<string, unknown>
</motion.div>
)}
{/* 描述 */}
{/* 描述 — alpha 0.7 仅 4.35:1 未达 WCAG AA 4.5:1,提到 0.8 → 5.74:1,视觉几乎无变化 */}
{teamData.heroDescription && (
<motion.p
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.7, delay: 0.5, ease: EASE_OUT }}
className="text-lg sm:text-xl text-text-secondary/70 max-w-2xl leading-relaxed mb-12 sm:mb-14"
className="text-lg sm:text-xl text-text-secondary/80 max-w-2xl leading-relaxed mb-12 sm:mb-14"
>
{teamData.heroDescription}
</motion.p>