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

  public final class AdapterListKt {
    method @androidx.compose.Composable public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
  }

  @androidx.compose.Immutable public final class Border {
    method public float component1();
    method public androidx.ui.graphics.Brush component2();
    method @androidx.compose.Immutable public androidx.ui.foundation.Border copy-HIF-_f0(float size, androidx.ui.graphics.Brush brush);
    method public androidx.ui.graphics.Brush getBrush();
    method public float getSize();
  }

  public final class BorderKt {
    method public static androidx.ui.foundation.Border Border-YSZAjy0(float size, long color);
  }

  public final class BoxKt {
    method @androidx.compose.Composable public static void Box-TInkGdk(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, long backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, float padding = elvis {
    var var4119171b: androidx.ui.unit.Dp = border?.size
    if (var4119171b != null) var4119171b else 0.dp
}, float paddingStart = Dp.Unspecified, float paddingTop = Dp.Unspecified, float paddingEnd = Dp.Unspecified, float paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
  }

  public final class CanvasKt {
    method @androidx.compose.Composable public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> onCanvas);
  }

  public final class ClickableKt {
    method @Deprecated @androidx.compose.Composable public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, androidx.ui.foundation.InteractionState? interactionState = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static androidx.ui.core.Modifier clickable(androidx.ui.core.Modifier, boolean enabled = true, String? onClickLabel = null, androidx.ui.foundation.InteractionState interactionState = remember({ 
    return <init>()
}), androidx.ui.foundation.Indication? indication = IndicationAmbient.invoke(), kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick = null, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
  }

  public final class ClickableTextKt {
    method @androidx.compose.Composable public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
  }

  public final class ContentColorKt {
    method @androidx.compose.Composable public static long contentColor();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
  }

  public final class DarkThemeKt {
    method @androidx.compose.Composable public static boolean isSystemInDarkTheme();
  }

  public final class DeterminateProgressIndicatorKt {
    method @androidx.compose.Composable public static void DeterminateProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class DialogKt {
    method @androidx.compose.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onCloseRequest, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class DrawBackgroundKt {
    method @Deprecated public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
    method public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
  }

  public final class DrawBorder implements androidx.ui.core.DrawModifier {
    method public void draw(androidx.ui.core.ContentDrawScope);
  }

  public final class DrawBorderKt {
    method @Deprecated @androidx.compose.Composable public static androidx.ui.core.Modifier DrawBorder(androidx.ui.foundation.Border border, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method @Deprecated @androidx.compose.Composable public static androidx.ui.foundation.DrawBorder DrawBorder-3vYgddY(float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
    method @Deprecated @androidx.compose.Composable public static androidx.ui.core.Modifier DrawBorder-Wounw_8(float size, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder(androidx.ui.core.Modifier, androidx.ui.foundation.Border border, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder-ik3FbJE(androidx.ui.core.Modifier, float size, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
  }

  public final class IconKt {
    method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
    method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
    method @androidx.compose.Composable public static void Icon-smRaMnI(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
  }

  public final class ImageKt {
    method @androidx.compose.Composable public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method @androidx.compose.Composable public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method @androidx.compose.Composable public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method @Deprecated @androidx.compose.Composable public static void SimpleImage--SSR55g(androidx.ui.graphics.ImageAsset image, long tint = Color.Unset);
  }

  @androidx.compose.Stable public interface Indication {
    method public androidx.ui.foundation.IndicationInstance createInstance();
  }

  public interface IndicationInstance {
    method public void drawIndication(androidx.ui.core.ContentDrawScope, androidx.ui.foundation.InteractionState interactionState);
    method public default void onDispose();
  }

  public final class IndicationKt {
    method public static androidx.compose.ProvidableAmbient<kotlin.jvm.functions.Function0<androidx.ui.foundation.Indication>> getIndicationAmbient();
    method public static androidx.ui.core.Modifier indication(androidx.ui.core.Modifier, androidx.ui.foundation.InteractionState interactionState, androidx.ui.foundation.Indication? indication = null);
  }

  public interface Interaction {
  }

  public static final class Interaction.Dragged implements androidx.ui.foundation.Interaction {
    field public static final androidx.ui.foundation.Interaction.Dragged INSTANCE;
  }

  public static final class Interaction.Pressed implements androidx.ui.foundation.Interaction {
    field public static final androidx.ui.foundation.Interaction.Pressed INSTANCE;
  }

  @androidx.compose.Stable public final class InteractionState implements androidx.compose.State<java.util.Set<? extends androidx.ui.foundation.Interaction>> {
    ctor public InteractionState();
    method public void addInteraction(androidx.ui.foundation.Interaction interaction, androidx.ui.unit.PxPosition? position = null);
    method public operator boolean contains(androidx.ui.foundation.Interaction interaction);
    method public java.util.Set<androidx.ui.foundation.Interaction> getValue();
    method public androidx.ui.unit.PxPosition? interactionPositionFor(androidx.ui.foundation.Interaction interaction);
    method public void removeInteraction(androidx.ui.foundation.Interaction interaction);
    property public java.util.Set<androidx.ui.foundation.Interaction> value;
  }

  public final class ScrollerKt {
    method @androidx.compose.Composable public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
    method @androidx.compose.Composable public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f, boolean isReversed = false);
    method @androidx.compose.Composable public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
  }

  @androidx.compose.Stable public final class ScrollerPosition {
    ctor public ScrollerPosition(androidx.ui.foundation.animation.FlingConfig flingConfig, float initial, internal boolean isReversed, androidx.animation.AnimationClockObservable animationClock);
    method public float getMaxPosition();
    method public float getValue();
    method public boolean isAnimating();
    method public void scrollBy(float value);
    method public void scrollTo(float value);
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void smoothScrollTo(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    property public final boolean isAnimating;
    property public final float maxPosition;
    property public final float value;
    field public static final androidx.ui.foundation.ScrollerPosition.Companion Companion;
  }

  public static final class ScrollerPosition.Companion {
    method @androidx.compose.Composable public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.ScrollerPosition,?> Saver(androidx.ui.foundation.animation.FlingConfig flingConfig, boolean isReversed, androidx.animation.AnimationClockObservable animationClock);
  }

  public final class Strings {
    method public String getChecked();
    method public String getInProgress();
    method public String getIndeterminate();
    method public String getNotSelected();
    method public String getSelected();
    method public String getTemplatePercent();
    method public String getUnchecked();
    property public final String Checked;
    property public final String InProgress;
    property public final String Indeterminate;
    property public final String NotSelected;
    property public final String Selected;
    property public final String TemplatePercent;
    property public final String Unchecked;
    field public static final androidx.ui.foundation.Strings INSTANCE;
  }

  public final class TextFieldKt {
    method @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
  }

  public final class TextFieldValue {
    ctor public TextFieldValue(String text, androidx.ui.text.TextRange selection);
    ctor public TextFieldValue();
    method public String component1();
    method public androidx.ui.text.TextRange component2();
    method public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
    method public androidx.ui.text.TextRange getSelection();
    method public String getText();
    field public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
  }

  public static final class TextFieldValue.Companion {
    method public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
    property public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
  }

  public final class TextKt {
    method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void Text--mY4wAA(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, androidx.ui.text.TextStyle style = currentTextStyle());
    method @androidx.compose.Composable public static void Text-OII7cnY(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, androidx.ui.text.TextStyle style = currentTextStyle());
    method @androidx.compose.Composable public static androidx.ui.text.TextStyle currentTextStyle();
  }

}

package androidx.ui.foundation.animation {

  public final class AndroidFlingCalculator {
    ctor public AndroidFlingCalculator(androidx.ui.unit.Density density);
    method public float flingDistance(float velocity);
    method public long flingDuration(float velocity);
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo flingInfo(float velocity);
    method public androidx.ui.unit.Density getDensity();
  }

  public static final class AndroidFlingCalculator.FlingInfo {
    ctor public AndroidFlingCalculator.FlingInfo(float initialVelocity, float distance, long duration);
    method public float component1();
    method public float component2();
    method public long component3();
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo copy(float initialVelocity, float distance, long duration);
    method public float getDistance();
    method public long getDuration();
    method public float getInitialVelocity();
    method public float position(long time);
    method public float velocity(long time);
  }

  public final class AndroidFlingCalculatorKt {
  }

  public final class AndroidFlingDecayAnimation implements androidx.animation.DecayAnimation {
    ctor public AndroidFlingDecayAnimation(androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator);
    method public float getAbsVelocityThreshold();
    method public long getDurationMillis(float start, float startVelocity);
    method public androidx.ui.foundation.animation.AndroidFlingCalculator getFlingCalculator();
    method public float getTarget(float start, float startVelocity);
    method public float getValue(long playTime, float start, float startVelocity);
    method public float getVelocity(long playTime, float start, float startVelocity);
    property public float absVelocityThreshold;
    property public final androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator;
  }

  public final class AndroidFlingSpline {
    method public double deceleration(float velocity, float friction);
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult flingPosition(float time);
    field public static final androidx.ui.foundation.animation.AndroidFlingSpline INSTANCE;
  }

  public static final class AndroidFlingSpline.FlingResult {
    ctor public AndroidFlingSpline.FlingResult(float distanceCoefficient, float velocityCoefficient);
    method public float component1();
    method public float component2();
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult copy(float distanceCoefficient, float velocityCoefficient);
    method public float getDistanceCoefficient();
    method public float getVelocityCoefficient();
  }

  public final class AndroidFlingSplineKt {
  }

  @androidx.compose.Immutable public final class FlingConfig {
    ctor public FlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public androidx.animation.DecayAnimation component1();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? component2();
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
    method @androidx.compose.Immutable public androidx.ui.foundation.animation.FlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
    method public androidx.animation.DecayAnimation getDecayAnimation();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? getOnAnimationEnd();
  }

  public final class FlingConfigKt {
    method public static androidx.ui.foundation.animation.FlingConfig AnchorsFlingConfig(java.util.List<java.lang.Float> anchors, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder = androidx.animation.PhysicsBuilder(), kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, androidx.animation.DecayAnimation decayAnimation = androidx.animation.ExponentialDecay());
    method @androidx.compose.Composable public static androidx.ui.foundation.animation.FlingConfig FlingConfig(kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget = { return null });
    method public static void fling(androidx.animation.AnimatedFloat, androidx.ui.foundation.animation.FlingConfig config, float startVelocity);
  }

}

package androidx.ui.foundation.gestures {

  public abstract sealed class DragDirection {
  }

  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal INSTANCE;
  }

  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical INSTANCE;
  }

  public final class DraggableKt {
    method public static androidx.ui.core.Modifier draggable(androidx.ui.core.Modifier, androidx.ui.foundation.gestures.DragDirection dragDirection, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDragStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDragStopped = {}, boolean enabled = true, androidx.ui.foundation.InteractionState? interactionState = null, boolean startDragImmediately = false, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onDragDeltaConsumptionRequested);
  }

  public final class ScrollableKt {
    method @androidx.compose.Composable public static androidx.ui.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested);
    method public static androidx.ui.core.Modifier scrollable(androidx.ui.core.Modifier, androidx.ui.foundation.gestures.DragDirection dragDirection, androidx.ui.foundation.gestures.ScrollableState scrollableState, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onScrollStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onScrollStopped = {}, boolean enabled = true);
  }

  public final class ScrollableState {
    ctor public ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested, androidx.ui.foundation.animation.FlingConfig flingConfig, androidx.animation.AnimationClockObservable animationClock);
    method public androidx.ui.foundation.animation.FlingConfig getFlingConfig();
    method public kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Float> getOnScrollDeltaConsumptionRequested();
    method public boolean isAnimating();
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void stopAnimation();
    property public final boolean isAnimating;
  }

}

package androidx.ui.foundation.selection {

  public final class MutuallyExclusiveSetItemKt {
    method @androidx.compose.Composable public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ToggleableKt {
    method @androidx.compose.Composable public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
    method @androidx.compose.Composable public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public enum ToggleableState {
    method public static androidx.ui.foundation.selection.ToggleableState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.foundation.selection.ToggleableState[] values();
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Indeterminate;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Off;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState On;
  }

}

package androidx.ui.foundation.semantics {

  public final class FoundationSemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getInMutuallyExclusiveGroup();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsDialog();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> getToggleableState();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> InMutuallyExclusiveGroup;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsDialog;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> ToggleableState;
    field public static final androidx.ui.foundation.semantics.FoundationSemanticsProperties INSTANCE;
  }

  public final class FoundationSemanticsPropertiesKt {
    method public static boolean getDialog(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getSelected(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.foundation.selection.ToggleableState getToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void setDialog(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setSelected(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.foundation.selection.ToggleableState p);
  }

}

package androidx.ui.foundation.shape {

  public final class GenericShape implements androidx.ui.graphics.Shape {
    ctor public GenericShape(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.unit.PxSize,kotlin.Unit> builder);
    method public androidx.ui.foundation.shape.GenericShape copy(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.unit.PxSize,kotlin.Unit> builder);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
  }

  public final class RectangleShapeKt {
    method @Deprecated public static androidx.ui.graphics.Shape getRectangleShape();
  }

}

package androidx.ui.foundation.shape.corner {

  public abstract class CornerBasedShape implements androidx.ui.graphics.Shape {
    ctor public CornerBasedShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public abstract androidx.ui.foundation.shape.corner.CornerBasedShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft = topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight = topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight = bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft = bottomLeft);
    method public final androidx.ui.foundation.shape.corner.CornerBasedShape copy(androidx.ui.foundation.shape.corner.CornerSize all);
    method public final androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
    method public abstract androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, float topLeft, float topRight, float bottomRight, float bottomLeft);
    method public final androidx.ui.foundation.shape.corner.CornerSize getBottomLeft();
    method public final androidx.ui.foundation.shape.corner.CornerSize getBottomRight();
    method public final androidx.ui.foundation.shape.corner.CornerSize getTopLeft();
    method public final androidx.ui.foundation.shape.corner.CornerSize getTopRight();
  }

  public interface CornerSize {
    method public float toPx(androidx.ui.unit.PxSize shapeSize, androidx.ui.unit.Density density);
  }

  public final class CornerSizeKt {
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(float size);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(@IntRange(from=0, to=50) int percent);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize-ipo6vVg(float size);
    method public static androidx.ui.foundation.shape.corner.CornerSize getZeroCornerSize();
  }

  public final class CutCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.CutCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, float topLeft, float topRight, float bottomRight, float bottomLeft);
  }

  public final class CutCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(float size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(float topLeft = 0.0f, float topRight = 0.0f, float bottomRight = 0.0f, float bottomLeft = 0.0f);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape-ipo6vVg(float size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape-rIHlIKc(float topLeft = 0.dp, float topRight = 0.dp, float bottomRight = 0.dp, float bottomLeft = 0.dp);
  }

  public final class RoundedCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.RoundedCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, float topLeft, float topRight, float bottomRight, float bottomLeft);
  }

  public final class RoundedCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(float size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(float topLeft = 0.0f, float topRight = 0.0f, float bottomRight = 0.0f, float bottomLeft = 0.0f);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape-ipo6vVg(float size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape-rIHlIKc(float topLeft = 0.dp, float topRight = 0.dp, float bottomRight = 0.dp, float bottomLeft = 0.dp);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape getCircleShape();
  }

}

