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

  public enum AlertDialogButtonLayout {
    method public static androidx.ui.material.AlertDialogButtonLayout valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.material.AlertDialogButtonLayout[] values();
    enum_constant public static final androidx.ui.material.AlertDialogButtonLayout SideBySide;
    enum_constant public static final androidx.ui.material.AlertDialogButtonLayout Stacked;
  }

  public final class AlertDialogKt {
    method @androidx.compose.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onCloseRequest, kotlin.jvm.functions.Function0<kotlin.Unit>? title = null, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton = null, androidx.ui.material.AlertDialogButtonLayout buttonLayout = androidx.ui.material.AlertDialogButtonLayout.SideBySide, androidx.ui.graphics.Shape shape = medium);
    method @androidx.compose.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onCloseRequest, kotlin.jvm.functions.Function0<kotlin.Unit>? title = null, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, androidx.ui.graphics.Shape shape = medium);
  }

  public final class AppBarKt {
    method @androidx.compose.Composable public static void BottomAppBar-GqrRtJg(androidx.ui.core.Modifier modifier = Modifier, long backgroundColor = MaterialTheme.colors.primarySurface, long contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
    method @androidx.compose.Composable public static void TopAppBar-FikZsjU(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, long backgroundColor = MaterialTheme.colors.primarySurface, long contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
    method @androidx.compose.Composable public static void TopAppBar-oP-1cd0(androidx.ui.core.Modifier modifier = Modifier, long backgroundColor = MaterialTheme.colors.primarySurface, long contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
  }

  public final class BottomAppBar {
    field public static final androidx.ui.material.BottomAppBar INSTANCE;
  }

  @androidx.compose.Immutable public static final class BottomAppBar.FabConfiguration {
    ctor public BottomAppBar.FabConfiguration(internal androidx.ui.unit.IntPxSize fabSize, internal androidx.ui.unit.PxPosition fabTopLeftPosition, internal androidx.ui.material.BottomAppBar.FabDockedPosition fabDockedPosition);
    method @androidx.compose.Immutable public androidx.ui.material.BottomAppBar.FabConfiguration copy(androidx.ui.unit.IntPxSize fabSize, androidx.ui.unit.PxPosition fabTopLeftPosition, androidx.ui.material.BottomAppBar.FabDockedPosition fabDockedPosition);
  }

  public enum BottomAppBar.FabDockedPosition {
    method public static androidx.ui.material.BottomAppBar.FabDockedPosition valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.material.BottomAppBar.FabDockedPosition[] values();
    enum_constant public static final androidx.ui.material.BottomAppBar.FabDockedPosition Center;
    enum_constant public static final androidx.ui.material.BottomAppBar.FabDockedPosition End;
  }

  public final class BottomNavigationKt {
    method @androidx.compose.Composable public static void BottomNavigation-oP-1cd0(androidx.ui.core.Modifier modifier = Modifier, long backgroundColor = MaterialTheme.colors.primarySurface, long contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
    method @androidx.compose.Composable public static void BottomNavigationItem-dOPBtLY(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, boolean alwaysShowLabels = true, long activeColor = contentColor(), long inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
  }

  public final class Button {
    method public androidx.ui.layout.InnerPadding getDefaultInnerPadding();
    property public final androidx.ui.layout.InnerPadding DefaultInnerPadding;
    field public static final androidx.ui.material.Button INSTANCE;
  }

  public final class ButtonKt {
    method @androidx.compose.Composable public static void Button-MQxsNoc(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, long backgroundColor = MaterialTheme.colors.primary, long contentColor = contentColorFor(backgroundColor), androidx.ui.layout.InnerPadding padding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
    method @androidx.compose.Composable public static inline void OutlinedButton-MQxsNoc(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), long backgroundColor = MaterialTheme.colors.surface, long contentColor = MaterialTheme.colors.primary, androidx.ui.layout.InnerPadding padding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
    method @androidx.compose.Composable public static inline void TextButton-MQxsNoc(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, long backgroundColor = Color.Transparent, long contentColor = MaterialTheme.colors.primary, androidx.ui.layout.InnerPadding padding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
  }

  public final class CardKt {
    method @androidx.compose.Composable public static void Card-r7cpYJI(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = medium, long color = MaterialTheme.colors.surface, long contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public final class CheckboxKt {
    method @androidx.compose.Composable public static void Checkbox-D4zOgQA(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.secondary);
    method @androidx.compose.Composable public static void TriStateCheckbox--Buf9SY(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.secondary);
  }

  public final class ColorKt {
    method @androidx.compose.Composable public static long contentColorFor-QEYXlZo(long color);
    method public static long contentColorFor-ZITCLTE(androidx.ui.material.ColorPalette, long color);
    method public static androidx.ui.material.ColorPalette darkColorPalette-bz757pg(long primary = Color(4290479868), long primaryVariant = Color(4281794739), long secondary = Color(4278442694), long background = Color(4279374354), long surface = Color(4279374354), long error = Color(4291782265), long onPrimary = Color.Black, long onSecondary = Color.Black, long onBackground = Color.White, long onSurface = Color.White, long onError = Color.Black);
    method public static androidx.ui.material.ColorPalette lightColorPalette-eO6A0Mk(long primary = Color(4284612846), long primaryVariant = Color(4281794739), long secondary = Color(4278442694), long secondaryVariant = Color(4278290310), long background = Color.White, long surface = Color.White, long error = Color(4289724448), long onPrimary = Color.White, long onSecondary = Color.Black, long onBackground = Color.Black, long onSurface = Color.Black, long onError = Color.White);
  }

  public interface ColorPalette {
    method public long getBackground();
    method public long getError();
    method public long getOnBackground();
    method public long getOnError();
    method public long getOnPrimary();
    method public long getOnSecondary();
    method public long getOnSurface();
    method public long getPrimary();
    method public long getPrimaryVariant();
    method public long getSecondary();
    method public long getSecondaryVariant();
    method public long getSurface();
    method public boolean isLight();
    property public abstract long background;
    property public abstract long error;
    property public abstract boolean isLight;
    property public abstract long onBackground;
    property public abstract long onError;
    property public abstract long onPrimary;
    property public abstract long onSecondary;
    property public abstract long onSurface;
    property public abstract long primary;
    property public abstract long primaryVariant;
    property public abstract long secondary;
    property public abstract long secondaryVariant;
    property public abstract long surface;
  }

  public final class DividerKt {
    method @androidx.compose.Composable public static void Divider-5sN9_mQ(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
  }

  public final class DrawerKt {
    method @androidx.compose.Composable public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
    method @androidx.compose.Composable public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
  }

  public enum DrawerState {
    method public static androidx.ui.material.DrawerState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.material.DrawerState[] values();
    enum_constant public static final androidx.ui.material.DrawerState Closed;
    enum_constant public static final androidx.ui.material.DrawerState Opened;
  }

  @androidx.compose.Immutable public interface Emphasis {
    method public long emphasize-QEYXlZo(long color);
  }

  public final class EmphasisKt {
    method @androidx.compose.Composable public static void ProvideEmphasis(androidx.ui.material.Emphasis emphasis, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method public static androidx.compose.Ambient<androidx.ui.material.EmphasisLevels> getEmphasisAmbient();
  }

  public interface EmphasisLevels {
    method public androidx.ui.material.Emphasis getDisabled();
    method public androidx.ui.material.Emphasis getHigh();
    method public androidx.ui.material.Emphasis getMedium();
    property public abstract androidx.ui.material.Emphasis disabled;
    property public abstract androidx.ui.material.Emphasis high;
    property public abstract androidx.ui.material.Emphasis medium;
  }

  public final class FloatingActionButtonKt {
    method @androidx.compose.Composable public static void ExtendedFloatingActionButton-r9QhOOE(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
    method @androidx.compose.Composable public static void FloatingActionButton-rf6Y9PE(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
  }

  public final class IconButtonKt {
    method @androidx.compose.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
    method @androidx.compose.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
  }

  public final class ListItemKt {
    method @androidx.compose.Composable public static void ListItem(String text, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null);
    method @androidx.compose.Composable public static void ListItem(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit> text);
  }

  public final class MaterialTheme {
    method public androidx.ui.material.ColorPalette getColors();
    method public androidx.ui.material.Shapes getShapes();
    method public androidx.ui.material.Typography getTypography();
    property public final androidx.ui.material.ColorPalette colors;
    property public final androidx.ui.material.Shapes shapes;
    property public final androidx.ui.material.Typography typography;
    field public static final androidx.ui.material.MaterialTheme INSTANCE;
  }

  public final class MaterialThemeKt {
    method @androidx.compose.Composable public static void MaterialTheme(androidx.ui.material.ColorPalette colors = MaterialTheme.colors, androidx.ui.material.Typography typography = MaterialTheme.typography, androidx.ui.material.Shapes shapes = MaterialTheme.shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public final class ProgressIndicatorKt {
    method @androidx.compose.Composable public static void CircularProgressIndicator-e8O-MNM(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.primary);
    method @androidx.compose.Composable public static void CircularProgressIndicator-kB8eKMs(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.primary);
    method @androidx.compose.Composable public static void LinearProgressIndicator-e8O-MNM(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.primary);
    method @androidx.compose.Composable public static void LinearProgressIndicator-kB8eKMs(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.primary);
  }

  public final class RadioButtonKt {
    method @androidx.compose.Composable public static void RadioButton-Mt5Voig(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onSelect, long color = MaterialTheme.colors.secondary);
    method @androidx.compose.Composable public static void RadioGroup(kotlin.jvm.functions.Function1<? super androidx.ui.material.RadioGroupScope,kotlin.Unit> content);
    method @androidx.compose.Composable public static void RadioGroup-lgrJWgo(java.util.List<java.lang.String> options, String? selectedOption, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onSelectedChange, long radioColor = MaterialTheme.colors.secondary, androidx.ui.text.TextStyle? textStyle = null);
  }

  @androidx.compose.Stable public final class RadioGroupScope {
    method @androidx.compose.Composable public void RadioGroupItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelect, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.Composable public void RadioGroupTextItem-7CoRhzM(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelect, String text, long radioColor = MaterialTheme.colors.secondary, androidx.ui.text.TextStyle? textStyle = null);
  }

  public final class Scaffold {
    field public static final androidx.ui.material.Scaffold INSTANCE;
  }

  public enum Scaffold.FabPosition {
    method public static androidx.ui.material.Scaffold.FabPosition valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.material.Scaffold.FabPosition[] values();
    enum_constant public static final androidx.ui.material.Scaffold.FabPosition Center;
    enum_constant public static final androidx.ui.material.Scaffold.FabPosition CenterDocked;
    enum_constant public static final androidx.ui.material.Scaffold.FabPosition End;
    enum_constant public static final androidx.ui.material.Scaffold.FabPosition EndDocked;
  }

  public final class ScaffoldKt {
    method @androidx.compose.Composable public static void Scaffold(androidx.ui.material.ScaffoldState scaffoldState = remember({ 
    return <init>()
}), kotlin.jvm.functions.Function0<kotlin.Unit>? topAppBar = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.BottomAppBar.FabConfiguration,kotlin.Unit>? bottomAppBar = null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = null, androidx.ui.material.Scaffold.FabPosition floatingActionButtonPosition = androidx.ui.material.Scaffold.FabPosition.End, kotlin.jvm.functions.Function0<kotlin.Unit>? drawerContent = null, kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier,kotlin.Unit> bodyContent);
  }

  @androidx.compose.Model public final class ScaffoldState {
    ctor public ScaffoldState(androidx.ui.material.DrawerState drawerState, boolean isDrawerGesturesEnabled);
    ctor public ScaffoldState();
    method public androidx.ui.material.DrawerState getDrawerState();
    method public boolean isDrawerGesturesEnabled();
    method public void setDrawerGesturesEnabled(boolean p);
    method public void setDrawerState(androidx.ui.material.DrawerState p);
  }

  public final class Shapes {
    ctor public Shapes(androidx.ui.foundation.shape.corner.CornerBasedShape small, androidx.ui.foundation.shape.corner.CornerBasedShape medium, androidx.ui.foundation.shape.corner.CornerBasedShape large);
    ctor public Shapes();
    method public androidx.ui.foundation.shape.corner.CornerBasedShape component1();
    method public androidx.ui.foundation.shape.corner.CornerBasedShape component2();
    method public androidx.ui.foundation.shape.corner.CornerBasedShape component3();
    method public androidx.ui.material.Shapes copy(androidx.ui.foundation.shape.corner.CornerBasedShape small, androidx.ui.foundation.shape.corner.CornerBasedShape medium, androidx.ui.foundation.shape.corner.CornerBasedShape large);
    method public androidx.ui.foundation.shape.corner.CornerBasedShape getLarge();
    method public androidx.ui.foundation.shape.corner.CornerBasedShape getMedium();
    method public androidx.ui.foundation.shape.corner.CornerBasedShape getSmall();
  }

  public final class ShapesKt {
  }

  public final class SliderKt {
    method @androidx.compose.Composable public static void Slider-NGIokMc(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, long color = MaterialTheme.colors.primary);
  }

  public final class SnackbarKt {
    method @androidx.compose.Composable public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
    method public static long snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
  }

  public final class SurfaceKt {
    method @androidx.compose.Composable public static void Surface-r7cpYJI(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, long color = MaterialTheme.colors.surface, long contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method public static long getPrimarySurface(androidx.ui.material.ColorPalette);
  }

  public final class SwitchKt {
    method @androidx.compose.Composable public static void Switch-V29Pvv8(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, long color = MaterialTheme.colors.secondaryVariant);
  }

  public final class TabKt {
    method @androidx.compose.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.Composable public static void Tab-5SZ958c(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, long activeColor = contentColor(), long inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
    method @androidx.compose.Composable public static <T> void TabRow-nOWMzd0(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier, long backgroundColor = MaterialTheme.colors.primarySurface, long contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
    TabRow.Indicator()
}) }, kotlin.jvm.functions.Function0<kotlin.Unit> divider = { Divider(1.dp, contentColor().copy(DividerOpacity)) }, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> tab);
  }

  public final class TabRow {
    method @androidx.compose.Composable public void Indicator-e8O-MNM(androidx.ui.core.Modifier modifier = Modifier, long color = contentColor());
    method @androidx.compose.Composable public void IndicatorContainer(java.util.List<androidx.ui.material.TabRow.TabPosition> tabPositions, int selectedIndex, kotlin.jvm.functions.Function0<kotlin.Unit> indicator);
    field public static final androidx.ui.material.TabRow INSTANCE;
  }

  public static final class TabRow.TabPosition {
    method public int component1();
    method public int component2();
    method public androidx.ui.material.TabRow.TabPosition copy-rRMsBxU(int left, int width);
    method public int getLeft();
    method public int getRight();
    method public int getWidth();
    property public final int right;
  }

  public final class TextButton {
    method public androidx.ui.layout.InnerPadding getDefaultInnerPadding();
    property public final androidx.ui.layout.InnerPadding DefaultInnerPadding;
    field public static final androidx.ui.material.TextButton INSTANCE;
  }

  public final class TextFieldKt {
    method @androidx.compose.Composable public static void FilledTextField-A1xS8DE(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
    method @androidx.compose.Composable public static void FilledTextField-SHpsG1Y(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
  }

  @androidx.compose.Immutable public final class Typography {
    ctor public Typography(androidx.ui.text.font.FontFamily defaultFontFamily, androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
    method public androidx.ui.text.TextStyle component1();
    method public androidx.ui.text.TextStyle component10();
    method public androidx.ui.text.TextStyle component11();
    method public androidx.ui.text.TextStyle component12();
    method public androidx.ui.text.TextStyle component13();
    method public androidx.ui.text.TextStyle component2();
    method public androidx.ui.text.TextStyle component3();
    method public androidx.ui.text.TextStyle component4();
    method public androidx.ui.text.TextStyle component5();
    method public androidx.ui.text.TextStyle component6();
    method public androidx.ui.text.TextStyle component7();
    method public androidx.ui.text.TextStyle component8();
    method public androidx.ui.text.TextStyle component9();
    method @androidx.compose.Immutable public androidx.ui.material.Typography copy(androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
    method public androidx.ui.text.TextStyle getBody1();
    method public androidx.ui.text.TextStyle getBody2();
    method public androidx.ui.text.TextStyle getButton();
    method public androidx.ui.text.TextStyle getCaption();
    method public androidx.ui.text.TextStyle getH1();
    method public androidx.ui.text.TextStyle getH2();
    method public androidx.ui.text.TextStyle getH3();
    method public androidx.ui.text.TextStyle getH4();
    method public androidx.ui.text.TextStyle getH5();
    method public androidx.ui.text.TextStyle getH6();
    method public androidx.ui.text.TextStyle getOverline();
    method public androidx.ui.text.TextStyle getSubtitle1();
    method public androidx.ui.text.TextStyle getSubtitle2();
  }

  public final class TypographyKt {
  }

}

package androidx.ui.material.internal {

  public final class StateDraggableKt {
  }

}

package androidx.ui.material.ripple {

  public final class DefaultRippleEffectFactory implements androidx.ui.material.ripple.RippleEffectFactory {
    method public androidx.ui.material.ripple.RippleEffect create(androidx.ui.unit.IntPxSize size, androidx.ui.unit.PxPosition startPosition, androidx.ui.unit.Density density, androidx.ui.unit.Dp? radius, boolean clipped, androidx.animation.AnimationClockObservable clock, kotlin.jvm.functions.Function1<? super androidx.ui.material.ripple.RippleEffect,kotlin.Unit> onAnimationFinished);
    field public static final androidx.ui.material.ripple.DefaultRippleEffectFactory INSTANCE;
  }

  public final class DefaultRippleEffectKt {
  }

  public interface RippleEffect {
    method public default void dispose();
    method public void draw-_wst67s(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.IntPxSize size, long color);
    method public void finish(boolean canceled);
  }

  public interface RippleEffectFactory {
    method public androidx.ui.material.ripple.RippleEffect create(androidx.ui.unit.IntPxSize size, androidx.ui.unit.PxPosition startPosition, androidx.ui.unit.Density density, androidx.ui.unit.Dp? radius, boolean clipped, androidx.animation.AnimationClockObservable clock, kotlin.jvm.functions.Function1<? super androidx.ui.material.ripple.RippleEffect,kotlin.Unit> onAnimationFinished);
  }

  public final class RippleKt {
    method @androidx.compose.Composable public static androidx.ui.core.Modifier ripple-8aGIaPY(androidx.ui.core.Modifier, boolean bounded = true, androidx.ui.unit.Dp? radius = null, long color = Color.Unset, boolean enabled = true, androidx.animation.AnimationClockObservable clock = AnimationClockAmbient.current);
  }

  public final class RippleTheme {
    ctor public RippleTheme(androidx.ui.material.ripple.RippleEffectFactory factory, kotlin.jvm.functions.Function0<androidx.ui.graphics.Color> defaultColor, kotlin.jvm.functions.Function0<java.lang.Float> opacity);
    method public androidx.ui.material.ripple.RippleEffectFactory component1();
    method public kotlin.jvm.functions.Function0<androidx.ui.graphics.Color> component2();
    method public kotlin.jvm.functions.Function0<java.lang.Float> component3();
    method public androidx.ui.material.ripple.RippleTheme copy(androidx.ui.material.ripple.RippleEffectFactory factory, kotlin.jvm.functions.Function0<androidx.ui.graphics.Color> defaultColor, kotlin.jvm.functions.Function0<java.lang.Float> opacity);
    method public kotlin.jvm.functions.Function0<androidx.ui.graphics.Color> getDefaultColor();
    method public androidx.ui.material.ripple.RippleEffectFactory getFactory();
    method public kotlin.jvm.functions.Function0<java.lang.Float> getOpacity();
  }

  public final class RippleThemeKt {
    method public static androidx.compose.ProvidableAmbient<androidx.ui.material.ripple.RippleTheme> getRippleThemeAmbient();
  }

}

