declare namespace APJS {
  /**
   * @description TweenType
   * @enum
   * @property  Transform - Transform
   * @property  TransformPath - TransformPath
   * @property  TransformFollow - TransformFollow
   * @property  Material - Material
   */
  enum TweenType {
    None,
    Transform,
    TransformPath,
    TransformFollow,
    Material,
  }
  
  /**
   * @class Tween
   * @extends DynamicComponent
   * @description Represents a dynamic component specifically designed for the Tween.
   */
  class Tween extends DynamicComponent {
    protected constructor();
  
      /**
       * @description Tween animation implementation
       * @type {TweenAnimation}
       */
    get tweenAnimation(): TweenAnimation;
  
      /**
       * @description TweenType
       * @type {TweenType}
       */
    get tweenType(): TweenType;
  
    set tweenType(value: TweenType);
  }
  
  /**
   * @description TweenPlayMode
   * @enum
   * @property  Loop - Loop
   * @property  LoopOnce - LoopOnce
   * @property  PingPong - PingPong
   * @property  PingPongOnce - PingPongOnce
   */
  enum TweenPlayMode {
    Loop,
    LoopOnce,
    PingPong,
    PingPongOnce,
  }
  
  /**
   * @description TweenMotionType
   * @enum
   * @property  FromTo - Move form start to end
   * @property  To - Move to end
   * @property  Offset - Move to offset
   */
  enum TweenMotionType {
    FromTo,
    To,
    Offset,
  }
  
  /**
   * @description TweenTargetType - Tween target type
   * @enum
   * @property Position - Position
   * @property Rotation - Rotation
   * @property Scale - Scale
   * @property AlbedoColor - Albedo color
   * @property EmissionColor - Emission color
   * @property UV - UV coordinates
   */
  enum TweenTargetType {
    Position,
    Rotation,
    Scale,
    AlbedoColor,
    EmissionColor,
    UV,
  }
  
  /**
   * @description TweenOrientation - Object orientation control method in path mode
   * @enum
   * @property Fixed - Fixed orientation
   * @property Path - Follow path direction
   */
  enum TweenOrientation {
    Fixed,
    Path,
  }
  
  /**
   * @description TweenPathType - Path type
   * @enum
   * @property Curve - Curve path
   * @property Straight - Straight path
   */
  enum TweenPathType {
    Curve,
    Straight,
  }
  
  /**
   * @description TweenEasingFunction - Tween easing function
   * @enum
   * @property Linear - Linear
   * @property Quadratic - Quadratic
   * @property Cubic - Cubic
   * @property Quartic - Quartic
   * @property Quintic - Quintic
   * @property Sinusoidal - Sinusoidal
   * @property Exponential - Exponential
   * @property Circular - Circular
   * @property Elastic - Elastic
   * @property Back - Back
   * @property Bounce - Bounce
   * @property Power - Power function
   */
  enum TweenEasingFunction {
    Linear,
    Quadratic,
    Cubic,
    Quartic,
    Quintic,
    Sinusoidal,
    Exponential,
    Circular,
    Elastic,
    Back,
    Bounce,
    GeneratePow,
  }
  
  /**
   * @description TweenEasingType - Tween easing type
   * @enum
   * @property None - None
   * @property EaseIn - Ease in
   * @property EaseOut - Ease out
   * @property EaseInOut - Ease in and out
   */
  enum TweenEasingType {
    None,
    In,
    Out,
    InOut,
  }
  
  /**
   * @class TweenAnimation
   * @description Base class for tween animation implementation
   */
  class TweenAnimation extends ScriptCustomObject {
    protected constructor();
  
      /**
       * @description Animation delay
       * @type {number}
       */
    get delay(): number;
  
    set delay(value: number);
  
      /**
       * @description Animation duration
       * @type {number}
       */
    get duration(): number;
  
    set duration(value: number);
  
      /**
       * @description Easing function
       * @type {TweenEasingFunction}
       */
    get easingFunction(): TweenEasingFunction;
  
    set easingFunction(value: TweenEasingFunction);
  
      /**
       * @description Easing type
       * @type {TweenEasingType}
       */
    get easingType(): TweenEasingType;
  
    set easingType(value: TweenEasingType);
  
      /**
       * @description Motion type
       * @type {TweenMotionType}
       */
    get motionType(): TweenMotionType;
  
    set motionType(value: TweenMotionType);
  
      /**
       * @description Target object
       * @type {SceneObject}
       */
    get object(): SceneObject | null;
  
    set object(value: SceneObject | null);
  
      /**
       * @description Play mode
       * @type {TweenPlayMode}
       */
    get playMode(): TweenPlayMode;
  
    set playMode(value: TweenPlayMode);
  
      /**
       * @description Target type
       * @type {TweenTargetType}
       */
    get targetType(): TweenTargetType;
  
    set targetType(value: TweenTargetType);
  
      /**
       * @description Pause tween animation
       */
      pause(): void;
  
      /**
       * @description Resume tween animation
       */
      resume(): void;
  
      /**
       * @description Start tween animation
       */
      start(): void;
  
      /**
       * @description Pause tween animation
       */
      stop(): void;
  }
  
  /**
   * @class TweenMaterial
   * @extends TweenAnimation
   * @description Tween component specifically for material animations (base color, emission color, uv)
   */
  class TweenMaterial extends TweenAnimation {
    protected constructor();
  
      /**
       * @description End color value
       * @type {Color}
       */
    get endColor(): Color;
  
    set endColor(value: Color);
  
      /**
       * @description End vector2 value
       * @type {Vector2f}
       */
    get endVector2(): Vector2f;
  
    set endVector2(value: Vector2f);
  
      /**
       * @description Start color value
       * @type {Color}
       */
    get startColor(): Color;
  
    set startColor(value: Color);
  
      /**
       * @description Start vector2 value
       * @type {Vector2f}
       */
    get startVector2(): Vector2f;
  
    set startVector2(value: Vector2f);
  
      /**
       * @description Target type
       * @type {TweenTargetType}
       */
    set targetType(value: TweenTargetType);
  
    get targetType(): TweenTargetType;
  
      pause(): void;
  
      resume(): void;
  
      start(): void;
  
      stop(): void;
  }
  
  /**
   * @class TweenTransform
   * @extends TweenAnimation
   * @description Tween component specifically for transform animations (position, rotation, scale)
   */
  class TweenTransform extends TweenAnimation {
    protected constructor();
  
      /**
       * @description End number value
       * @type {number}
       */
    get endNumber(): number;
  
    set endNumber(value: number);
  
      /**
       * @description End vector2 value
       * @type {Vector2f}
       */
    get endVector2(): Vector2f;
  
    set endVector2(value: Vector2f);
  
      /**
       * @description End vector3 value
       * @type {Vector3f}
       */
    get endVector3(): Vector3f;
  
    set endVector3(value: Vector3f);
  
      /**
       * @description Offset number value
       * @type {number}
       */
    get offsetNumber(): number;
  
    set offsetNumber(value: number);
  
      /**
       * @description Offset vector2 value
       * @type {Vector2f}
       */
    get offsetVector2(): Vector2f;
  
    set offsetVector2(value: Vector2f);
  
      /**
       * @description Offset vector3 value
       * @type {Vector3f}
       */
    get offsetVector3(): Vector3f;
  
    set offsetVector3(value: Vector3f);
  
      /**
       * @description Start number value
       * @type {number}
       */
    get startNumber(): number;
  
    set startNumber(value: number);
  
      /**
       * @description Start vector2 value
       * @type {Vector2f}
       */
    get startVector2(): Vector2f;
  
    set startVector2(value: Vector2f);
  
      /**
       * @description Start vector3 value
       * @type {Vector3f}
       */
    get startVector3(): Vector3f;
  
    set startVector3(value: Vector3f);
  
      /**
       * @description Target type
       * @type {TweenTargetType}
       */
    set targetType(value: TweenTargetType);
  
    get targetType(): TweenTargetType;
  
      pause(): void;
  
      resume(): void;
  
      start(): void;
  
      stop(): void;
  }
  
  /**
   * @class TweenTransformFollow
   * @extends TweenAnimation
   * @description Tween component specifically for transform follow target animations (position, rotation, scale)
   */
  class TweenTransformFollow extends TweenAnimation {
    protected constructor();
  
      /**
       * @description Follow target
       * @type {Transform}
       */
    get followTarget(): Transform | null;
  
    set followTarget(value: Transform | null);
  
      /**
       * @description Start number value
       * @type {number}
       */
    get startNumber(): number;
  
    set startNumber(value: number);
  
      /**
       * @description Start vector2 value
       * @type {Vector2f}
       */
    get startVector2(): Vector2f;
  
    set startVector2(value: Vector2f);
  
      /**
       * @description Start vector3 value
       * @type {Vector3f}
       */
    get startVector3(): Vector3f;
  
    set startVector3(value: Vector3f);
  
      /**
       * @description Target type
       * @type {TweenTargetType}
       */
    set targetType(value: TweenTargetType);
  
    get targetType(): TweenTargetType;
  
      pause(): void;
  
      resume(): void;
  
      start(): void;
  
      stop(): void;
  }
  
  /**
   * @class TweenTransformPath
   * @extends TweenAnimation
   * @description Tween component specifically for transform path animations (position, rotation, scale)
   */
  class TweenTransformPath extends TweenAnimation {
    protected constructor();
  
      /**
       * @description Delays
       * @type {Float32Array}
       */
    get delays(): number[];
  
    set delays(value: number[]);
  
      /**
       * @description Durations
       * @type {number[]}
       */
    get durations(): number[];
  
    set durations(value: number[]);
  
      /**
       * @description Fixed duration
       * @type {boolean}
       */
    get fixedDuration(): boolean;
  
    set fixedDuration(value: boolean);
  
      /**
       * @description Orientation
       * @type {TweenOrientation}
       */
    get orientation(): TweenOrientation;
  
    set orientation(value: TweenOrientation);
  
      /**
       * @description Path type
       * @type {TweenPathType}
       */
    get pathType(): TweenPathType;
  
    set pathType(value: TweenPathType);
  
      /**
       * @description Points path number
       * @type {number[]}
       */
    get pointsPathNumber(): number[];
  
    set pointsPathNumber(value: number[]);
  
      /**
       * @description Points path vector2
       * @type {Vector2f[]}
       */
    get pointsPathVector2(): Vector2f[];
  
    set pointsPathVector2(value: Vector2f[]);
  
      /**
       * @description Points path vector3
       * @type {Vector3f[]}
       */
    get pointsPathVector3(): Vector3f[];
  
    set pointsPathVector3(value: Vector3f[]);
  
      /**
       * @description Target type
       * @type {TweenTargetType}
       */
    set targetType(value: TweenTargetType);
  
    get targetType(): TweenTargetType;
  
      pause(): void;
  
      resume(): void;
  
      start(): void;
  
      stop(): void;
  }
}