fix(font): 字体选择全场景修复 — AI数字人/Step3标题/封面编辑器 #2054

Merged
auto-approve-bot merged 1 commits from fix/font-selection-20260926 into develop 2026-09-26 16:56:22 +08:00
Owner

问题

用户反馈软件中所有字体选择功能都不起作用——Step3标题设置字体选择、封面编辑器字体选择、AI数字人流程字体选择点了没反应。

根因

  1. AI数字人 TitleStylePanel 传 enableTemplates=true 导致面板直接进入「标题模板网格」分支,完全不渲染字体/字号/位置等参数Tab(最严重,字体选择入口直接消失)。
  2. 智能剪辑 GeneratePage 裸写 prop enableTemplates 但未声明变量(TS 靠作用域巧合未报错),显式声明为 false。
  3. 字体零加载 项目零 @font-face/零字体文件,优设标题黑/阿里普惠体/抖音美好体/斗鱼追光体等自定义中文字体从未加载,浏览器直接 fallback 到 sans-serif,用户感知「切换字体没反应」。
  4. 封面编辑器字体列表错误 PRESET_FONTS 的 family 用不存在的名字(DouYin MeiHaoTi/DouYu ZhuangGuangTi),与标题面板字体列表不同步。
  5. pointer-events 一刀切 .xx-ce-canvas > div { pointer-events:none } 把可拖拽的标题文字层也禁了(文字拖不动也是这个原因)。
  6. Canvas 首帧字体未就绪 TitleMiniPreview 在 Web Font 加载前就用 sans-serif 画完,字体就绪后不重绘。

修复

  • index.html:引入 Google Fonts CDN(Noto Sans/Serif SC、ZCOOL 三款、马善政/龙藏/流江/志莽行书等中文书法字体)
  • components/title/constants.ts:字体 family 栈补全兜底链;新增 5 款可加载字体(站酷小薇/马善政毛笔/龙藏/流江毛笔草/志莽行书)
  • pages/generate/types/cover.ts:重写封面编辑器 PRESET_FONTS/SYSTEM_FONTS,新增 tag 字段区分 preset/hand/serif/sans/mono;移除不可用的「斗鱼追光体2.0」
  • CoverEditorModal.tsx:字体下拉合并 ALL_FONTS、圆点按tag区分颜色;文字层显式 pointer-events:auto 保证可拖拽
  • generate.css:精准选择装饰层禁用 pointer-events(不再一刀切);新增 hand/serif/mono 三色圆点样式
  • GeneratePage.tsx:显式 const enableTemplates=false
  • PanelTitleConfig.tsx(AI数字人):enableTemplates 改为 false,让AI数字人标题面板正确渲染「预设+参数Tab」
  • TitleMiniPreview.tsx:监听 document.fonts.ready,字体加载完成后重绘 Canvas

验证

  • tsc 无错
  • eslint 通过
  • prettier 格式化
  • vite build 6s 构建成功
  • 本地 dev server 已启动,独立字体测试页面可访问

注意

优设标题黑/阿里普惠体/抖音美好体/斗鱼追光体为商业字体,无法通过开源 CDN 加载。family 栈已设置 Google Fonts 中视觉风格最接近的开源字体作为兜底:

  • 优设标题黑 → 站酷庆科黄油体(ZCOOL QingKe HuangYou,厚重海报黑体)
  • 抖音美好体 → 站酷快乐体(ZCOOL KuaiLe,圆润卡通)
  • 阿里普惠体Bold → Noto Sans SC 900(同字重黑体)
  • 斗鱼追光体2.0:已从预置字体移除(无合适开源替代),用户仍可通过系统字体列表选择其他字体

若后续需要精确商用字体,需采购字体授权后放入 public/fonts/ 并加 @font-face 声明。

## 问题 用户反馈软件中所有字体选择功能都不起作用——Step3标题设置字体选择、封面编辑器字体选择、AI数字人流程字体选择点了没反应。 ## 根因 1. **AI数字人** TitleStylePanel 传 `enableTemplates=true` 导致面板直接进入「标题模板网格」分支,完全不渲染字体/字号/位置等参数Tab(最严重,字体选择入口直接消失)。 2. **智能剪辑 GeneratePage** 裸写 prop `enableTemplates` 但未声明变量(TS 靠作用域巧合未报错),显式声明为 `false`。 3. **字体零加载** 项目零 `@font-face`/零字体文件,优设标题黑/阿里普惠体/抖音美好体/斗鱼追光体等自定义中文字体从未加载,浏览器直接 fallback 到 sans-serif,用户感知「切换字体没反应」。 4. **封面编辑器字体列表错误** `PRESET_FONTS` 的 family 用不存在的名字(`DouYin MeiHaoTi`/`DouYu ZhuangGuangTi`),与标题面板字体列表不同步。 5. **pointer-events 一刀切** `.xx-ce-canvas > div { pointer-events:none }` 把可拖拽的标题文字层也禁了(文字拖不动也是这个原因)。 6. **Canvas 首帧字体未就绪** TitleMiniPreview 在 Web Font 加载前就用 sans-serif 画完,字体就绪后不重绘。 ## 修复 - `index.html`:引入 Google Fonts CDN(Noto Sans/Serif SC、ZCOOL 三款、马善政/龙藏/流江/志莽行书等中文书法字体) - `components/title/constants.ts`:字体 family 栈补全兜底链;新增 5 款可加载字体(站酷小薇/马善政毛笔/龙藏/流江毛笔草/志莽行书) - `pages/generate/types/cover.ts`:重写封面编辑器 PRESET_FONTS/SYSTEM_FONTS,新增 tag 字段区分 preset/hand/serif/sans/mono;移除不可用的「斗鱼追光体2.0」 - `CoverEditorModal.tsx`:字体下拉合并 ALL_FONTS、圆点按tag区分颜色;文字层显式 `pointer-events:auto` 保证可拖拽 - `generate.css`:精准选择装饰层禁用 pointer-events(不再一刀切);新增 hand/serif/mono 三色圆点样式 - `GeneratePage.tsx`:显式 `const enableTemplates=false` - `PanelTitleConfig.tsx`(AI数字人):`enableTemplates` 改为 `false`,让AI数字人标题面板正确渲染「预设+参数Tab」 - `TitleMiniPreview.tsx`:监听 `document.fonts.ready`,字体加载完成后重绘 Canvas ## 验证 - tsc 无错 - eslint 通过 - prettier 格式化 - vite build 6s 构建成功 - 本地 dev server 已启动,独立字体测试页面可访问 ## 注意 优设标题黑/阿里普惠体/抖音美好体/斗鱼追光体为商业字体,无法通过开源 CDN 加载。family 栈已设置 Google Fonts 中视觉风格最接近的开源字体作为兜底: - 优设标题黑 → 站酷庆科黄油体(ZCOOL QingKe HuangYou,厚重海报黑体) - 抖音美好体 → 站酷快乐体(ZCOOL KuaiLe,圆润卡通) - 阿里普惠体Bold → Noto Sans SC 900(同字重黑体) - 斗鱼追光体2.0:已从预置字体移除(无合适开源替代),用户仍可通过系统字体列表选择其他字体 若后续需要精确商用字体,需采购字体授权后放入 `public/fonts/` 并加 @font-face 声明。
xiaoxia added 1 commit 2026-09-26 16:48:55 +08:00
fix(font): 字体选择全场景修复 — AI数字人/Step3标题/封面编辑器
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m37s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m57s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m59s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m4s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m15s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m28s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m53s
AI Code Review / AI Code Review (pull_request) Successful in 6m33s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 6m40s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m21s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 28s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 31s
2654c2afcc
根因分析:
1. AI数字人TitleStylePanel 传 enableTemplates=true 导致面板直接进入
   「标题模板网格」分支,完全不渲染字体/字号/位置等参数Tab,用户看不到任何字体选择UI
2. 智能剪辑 GeneratePage 直接写了裸 prop `enableTemplates` 但没定义该变量
   (TS不报错是因为之前 props 解构顺序导致引用了 formState 之外的全局?
   实际效果是传了 undefined,面板落回默认模式但易出错),显式声明为 false
3. 项目零 @font-face/零字体文件,优设标题黑/阿里普惠体/抖音美好体等自定义
   字体从未加载,浏览器直接 fallback 到 sans-serif,用户感知「切换字体没反应」
4. CoverEditorModal 的 PRESET_FONTS family 用的是不通用的英文引号/错误名字
   ('DouYin MeiHaoTi'/'DouYu ZhuangGuangTi' 实际不存在),且和标题面板字体列表
   不同步,两边视觉不一致
5. CSS .xx-ce-canvas>div { pointer-events:none } 把可拖拽的标题文字层也禁了,
   封面预览文字无法响应mousedown拖拽(这是「文字拖拽不动」的另一个原因)
6. TitleMiniPreview 用Canvas绘制,Web Font异步加载,首次draw时字体还没就绪
   先用sans-serif画完不重绘,视觉上「选了字体没反应」

修复:
- index.html: 引入Google Fonts CDN(Noto Sans SC / Noto Serif SC / ZCOOL
  三款 / Ma Shan Zheng / Long Cang / Liu Jian Mao Cao / Zhi Mang Xing)
- components/title/constants.ts: FONT_OPTIONS family栈补全兜底字体链;
  新增「站酷小薇体/马善政毛笔/龙藏体/流江毛笔草/志莽行书」5款可加载字体
- pages/generate/types/cover.ts: 重写PRESET_FONTS/SYSTEM_FONTS,复用统一family栈,
  新增tag字段区分preset/hand/serif/sans/mono;删去不可用的「斗鱼追光体2.0」
- CoverEditorModal.tsx: 字体下拉合并ALL_FONTS、圆点颜色按tag区分;
  文字层显式 pointer-events:auto 保证可拖拽;清理未使用import
- generate.css: 精准选择装饰层禁用pointer-events(不再一刀切xx-ce-canvas>div);
  新增hand/serif/mono三色字体圆点
- GeneratePage.tsx: 显式 const enableTemplates=false,JSX传参改为
  enableTemplates={enableTemplates}
- PanelTitleConfig.tsx(AI数字人): enableTemplates 改 false,让AI数字人
  标题面板正确渲染「预设+参数Tab」,字体/描边/阴影/排版参数全部可见
- TitleMiniPreview.tsx: useEffect里监听document.fonts.ready,字体加载完成后
  重绘一次Canvas,避免首帧fallback sans-serif

🚀 预览环境已部署

项目 详情
PR号 #2054
预览链接 https://pr-2054.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #2054 | | 预览链接 | [https://pr-2054.preview.xiaoxiajianji.com](https://pr-2054.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-09-26 16:50:59 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-09-26 16:50:59 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 95fdc97b65 into develop 2026-09-26 16:56:22 +08:00
auto-approve-bot deleted branch fix/font-selection-20260926 2026-09-26 16:56:24 +08:00

🗑️ 预览环境已清理

PR #2054 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #2054 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.