zhangxiang
3ed3afd819
fix(metrics): 数字口径 basis 结构强制,删除详情页虚构佐证
...
复评 P0 收尾:把「每个数字带口径」从个别页自觉升级为结构性强制。
- metrics-basis.ts:METRIC_BASES / METRIC_BASIS_NOTES + resolveMetricBasis
(缺失·非法·大小写错一律回落最弱 target)+ weakestBasis(一组数字取最弱者聚合)
+ FORBIDDEN_PROOF_PHRASES;MetricsBasisNote 收 basis prop
- 类型层 Product.metrics / DataProof / ServiceMetric / Solution.outcomes /
DataMetric / about keyMetrics 全部加 basis?;9 处调用点改为 basis 驱动
- content-types.ts 新增共享 metricBasisField(select)展开进 9 处字段定义;
trustSignals 有意跳过(已有自己的 source)。seed 显式声明 55 条 target
- 删除字面虚构佐证:详情页「每一项指标都源自真实客户案例」、「经过实战验证」×3、
「来自真实客户的使用数据」、「经实际场景验证」;给此前完全裸奔的 3 个共享
数字渲染器(DataProofSection / detail-trust / detail-product-value)补上角注
- metrics-basis.test 3→16 例:basis 解析正控制、weakestBasis 次序、seed 全量
显式声明 + 覆盖证明(防空跑假绿)+ 禁任何条目自称 verified + 禁词全源码扫描
- 文档同源:DESIGN.md 立 The Declared-Basis Rule;PRODUCT.md 常驻禁令;
CONTEXT.md 记决策并警示 admin 字段需重跑 seed 才激活
边界:CMS 字段定义存 ContentModel.fields(DB 内 JSON),basis 下拉须重跑 seed
才会出现在 admin 表单;本次 DB 与 seed 数据值零改动,渲染端对缺 basis 兜底 target。
Gates: type-check 0 · jest 1594/132 · contrast 7/7 · headings 10/10
lint 0e/128w(与 stash 基线逐行比对,零新增告警)
2026-09-20 10:38:23 +08:00
zhangxiang
611b6b87fe
feat(ui): 营销站 UI/UE/UX 治理 P0→P3 收官
...
复评(impeccable critique)全部 Priority Issues 与 Minor Observations 落地:
- P0 数字口径:MetricsBasisNote 单一真源 + metrics-basis.test fs 防线,接入
products/solutions/services/home/about;纯渲染端加角注,不动 DB/seed 值
- P1 转化断头路:敬请期待态 + 404 语境出口 + services 空态双出口
- P1 首页并卡:TrustSection 早鸟横幅并入 CasesSection 单张深色共创卡
- P2 CTA 治理:CONSULT_CTA_ALLOWLIST 白名单 + 逐字符扫描器,/contact CTA 全归一
- P3 polish:footer 补 服务/公司列、contact 死三元/空槽/toast、GlobalErrorTracker 幂等日志
- 文档同源:PRODUCT/CONTEXT 动效带统一 180–280ms;DESIGN.md 立 The 10px Floor;
font-floor.test 守卫禁止再引入 <10px(保留 10/11px 有意 Bain 微标签)
Gates: type-check 0 · jest 1581/132 · lint 0e/126w · contrast 7/7 · headings 10/10
2026-09-20 09:17:07 +08:00
zhangxiang
4b8500af1d
fix(theme): 品牌色令牌语义拆分与暗黑模式全站治理
...
- 拆分品牌色「文字/底色」双通道:新增 --color-brand-ink(-rgb)(深色 #F87171)
与 tailwind brand.ink;text-brand → text-brand-ink 迁移 247 处;
bg-brand/border-brand 保持 --color-brand-rgb 不翻转(红底白字 5.58:1 不能动)
- dark 块补齐 --color-brand-bg: #2A1418(修复深色白字压浅粉底 1.04:1)
- hero 徽章新增 --badge-accent-text 桥接:accentColor 直用作深底文字不可读
(#1e3a5f 深底 1.65:1),浅色取原色 / 深色 color-mix 提亮
- 硬编码颜色 token 化:bg-white/text-gray-*/border-gray-* → bg-bg-*/text-text-*/border-border-*
- 可访问性:触控目标 <24px 归零(footer 链接列 [&_a]:min-h-6 收口 377 处等)、
news 搜索框补 aria-label、标题跳级 h2→h4 修正为 h3、装饰 blur 光斑容器补
overflow-hidden 消除伪文本裁剪
- 验证:tsc 0 / eslint 0 error / jest 0 失败用例 / dogfood 33 路由 × 双主题 P1-P3 全零
2026-09-05 08:16:31 +08:00
zhangxiang
8f4a860180
refactor(motion): 收敛末批 P1 入场时长与变量递增 stagger 步进
...
动效合规专项(Task #16)收尾。
改动:
- page-transition.tsx:入场 duration 0.4/0.5 → 0.3(末处真 P1,由 client-layout 消费)
- 17 文件 21 处子元素 stagger 步进 80/100ms → 60ms
(CONTEXT.md 原则4「子元素 stagger 30-60ms」;属已批准决策 04e91e3 的漏网,
因当时审计脚本看不见 delay: i * N 的乘法写法)
- 审计脚本补盲区:新增变量递增 stagger 识别 + 明细表(此前漏掉全站 33 处)
- 审计脚本新增 NON_ENTRANCE 排除:flip-clock 机械翻转、design-system 死代码令牌
- delay 判据自我纠正:硬禁令约束的是 duration(动效时长),
delay 属调度而非动效本身,一律判 P2(偏离指引),不得判 P0
门禁(全绿):
- tsc 0 error
- eslint 0 error(50 warnings 均为既有)
- jest 130/130 套件,1573 通过 / 2 跳过 / 0 失败
- 运行时冒烟 16/16 PASS(8 路由 × 浅深双版,0 控制台报错)
- 审计:P0=0 · P1=0 · stagger 步进 P2=0
2026-09-04 08:39:00 +08:00
zhangxiang and 阿睿
04e91e3dbf
refactor(animations): converge P2 stagger delays to ≤60ms target
...
Task #16 P2: converge 25 stagger/delay delays to ≤60ms target.
scope: 12 files, 25 staggerDelay/delayChildren props
before: 0.07/0.08/0.1/0.12s -> after: 0.05s (50ms, aligns ScrollReveal default)
verified:
- tsc --noEmit: clean (TSC_EXIT=0)
- eslint (12 files): 0 errors, 22 pre-existing warnings only
- jest: 130/130 suites, 1573 passed, 2 skipped, 0 failed (JEST_EXIT=0)
- motion audit: P0=0, P1=5 preserved, P2=0, OK=425
note: P1 residual 5 preserved (flip-clock 2 + page-transition 2 by
semantics; design-system.ts 1 dead-code deferred). visual regression
waived: stagger is entrance delay, reducedMotion yields same pixels.
Co-Authored-By: 阿睿 <workbuddy@local>
2026-09-03 22:41:10 +08:00
zhangxiang and 阿睿
495f6d4eca
refactor(animations): converge P1 motion durations to ≤300ms target
...
- 151 scripted + 1 manual duration fixes across 46 files
- framer entrance 0.5/0.6s -> 0.3s
- Tailwind hover -> duration-150, entrance -> duration-300
- preserve flip-clock/page-transition per semantic decision
- design-system.ts dead-code deferred
- P1 violations 156 -> 5; P0 remains 0; OK class 249 -> 400
- verified: tsc clean, eslint 0 errors
- verified: 130/130 jest suites, 1573 passed
- verified: visual regression 46/46 zero-pixel diff
Co-Authored-By: 阿睿 <workbuddy@tencent.com >
2026-09-03 21:34:52 +08:00
zhangxiang
7e19661a99
perf(motion): 清理末批 P0 —— 移除循环动画 + 删除死代码
...
按用户决策收尾 Task #16,P0 硬违规 13 → 0:
- 移除 3 处循环动画(均违反 CONTEXT.md「禁循环动画」)
detail-hero 徽章 Sparkles 旋转 4s、滚动箭头浮动 2s、brand-visuals 半径脉冲 4s
→ motion.* 改静态元素,保留视觉语义但不再循环
- 删除死代码 src/lib/animations.tsx(923 行,全站零引用,含 10 处 P0 + spring variants)
同步删除 src/lib/animations.test.tsx
- 级联修复:brand-visuals 因删 guard 冗余的 shouldReduceMotion 声明一并移除
验证:
- 审计 P0 13 → 0,P1 163→156,P2 28→25(死代码移除导致分母下降)
- tsc --noEmit 0 error;eslint 0 error
- 视觉基线不变:时长/循环改动在 reducedMotion+animations disabled 下不改变最终像素
2026-09-03 19:28:18 +08:00
zhangxiang
ceeb88aca3
perf(motion): 第三批入场动效时长收敛至 300ms(9 文件 20 处)
...
承接前两批,继续清理 Task #16 的 P0 硬违规:
- brand-content (1) / methodology-content (3) / products-content-v3 (4) /
solution-detail-content-v3 (4) / team-content-v3 (1) / detail-product-value (2) /
service-value (1) / solution-value (3) / brand-visuals 入场处 (1)
- 审计:P0 33 → 13,P1 163 / P2 28 持平
- 只改 duration,保留原 delay(与首批先例一致)
验证:
- tsc --noEmit 0 error;eslint 9 文件 0 error(仅 methodology 既有 `any` 警告,非本次引入)
- 视觉基线不变:前两批已证明时长改动在 reducedMotion+animations disabled 下不改变最终像素
剩余 13 处 P0 均为决策点,未在本批处理:
- 3 处循环动画(detail-hero ×2、brand-visuals ×1,repeat:Infinity,违反「禁循环动画」)
- 10 处死代码(src/lib/animations.tsx,全站零引用)
2026-09-03 19:12:38 +08:00
zhangxiang
8117dba865
perf(motion): 第二批入场动效时长收敛至 300ms(4 文件 21 处)
...
承接 8fb5aae,继续清理 Task #16 的 P0 硬违规(>700ms 明确禁止):
- contact-content-v3 (7) / case-detail-page (6) / product-detail-content-v3 (5) /
detail-hero (3 处入场)
- 审计:P0 54 → 33,P1 163 持平,P2 28 持平
- 只改 duration,保留原 delay(与首批先例一致);改动行已逐行核验为纯动效行
验证:
- tsc --noEmit 0 error;eslint 4 个改动文件 0 error
- 单测 131 套件 / 1662 通过 / 2 跳过 / EXIT=0(与基线一致)
- 视觉基线零变动:reducedMotion+animations disabled 下终态一致,
时长改动不改变最终像素;不带 -u 复跑 92 用例 EXIT=0
2026-09-03 18:54:16 +08:00
zhangxiang
d91eeca5de
feat(theme): 主题三态偏好模型,默认跟随系统自动切换暗黑模式
...
- 新增 src/lib/theme.ts:三态偏好单一真源
(system/light/dark,无存储值默认跟随系统)
- ThemeToggle 改三态循环(Monitor→Sun→Moon):
实时监听 prefers-color-scheme(仅 system 档生效)
+ storage 跨标签页同步;尺寸位置不变
- layout.tsx FOUC 内联脚本支持 system 档,
首帧前解析避免闪烁
- e2e 视觉回归 L2 改用 test.use({ colorScheme }) 驱动
(事后 setAttribute 存在被挂载效果覆盖的竞态)
- header.test.tsx lucide 白名单补 Monitor
- CLAUDE.md 同步三态语义与 variant 踩坑
- 新增 scripts/audit/theme-system-verify.mjs
(55 断言:首帧无闪烁/循环/实时跟随/旧值兼容/
污染回退/6 路由冒烟)
验证:单测 131 套件 1662 通过 0 失败;
tsc 0 错;eslint 0 错;next build 通过;
运行时 55/55 PASS(dogfood-output/theme-system-verify/)
2026-09-03 16:01:08 +08:00
zhangxiang
a9d55298fc
fix(motion): ScrollReveal 默认入场 400ms→300ms,对齐动效四原则目标值
...
约束纠正:CONTEXT.md L49-61 规定入场 200-300ms 为**目标值**,700ms 只是
「禁止超过」的**硬上限**(L58)。此前按 700ms 执行属最低限度合规。
杠杆点改动:
- src/components/ui/scroll-reveal.tsx:69 duration 0.4 → 0.3
该默认值被 22 个文件消费,一行改动即把全站默认入场拉到目标区间
- 同文件 staggerDelay/delayChildren = 0.05 已在 30-60ms 目标内,未动
新增审计工具(Task #16 各批次复用):
- scripts/audit/motion-duration-audit.mjs:扫 273 文件,抓 framer duration /
默认参数 / Tailwind duration-NNN / staggerDelay·delayChildren·delay,
按 P0(>700ms) / P1(300-700ms) / P2(stagger>60ms) 分级
- 已修正两处自身缺陷:漏掉默认参数赋值 duration=N;CountUp/toast 的
毫秒值误判为秒(加 >10 判毫秒排除 7 处误报)
- scripts/audit/motion-smoke.mjs:多路由 × 浅深运行时冒烟(hydration + 0 报错)
盘点基线(本次审计):P0 硬违规 99 / P1 超目标 164 / P2 stagger 28
- 其中 animations.tsx 20 处为死代码(生产零消费方,仅自家 test import),
按「保留待用」决策不动,不计入用户可见违规 → 用户可见 P0 89 / P1 157 / P2 25
验证:tsc 0 错 · eslint 0 错(50 既有 warnings) · jest 129 套件/1628 通过
冒烟 5 路由 × 浅深 = 10/10 PASS(hydration=true, errors=0)
2026-09-03 07:05:08 +08:00
zhangxiang
10160fb7f2
refactor(detail): 合并 L3 客户案例/资质认证区块为共享组件
...
- 新建 CaseStudiesSection / CertificationsSection 共享组件(src/components/detail),
合并 solution/product 逐字重复的本地实现与 service 的异类实现(卡片 motion.a
链 /cases/<slug> 依赖尚不存在数据 → 404,违反零编造)
- bg-white → bg-bg-primary token 化(浅色零视觉差异,深色模式正确反色,对齐暗黑 Phase 2)
- 数据闸门保留:caseStudies/certifications 空时 return null,由 L3EmptyFallback 接管
- grid/flex 类直接挂 StaggerReveal,修复合并前的单列布局 bug
- 动效 0.8s → 0.7s(detail-cta-section + service CTASection),对齐 ≤700ms 约束
- 附 scripts/audit/l3-b2-verify.mjs 运行时冒烟(product 页浅深双版,0 报错,hydration 通过)
验证:type-check 0 错 / lint 0 错(127 既有 warnings) / 单测 129 套件 1628 通过
2026-09-02 12:51:03 +08:00
zhangxiang
3091035c56
feat(detail): Layer 3 信任层空数据兜底骨架(L3SignalsSlot + L3EmptyFallback + EarlyAccessNotice)
...
- 新增 L3SignalsSlot:4 类可验证替代信号卡(方法论/团队/历程/服务承诺),
服务承诺卡 disabled 占位待业务确认;零编造约束下替代真实案例/认证
- 新增 EarlyAccessNotice:首批客户共创状态条(单一真源 company.ts EARLY_ACCESS)
- 新增 L3EmptyFallback:caseStudies/certifications/dataProofs 三者全空时渲染兜底,
任一非空 return null 保留本地真实 section 视觉
- 接入 5 处详情页:solution v3 / service v4 / product v3 / erp-upgrade-v3 / standalone/[id]
- 修复 StaggerReveal 网格布局:grid 类须挂在 StaggerReveal 自身(否则卡片堆单列)
- 更新 solution 测试至新行为(空数据→兜底渲染)+ 补 lucide 图标 mock
- 修复 header.test.tsx 双 logo 断言(2593599 遗留)
- 新增 scripts/audit/l3-fallback-verify.mjs 运行时验证(浅/深双版 PASS)
注:必须用 localhost 而非 127.0.0.1 —— Next dev allowedDevOrigins 默认白名单
不含 127.0.0.1,chunk 请求带该 Origin 被 403 → hydration 不发生 → 动画全冻结
验证:type-check 0 错 · lint 0 错(127 既有 warnings) · 单测 129 套件/1628 通过 ·
L3 兜底浅深双版渲染截图 PASS
2026-09-02 12:26:07 +08:00
zhangxiang
2593599862
fix(ui,a11y): 修 logo 深色模式不可见 + 补 tailwind font-calligraphy 工具类
...
修复 A:header logo 深色模式字被吞
- logo.svg 右侧公司名(睿新致遠 + NOVALON)硬编码 fill='#0A0E14',
深色背景下 background 同色不可见,红色印章下书法字与英文全部被吞。
- 复用既有 logo-white.svg(白字 + 红印章)作为深色版,
header 渲染双 <Image>,按 html[data-theme] CSS 显隐。
- 双 Image 不占位(display:none),零 JS 闪烁,未来主题切换器自动生效。
修复 B:font-calligraphy 工具类不生成
- tailwind.config.js 的 fontFamily 此前未声明 calligraphy key,
导致 font-calligraphy utility 永不生成,4 处装饰书法字
(BrandStamp「值得信赖」/ ChallengeSection「使命」/ WhyUsSection「睿」「我们」)
静默回退 sans。
- fontFamily 加 calligraphy: ['var(--font-calligraphy-system)']。
审计脚本:
- logo-compare*.mjs:生产 vs 本地 logo 对比定位
- logo-dark-verify.mjs:明暗双版渲染验证
- font-calligraphy-verify.mjs:合成探针验证 utility 生效
验证:
- type-check 0 error · lint 0 error(127 warnings 既有项与本次无关)
- 深浅色 header 截图:明暗版正确切换,书法字 + NOVALON 清晰可见
- font-calligraphy 合成探针 computed fontFamily = STKaiti, KaiTi, 楷体, SimKai, serif ✓
2026-09-02 11:23:47 +08:00
zhangxiang
152eef9da0
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
2026-09-01 16:12:45 +08:00
zhangxiang
bfa49410e4
feat(hero): refine light hero tech-sense with engineering grid and tuned ink links
...
浅色 Hero 科技感变体(HERO_VARIANT='grid'):墨色工程网格 + 品牌红节点 + 墨色细连线
连线 globalAlpha 上限 0.7→0.42,加边缘径向淡出(确定性,快照零漂移)
工程网格 CSS 加 radial mask 聚焦版心(呼应 McKinsey 穿透噪声)
清理死 CSS:移除 hero-dot-grid/hero-dot-spot 及 --hero-dot-* 变量
保留 --spot-x/--spot-y(spotlight 聚光复用)
门禁:type-check 0 / eslint 0 / 单测 17 passed
2026-09-01 09:54:45 +08:00
zhangxiang
95dc07c3f7
refactor(home): 移除 Hero「数据驱动」产品视觉整个板块(非仅眉标)
...
- 删除 hero-product-visual 组件及其测试(该板块仅用于 Hero 右侧,移除后成死代码)。
- home-content-v15:移除 2 列网格的右侧列,Hero 收为单列文本 + 循环粒子层;
同步删除 HeroProductVisual 导入与过时 L3 注释("入场静止"→"持续循环漂移")。
- 删除 home-content-v15 中对已移除板块的测试断言。
注意(视觉回归):home 快照将因右侧板块消失而大幅变化,需在
CI/本地(npx playwright install chromium + npm run dev 后 npm run test)
跑 --update-snapshots 并 review 新基线。
验证:type-check ✅ / lint ✅ (0 error) / 单测 ✅ (129 套 1628 passed)。
视觉回归像素门禁:本沙箱未装 Playwright 浏览器,未实跑;且因板块移除快照
必然变更,需更新基线。
2026-09-01 09:11:35 +08:00
zhangxiang
45a92fcc2b
feat(home): Hero 粒子层改为循环漂移 + 移除「数据驱动」眉标
...
- hero-particle-field: 由「入场浮现后静止」改为 rAF 持续漂移循环;保留
reduced-motion 静态降级、DPR≤2、粒子封顶 56、品牌红单电压(面积<0.1%)、
离屏/隐藏即停、ResizeObserver 重排、无 2d 上下文安全退出。
- 视觉回归稳定:navigator.webdriver(Playwright 默认 true)下降级为静态帧,
位置由固定种子 mulberry32(0x9e3779b9) 复现,与改动前冻结帧像素一致,
快照基线零漂移,无需更新全站 baseline。
- hero-product-visual: 删除「数据驱动 · 让转型可量化」眉标(含品牌红圆点 div)。
- 同步移除 home-content-v15 对应测试断言;新增粒子层循环路径单测
(修复被前置用例污染的共享 useReducedMotion mock)。
验证:type-check ✅ / lint ✅ (0 error) / 单测 ✅ (130 套 1631 passed)。
待 CI 确认:视觉回归像素门禁(本沙箱未安装 Playwright 浏览器,未实跑)。
2026-09-01 08:49:49 +08:00
zhangxiang and 阿睿
ac4c853b71
feat(home): Hero 右侧看板 Absorb 层渐进描边
...
hero-product-visual 升级为客户端组件,趋势线改用 stroke-dashoffset 渐进描边:
滚动入视触发、600ms ease-ink 绘出,填充/端点同步淡入,补齐参考埃森哲的
Glance/Skim/Absorb 三层交互模型。reduced-motion 首帧即静态完整线、零动画;
IntersectionObserver 不可用时降级静态。刻意未做 KPI count-up(格式化串解析 hacky
且偏装饰,与动效克制偏好冲突)。
Co-Authored-By: 阿睿 <workbuddy@tencent.com >
2026-09-01 08:02:56 +08:00
zhangxiang and 阿睿
549c151c6a
feat(home): Hero 动态粒子层(入场浮现后静止)
...
新增 hero-particle-field 组件作为 Hero L3 层:品牌红点缀、Canvas + rAF
仅在 ~600ms 入场窗运行后冻结为静态帧,遵守「无持续循环动画」动效铁律;
prefers-reduced-motion 退化为一次性静态帧。固定种子 PRNG 保证视觉快照可复现。
同步更新 home-content-v15 接入与单测、home 视觉基线。
Co-Authored-By: 阿睿 <workbuddy@tencent.com >
2026-09-01 07:57:12 +08:00
zhangxiang
e0828db0cc
test(header): 补充 lucide-react mock 的 Sun/Moon 图标
...
- header 接入 ThemeToggle 后,其测试 mock 的 lucide-react 缺 Sun/Moon
- 导致 theme-toggle 内 <Sun/>/<Moon/> 导入为 undefined,14 例渲染失败
- 补齐后 14 例通过,全量单测 128 suites / 1624 passed
2026-09-01 06:50:59 +08:00
zhangxiang
02fec8a67b
feat(theme): add ThemeToggle and wire into header + admin top bar
...
- Add reusable client ThemeToggle at src/components/theme/theme-toggle.tsx
- Reads/writes novalon-theme localStorage key and toggles data-theme
- Placeholder on first render to avoid hydration mismatch
- Wired into public Header desktop cluster and AdminLayout top bar
2026-08-31 22:05:06 +08:00
zhangxiang
860a7f454a
refactor(admin): 替换硬编码 gray/white 为设计 token(login + layout)
...
- login/page.tsx、admin-layout.tsx 全部 Tailwind gray-* / bg-white / bg-black/50 映射至语义 token
- 深色面板(bg-gray-900/800 激活态、头像、登录按钮)映射 bg-dark-bg / bg-dark-bg-secondary,保持两模式深色
- 深色面板上的文字用 text-dark-text-primary(固定亮色),规避 text-white 在暗黑模式反色为暗的陷阱
- 遮罩 bg-black/50 → bg-overlay/50(独立 token,不随反色)
- 验证: type-check 0 / lint 0 / 产物 CSS 已含全部映射类
2026-08-31 21:38:44 +08:00
zhangxiang
e4bbe3822d
feat(home): hero 信息层重构 — 声明先行,数据指标下沉为独立成果带
...
参考 Accenture Radical Relevance 设计语言(方向 A,用户已决策):
- hero 内数据条移出,主张(副标题)前置,一屏只负责一句话声明 + 一个行动
- 新增 HeroStatsBand 成果带,滚动触发(Glance 层),承接下沉的指标
- H1 字重 900→700,hero 内 KPI 数字同步收敛,对齐「字重 9→3」克制
- 右侧数据看板保持单电压(仅品牌红),hero 内已无辅助色
验证(evidence-first):
- type-check 0 errors / lint 0 errors(127 warnings 均为既有、与本改无关)
- jest 13 passed(含新断言:hero 内不含 hero-stats、数据下沉成果带仍渲染)
- 视觉回归 22 passed(首页浅/深快照已 update;19 个非首页页零 diff,证明改动仅影响首页)
含 docs/design/hero-redesign-proposal.md(设计提案,未改代码)
P0 批次;P1(点阵 token 化 + L2 光标聚光)待续
2026-08-31 21:24:05 +08:00
zhangxiang
dcc2073e1e
feat(theme): 暗黑模式 Phase 2 批次 3 — product-detail/standalone/detail-hero token 化
...
- product-detail-content-v3.tsx: 9 处 bg-white → bg-bg-primary
(Hero / features / benefits / process / cases / certifications / CTA)
- standalone/[id]/client.tsx: 5 处 bg-white → bg-bg-primary
- detail-hero.tsx: 浅色 variant bg-white → bg-bg-primary(共享组件)
- detail.test.tsx: 新增常驻断言——light variant 必须用主题 token,禁止硬编码 bg-white
验证(evidence-first):
- type-check 0 / lint 0 errors
- jest 128 suites / 1624 passed(含新增断言)
- 视觉回归 22 passed(浅色基线零 diff)
- computed-style 一次性验证 4 passed: /products/erp + /products/crm 的 dark 反色
(html/body/header → #0A0E14、section 层次自动反色)+ light 零深色残留;脚本已删
Phase 2 剩余批次: 批次 4 admin 全量(user 决策: admin 也参与)
2026-08-31 18:53:47 +08:00
zhangxiang
80e3c48c5d
feat(theme): 暗黑模式 Phase 2 批次 2 — services/service-detail/solution-value token 化
...
将 services-content-v3(7 处)、service-detail-content-v4(7 处)、
solution-value(1 处)的浅色 bg-white 全部迁移到 bg-bg-primary。
浅色下值完全等价(#FFFFFF)→ 浅色视觉零差异;dark 下随 token 自动
反色为 #0A0E14,section 间 bg-bg-secondary 层次交替保留。
【变更】
- services-content-v3.tsx(7 处):Hero + section + 卡片×3 + main wrapper
(含卡片条件 className 中两个 bg-white 分支)
- service-detail-content-v4.tsx(7 处):Hero + FeaturesSection + 卡片×3 +
CasesSection + main wrapper
- solution-value.tsx(1 处):共享 section 组件
【验证】
- type-check 0 / lint 0 errors(127 warnings 既有)
- jest 128 suites / 1623 passed
- 视觉回归 22 passed(含 /services 与 /services/software 浅色快照零 diff)
- computed-style 一次性脚本验证(已删除):
dark: /services 与 /services/software 的 html/body/header → #0A0E14
section 层次 [primary, secondary, primary, secondary] 自动反色正确
light: 零深色残留
【Phase 2 剩余批次】
- 批次 3:product-detail-content-v3 + products/standalone + detail-hero 共享组件
- 批次 4:admin 全量(user决策:参与暗黑)
2026-08-31 18:31:08 +08:00
zhangxiang
40c6cd612d
feat(theme): 暗黑模式 Phase 1 基础设施 + 首页试点
...
为 html[data-theme='dark'] 添加完整 CSS 变量覆盖块,建立暗黑模式基石。
--color-ink 收窄为'文字/描边跟随主题'语义,深色 UI 元素(卡片/按钮/遮罩/
代码块/页脚)迁到 --color-dark-bg / --color-overlay 独立 token,避免 ink
反色为浅色文字时连带把深色区块变浅(双语义冲突)。
【基础设施】
- globals.css:
* html/body 顶部硬编码 #FFFFFF !important 改 var() 化(保留 !important)
* :root 新增 --color-overlay / --color-overlay-rgb(遮罩/深色叠加层,
永不反色)
* 新增 html[data-theme='dark'] 覆盖块:墨色反色为浅色文字,bg/text/
border 层级反色,link 反色;保留 --color-dark-* / --color-brand-section
* pre 背景 var(--color-ink) → var(--color-dark-bg)
- tailwind.config.js:注册 overlay 色(rgb() 形式,支持 /50 /60 修饰符)
- layout.tsx:head 内联防 FOUC 同步脚本,读 localStorage['novalon-theme']
设置 data-theme(当前无切换 UI,仅作未来挂载点)
【首页试点 + 布局组件】(浅色值完全等价 → 浅色零视觉差异)
- home-content-v15.tsx:7 处 bg-white → bg-bg-primary(narrative/insights/
cases sections 与卡片),2 处 bg-ink → bg-dark-bg(案例卡 bg-dark-bg 不
随反色,保留深色画布)
- header.tsx / mega-dropdown.tsx:bg-white → bg-bg-primary(导航栏/移动
端菜单/下拉面板)
- footer.tsx:bg-[#0A0E14] → bg-dark-bg(语义统一,视觉零差异)
【全局 UI 组件】(深色区块语义统一 + 遮罩固定深色)
- button.tsx:secondary 'bg-ink hover:bg-ink-light' → bg-dark-bg / hover:bg-dark-bg-secondary;
outline 'hover:bg-ink hover:border-ink' → hover:bg-dark-bg / border-dark-bg
- stats-showcase / milestone-timeline:isDark 分支 bg-ink → bg-dark-bg
- metric-card:isDark 分支 bg-ink/50 → bg-overlay/50,hover:bg-ink → hover:bg-overlay
- dialog / alert-dialog:遮罩 bg-ink/60 → bg-overlay/60(永不反色)
- button.test.tsx:断言 bg-ink → bg-dark-bg,注释同步
【验证】
- type-check 0 errors
- lint 0 errors(127 warnings 既有,非本次引入)
- jest 128 suites / 1623 passed(button 断言同步通过)
- 视觉回归先非 update:21 passed(浅色安全门零 diff)+ 1 failed
(仅 theme-dark-main,dark 快照从浅色名义变真正深色 = 语义修复预期)
- update-snapshots:22 passed,仅 theme-dark-main 基线重写
- computed-style 权威验证(一次性脚本,已删除):
dark 7 项断言全过(html/body/hero/导航栏/案例卡→深色 #0A0E14;
body 文字→浅色 #F8FAFC;footer/overlay→保持深色);light 4 项零回归
【未在 Phase 1 范围】(已识别,留待 Phase 2/3 决策)
- service-detail-content-v4.tsx 等营销页 bg-white:Phase 2 批量 token 化
- admin 页面 bg-white + RichTextEditor:admin 边界决策 + Phase 3
- 品牌红 #C41E3A 在深色底对比度复检:Phase 3
2026-08-31 18:15:58 +08:00
zhangxiang
f64e9648ff
refactor(ui): HeroProductVisual 硬编码 bg-white token 化(bg-bg-primary)
...
- 消除暗黑模式 token 反色时的冲突隐患(浅色下视觉零变化,22 passed 确认)
2026-08-31 17:51:28 +08:00
zhangxiang
5c1b883abf
feat(ui): CTAButton 可复用组件 + P5 全站 CTA 签名切换(17 页面 27 处)
...
feat(ui): 抽离 CTAButton 为 src/components/ui/cta-button.tsx
- 4 variant 覆盖全站 CTA 场景:
* primary:品牌红填充 pill(hero 主行动 / 底部大 CTA)
* secondary:描边墨色 pill(浅色 section 次行动)
* dark:描边浅色 pill(深色区块 bg-dark-bg 内次行动,如 brand/team 底部 CTA)
* inline:透明 + 小箭头(卡片内次行动)
- 品牌箭头签名化:内置 ArrowRight + hover translate-x 微交互
- 200-300ms transition,对齐项目动效四原则
- data-testid 透传避免破坏既有测试
style(cta): P5 全站 CTA 签名切换(17 页面 27 处)
- home V15 / news×3 / products×4(含 erp)/ cases / services×2 / solutions×2
- brand / methodology / team(hero 2 + L4 2 = 4 处,含 dark variant)
- error / not-found(保留 onClick 功能按钮与卡片式导航 StaticLink)
- 清理:StaticLink / Button / ArrowRight / ChevronRight unused import
test(marketing): services/solutions lucide-react mock 补 ArrowRight
- CTAButton 内部用 ArrowRight,原 mock 漏导导致渲染崩(4 测试失败已修)
- 对齐 home-content-v15.test.tsx 既有 mock 范式
2026-08-31 17:25:08 +08:00
zhangxiang
88578a7433
style(cta): 全站 CTA Pill 化(Button 组件 + 11 个营销页内联按钮 rounded-full 对齐签名化)
2026-08-31 16:17:42 +08:00
zhangxiang
b65ddd1ff7
fix(a11y): 无障碍与 lint 修复(对比度/alt 属性/触控目标收窄)+ Geist 本地字体系统
2026-08-31 12:03:32 +08:00
zhangxiang
08a020105f
refactor(link): 营销页站内链接统一 StaticLink(静态托管适配)+ 删除 0 引用死代码组件 + QA 页 client/server 拆分
2026-08-31 12:03:12 +08:00
zhangxiang
4c85b3cbdf
fix(tailwind): arbitrary-value 改映射类,消除 ambiguous warnings
2026-08-31 12:03:03 +08:00
zhangxiang
337e1e60c0
feat(cms): 品牌叙事与结构性文案全站 CMS 化并补齐信任证据阶段 0
...
- 品牌叙事内核(价值主张/定位/承诺/三支柱/语气)下沉 site-config,经 SiteConfigProvider 注入全站
- 新增 page-copy 内容模型承载结构性文案(章节标题/眉标/描述/CTA/空状态),覆盖首页+服务/方案/产品/案例/新闻列表页,「CMS 优先 + 硬编码兜底」不白屏
- 首页「首批客户共创计划」板块(earlyAccessTitle/CtaLabel/Status 驱动)替代单行标签,如实呈现共创/内测/授权公开三档状态
- 关于页资质区数据空时如实展示「建设中」空态
- 零编造:不虚构客户/数据/资质
2026-08-20 09:25:12 +08:00
zhangxiang
cbdc7dd0c8
refactor(home): de-productize hero visual to abstract data-driven graphic
...
- 移除「睿新·经营驾驶舱」产品 UI 外壳(窗口头/侧边栏/表格/产品名)
- Hero 视觉改为抽象数据可视化(KPI + 趋势图),眉标「数据驱动 · 让转型可量化」
- 对齐 IHG/字节式品牌矩阵定位:能力表达而非产品展示
- 首页单测 6/6 + 视觉基线三端更新,type-check / lint 0 errors
2026-08-19 16:34:11 +08:00
zhangxiang
713186d552
feat(design): Vibe design optimization — Hero, Bento grids, trust layer, narrative
...
升级全站体验:首页 Hero 改为产品视觉 + 单一 CTA 转化布局;产品矩阵/服务/方案改
为 Bento 非对称网格(ERP 2x2 大卡 + BI 1x2);补齐信任层(可验证信号 + 来源标注)
与「问题→方法→结果」章节式叙事;新增 hero-product-visual 与 bento-grid 可复用组件;
统一动效与品牌视觉资产。新增对应单测、UJ-11 用户旅程测试并更新视觉回归基线快照。
2026-08-19 14:43:27 +08:00
zhangxiang
8d3bd723c3
fix(brand): unify calligraphy logo across header, footer and brand page
...
- logo.svg: remove dark-mode white fill so header/hero calligraphy stays
visible on white backgrounds and matches footer logo-white.svg
- about/brand: replace sans-serif brand title with BrandCalligraphyName,
reusing the same AoyagiReisho SVG paths as the footer logo without
loading the 4.4MB font file
- add unit tests for BrandCalligraphyName and document decision in CONTEXT.md
2026-08-18 12:51:33 +08:00
zhangxiang
628a0f1a2b
fix: align startup copy with 2026 founding and deploy hybrid rendering
...
- Replace fabricated 12-year/500+/8+ team experience claims with
2026 founding, first-client co-creation, professional team wording
- Remove fake case studies and unverified certifications from seeds,
cases page, products and ERP upgrade page
- Enable Next.js standalone output and production hybrid deployment
(Dockerfile.prod, docker-compose.server.yml, Nginx nextjs upstream)
- Add linux-musl Prisma engine target and production crypto key build
- Sync production CMS database with cleaned seed content
2026-08-17 20:21:39 +08:00
zhangxiang
b84ee9515f
fix(products): add externalUrl support for standalone products and fix footer alignment
...
- Add externalUrl field to standalone product content type
- Filter out externalUrl products from generateStaticParams
- Fix email icon vertical alignment in footer
2026-08-13 07:12:17 +08:00
zhangxiang
f3fc969bef
test(mobile): add mobile E2E test suite (53 tests) and fix layout issues
...
Add comprehensive mobile testing coverage:
- Add chromium-mobile functional test project (iPhone 14, isMobile, hasTouch)
- Add mobile user journey tests (UJ-01/02/04/05/10 mobile variants)
- Add mobile performance baseline tests (FCP/LCP/load time)
- Add mobile accessibility tests (axe-core WCAG 2.1 AA, touch targets,
form labels, alt text, contrast)
- Update README with progress and new npm scripts
Fix pre-existing issues:
- Fix footer component layout and test assertions
- Fix admin content page sidebar navigation and breadcrumb
- Fix standalone products page metadata and layout
- Fix product detail/service value sections
- Fix contact form layout on mobile
- Fix navigation constants and products data
- Fix layout.tsx CMS config and theme handling
- Fix erp-upgrade content layout
2026-08-03 18:32:29 +08:00
zhangxiang
f4d8f0a8e9
fix(breadcrumb): add aria-label to news detail breadcrumb for alignment
...
Also accumulates other pre-existing changes:
- refactor(icons): replace deprecated BarChart3 with TrendingUp
- refactor(services): replace emoji icons with LucideIcon components
- refactor(footer): use logo-white for dark background
- cleanup(archive): remove unused archive components
- cleanup(constants): remove unused types and exports
2026-08-03 14:47:20 +08:00
zhangxiang
b262bf0836
fix(admin): auto-expand sidebar navigation group for active child page
...
- Add getExpandedMenusForPath to auto-expand the parent menu group
when navigating to a child page (e.g., /admin/users expands "系统管理")
- Add hasActiveChild highlight on parent menu group button (bg-gray-100)
- Use lazy initialization for expandedMenus state based on current path
- Use useEffect to track pathname changes and auto-expand accordingly
- Replace `path` unused param with `_path` to satisfy TypeScript strict
2026-08-03 11:49:43 +08:00
zhangxiang
602ed6a671
test(hooks): finalize mutation test improvements and release acceptance
...
- Raise use-swipe-gesture mutation score to 66.13% (target 65%+)
- Maintain use-reduced-motion mutation score at 76.32% (target 50%+)
- Fix use-reduced-motion.ts ESLint set-state-in-effect warning
- Add UJ-10 deep searcher journey (category browse → article read → content discovery)
- Add 40 new test files (analytics, detail, sections, ui, lib components)
- Update test-strategy-plan.md to v2.0 (sync test count to 1591)
- Sync README.md with final release metrics
Quality gates: TS 0 errors, ESLint 0 errors, 121 suites / 1591 tests passed
2026-08-02 19:39:27 +08:00
zhangxiang
ad1a522b17
test(hooks): expand focus-trap tests with Tab/Shift+Tab coverage and fix TypeScript errors
...
- Add 33 unit tests for useFocusTrap hook covering all key behaviors
- Add Tab/Shift+Tab focus cycling tests with activeElement mocking attempt
- Add Escape key behavior, state change, and dependency tracking tests
- Fix TypeScript errors in RichTextEditor.test.tsx (unknown types, unused vars)
- Fix ESLint error in use-focus-trap.test.tsx (self-closing component)
- Fix unused variable warnings in use-focus-trap.test.tsx
- All 33 tests passing, 0 TypeScript errors, 0 ESLint errors
2026-08-02 18:12:41 +08:00
zhangxiang
a022a612c5
test(seo): expand structured data tests to cover all 7 schema components
...
- Add 24 new tests for ServiceSchema, ProductSchema, FAQSchema,
BreadcrumbSchema, and LocalBusinessSchema (previously uncovered)
- Raise SEO component coverage from 40.89% → 100% (all metrics)
- Update jest.config.js coverage thresholds to reflect Phase 7实测 values
- Sync test-strategy-plan.md to v1.8 with latest coverage data
- Update README.md progress with 1509 tests / 73.59% stmts / 82.38% branches
2026-08-02 13:36:28 +08:00
zhangxiang
c480772aec
feat(admin): enhance admin dashboard, user management, and content editor UX
...
- Dashboard: add stats API with content status distribution, recent notifications,
and recent content updates; display active users, pending reviews, unread counts
- User management: full CRUD with role assignment, search, pagination, delete dialog
- Notification center: list with unread filter, mark as read, mark all as read,
pagination, and auto-refresh unread count
- Content editor: form validation (required fields, slug format, blur-triggered
errors), auto-save with 3s debounce and status indicator, publish confirmation
dialog, unsaved changes warning on leave
- Admin layout: add navigation links for user management, roles, and notifications
- admin-api: make request() method public for custom API calls
- gitignore: add reports/mutation/ to exclude mutation test output
2026-07-31 23:05:24 +08:00
张翔
10404dbb36
chore: sync marketing pages, CMS extensions, tests and project docs
...
同步工作区剩余变更,主要包括:
- 营销页面组件与布局持续优化(about/news/services/solutions/team 等)
- 详情页四层叙事组件、布局组件、UI 组件调整
- CMS 数据模型、API 路由、权限、工作流、站内通知、媒体管理扩展
- 新增/补充单元测试与 E2E 测试(cms-workflow.spec.ts 等)
- ESLint 9 迁移、jest/tsconfig 配置更新、依赖调整
- 新增 ADR、CMS 评估文档、Release Review / Acceptance 报告
- 移除水墨装饰组件与大体积未使用字体文件
2026-07-25 08:04:01 +08:00
张翔
d9c0e5f2c1
fix(cms): resolve admin dogfood findings on auth, content editing, and UX
...
修复 CMS / Admin 后台 dogfood 专项测试发现的阻塞性与体验性问题:
- 登录后无限重定向(Secure Cookie + Edge Runtime JWT 兼容)
- 内容新增/编辑保存 400/500(默认不加密请求体、自动生成唯一 slug)
- 编辑时提交 status 导致验证错误
- 原生 confirm 阻塞自动化测试,改为 AlertDialog
- 表单字段可访问性(id/htmlFor/fieldset)
- JSON 数组标签字段新增 TagInput 组件
- 操作反馈统一使用 Sonner Toast
- 后台隐藏营销 Cookie 横幅
- 媒体库空状态优化
添加 dogfood-cms-regression 与 dogfood-cms-output 报告、截图及工作流路由测试。
2026-07-25 08:03:06 +08:00
张翔
a6ea2cc72c
test(e2e,unit): add navigation edge cases and component coverage
...
- Add missing-paths E2E spec for desktop/mobile navigation and contrast
- Add local Playwright config for dev server testing
- Expand unit tests for CMS data server, products, contact and UI components
- Adjust jest config for new test patterns
2026-07-08 14:47:07 +08:00
张翔
7f36211342
feat(content): deepen Bain differentiation across product, solution and service pages
...
- Replace decorative numbering and side-stripe borders with structured copy
- Add scenario positioning, capability metrics and verifiable dimensions
- Refine service timelines, deliverables and case-study narratives
- Update content constants to support CMS seeding
2026-07-08 14:46:51 +08:00