// Signature format: 3.0
package androidx.ui.animation {

  @androidx.compose.Stable public final class AnimatedFloatModel extends androidx.animation.AnimatedFloat {
    ctor public AnimatedFloatModel(float initialValue, androidx.animation.AnimationClockObservable clock, float visibilityThreshold);
    method public Float! getValue();
    method protected void setValue(float p);
    property public Float! value;
  }

  public final class AnimatedValueEffectsKt {
    method @androidx.compose.Composable public static androidx.animation.AnimatedValue<androidx.ui.graphics.Color,androidx.animation.AnimationVector4D> animatedColor-o4iVt3U(long initVal, androidx.animation.AnimationClockObservable clock = AnimationClockAmbient.current);
    method @androidx.compose.Composable public static androidx.animation.AnimatedFloat animatedFloat(float initVal, float visibilityThreshold = 0.01f, androidx.animation.AnimationClockObservable clock = AnimationClockAmbient.current);
    method @androidx.compose.Composable public static <T, V extends androidx.animation.AnimationVector> androidx.animation.AnimatedValue<T,V> animatedValue(T? initVal, androidx.animation.TwoWayConverter<T,V> converter, T? visibilityThreshold = null, androidx.animation.AnimationClockObservable clock = AnimationClockAmbient.current);
  }

  @androidx.compose.Stable public final class AnimatedValueModel<T, V extends androidx.animation.AnimationVector> extends androidx.animation.AnimatedValue<T,V> {
    ctor public AnimatedValueModel(T! initialValue, androidx.animation.TwoWayConverter<T,V> typeConverter, androidx.animation.AnimationClockObservable clock, T? visibilityThreshold);
    method public T! getValue();
    method protected void setValue(T! p);
    property public T! value;
  }

  public final class ColorPropKey implements androidx.animation.PropKey<androidx.ui.graphics.Color,androidx.animation.AnimationVector4D> {
    ctor public ColorPropKey(androidx.ui.graphics.colorspace.ColorSpace colorSpace, String label);
    ctor public ColorPropKey();
    method public String getLabel();
    method public androidx.animation.TwoWayConverter<androidx.ui.graphics.Color,androidx.animation.AnimationVector4D> getTypeConverter();
    property public androidx.animation.TwoWayConverter<androidx.ui.graphics.Color,androidx.animation.AnimationVector4D> typeConverter;
  }

  public final class CrossfadeKt {
    method @androidx.compose.Composable public static <T> void Crossfade(T? current, androidx.ui.core.Modifier modifier = Modifier, androidx.animation.AnimationSpec<java.lang.Float> animation = tween(), kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
  }

  public final class DisposableAnimationClock implements androidx.animation.AnimationClockObservable {
    ctor public DisposableAnimationClock(androidx.animation.AnimationClockObservable clock);
    method public void dispose();
    method public boolean isDisposed();
    method public void subscribe(androidx.animation.AnimationClockObserver observer);
    method public void unsubscribe(androidx.animation.AnimationClockObserver observer);
    property public final boolean isDisposed;
  }

  public final class DisposableAnimationClockKt {
    method @androidx.compose.Composable public static androidx.ui.animation.DisposableAnimationClock asDisposableClock(androidx.animation.AnimationClockObservable);
  }

  public final class DpPropKey implements androidx.animation.PropKey<androidx.ui.unit.Dp,androidx.animation.AnimationVector1D> {
    ctor public DpPropKey(String label);
    ctor public DpPropKey();
    method public String getLabel();
    method public androidx.animation.TwoWayConverter<androidx.ui.unit.Dp,androidx.animation.AnimationVector1D> getTypeConverter();
    property public androidx.animation.TwoWayConverter<androidx.ui.unit.Dp,androidx.animation.AnimationVector1D> typeConverter;
  }

  public final class LegacyTransitionKt {
    method @Deprecated @androidx.compose.Composable public static <T> void Transition(androidx.animation.TransitionDefinition<T> definition, T? toState, androidx.animation.AnimationClockObservable clock = AnimationClockAmbient.current, T? initState = toState, kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? onStateChangeFinished = null, kotlin.jvm.functions.Function1<? super androidx.animation.TransitionState,kotlin.Unit> children);
  }

  public final class OffsetPropKey implements androidx.animation.PropKey<androidx.ui.geometry.Offset,androidx.animation.AnimationVector2D> {
    ctor public OffsetPropKey(String label);
    ctor public OffsetPropKey();
    method public String getLabel();
    method public androidx.animation.TwoWayConverter<androidx.ui.geometry.Offset,androidx.animation.AnimationVector2D> getTypeConverter();
    property public androidx.animation.TwoWayConverter<androidx.ui.geometry.Offset,androidx.animation.AnimationVector2D> typeConverter;
  }

  public final class PropertyKeysKt {
    method public static androidx.animation.TwoWayConverter<androidx.ui.unit.Bounds,androidx.animation.AnimationVector4D> getBoundsToVectorConverter();
    method public static kotlin.jvm.functions.Function1<androidx.ui.graphics.colorspace.ColorSpace,androidx.animation.TwoWayConverter<androidx.ui.graphics.Color,androidx.animation.AnimationVector4D>> getColorToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.unit.Dp,androidx.animation.AnimationVector1D> getDpToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.unit.IntOffset,androidx.animation.AnimationVector2D> getIntPxPositionToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.unit.IntSize,androidx.animation.AnimationVector2D> getIntSizeToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.geometry.Offset,androidx.animation.AnimationVector2D> getOffsetToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.unit.Position,androidx.animation.AnimationVector2D> getPositionToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.unit.PxBounds,androidx.animation.AnimationVector4D> getPxBoundsToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.geometry.Rect,androidx.animation.AnimationVector4D> getRectToVectorConverter();
    method public static androidx.animation.TwoWayConverter<androidx.ui.geometry.Size,androidx.animation.AnimationVector2D> getSizeToVectorConverter();
  }

  public final class PxPropKey implements androidx.animation.PropKey<java.lang.Float,androidx.animation.AnimationVector1D> {
    ctor public PxPropKey(String label);
    ctor public PxPropKey();
    method public String getLabel();
    method public androidx.animation.TwoWayConverter<java.lang.Float,androidx.animation.AnimationVector1D> getTypeConverter();
    property public androidx.animation.TwoWayConverter<java.lang.Float,androidx.animation.AnimationVector1D> typeConverter;
  }

  public final class RectPropKey implements androidx.animation.PropKey<androidx.ui.geometry.Rect,androidx.animation.AnimationVector4D> {
    ctor public RectPropKey(String label);
    ctor public RectPropKey();
    method public String getLabel();
    method public androidx.animation.TwoWayConverter<androidx.ui.geometry.Rect,androidx.animation.AnimationVector4D> getTypeConverter();
    property public androidx.animation.TwoWayConverter<androidx.ui.geometry.Rect,androidx.animation.AnimationVector4D> typeConverter;
  }

  public final class SingleValueAnimationKt {
    method @androidx.compose.Composable public static float animate(float target, androidx.animation.AnimationSpec<java.lang.Float> animSpec = androidx.ui.animation.SingleValueAnimationKt.defaultAnimation, float visibilityThreshold = 0.01f, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static androidx.ui.unit.Bounds animate(androidx.ui.unit.Bounds target, androidx.animation.AnimationSpec<androidx.ui.unit.Bounds> animSpec = remember({ 
    return <init>(BoundsToVectorConverter.invoke(DpVisibilityThreshold4D))
}), kotlin.jvm.functions.Function1<? super androidx.ui.unit.Bounds,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static androidx.ui.geometry.Offset animate(androidx.ui.geometry.Offset target, androidx.animation.AnimationSpec<androidx.ui.geometry.Offset> animSpec = remember({ 
    return <init>(Offset(PxVisibilityThreshold, PxVisibilityThreshold))
}), kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static androidx.ui.unit.PxBounds animate(androidx.ui.unit.PxBounds target, androidx.animation.AnimationSpec<androidx.ui.unit.PxBounds> animSpec = remember({ 
    return <init>(PxBoundsToVectorConverter.invoke(PxVisibilityThreshold4D))
}), kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxBounds,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static int animate(int target, androidx.animation.AnimationSpec<java.lang.Integer> animSpec = remember({ 
    return <init>(1)
}), kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static androidx.ui.unit.IntOffset animate(androidx.ui.unit.IntOffset target, androidx.animation.AnimationSpec<androidx.ui.unit.IntOffset> animSpec = remember({ 
    return <init>(IntOffset(1, 1))
}), kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntOffset,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static androidx.ui.unit.IntSize animate(androidx.ui.unit.IntSize target, androidx.animation.AnimationSpec<androidx.ui.unit.IntSize> animSpec = remember({ 
    return <init>(IntSize(1, 1))
}), kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntSize,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static <T extends androidx.animation.AnimationVector> T animate(T target, androidx.animation.AnimationSpec<T> animSpec = remember({ 
    return <init>(visibilityThreshold)
}), T? visibilityThreshold = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static <T, V extends androidx.animation.AnimationVector> T! animate(T? target, androidx.animation.TwoWayConverter<T,V> converter, androidx.animation.AnimationSpec<T> animSpec = remember({ 
    return <init>(visibilityThreshold)
}), T? visibilityThreshold = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static float animate-5VRrNdo(float target, androidx.animation.AnimationSpec<androidx.ui.unit.Dp> animSpec = remember({ 
    return <init>(DpVisibilityThreshold.dp)
}), kotlin.jvm.functions.Function1<? super androidx.ui.unit.Dp,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static long animate-MNu1-i4(long target, androidx.animation.AnimationSpec<androidx.ui.unit.Position> animSpec = remember({ 
    return <init>(Position(DpVisibilityThreshold.dp, DpVisibilityThreshold.dp))
}), kotlin.jvm.functions.Function1<? super androidx.ui.unit.Position,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static long animate-_lqcFKk(long target, androidx.animation.AnimationSpec<androidx.ui.geometry.Size> animSpec = remember({ 
    return <init>(Size(PxVisibilityThreshold, PxVisibilityThreshold))
}), kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Size,kotlin.Unit>? endListener = null);
    method @androidx.compose.Composable public static long animate-zJFKTE8(long target, androidx.animation.AnimationSpec<androidx.ui.graphics.Color> animSpec = remember({ 
    return <init>()
}), kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Color,kotlin.Unit>? endListener = null);
  }

  public final class TransitionKt {
    method public static boolean getTransitionsEnabled();
    method public static void setTransitionsEnabled(boolean p);
    method @androidx.compose.Composable public static <T> androidx.animation.TransitionState transition(androidx.animation.TransitionDefinition<T> definition, T? toState, androidx.animation.AnimationClockObservable clock = AnimationClockAmbient.current, T? initState = toState, kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? onStateChangeFinished = null);
  }

}

