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

  @Deprecated @kotlin.RequiresOptIn(message="Accompanist Pager is experimental. The API may be changed in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalPagerApi {
  }

  public final class Pager {
    method @Deprecated @androidx.compose.runtime.Composable public static void HorizontalPager(int count, optional androidx.compose.ui.Modifier modifier, optional com.google.accompanist.pager.PagerState state, optional boolean reverseLayout, optional float itemSpacing, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional boolean userScrollEnabled, kotlin.jvm.functions.Function2<? super com.google.accompanist.pager.PagerScope,? super java.lang.Integer,kotlin.Unit> content);
    method @Deprecated @androidx.compose.runtime.Composable public static void VerticalPager(int count, optional androidx.compose.ui.Modifier modifier, optional com.google.accompanist.pager.PagerState state, optional boolean reverseLayout, optional float itemSpacing, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional boolean userScrollEnabled, kotlin.jvm.functions.Function2<? super com.google.accompanist.pager.PagerScope,? super java.lang.Integer,kotlin.Unit> content);
    method @Deprecated public static float calculateCurrentOffsetForPage(com.google.accompanist.pager.PagerScope, int page);
  }

  @Deprecated public final class PagerDefaults {
    method @Deprecated @androidx.compose.runtime.Composable @dev.chrisbanes.snapper.ExperimentalSnapperApi public androidx.compose.foundation.gestures.FlingBehavior flingBehavior(com.google.accompanist.pager.PagerState state, optional androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> decayAnimationSpec, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec, optional kotlin.jvm.functions.Function1<? super dev.chrisbanes.snapper.SnapperLayoutInfo,java.lang.Float> maximumFlingDistance, optional float endContentPadding);
    method @Deprecated @androidx.compose.runtime.Composable @dev.chrisbanes.snapper.ExperimentalSnapperApi public androidx.compose.foundation.gestures.FlingBehavior flingBehavior(com.google.accompanist.pager.PagerState state, optional androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> decayAnimationSpec, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec, optional float endContentPadding, kotlin.jvm.functions.Function3<? super dev.chrisbanes.snapper.SnapperLayoutInfo,? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> snapIndex);
    method @Deprecated @androidx.compose.runtime.Composable @dev.chrisbanes.snapper.ExperimentalSnapperApi public androidx.compose.foundation.gestures.FlingBehavior flingBehavior(com.google.accompanist.pager.PagerState state, optional androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> decayAnimationSpec, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec, optional float endContentPadding);
    method @Deprecated public kotlin.jvm.functions.Function1<dev.chrisbanes.snapper.SnapperLayoutInfo,java.lang.Float> getSinglePageFlingDistance();
    method @Deprecated public kotlin.jvm.functions.Function3<dev.chrisbanes.snapper.SnapperLayoutInfo,java.lang.Integer,java.lang.Integer,java.lang.Integer> getSinglePageSnapIndex();
    property @Deprecated public final kotlin.jvm.functions.Function1<dev.chrisbanes.snapper.SnapperLayoutInfo,java.lang.Float> singlePageFlingDistance;
    property public final kotlin.jvm.functions.Function3<dev.chrisbanes.snapper.SnapperLayoutInfo,java.lang.Integer,java.lang.Integer,java.lang.Integer> singlePageSnapIndex;
    field @Deprecated public static final com.google.accompanist.pager.PagerDefaults INSTANCE;
  }

  @Deprecated @androidx.compose.runtime.Stable public interface PagerScope {
    method @Deprecated public int getCurrentPage();
    method @Deprecated public float getCurrentPageOffset();
    property public abstract int currentPage;
    property public abstract float currentPageOffset;
  }

  @Deprecated @androidx.compose.runtime.Stable public final class PagerState implements androidx.compose.foundation.gestures.ScrollableState {
    ctor @Deprecated public PagerState(optional @IntRange(from=0L) int currentPage);
    method @Deprecated public suspend Object? animateScrollToPage(@IntRange(from=0L) int page, optional @FloatRange(from=0.0, to=1.0) float pageOffset, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional float initialVelocity, optional boolean skipPages, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
    method @Deprecated public suspend Object? animateScrollToPage(@IntRange(from=0L) int page, optional @FloatRange(from=-1.0, to=1.0) float pageOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
    method @Deprecated public float dispatchRawDelta(float delta);
    method @Deprecated @IntRange(from=0L) public int getCurrentPage();
    method @Deprecated public float getCurrentPageOffset();
    method @Deprecated public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
    method @Deprecated @IntRange(from=0L) public int getPageCount();
    method @Deprecated public int getTargetPage();
    method @Deprecated public boolean isScrollInProgress();
    method @Deprecated public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
    method @Deprecated public suspend Object? scrollToPage(@IntRange(from=0L) int page, optional @FloatRange(from=-1.0, to=1.0) float pageOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
    property @IntRange(from=0L) public final int currentPage;
    property public final float currentPageOffset;
    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
    property public boolean isScrollInProgress;
    property @Deprecated @IntRange(from=0L) public final int pageCount;
    property @Deprecated public final int targetPage;
    field @Deprecated public static final com.google.accompanist.pager.PagerState.Companion Companion;
  }

  @Deprecated public static final class PagerState.Companion {
    method @Deprecated public androidx.compose.runtime.saveable.Saver<com.google.accompanist.pager.PagerState,?> getSaver();
    property public final androidx.compose.runtime.saveable.Saver<com.google.accompanist.pager.PagerState,?> Saver;
  }

  public final class PagerStateKt {
    method @Deprecated @androidx.compose.runtime.Composable public static com.google.accompanist.pager.PagerState rememberPagerState(optional @IntRange(from=0L) int initialPage);
  }

}

