### Changed - 全部源码从 JavaScript 迁移到 TypeScript (strict mode) - core.js (1244行) 拆分为 toast.ts + api.ts + templates.ts - 删除手动维护的 types/index.d.ts,类型从源码自动生成 - 构建工具链: Babel → ts-jest, 新增 @rollup/plugin-typescript - 新增 rollup-plugin-dts 生成合并 .d.ts ### Added - tsconfig.json (strict: true) - src/types.ts 核心类型模块 (39 个导出类型) - .eslintrc.json (@typescript-eslint) - .gitea/workflows/ci.yml (Node 18/20/22/24 矩阵) - CHANGELOG.md ### Aligned with metona-starter - package.json: type:module, engines≥16, prepublishOnly - rollup.config.js: dts plugin, port 3001 - jest.config.cjs, build.sh, serve.sh, .gitignore (.npmrc) ### Removed - babel.config.js, types/ 目录, 所有 src/*.js
90 lines
2.0 KiB
TypeScript
90 lines
2.0 KiB
TypeScript
/**
|
||
* MetonaToast Animations — 动画管理
|
||
* @module animations
|
||
* @version 0.2.0
|
||
*/
|
||
|
||
import { ANIMATIONS } from './constants.js';
|
||
import type { AnimationConfig, AnimationUtils } from './types.js';
|
||
|
||
// 动画缓存
|
||
const animationMap: Map<string, AnimationConfig> = new Map();
|
||
|
||
// 注册默认动画
|
||
Object.entries(ANIMATIONS).forEach(([name, config]) => {
|
||
animationMap.set(name, {
|
||
name,
|
||
enter: config.enter,
|
||
leave: config.leave,
|
||
duration: config.duration,
|
||
easing: config.easing,
|
||
});
|
||
});
|
||
|
||
/**
|
||
* 动画工具函数
|
||
*/
|
||
export const animationUtils: AnimationUtils = {
|
||
register(name: string, config: Partial<AnimationConfig>): void {
|
||
animationMap.set(name, {
|
||
name,
|
||
enter: config.enter || {},
|
||
leave: config.leave || {},
|
||
duration: config.duration || 300,
|
||
easing: config.easing || 'cubic-bezier(0.4, 0, 0.2, 1)',
|
||
});
|
||
},
|
||
|
||
unregister(name: string): void {
|
||
animationMap.delete(name);
|
||
},
|
||
|
||
get(name: string): AnimationConfig | null {
|
||
return animationMap.get(name) || null;
|
||
},
|
||
|
||
getAnimationNames(): string[] {
|
||
return Array.from(animationMap.keys());
|
||
},
|
||
|
||
getActiveCount(): number {
|
||
return animationMap.size;
|
||
},
|
||
|
||
cancelAll(): void {
|
||
// CSS动画由浏览器原生管理,无需手动取消
|
||
},
|
||
|
||
reset(): void {
|
||
animationMap.clear();
|
||
Object.entries(ANIMATIONS).forEach(([name, config]) => {
|
||
animationMap.set(name, {
|
||
name,
|
||
enter: config.enter,
|
||
leave: config.leave,
|
||
duration: config.duration,
|
||
easing: config.easing,
|
||
});
|
||
});
|
||
},
|
||
|
||
destroy(): void {
|
||
animationMap.clear();
|
||
},
|
||
};
|
||
|
||
/**
|
||
* 动画预设(占位,兼容旧API)
|
||
*/
|
||
export const animationPresets: Record<string, AnimationConfig> = {};
|
||
|
||
/**
|
||
* 创建自定义动画配置
|
||
*/
|
||
export const createAnimation = (config: Partial<AnimationConfig>): AnimationConfig => ({
|
||
enter: config.enter || {},
|
||
leave: config.leave || {},
|
||
duration: config.duration || 300,
|
||
easing: config.easing || 'cubic-bezier(0.4, 0, 0.2, 1)',
|
||
});
|