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

  public final class CoreTextFieldKt {
    method @Deprecated @androidx.compose.Composable public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {});
    method @androidx.compose.Composable public static void CoreTextField(androidx.ui.input.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChanged = {}, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {});
  }

  public final class CoreTextKt {
    method @androidx.compose.Composable public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
  }

  public final class InlineTextContent {
    ctor public InlineTextContent(androidx.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
    method public androidx.ui.text.Placeholder component1();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> component2();
    method public androidx.ui.text.InlineTextContent copy(androidx.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> getChildren();
    method public androidx.ui.text.Placeholder getPlaceholder();
  }

  public final class InlineTextContentKt {
    method public static void appendInlineContent(androidx.ui.text.AnnotatedString.Builder, String id, String alternateText = "\ufffd");
  }

  public final class TextFieldDelegateKt {
  }

  public final class TextSemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.input.ImeAction> getImeAction();
    method public androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSupportsInputMethods();
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.input.ImeAction> ImeAction;
    property public final androidx.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SupportsInputMethods;
    field public static final androidx.ui.text.TextSemanticsProperties INSTANCE;
  }

  public final class TextSemanticsPropertiesKt {
    method public static androidx.ui.input.ImeAction getImeAction(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void setImeAction(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.input.ImeAction p);
    method public static void supportsInputMethods(androidx.ui.semantics.SemanticsPropertyReceiver);
  }

}

package androidx.ui.text.selection {

  public final class MultiWidgetSelectionDelegateKt {
  }

  public final class TextFieldSelectionDelegateKt {
  }

  public final class TextFieldSelectionManagerKt {
  }

  public final class TextSelectionDelegateKt {
  }

}

