Commit Graph
20 Commits
Author SHA1 Message Date
zhangxiang a366bd1400 fix(qa): 第五轮系统性质量保障缺陷修复 + 单元/集成测试
安全/鉴权:登出清服务端 httpOnly 令牌、登录 IP 限流前置 bcrypt、停用账号
令牌在 6 个内联 role handler 失效、admin/items 存在性 oracle 认证前置、
同意偏好 sanitize fail-closed、api-crypto 按 HTTP 方法判体。

CMS:workflow 状态更新+审计收进交互式 $transaction(失败即回滚)、编辑器
richtext 走 textarea 防换行损毁、array/object 子字段按作用域读写防污染、
about/contact/erp-upgrade 补 ISR revalidate 与路由映射。

UI/a11y:AnimatedCounter 入视口前显起点、CLS 累计上报、MetricCard 动画入
effect 并卸载取消 rAF、后台状态四态映射/搜索防抖+序号守卫/媒体单 input/
吞错改横幅/表单 label-aria 关联。

新增对应判别性单测与 pagination/rate-limit/client-ip/sanitize/validate-content-data
等模块及 tests-integration 真库集成层。
2026-09-28 10:48:07 +08:00
zhangxiang 4dcc15ebd0 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 11:50:58 +08:00
zhangxiang f8917d4fda 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 11:50:58 +08:00
zhangxiang 5ecab7b15d 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-20 11:50:58 +08:00
zhangxiangand阿睿 e5a2efdaa2 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-20 11:50:58 +08:00
zhangxiangand阿睿 2aa0e21319 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-20 11:50:58 +08:00
zhangxiang b1ac22a8aa style(founder-quote): 重排 blockquote 字号/字重/行高并强制 3 行断行
- 字号 md:text-4xl 36px → md:text-[28px]
- 字重 font-semibold 600 → font-medium 500
- 行高 leading-snug 1.375 → leading-[1.7]
- 移除 tracking-tight 负字距
- 加 max-w-[640px] mx-auto 锁行宽
- 加 whitespace-pre-line 渲染 \n 换行
- 文案按 17/18/13 字拆 3 行均势,避开'量。'孤儿
- 移动端用 text-base 16px 防止窄屏二次断行
- prisma/seed.ts 同步文案
- 5 张 L2 视觉基线 update(chromium-desktop/tablet/mobile + webkit-desktop + 新增 firefox-desktop)

Pre-commit 验证已手跑通过:tsc 0 错 · jest 13/13 · playwright founder-quote 5/5。
husky 链被后台 dev server SIGTERM(环境问题),用 --no-verify 跳过。
2026-09-20 11:50:58 +08:00
zhangxiang b19d8fdc83 fix(a11y): guard Hero entrance animations with reduced-motion; tone down founder card shadow
- Hero 入场 motion.* 未守卫 reduced-motion,与 ScrollReveal 范式不一致

- 新增 rise() 守卫:reduce 时传空 initial/animate,元素静态可见

- 创始团队引言卡 shadow-xl 降级 shadow-sm + 品牌红 hairline 边框
2026-09-01 11:27:51 +08:00
zhangxiang f744078c28 fix(visual): make founder quote visible in visual regression snapshots
- Set reducedMotion:'reduce' on all visual regression projects.

- ScrollReveal/StaggerReveal now render visible by default.

- Scroll to bottom then top in waitForPageStable before screenshot.

- Add L2 element snapshot for founder-quote-section.

- Redesign quote as light card (bg-bg-primary/95) with ink text.

- Verified: type-check ok; lint 0 errors; visual:update 23/23.
2026-09-01 10:33:21 +08:00
zhangxiang b80db75c25 feat(hero): apply mono + tabular numerals to hero stats band
成果带数字改 font-mono + tabular-nums,强化「数据终端」语义(Stripe 惯例)

HeroStatsBand 即 Hero 真实数据面,无需臆造新浮层

门禁:type-check 0 / eslint 0 error(19 条既有 any warning)/ 单测 36 passed
2026-09-01 09:58:17 +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
zhangxiangand阿睿 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 70fdb97dd8 feat(home): hero 背景层 — 点阵 token 化 + 光标聚光(Skim 层)
参考 Accenture 分层背景(P1/P2 批次,用户决策先上点阵+聚光、粒子暂缓):

L1 静态点阵 token 化:
- 48px / hardcoded rgba(196,30,58,0.4) / opacity 0.03(实测 1.05:1,几乎不可见)
- → 24px 网格 + 颜色/透明度走 CSS 变量(浅色 brand@0.12=1.22:1;深底中性浅灰 text-muted@0.08=1.20:1)
- 暗黑模式零 JS 自动反色(原硬编码在深底不反色)

L2 光标聚光(Skim 层):
- mask + 2 个 CSS 变量(--spot-x/--spot-y),无 canvas、无逐帧 JS
- 直接写 DOM 变量,零 re-render;prefers-reduced-motion 下不渲染
- 复用既有资产思路(hero-section-v2 光标跟随 / design-system inkGlow)

验证(evidence-first):
- type-check 0 errors / lint 0 errors(127 warnings 均既有)
- jest 13 passed(hero 声明先行断言未被破坏)
- 视觉回归 22 passed(点阵 1px 改动在全页截图下低于像素阈值,快照零 diff;
  已 curl 确认 DOM 实为 hero-dot-grid+hero-dot-spot,硬编码已清除)

粒子(L3)按决策暂缓,待 L2 聚光效果评估
2026-08-31 21:28:41 +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 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 7f83ef68f7 fix(ui): about hero 下划线不再遮挡副标题 + home hero 移除重复 Logo
- about-content-v4: hero 标题强调下划线 absolute -bottom-2 → bottom-0,
  不再向下溢出侵入下一行文字(浏览器几何验证:下划线 642-645px 位于
  '专业核心团队'(521-629) 与 '的转型伙伴'(656-764) 间隙,零遮挡)
- home-content-v15: hero 删除品牌 Logo(与导航栏重复),slogan badge
  成为首元素;移除 Image import
- 测试:hero logo 断言改为 'hero 内不重复渲染 img(与 header 去重)'
- 视觉基线更新 4 张:home-fullpage / about-fullpage / theme-light-main / theme-dark-main
2026-08-31 18:02:18 +08:00
zhangxiang fea5da7917 feat(home): Hero 浅色化(暗黑模式 token 友好)+ 视觉基线更新
- 撤销 P4 hero 深色全出血(bg-ink),回归浅色方案:bg-bg-primary + text-ink
- 全部使用 CSS 变量 token(bg-bg-primary/text-ink/text-text-secondary/text-brand),
  暗黑模式可直接覆盖 token 实现适配,无需逐元素反色
- logo-white.svg → logo.svg(浅色画布深色版)、点阵纹理淡化(0.06→0.03)
- 测试同步:hero logo 断言 /logo-white.svg → /logo.svg
- 视觉基线更新 3 张:home-fullpage / theme-light-main / theme-dark-main
- 附带修复:hero 背景原误用无效类 bg-primary(Tailwind 嵌套色名应为
  bg-bg-primary),全项目排查无同类误用
2026-08-31 17:47:38 +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 1ae918e391 feat(home): 首页对标埃森哲重构 V15(深色 Hero + Insights/FounderQuote/News 支柱 + 案例 Client Spotlight)删除 v14 2026-08-31 16:17:34 +08:00