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

  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<java.lang.Boolean> getSupportsInputMethods();
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.input.ImeAction> ImeAction;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> 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 boolean getSupportsInputMethods(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void setImeAction(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.input.ImeAction p);
    method public static void setSupportsInputMethods(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
  }

}

package androidx.ui.text.selection {

  public final class MultiWidgetSelectionDelegateKt {
  }

  public final class TextFieldSelectionDelegateKt {
  }

  public final class TextSelectionDelegateKt {
  }

}

