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

  public final class AppBarKt {
    method @androidx.compose.Composable public static void BottomAppBar(androidx.ui.graphics.Color color = MaterialTheme.colors().primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
    method @androidx.compose.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color color = MaterialTheme.colors().primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
    method @androidx.compose.Composable public static void TopAppBar(androidx.ui.graphics.Color color = MaterialTheme.colors().primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
  }

  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(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors().primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
    method @androidx.compose.Composable public static void BottomNavigationItem(androidx.ui.layout.RowScope, 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.None, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = MaterialTheme.emphasisLevels().medium.emphasize(activeColor));
  }

  public final class ButtonKt {
    method @androidx.compose.Composable public static void Button(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors().primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.graphics.Shape shape = button, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.layout.EdgeInsets paddings = ButtonPaddings, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static inline void OutlinedButton(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors().surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors().primary, androidx.ui.graphics.Shape shape = button, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors().onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.layout.EdgeInsets paddings = ButtonPaddings, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static inline void TextButton(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors().primary, androidx.ui.graphics.Shape shape = button, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.layout.EdgeInsets paddings = TextButtonPaddings, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

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

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

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

  public final class DataTableChildren {
    method public void dataRow(boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> children);
    method public void dataRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.Image> icon = { return null }, boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null);
    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> children);
    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.Image> icon = { return null }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null);
  }

  public final class DataTableKt {
    method @androidx.compose.Composable public static void DataTable(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> numeric = { return false }, androidx.ui.unit.Dp dataRowHeight = androidx.ui.material.DataTableKt.DataRowHeight, androidx.ui.unit.Dp headerRowHeight = androidx.ui.material.DataTableKt.HeaderRowHeight, androidx.ui.layout.EdgeInsets cellSpacing = androidx.ui.material.DataTableKt.CellSpacing, androidx.ui.foundation.Border border = Border(BorderColor, BorderWidth), androidx.ui.graphics.Color selectedColor = MaterialTheme.colors().primary.copy(0.08), androidx.ui.material.DataTablePagination? pagination = null, androidx.ui.material.DataTableSorting? sorting = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.DataTableChildren,kotlin.Unit> block);
    method @androidx.compose.Composable public static androidx.ui.material.DataTablePagination DefaultDataTablePagination(int initialPage = 0, int initialRowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage);
    method @androidx.compose.Composable public static androidx.ui.material.DataTableSorting DefaultDataTableSorting(Integer? initialColumn = null, boolean initialAscending = true, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortRequest);
  }

  public final class DataTablePagination {
    ctor public DataTablePagination(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
    method public int component1();
    method public int component2();
    method public java.util.List<java.lang.Integer> component3();
    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component4();
    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component5();
    method public androidx.ui.material.DataTablePagination copy(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
    method public java.util.List<java.lang.Integer> getAvailableRowsPerPage();
    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnPageChange();
    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnRowsPerPageChange();
    method public int getPage();
    method public int getRowsPerPage();
  }

  public final class DataTableSorting {
    ctor public DataTableSorting(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
    method public Integer? component1();
    method public boolean component2();
    method public java.util.Set<java.lang.Integer> component3();
    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> component4();
    method public androidx.ui.material.DataTableSorting copy(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
    method public boolean getAscending();
    method public Integer? getColumn();
    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> getOnSortChange();
    method public java.util.Set<java.lang.Integer> getSortableColumns();
  }

  public final class DividerKt {
    method @androidx.compose.Composable public static void Divider(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors().surface, androidx.ui.unit.Dp height = 1.dp, androidx.ui.unit.Dp indent = 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);
    method @androidx.compose.Composable public static void StaticDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent);
  }

  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 androidx.ui.graphics.Color emphasize(androidx.ui.graphics.Color color);
  }

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

  public final class EmphasisLevels {
    ctor public EmphasisLevels(androidx.ui.material.Emphasis high, androidx.ui.material.Emphasis medium, androidx.ui.material.Emphasis disabled);
    ctor public EmphasisLevels();
    method public androidx.ui.material.Emphasis component1();
    method public androidx.ui.material.Emphasis component2();
    method public androidx.ui.material.Emphasis component3();
    method public androidx.ui.material.EmphasisLevels copy(androidx.ui.material.Emphasis high, androidx.ui.material.Emphasis medium, androidx.ui.material.Emphasis disabled);
    method public androidx.ui.material.Emphasis getDisabled();
    method public androidx.ui.material.Emphasis getHigh();
    method public androidx.ui.material.Emphasis getMedium();
  }

  public final class FloatingActionButtonKt {
    method @androidx.compose.Composable public static void FloatingActionButton(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.unit.Dp minSize = androidx.ui.material.FloatingActionButtonKt.FabSize, androidx.ui.graphics.Shape shape = androidx.ui.foundation.shape.corner.RoundedCornerShapeKt.CircleShape, androidx.ui.graphics.Color color = MaterialTheme.colors().primary, androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void FloatingActionButton(androidx.ui.graphics.Image icon, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.Shape shape = androidx.ui.foundation.shape.corner.RoundedCornerShapeKt.CircleShape, androidx.ui.graphics.Color color = MaterialTheme.colors().primary, androidx.ui.unit.Dp elevation = 6.dp);
    method @androidx.compose.Composable public static void FloatingActionButton(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Image? icon = null, androidx.ui.text.TextStyle? textStyle = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.Color color = MaterialTheme.colors().primary, androidx.ui.unit.Dp elevation = 6.dp);
  }

  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.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ListItemKt {
    method @androidx.compose.Composable public static void ListItem(String text, androidx.ui.graphics.Image? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
    method @androidx.compose.Composable public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> text, 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>? onClick = null);
  }

  public final class MaterialTheme {
    method @androidx.compose.Composable public androidx.ui.material.ColorPalette colors();
    method @androidx.compose.Composable public androidx.ui.material.EmphasisLevels emphasisLevels();
    method @androidx.compose.Composable public androidx.ui.material.Shapes shapes();
    method @androidx.compose.Composable public 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 = lightColorPalette(), androidx.ui.material.Typography typography = androidx.ui.material.Typography(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ProgressIndicatorKt {
    method @androidx.compose.Composable public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.graphics.Color color = MaterialTheme.colors().primary);
    method @androidx.compose.Composable public static void CircularProgressIndicator(androidx.ui.graphics.Color color = MaterialTheme.colors().primary);
    method @androidx.compose.Composable public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.graphics.Color color = MaterialTheme.colors().primary);
    method @androidx.compose.Composable public static void LinearProgressIndicator(androidx.ui.graphics.Color color = MaterialTheme.colors().primary);
  }

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

  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> children);
    method @androidx.compose.Composable public void RadioGroupTextItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelect, String text, androidx.ui.graphics.Color 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 ShapeKt {
  }

  public final class Shapes {
    ctor public Shapes(androidx.ui.graphics.Shape button, androidx.ui.graphics.Shape card);
    ctor public Shapes();
    method public androidx.ui.graphics.Shape component1();
    method public androidx.ui.graphics.Shape component2();
    method public androidx.ui.material.Shapes copy(androidx.ui.graphics.Shape button, androidx.ui.graphics.Shape card);
    method public androidx.ui.graphics.Shape getButton();
    method public androidx.ui.graphics.Shape getCard();
  }

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

  public final class SliderPosition {
    ctor public SliderPosition(float initial, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, @IntRange(from=null) int steps, androidx.animation.AnimationClockObservable animatedClock);
    method public float getValue();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getValueRange();
    method public void setValue(float value);
    property public final float value;
  }

  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.None, boolean actionOnNewLine = false);
    method public static androidx.ui.graphics.Color snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
  }

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

  public final class TabKt {
    method @androidx.compose.Composable public static void Tab(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.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = MaterialTheme.emphasisLevels().medium.emphasize(activeColor));
    method @androidx.compose.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.graphics.Color color = MaterialTheme.colors().primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(color), 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(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color 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 androidx.ui.unit.IntPx component1();
    method public androidx.ui.unit.IntPx component2();
    method public androidx.ui.material.TabRow.TabPosition copy(androidx.ui.unit.IntPx left, androidx.ui.unit.IntPx width);
    method public androidx.ui.unit.IntPx getLeft();
    method public androidx.ui.unit.IntPx getRight();
    method public androidx.ui.unit.IntPx getWidth();
    property public final androidx.ui.unit.IntPx right;
  }

  public final class Typography {
    ctor public Typography(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);
    ctor public Typography();
    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 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.core.LayoutCoordinates coordinates, androidx.ui.unit.PxPosition startPosition, androidx.ui.unit.Density density, androidx.ui.unit.Dp? radius, boolean clipped, androidx.animation.AnimationClockObservable clock, kotlin.jvm.functions.Function0<kotlin.Unit> requestRedraw, 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 void dispose();
    method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.graphics.Color color);
    method public void finish(boolean canceled);
  }

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

  public final class RippleKt {
    method @androidx.compose.Composable public static void Ripple(boolean bounded, androidx.ui.unit.Dp? radius = null, androidx.ui.graphics.Color? color = null, boolean enabled = true, androidx.animation.AnimationClockObservable clock = AnimationClockAmbient.current, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

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

}

package androidx.ui.material.surface {

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

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

}

