{"version":3,"file":"KeyframeAnimation.cjs","sources":["../../../src/animations/KeyframeAnimation.js"],"sourcesContent":["import { Animation } from './Animation.js';\r\nimport { AnimationType } from '../types/enums.js';\r\nimport { lerp } from '../utils/helpers.js';\r\n\r\n/**\r\n * 关键帧动画\r\n */\r\nexport class KeyframeAnimation extends Animation {\r\n  constructor(config = {}) {\r\n    super(config);\r\n    this.type = AnimationType.KEYFRAME;\r\n    this.keyframes = config.keyframes || []; // [{ time: 0, props: {...} }, ...]\r\n    this.properties = config.properties || []; // 要动画的属性列表\r\n  }\r\n\r\n  /**\r\n   * 添加关键帧\r\n   */\r\n  addKeyframe(time, props) {\r\n    this.keyframes.push({ time, props });\r\n    this.keyframes.sort((a, b) => a.time - b.time);\r\n    const maxKFTime = this.keyframes.reduce((m, kf) => {\r\n      const t = (kf && typeof kf.time === 'number') ? kf.time : 0;\r\n      return Math.max(m, t);\r\n    }, 0);\r\n    if (maxKFTime > 1.000001 && (this.config.duration === undefined || this.config.duration < maxKFTime)) {\r\n      this.config.duration = maxKFTime;\r\n      this.endTime = this.startTime + this.config.duration;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 设置关键帧\r\n   */\r\n  setKeyframes(keyframes) {\r\n    this.keyframes = keyframes.sort((a, b) => a.time - b.time);\r\n    const maxKFTime = this.keyframes.reduce((m, kf) => {\r\n      const t = (kf && typeof kf.time === 'number') ? kf.time : 0;\r\n      return Math.max(m, t);\r\n    }, 0);\r\n    if (maxKFTime > 1.000001 && (this.config.duration === undefined || this.config.duration < maxKFTime)) {\r\n      this.config.duration = maxKFTime;\r\n      this.endTime = this.startTime + this.config.duration;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 获取指定时间的关键帧状态\r\n   */\r\n  getStateAtTime(time) {\r\n    if (this.keyframes.length === 0) return {};\r\n\r\n    const progress = this.getEasedProgress(time);\r\n    const duration = this.config.duration || 1;\r\n\r\n    const maxKFTime = this.keyframes.reduce((m, kf) => {\r\n      const t = (kf && typeof kf.time === 'number') ? kf.time : 0;\r\n      return Math.max(m, t);\r\n    }, 0);\r\n\r\n    const useSeconds = maxKFTime > 1.000001;\r\n    const normalizedTime = useSeconds ? (time - this.startTime) : (progress * duration);\r\n\r\n    let startKeyframe = this.keyframes[0];\r\n    let endKeyframe = this.keyframes[this.keyframes.length - 1];\r\n\r\n    for (let i = 0; i < this.keyframes.length - 1; i++) {\r\n      const currentTime = useSeconds ? this.keyframes[i].time : (this.keyframes[i].time * duration);\r\n      const nextTime = useSeconds ? this.keyframes[i + 1].time : (this.keyframes[i + 1].time * duration);\r\n      if (normalizedTime >= currentTime && normalizedTime <= nextTime) {\r\n        startKeyframe = this.keyframes[i];\r\n        endKeyframe = this.keyframes[i + 1];\r\n        break;\r\n      }\r\n    }\r\n\r\n    const startTime = useSeconds ? startKeyframe.time : (startKeyframe.time * duration);\r\n    const endTime = useSeconds ? endKeyframe.time : (endKeyframe.time * duration);\r\n    const segmentDuration = endTime - startTime;\r\n    const segmentProgress = segmentDuration > 0 ? (normalizedTime - startTime) / segmentDuration : 0;\r\n\r\n    const state = {};\r\n    const startProps = startKeyframe.props || startKeyframe;\r\n    const endProps = endKeyframe.props || endKeyframe;\r\n    const allProps = new Set([\r\n      ...Object.keys(startProps).filter(k => k !== 'time'),\r\n      ...Object.keys(endProps).filter(k => k !== 'time'),\r\n    ]);\r\n\r\n    for (const prop of allProps) {\r\n      const startValue = startProps[prop] ?? 0;\r\n      const endValue = endProps[prop] ?? 0;\r\n      state[prop] = lerp(startValue, endValue, segmentProgress);\r\n    }\r\n\r\n    return state;\r\n  }\r\n\r\n  /**\r\n   * 获取初始状态（第一个关键帧的值）\r\n   */\r\n  getInitialState() {\r\n    if (this.keyframes.length === 0) return {};\r\n    \r\n    const firstKeyframe = this.keyframes[0];\r\n    const props = firstKeyframe.props || firstKeyframe;\r\n    const state = {};\r\n    \r\n    // 排除 time 属性\r\n    for (const key of Object.keys(props)) {\r\n      if (key !== 'time') {\r\n        state[key] = props[key];\r\n      }\r\n    }\r\n    \r\n    return state;\r\n  }\r\n\r\n  /**\r\n   * 获取结束状态（最后一个关键帧的值）\r\n   */\r\n  getFinalState() {\r\n    if (this.keyframes.length === 0) return {};\r\n    \r\n    const lastKeyframe = this.keyframes[this.keyframes.length - 1];\r\n    const props = lastKeyframe.props || lastKeyframe;\r\n    const state = {};\r\n    \r\n    // 排除 time 属性\r\n    for (const key of Object.keys(props)) {\r\n      if (key !== 'time') {\r\n        state[key] = props[key];\r\n      }\r\n    }\r\n    \r\n    return state;\r\n  }\r\n}\r\n\r\n"],"names":["Animation","AnimationType","lerp"],"mappings":"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"}