// Signature format: 4.0
package com.google.accompanist.placeholder {

  @Deprecated public final class PlaceholderDefaults {
    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> getFadeAnimationSpec();
    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> getShimmerAnimationSpec();
    property public final androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> fadeAnimationSpec;
    property public final androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> shimmerAnimationSpec;
    field @Deprecated public static final com.google.accompanist.placeholder.PlaceholderDefaults INSTANCE;
  }

  @Deprecated @androidx.compose.runtime.Stable public interface PlaceholderHighlight {
    method @Deprecated @FloatRange(from=0.0, to=1.0) public float alpha(float progress);
    method @Deprecated public androidx.compose.ui.graphics.Brush brush(@FloatRange(from=0.0, to=1.0) float progress, long size);
    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float>? getAnimationSpec();
    property public abstract androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float>? animationSpec;
    field @Deprecated public static final com.google.accompanist.placeholder.PlaceholderHighlight.Companion Companion;
  }

  @Deprecated public static final class PlaceholderHighlight.Companion {
  }

  public final class PlaceholderHighlightKt {
    method @Deprecated public static com.google.accompanist.placeholder.PlaceholderHighlight fade(com.google.accompanist.placeholder.PlaceholderHighlight.Companion, long highlightColor, optional androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec);
    method @Deprecated public static com.google.accompanist.placeholder.PlaceholderHighlight shimmer(com.google.accompanist.placeholder.PlaceholderHighlight.Companion, long highlightColor, optional androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec, optional @FloatRange(from=0.0, to=1.0) float progressForMaxAlpha);
  }

  public final class PlaceholderKt {
    method @Deprecated public static androidx.compose.ui.Modifier placeholder(androidx.compose.ui.Modifier, boolean visible, long color, optional androidx.compose.ui.graphics.Shape shape, optional com.google.accompanist.placeholder.PlaceholderHighlight? highlight, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<java.lang.Boolean>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> placeholderFadeTransitionSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<java.lang.Boolean>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> contentFadeTransitionSpec);
  }

}

