// 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-RAvbXkg(androidx.ui.core.Modifier modifier = Modifier, long backgroundColor = MaterialTheme.colors.primarySurface, long contentColor = contentColorFor(backgroundColor), 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 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();
    method public float getDefaultMinHeight();
    method public float getDefaultMinWidth();
    property public final androidx.ui.layout.InnerPadding DefaultInnerPadding;
    property public final float DefaultMinHeight;
    property public final float DefaultMinWidth;
    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);
    field @kotlin.PublishedApi internal static final float OutlinedStrokeOpacity = 0.12f;
  }

  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-9ViTWCU(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, long checkedColor = MaterialTheme.colors.secondary, long uncheckedColor = MaterialTheme.colors.onSurface, long disabledColor = MaterialTheme.colors.onSurface, long checkMarkColor = MaterialTheme.colors.surface);
    method @androidx.compose.Composable public static void TriStateCheckbox-4vNNdMw(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, long checkedColor = MaterialTheme.colors.secondary, long uncheckedColor = MaterialTheme.colors.onSurface, long disabledColor = MaterialTheme.colors.onSurface, long checkMarkColor = MaterialTheme.colors.surface);
  }

  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 End;
  }

  public final class ScaffoldKt {
    method @androidx.compose.Composable public static void Scaffold-1z1vkZI(androidx.ui.material.ScaffoldState scaffoldState = remember({ 
    return <init>()
}), kotlin.jvm.functions.Function0<kotlin.Unit>? topBar = null, kotlin.jvm.functions.Function0<kotlin.Unit>? bottomBar = null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = null, androidx.ui.material.Scaffold.FabPosition floatingActionButtonPosition = androidx.ui.material.Scaffold.FabPosition.End, boolean isFloatingActionButtonDocked = false, kotlin.jvm.functions.Function0<kotlin.Unit>? drawerContent = null, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, long backgroundColor = MaterialTheme.colors.background, kotlin.jvm.functions.Function1<? super androidx.ui.layout.InnerPadding,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.geometry.Size? getBottomBarSize();
    method public androidx.ui.material.DrawerState getDrawerState();
    method public androidx.ui.geometry.Size? getFloatingActionButtonSize();
    method public androidx.ui.geometry.Size? getTopBarSize();
    method public boolean isDrawerGesturesEnabled();
    method public void setDrawerGesturesEnabled(boolean p);
    method public void setDrawerState(androidx.ui.material.DrawerState p);
    property public final androidx.ui.geometry.Size? bottomBarSize;
    property public final androidx.ui.material.DrawerState drawerState;
    property public final androidx.ui.geometry.Size? floatingActionButtonSize;
    property public final boolean isDrawerGesturesEnabled;
    property public final androidx.ui.geometry.Size? topBarSize;
  }

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

  @androidx.compose.Immutable public static final class TabRow.TabPosition {
    method public float component1();
    method public float component2();
    method @androidx.compose.Immutable public androidx.ui.material.TabRow.TabPosition copy-98Cn76g(float left, float width);
    method public float getLeft();
    method public float getRight();
    method public float getWidth();
    property public final float 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-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.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));
    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 @Deprecated @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));
    method @androidx.compose.Composable public static void OutlinedTextField-CVdlBpA(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.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);
    method @androidx.compose.Composable public static void OutlinedTextField-wI6llck(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);
  }

  @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 RippleAnimationKt {
  }

  @androidx.compose.Stable 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 @Deprecated 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 interface RippleOpacity {
    method public float opacityForInteraction(androidx.ui.foundation.Interaction interaction);
  }

  public interface RippleTheme {
    method @androidx.compose.Composable public long defaultColor();
    method @androidx.compose.Composable public androidx.ui.material.ripple.RippleOpacity rippleOpacity();
  }

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

}

