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

  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
    ctor public BackspaceKeyEditOp();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
    ctor public CommitTextEditOp(String text, int newCursorPosition);
    method public String component1();
    method public int component2();
    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
    method public int getNewCursorPosition();
    method public String getText();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public final class DeleteAllEditOp implements androidx.ui.input.EditOperation {
    ctor public DeleteAllEditOp();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
    method public int component1();
    method public int component2();
    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
    method public int getAfterLength();
    method public int getBeforeLength();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
    method public int component1();
    method public int component2();
    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
    method public int getAfterLength();
    method public int getBeforeLength();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public interface EditOperation {
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class EditProcessor {
    method public androidx.ui.input.EditorValue onEditCommands(java.util.List<? extends androidx.ui.input.EditOperation> ops);
    method public void onNewState(androidx.ui.input.EditorValue model, androidx.ui.input.TextInputService? textInputService, int token);
  }

  public final class EditingBuffer {
    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
    field public static final int NOWHERE = -1; // 0xffffffff
  }

  public final class EditorValue {
    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
    ctor public EditorValue();
    method public String component1();
    method public androidx.ui.text.TextRange component2();
    method public androidx.ui.text.TextRange? component3();
    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
    method public androidx.ui.text.TextRange? getComposition();
    method public String getSelectedText();
    method public androidx.ui.text.TextRange getSelection();
    method public String getText();
    method public String getTextAfterSelection(int maxChars);
    method public String getTextBeforeSelection(int maxChars);
  }

  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
    ctor public FinishComposingTextEditOp();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public enum ImeAction {
    enum_constant public static final androidx.ui.input.ImeAction Done;
    enum_constant public static final androidx.ui.input.ImeAction Go;
    enum_constant public static final androidx.ui.input.ImeAction Next;
    enum_constant public static final androidx.ui.input.ImeAction NoAction;
    enum_constant public static final androidx.ui.input.ImeAction Previous;
    enum_constant public static final androidx.ui.input.ImeAction Search;
    enum_constant public static final androidx.ui.input.ImeAction Send;
    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
  }

  public interface InputEventListener {
    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
  }

  public enum KeyboardType {
    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
    enum_constant public static final androidx.ui.input.KeyboardType Email;
    enum_constant public static final androidx.ui.input.KeyboardType Number;
    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
    enum_constant public static final androidx.ui.input.KeyboardType Password;
    enum_constant public static final androidx.ui.input.KeyboardType Phone;
    enum_constant public static final androidx.ui.input.KeyboardType Text;
    enum_constant public static final androidx.ui.input.KeyboardType Uri;
  }

  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
    ctor public MoveCursorEditOp(int amount);
    method public int component1();
    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
    method public int getAmount();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public interface OffsetMap {
    method public int originalToTransformed(int offset);
    method public int transformedToOriginal(int offset);
    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
  }

  public static final class OffsetMap.Companion {
    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
    property public final androidx.ui.input.OffsetMap identityOffsetMap;
  }

  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
    ctor public PasswordVisualTransformation(char mask);
    ctor public PasswordVisualTransformation();
    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
    method public char getMask();
  }

  public interface PlatformTextInputService {
    method public void hideSoftwareKeyboard();
    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
    method public void onStateUpdated(androidx.ui.input.EditorValue model);
    method public void showSoftwareKeyboard();
    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
    method public void stopInput();
  }

  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
    ctor public SetComposingRegionEditOp(int start, int end);
    method public int component1();
    method public int component2();
    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
    method public int getEnd();
    method public int getStart();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
    method public String component1();
    method public int component2();
    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
    method public int getNewCursorPosition();
    method public String getText();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
    ctor public SetSelectionEditOp(int start, int end);
    method public int component1();
    method public int component2();
    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
    method public int getEnd();
    method public int getStart();
    method public void process(androidx.ui.input.EditingBuffer buffer);
  }

  public class TextInputService {
    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
    method public void hideSoftwareKeyboard(int token);
    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
    method public void showSoftwareKeyboard(int token);
    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
    method public void stopInput(int token);
  }

  public final class TextInputServiceKt {
    field public static final int INVALID_SESSION = -1; // 0xffffffff
    field public static final int NO_SESSION = 0; // 0x0
  }

  public final class TransformedText {
    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
    method public androidx.ui.text.AnnotatedString component1();
    method public androidx.ui.input.OffsetMap component2();
    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
    method public androidx.ui.input.OffsetMap getOffsetMap();
    method public androidx.ui.text.AnnotatedString getTransformedText();
  }

  public interface VisualTransformation {
    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
    field public static final androidx.ui.input.VisualTransformation.Companion! Companion;
  }

  public static final class VisualTransformation.Companion {
    method public androidx.ui.input.VisualTransformation getNone();
    property public final androidx.ui.input.VisualTransformation None;
  }

}

package androidx.ui.text {

  public final class AnnotatedString {
    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
    method public String component1();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String tag, int start, int end);
    method public String getText();
    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
  }

  public static final class AnnotatedString.Builder {
    ctor public AnnotatedString.Builder(int capacity);
    ctor public AnnotatedString.Builder();
    ctor public AnnotatedString.Builder(String text);
    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
    method public void addAnnotationString(String scope, String annotation, int start, int end);
    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
    method public void append(String text);
    method public void append(char p);
    method public void append(androidx.ui.text.AnnotatedString text);
    method public int getLength();
    method public void pop();
    method public void pop(int index);
    method public int pushStringAnnotation(String tag, String annotation);
    method public int pushStyle(androidx.ui.text.SpanStyle style);
    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
    method public androidx.ui.text.AnnotatedString toAnnotatedString();
    property public final int length;
  }

  public static final class AnnotatedString.Item<T> {
    ctor public AnnotatedString.Item(T! item, int start, int end, String tag);
    ctor public AnnotatedString.Item(T! item, int start, int end);
    method public T! component1();
    method public int component2();
    method public int component3();
    method public String component4();
    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String tag);
    method public int getEnd();
    method public T! getItem();
    method public int getStart();
    method public String getTag();
  }

  public final class AnnotatedStringKt {
    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
    method public static int getLength(androidx.ui.text.AnnotatedString);
    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
  }

  public final class Locale {
    ctor public Locale(String languageTag);
    method public String getLanguage();
    method public String getRegion();
    method public String getScript();
    method public String toLanguageTag();
    property public final String language;
    property public final String region;
    property public final String script;
    field public static final androidx.ui.text.Locale.Companion! Companion;
  }

  public static final class Locale.Companion {
    method public androidx.ui.text.Locale getCurrent();
    property public final androidx.ui.text.Locale current;
  }

  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
    ctor public LocaleList(String languageTags);
    ctor public LocaleList(androidx.ui.text.Locale... locales);
    method public java.util.List<androidx.ui.text.Locale> component1();
    method public operator boolean contains(androidx.ui.text.Locale element);
    method public boolean containsAll(java.util.Collection<?> elements);
    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
    method public operator androidx.ui.text.Locale get(int i);
    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
    method public int getSize();
    method public boolean isEmpty();
    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
    property public int size;
    field public static final androidx.ui.text.LocaleList.Companion! Companion;
  }

  public static final class LocaleList.Companion {
    method public androidx.ui.text.LocaleList getCurrent();
    property public final androidx.ui.text.LocaleList current;
  }

  public final class MultiParagraph {
    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.ui.geometry.Rect getCursorRect(int offset);
    method public boolean getDidExceedMaxLines();
    method public float getFirstBaseline();
    method public float getHeight();
    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
    method public float getLastBaseline();
    method public float getLineBottom(int lineIndex);
    method public int getLineCount();
    method public int getLineEllipsisCount(int lineIndex);
    method public int getLineEllipsisOffset(int lineIndex);
    method public int getLineEnd(int lineIndex);
    method public int getLineForOffset(int offset);
    method public float getLineHeight(int lineIndex);
    method public float getLineLeft(int lineIndex);
    method public float getLineRight(int lineIndex);
    method public int getLineStart(int lineIndex);
    method public float getLineTop(int lineIndex);
    method public float getLineWidth(int lineIndex);
    method public float getMaxIntrinsicWidth();
    method public int getMaxLines();
    method public float getMinIntrinsicWidth();
    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
    method public float getWidth();
    method public androidx.ui.text.TextRange getWordBoundary(int offset);
    method public void paint(androidx.ui.graphics.Canvas canvas);
    property public final boolean didExceedMaxLines;
    property public final float firstBaseline;
    property public final float height;
    property public final float lastBaseline;
    property public final int lineCount;
    property public final float maxIntrinsicWidth;
    property public final float minIntrinsicWidth;
    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
    property public final float width;
  }

  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
    method public androidx.ui.text.AnnotatedString getAnnotatedString();
    method public float getMaxIntrinsicWidth();
    method public float getMinIntrinsicWidth();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
    property public float maxIntrinsicWidth;
    property public float minIntrinsicWidth;
  }

  public final class MultiParagraphIntrinsicsKt {
  }

  public final class MultiParagraphKt {
  }

  public interface Paragraph {
    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.ui.geometry.Rect getCursorRect(int offset);
    method public boolean getDidExceedMaxLines();
    method public float getFirstBaseline();
    method public float getHeight();
    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
    method public float getLastBaseline();
    method public float getLineBottom(int lineIndex);
    method public int getLineCount();
    method public int getLineEllipsisCount(int lineIndex);
    method public int getLineEllipsisOffset(int lineIndex);
    method public int getLineEnd(int lineIndex);
    method public int getLineForOffset(int offset);
    method public float getLineHeight(int lineIndex);
    method public float getLineLeft(int lineIndex);
    method public float getLineRight(int lineIndex);
    method public int getLineStart(int lineIndex);
    method public float getLineTop(int lineIndex);
    method public float getLineWidth(int lineIndex);
    method public float getMaxIntrinsicWidth();
    method public float getMinIntrinsicWidth();
    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
    method public float getWidth();
    method public androidx.ui.text.TextRange getWordBoundary(int offset);
    method public void paint(androidx.ui.graphics.Canvas canvas);
    property public abstract boolean didExceedMaxLines;
    property public abstract float firstBaseline;
    property public abstract float height;
    property public abstract float lastBaseline;
    property public abstract int lineCount;
    property public abstract float maxIntrinsicWidth;
    property public abstract float minIntrinsicWidth;
    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
    property public abstract float width;
  }

  public final class ParagraphConstraints {
    ctor public ParagraphConstraints(float width);
    method public float component1();
    method public androidx.ui.text.ParagraphConstraints copy(float width);
    method public float getWidth();
  }

  public interface ParagraphIntrinsics {
    method public float getMaxIntrinsicWidth();
    method public float getMinIntrinsicWidth();
    property public abstract float maxIntrinsicWidth;
    property public abstract float minIntrinsicWidth;
  }

  public final class ParagraphIntrinsicsKt {
    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
  }

  public final class ParagraphKt {
    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
  }

  public final class ParagraphStyle {
    method public androidx.ui.text.style.TextAlign? component1();
    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
    method public long component3();
    method public androidx.ui.text.style.TextIndent? component4();
    method public androidx.ui.text.ParagraphStyle copy-ffQossE(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, long lineHeight, androidx.ui.text.style.TextIndent? textIndent);
    method public long getLineHeight();
    method public androidx.ui.text.style.TextAlign? getTextAlign();
    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
    method public androidx.ui.text.style.TextIndent? getTextIndent();
    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
    method public operator androidx.ui.text.ParagraphStyle plus(androidx.ui.text.ParagraphStyle other);
  }

  public final class ParagraphStyleKt {
    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
  }

  public final class Placeholder {
    method public long component1();
    method public long component2();
    method public androidx.ui.text.PlaceholderVerticalAlign component3();
    method public androidx.ui.text.Placeholder copy-eLqjHCw(long width, long height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
    method public long getHeight();
    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
    method public long getWidth();
  }

  public enum PlaceholderVerticalAlign {
    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
  }

  public final class SoftwareKeyboardController {
    ctor public SoftwareKeyboardController(androidx.ui.input.TextInputService textInputService, int token);
    method public void hideSoftwareKeyboard();
    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
    method public void showSoftwareKeyboard();
  }

  public final class SpanStyle {
    method public long component1();
    method public androidx.ui.text.style.TextGeometricTransform? component10();
    method public androidx.ui.text.LocaleList? component11();
    method public long component12();
    method public androidx.ui.text.style.TextDecoration? component13();
    method public androidx.ui.graphics.Shadow? component14();
    method public long component2();
    method public androidx.ui.text.font.FontWeight? component3();
    method public androidx.ui.text.font.FontStyle? component4();
    method public androidx.ui.text.font.FontSynthesis? component5();
    method public androidx.ui.text.font.FontFamily? component6();
    method public String? component7();
    method public long component8();
    method public androidx.ui.text.style.BaselineShift? component9();
    method public androidx.ui.text.SpanStyle copy-kRoccyE(long color, long fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, long letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, long background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
    method public long getBackground();
    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
    method public long getColor();
    method public androidx.ui.text.font.FontFamily? getFontFamily();
    method public String? getFontFeatureSettings();
    method public long getFontSize();
    method public androidx.ui.text.font.FontStyle? getFontStyle();
    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
    method public androidx.ui.text.font.FontWeight? getFontWeight();
    method public long getLetterSpacing();
    method public androidx.ui.text.LocaleList? getLocaleList();
    method public androidx.ui.graphics.Shadow? getShadow();
    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
    method public operator androidx.ui.text.SpanStyle plus(androidx.ui.text.SpanStyle other);
  }

  public final class SpanStyleKt {
    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
  }

  public final class StringKt {
    method public static String capitalize(String, androidx.ui.text.Locale locale);
    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
    method public static String decapitalize(String, androidx.ui.text.Locale locale);
    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class TextDelegate {
    ctor public TextDelegate(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders);
    method public androidx.ui.unit.Density getDensity();
    method public int getMaxIntrinsicWidth();
    method public int getMaxLines();
    method public int getMinIntrinsicWidth();
    method public androidx.ui.text.style.TextOverflow getOverflow();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
    method public boolean getSoftWrap();
    method public androidx.ui.text.TextStyle getStyle();
    method public androidx.ui.text.AnnotatedString getText();
    method public androidx.ui.text.TextLayoutResult layout(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.TextLayoutResult? prevResult = null);
    method public void layoutIntrinsics(androidx.ui.core.LayoutDirection layoutDirection);
    property public final int maxIntrinsicWidth;
    property public final int minIntrinsicWidth;
    field public static final androidx.ui.text.TextDelegate.Companion! Companion;
  }

  public static final class TextDelegate.Companion {
    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
    method public void paintBackground-ZIA4ZIk(int start, int end, long color, androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
  }

  public final class TextLayoutHelperKt {
  }

  public final class TextLayoutInput {
    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
    method public androidx.ui.text.AnnotatedString component1();
    method public androidx.ui.core.Constraints component10();
    method public androidx.ui.text.TextStyle component2();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
    method public int component4();
    method public boolean component5();
    method public androidx.ui.text.style.TextOverflow component6();
    method public androidx.ui.unit.Density component7();
    method public androidx.ui.core.LayoutDirection component8();
    method public androidx.ui.text.font.Font.ResourceLoader component9();
    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
    method public androidx.ui.core.Constraints getConstraints();
    method public androidx.ui.unit.Density getDensity();
    method public androidx.ui.core.LayoutDirection getLayoutDirection();
    method public int getMaxLines();
    method public androidx.ui.text.style.TextOverflow getOverflow();
    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
    method public boolean getSoftWrap();
    method public androidx.ui.text.TextStyle getStyle();
    method public androidx.ui.text.AnnotatedString getText();
  }

  public final class TextLayoutResult {
    method public androidx.ui.text.TextLayoutInput component1();
    method public androidx.ui.unit.IntPxSize component3();
    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.ui.geometry.Rect getCursorRect(int offset);
    method public boolean getDidOverflowHeight();
    method public boolean getDidOverflowWidth();
    method public float getFirstBaseline();
    method public boolean getHasVisualOverflow();
    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
    method public float getLastBaseline();
    method public androidx.ui.text.TextLayoutInput getLayoutInput();
    method public float getLineBottom(int lineIndex);
    method public int getLineEnd(int lineIndex);
    method public int getLineForOffset(int offset);
    method public int getLineStart(int lineIndex);
    method public float getLineTop(int lineIndex);
    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
    method public androidx.ui.unit.IntPxSize getSize();
    method public androidx.ui.text.TextRange getWordBoundary(int offset);
    property public final boolean didOverflowHeight;
    property public final boolean didOverflowWidth;
    property public final float firstBaseline;
    property public final boolean hasVisualOverflow;
    property public final float lastBaseline;
    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
  }

  public final class TextPainter {
    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
    field public static final androidx.ui.text.TextPainter! INSTANCE;
  }

  public final class TextRange {
    ctor public TextRange(int start, int end);
    method public int component1();
    method public int component2();
    method public operator boolean contains(androidx.ui.text.TextRange other);
    method public operator boolean contains(int offset);
    method public androidx.ui.text.TextRange copy(int start, int end);
    method public boolean getCollapsed();
    method public int getEnd();
    method public int getLength();
    method public int getMax();
    method public int getMin();
    method public int getStart();
    method public boolean intersects(androidx.ui.text.TextRange other);
    property public final boolean collapsed;
    property public final int length;
    property public final int max;
    property public final int min;
  }

  public final class TextRangeKt {
    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
  }

  public final class TextStyle {
    method public long component1();
    method public androidx.ui.text.style.TextGeometricTransform? component10();
    method public androidx.ui.text.LocaleList? component11();
    method public long component12();
    method public androidx.ui.text.style.TextDecoration? component13();
    method public androidx.ui.graphics.Shadow? component14();
    method public androidx.ui.text.style.TextAlign? component15();
    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
    method public long component17();
    method public androidx.ui.text.style.TextIndent? component18();
    method public long component2();
    method public androidx.ui.text.font.FontWeight? component3();
    method public androidx.ui.text.font.FontStyle? component4();
    method public androidx.ui.text.font.FontSynthesis? component5();
    method public androidx.ui.text.font.FontFamily? component6();
    method public String? component7();
    method public long component8();
    method public androidx.ui.text.style.BaselineShift? component9();
    method public androidx.ui.text.TextStyle copy-4Bo2vQE(long color, long fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, long letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, long background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, long lineHeight, androidx.ui.text.style.TextIndent? textIndent);
    method public long getBackground();
    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
    method public long getColor();
    method public androidx.ui.text.font.FontFamily? getFontFamily();
    method public String? getFontFeatureSettings();
    method public long getFontSize();
    method public androidx.ui.text.font.FontStyle? getFontStyle();
    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
    method public androidx.ui.text.font.FontWeight? getFontWeight();
    method public long getLetterSpacing();
    method public long getLineHeight();
    method public androidx.ui.text.LocaleList? getLocaleList();
    method public androidx.ui.graphics.Shadow? getShadow();
    method public androidx.ui.text.style.TextAlign? getTextAlign();
    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
    method public androidx.ui.text.style.TextIndent? getTextIndent();
    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
    method public operator androidx.ui.text.TextStyle plus(androidx.ui.text.TextStyle other);
    method public operator androidx.ui.text.TextStyle plus(androidx.ui.text.ParagraphStyle other);
    method public operator androidx.ui.text.TextStyle plus(androidx.ui.text.SpanStyle other);
    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
    method public androidx.ui.text.SpanStyle toSpanStyle();
    field public static final androidx.ui.text.TextStyle.Companion! Companion;
  }

  public static final class TextStyle.Companion {
    method public androidx.ui.text.TextStyle getDefault();
    property public final androidx.ui.text.TextStyle Default;
  }

  public final class TextStyleKt {
    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
  }

  public interface Typeface {
    method public androidx.ui.text.font.FontFamily getFontFamily();
    property public abstract androidx.ui.text.font.FontFamily fontFamily;
  }

  public final class TypefaceKt {
    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
  }

}

package androidx.ui.text.font {

  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
  }

  public interface Font {
    method public androidx.ui.text.font.FontStyle getStyle();
    method public androidx.ui.text.font.FontWeight getWeight();
    property public abstract androidx.ui.text.font.FontStyle style;
    property public abstract androidx.ui.text.font.FontWeight weight;
  }

  public static interface Font.ResourceLoader {
    method public Object load(androidx.ui.text.font.Font font);
  }

  public abstract sealed class FontFamily {
    method public final boolean getCanLoadSynchronously();
    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
  }

  public static final class FontFamily.Companion {
    method public androidx.ui.text.font.GenericFontFamily getCursive();
    method public androidx.ui.text.font.SystemFontFamily getDefault();
    method public androidx.ui.text.font.GenericFontFamily getMonospace();
    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
    method public androidx.ui.text.font.GenericFontFamily getSerif();
    property public final androidx.ui.text.font.GenericFontFamily Cursive;
    property public final androidx.ui.text.font.SystemFontFamily Default;
    property public final androidx.ui.text.font.GenericFontFamily Monospace;
    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
    property public final androidx.ui.text.font.GenericFontFamily Serif;
  }

  public final class FontFamilyKt {
    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
  }

  public final class FontKt {
    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
  }

  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
    method public java.util.List<androidx.ui.text.font.Font> component1();
    method public boolean contains(androidx.ui.text.font.Font element);
    method public boolean containsAll(java.util.Collection<?> elements);
    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
    method public androidx.ui.text.font.Font get(int index);
    method public java.util.List<androidx.ui.text.font.Font> getFonts();
    method public int getSize();
    method public int indexOf(androidx.ui.text.font.Font element);
    method public boolean isEmpty();
    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
    method public int lastIndexOf(androidx.ui.text.font.Font element);
    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
  }

  public enum FontStyle {
    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
  }

  public enum FontSynthesis {
    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
  }

  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
    ctor public FontWeight(int weight);
    method public int compareTo(androidx.ui.text.font.FontWeight other);
    method public int component1();
    method public androidx.ui.text.font.FontWeight copy(int weight);
    method public int getWeight();
    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
  }

  public static final class FontWeight.Companion {
    method public androidx.ui.text.font.FontWeight getBlack();
    method public androidx.ui.text.font.FontWeight getBold();
    method public androidx.ui.text.font.FontWeight getExtraBold();
    method public androidx.ui.text.font.FontWeight getExtraLight();
    method public androidx.ui.text.font.FontWeight getLight();
    method public androidx.ui.text.font.FontWeight getMedium();
    method public androidx.ui.text.font.FontWeight getNormal();
    method public androidx.ui.text.font.FontWeight getSemiBold();
    method public androidx.ui.text.font.FontWeight getThin();
    method public androidx.ui.text.font.FontWeight getW100();
    method public androidx.ui.text.font.FontWeight getW200();
    method public androidx.ui.text.font.FontWeight getW300();
    method public androidx.ui.text.font.FontWeight getW400();
    method public androidx.ui.text.font.FontWeight getW500();
    method public androidx.ui.text.font.FontWeight getW600();
    method public androidx.ui.text.font.FontWeight getW700();
    method public androidx.ui.text.font.FontWeight getW800();
    method public androidx.ui.text.font.FontWeight getW900();
    property public final androidx.ui.text.font.FontWeight Black;
    property public final androidx.ui.text.font.FontWeight Bold;
    property public final androidx.ui.text.font.FontWeight ExtraBold;
    property public final androidx.ui.text.font.FontWeight ExtraLight;
    property public final androidx.ui.text.font.FontWeight Light;
    property public final androidx.ui.text.font.FontWeight Medium;
    property public final androidx.ui.text.font.FontWeight Normal;
    property public final androidx.ui.text.font.FontWeight SemiBold;
    property public final androidx.ui.text.font.FontWeight Thin;
    property public final androidx.ui.text.font.FontWeight W100;
    property public final androidx.ui.text.font.FontWeight W200;
    property public final androidx.ui.text.font.FontWeight W300;
    property public final androidx.ui.text.font.FontWeight W400;
    property public final androidx.ui.text.font.FontWeight W500;
    property public final androidx.ui.text.font.FontWeight W600;
    property public final androidx.ui.text.font.FontWeight W700;
    property public final androidx.ui.text.font.FontWeight W800;
    property public final androidx.ui.text.font.FontWeight W900;
  }

  public final class FontWeightKt {
    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
  }

  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
    method public String getName();
  }

  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
    method public androidx.ui.text.Typeface component1();
    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
    method public androidx.ui.text.Typeface getTypeface();
  }

  public final class ResourceFont implements androidx.ui.text.font.Font {
    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
    method public int component1();
    method public androidx.ui.text.font.FontWeight component2();
    method public androidx.ui.text.font.FontStyle component3();
    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
    method public int getResId();
    method public androidx.ui.text.font.FontStyle getStyle();
    method public androidx.ui.text.font.FontWeight getWeight();
  }

  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
  }

}

package androidx.ui.text.platform {

  public final class AndroidParagraphHelperKt {
  }

  public final class AndroidParagraphKt {
  }

  public final class PlatformLocaleKt {
  }

}

package androidx.ui.text.style {

  public final inline class BaselineShift {
    ctor public BaselineShift();
    method public static float constructor-impl(float multiplier);
    method public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getMultiplier();
    method public static inline int hashCode-impl(float p);
    method public static inline String! toString-impl(float p);
    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
  }

  public static final class BaselineShift.Companion {
    method public float getNone();
    method public float getSubscript();
    method public float getSuperscript();
    property public final float None;
    property public final float Subscript;
    property public final float Superscript;
  }

  public final class BaselineShiftKt {
    method public static float lerp-7csQwvo(float start, float stop, float fraction);
  }

  public enum TextAlign {
    enum_constant public static final androidx.ui.text.style.TextAlign Center;
    enum_constant public static final androidx.ui.text.style.TextAlign End;
    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
    enum_constant public static final androidx.ui.text.style.TextAlign Left;
    enum_constant public static final androidx.ui.text.style.TextAlign Right;
    enum_constant public static final androidx.ui.text.style.TextAlign Start;
  }

  public final class TextDecoration {
    method public int component1();
    method public boolean contains(androidx.ui.text.style.TextDecoration other);
    method public androidx.ui.text.style.TextDecoration copy(int mask);
    method public int getMask();
    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
  }

  public static final class TextDecoration.Companion {
    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
    method public androidx.ui.text.style.TextDecoration getLineThrough();
    method public androidx.ui.text.style.TextDecoration getNone();
    method public androidx.ui.text.style.TextDecoration getUnderline();
    property public final androidx.ui.text.style.TextDecoration LineThrough;
    property public final androidx.ui.text.style.TextDecoration None;
    property public final androidx.ui.text.style.TextDecoration Underline;
  }

  public enum TextDirection {
    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
  }

  public enum TextDirectionAlgorithm {
    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
  }

  public final class TextGeometricTransform {
    ctor public TextGeometricTransform(float scaleX, float skewX);
    ctor public TextGeometricTransform();
    method public float component1();
    method public float component2();
    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
    method public float getScaleX();
    method public float getSkewX();
    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
  }

  public static final class TextGeometricTransform.Companion {
  }

  public final class TextGeometricTransformKt {
    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
  }

  public final class TextIndent {
    method public long component1();
    method public long component2();
    method public androidx.ui.text.style.TextIndent copy-gL_aCS0(long firstLine, long restLine);
    method public long getFirstLine();
    method public long getRestLine();
    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
  }

  public static final class TextIndent.Companion {
    method public androidx.ui.text.style.TextIndent getNone();
    property public final androidx.ui.text.style.TextIndent None;
  }

  public final class TextIndentKt {
    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
  }

  public enum TextOverflow {
    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
  }

}

