import type { LetterTracingMode } from './generators/letter-tracing-generator'; import type { DebugPublishMeta } from '../../utils/debugPublish'; import { inferGradeFromAge } from '../../utils/debugPublish'; interface ModeDefinition { id: LetterTracingMode; icon: string; title: string; subtitle: string; difficulty: 1 | 2 | 3 | 4; tags: string[]; sortOrder: number; } const MODES = [ { id: 'letter-tracing-single', icon: 'start-a', title: '默认字帖', subtitle: '配图、例句与描红', difficulty: 1, tags: ['字母描红', '英语启蒙', '看图描红'], sortOrder: 42, }, { id: 'letter-tracing-upper-lower', icon: 'draw-o', title: '基础描红', subtitle: 'Uppercase / Lowercase 总览', difficulty: 1, tags: ['字母描红', '英语启蒙', '字母总览'], sortOrder: 44, }, { id: 'letter-tracing-case-pairing', icon: 'font-size', title: '大小写对照', subtitle: '半组字母左大写右小写', difficulty: 1, tags: ['字母描红', '英语启蒙', '大小写练习'], sortOrder: 45, }, { id: 'letter-tracing-two-column', icon: 'two-columns', title: '两列描红', subtitle: '左 A–M、右 N–Z 配对描红', difficulty: 1, tags: ['字母描红', '英语启蒙', '两列练习'], sortOrder: 43, }, { id: 'letter-tracing-half', icon: 'square-half', title: '13字母半表', subtitle: '每行一个字母,13 字母半表', difficulty: 2, tags: ['字母描红', '英语启蒙', '单字母逐行'], sortOrder: 47, }, { id: 'letter-tracing-three', icon: 'ABC-list', title: '三字母精练', subtitle: '每页聚焦 3 个字母深度书写', difficulty: 2, tags: ['字母描红', '英语启蒙', '三字母精练'], sortOrder: 46, }, { id: 'letter-tracing-daily-checkin', icon: 'draw-o', title: '每日打卡', subtitle: '四宫格每日字母打卡练习', difficulty: 2, tags: ['字母描红', '英语启蒙', '每日打卡'], sortOrder: 48, }, ] as const satisfies ReadonlyArray; type Mode = (typeof MODES)[number]; const MODE_BY_ID = Object.fromEntries( MODES.map((m) => [m.id, m]), ) as Record; /** 页面渲染用:模式选择器列表 */ export const LETTER_TRACING_MODE_OPTIONS = MODES; /** 页面 pageInfoLookup 用 */ export function getModeInfo(id: string) { const m = MODE_BY_ID[id]; return m ? { title: m.title, desc: m.subtitle } : undefined; } /** 判断 id 是否有效 */ export function isValidMode(id: string): boolean { return id in MODE_BY_ID; } /** 发布用:从当前 mode 生成 DebugPublishMeta */ export function getPublishMetaByMode(id: string): DebugPublishMeta | null { const m = MODE_BY_ID[id]; if (!m) return null; return { id: m.id, title: m.title, subtitle: m.subtitle, category: 'english', subcategory: 'letter-tracing', path: `/englishPages/letterTracing/letterTracing?id=${m.id}`, ageMin: 4, ageMax: 7, grade: inferGradeFromAge(4, 7), difficulty: m.difficulty, previewImg: '', tags: [...m.tags], isNew: false, isHot: false, sortOrder: m.sortOrder, status: 'draft', }; }