feat: Kinetic Dark 设计语言 + Lucide 图标迁移 + 首页轻量个性化

- 建立 Lucide 子集 iconfont(49 字形),全站 emoji 替换为 fc-icon 组件
- 重塑 Design Token(冷中性近黑底 + Volt 荧光绿 #B6F24E),消除硬编码颜色
- 首页登录后个性化:我的计划 / 我的收藏 / 今日推荐(纯前端复用现有 API)
- 后端 DEFAULT_EMOJI→Lucide 名,PALETTE 对齐 Kinetic Dark 语义色板
- 修复 person-standing 缺失字形;14 个官方组合 seed emoji 全部映射到现有字形
This commit is contained in:
2026-07-22 21:38:56 +08:00
parent ca0af6f7d2
commit b94eb706ff
64 changed files with 1572 additions and 173 deletions

View File

@@ -11,8 +11,10 @@ import {
labelOf,
} from '../data/labels';
// 媒体根地址:默认指向本服务自托管的 /media 静态目录(走自家后端,不依赖公共图床)。
// 生产/服务器部署时用环境变量覆盖,例如 MEDIA_BASE_URL=http://192.227.237.8:3001/media
const MEDIA_BASE_URL = (
process.env.MEDIA_BASE_URL || 'https://cdn.jsdelivr.net/gh/hasaneyldrm/exercises-dataset@main'
process.env.MEDIA_BASE_URL || 'http://localhost:3000/media'
).replace(/\/$/, '');
function toMediaUrl(path: string): string {

View File

@@ -34,8 +34,9 @@ export interface PlanDetail extends PlanSummary {
exercises: ExerciseSummary[];
}
const DEFAULT_EMOJI = '📋';
const PALETTE = ['#D9B36C', '#58C9B9', '#9B72FF', '#FF6B6B', '#4D96FF', '#6BCB77'];
// 历史字段名仍叫 emoji但值已是 Lucide 图标名(前端 iconName 兼容旧 emoji
const DEFAULT_EMOJI = 'clipboard-list';
const PALETTE = ['#B6F24E', '#2BD9A6', '#4FA8FF', '#F2B53D', '#FF5C5C', '#9BA7A1'];
@Injectable()
export class PlansService {

View File

@@ -22,7 +22,7 @@ export class UsersService {
const user: UserRecord = {
openid: input.openid,
nickname: input.nickname?.trim() || '健身学员',
avatar: input.avatar || '🏃',
avatar: input.avatar || 'user',
createdAt: now,
updatedAt: now,
};