// 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), float 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), float 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), float 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.applyEmphasis(activeColor));
  }

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

  public final class ButtonKt {
    method @androidx.compose.Composable public static void Button-YWYas6U(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, float elevation = 2.dp, float disabledElevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, long backgroundColor = MaterialTheme.colors.primary, long disabledBackgroundColor = Button.defaultDisabledBackgroundColor, long contentColor = contentColorFor(backgroundColor), long disabledContentColor = Button.defaultDisabledContentColor, androidx.ui.layout.InnerPadding padding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
    method @androidx.compose.Composable public static inline void OutlinedButton-5tjLhF8(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, float 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 = contentColorFor(backgroundColor), long disabledContentColor = Button.defaultDisabledContentColor, androidx.ui.layout.InnerPadding padding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
    method @androidx.compose.Composable public static inline void TextButton-5tjLhF8(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, float elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, long backgroundColor = Color.Transparent, long contentColor = MaterialTheme.colors.primary, long disabledContentColor = Button.defaultDisabledContentColor, 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, float 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.onSurface.copy(DividerAlpha), float thickness = 1.dp, float startIndent = 0.dp);
  }

  public final class DrawerConstants {
    method public float getDefaultElevation();
    property public final float DefaultElevation;
    field public static final androidx.ui.material.DrawerConstants INSTANCE;
  }

  public final class DrawerKt {
    method @androidx.compose.Composable public static void BottomDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
    method @androidx.compose.Composable public static void ModalDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, 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 applyEmphasis-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), float 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), float 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 MenuKt {
    method @androidx.compose.Composable public static void DropdownMenu-1DTJxuk(kotlin.jvm.functions.Function0<kotlin.Unit> toggle, boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, androidx.ui.core.Modifier toggleModifier = Modifier, long dropdownOffset = Position(0.dp, 0.dp), androidx.ui.core.Modifier dropdownModifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> dropdownContent);
    method @androidx.compose.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public final class ProgressIndicatorConstants {
    method public float getDefaultStrokeWidth();
    property public final float DefaultStrokeWidth;
    field public static final androidx.ui.material.ProgressIndicatorConstants INSTANCE;
  }

  public final class ProgressIndicatorKt {
    method @androidx.compose.Composable public static void CircularProgressIndicator-EMuwvL0(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.primary, float strokeWidth = ProgressIndicatorConstants.DefaultStrokeWidth);
    method @androidx.compose.Composable public static void CircularProgressIndicator-it0oM4E(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.primary, float strokeWidth = ProgressIndicatorConstants.DefaultStrokeWidth);
    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-HeBYgfA(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onSelect, androidx.ui.core.Modifier modifier = Modifier, 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-HJ2D5H4(java.util.List<java.lang.String> options, String? selectedOption, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onSelectedChange, androidx.ui.core.Modifier modifier = Modifier, 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, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.Composable public void RadioGroupTextItem-JJAyy3w(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelect, String text, androidx.ui.core.Modifier modifier = Modifier, 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.Stable 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);
    property public final androidx.ui.material.DrawerState drawerState;
    property public final boolean isDrawerGesturesEnabled;
  }

  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-bRoLwi0(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, float 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, float 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-Ym7EGpc(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, androidx.ui.core.Modifier modifier = Modifier, 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.applyEmphasis(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-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onImeActionPerformed = { _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
    method @androidx.compose.Composable public static void FilledTextField-u5y5QhY(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onImeActionPerformed = { _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, 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-muzrHoo(androidx.ui.unit.PxSize 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-z8Px3OI(androidx.ui.graphics.drawscope.DrawScope, long color);
    method public void finish(boolean canceled);
  }

  public interface RippleEffectFactory {
    method public androidx.ui.material.ripple.RippleEffect create-muzrHoo(androidx.ui.unit.PxSize 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 RippleIndication implements androidx.ui.foundation.Indication {
    method public androidx.ui.foundation.IndicationInstance createInstance();
  }

  public final class RippleIndicationKt {
    method @androidx.compose.Composable public static androidx.ui.material.ripple.RippleIndication RippleIndication-XC6LiZk(boolean bounded = true, androidx.ui.unit.Dp? radius = null, long color = Color.Unset);
  }

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

  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();
  }

}

