// Signature format: 4.0
package androidx.compose.ui.text {

  public final class ActualAtomicReferenceJvmKt {
  }

  public final class AndroidTextStyle_androidKt {
  }

  @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
    ctor public AnnotatedString(String text, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles);
    method public operator char get(int index);
    method public int getLength();
    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> getParagraphStyles();
    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> getSpanStyles();
    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(String tag, int start, int end);
    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(int start, int end);
    method public String getText();
    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.TtsAnnotation>> getTtsAnnotations(int start, int end);
    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
    property public int length;
    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
    property public final String text;
  }

  public static final class AnnotatedString.Builder {
    ctor public AnnotatedString.Builder(optional int capacity);
    ctor public AnnotatedString.Builder(String text);
    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
    method public void addStringAnnotation(String tag, String annotation, int start, int end);
    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
    method public void append(String text);
    method public void append(char char);
    method public void append(androidx.compose.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.compose.ui.text.SpanStyle style);
    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
    property public final int length;
  }

  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
    ctor public AnnotatedString.Range(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.compose.ui.text.AnnotatedString.Range<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();
    property public final int end;
    property public final T! item;
    property public final int start;
    property public final String tag;
  }

  public final class AnnotatedStringKt {
    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
  }

  public final class JvmAnnotatedString_jvmKt {
  }

  public final class JvmCharHelpers_androidKt {
  }

  public final class MultiParagraph {
    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
    ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
    ctor public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver);
    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.compose.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.compose.ui.text.MultiParagraphIntrinsics getIntrinsics();
    method public float getLastBaseline();
    method public float getLineBottom(int lineIndex);
    method public int getLineCount();
    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
    method public int getLineForOffset(int offset);
    method public int getLineForVerticalPosition(float vertical);
    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(long position);
    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
    method public float getWidth();
    method public long getWordBoundary(int offset);
    method public boolean isLineEllipsized(int lineIndex);
    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
    property public final boolean didExceedMaxLines;
    property public final float firstBaseline;
    property public final float height;
    property public final androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics;
    property public final float lastBaseline;
    property public final int lineCount;
    property public final float maxIntrinsicWidth;
    property public final int maxLines;
    property public final float minIntrinsicWidth;
    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
    property public final float width;
  }

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

  public final class MultiParagraphIntrinsicsKt {
  }

  public final class MultiParagraphKt {
  }

  public interface Paragraph {
    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.compose.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 getLineEnd(int lineIndex, optional boolean visibleEnd);
    method public int getLineForOffset(int offset);
    method public int getLineForVerticalPosition(float vertical);
    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(long position);
    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
    method public float getWidth();
    method public long getWordBoundary(int offset);
    method public boolean isLineEllipsized(int lineIndex);
    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
    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.compose.ui.geometry.Rect> placeholderRects;
    property public abstract float width;
  }

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

  public final class ParagraphIntrinsicsKt {
    method @Deprecated public static androidx.compose.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
    method public static androidx.compose.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver);
  }

  public final class ParagraphKt {
    method @Deprecated public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
    method public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver);
    method public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, optional int maxLines, optional boolean ellipsis, float width);
  }

  @androidx.compose.runtime.Immutable public final class ParagraphStyle {
    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
    method public operator boolean equals(Object? other);
    method public long getLineHeight();
    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle merge(optional androidx.compose.ui.text.ParagraphStyle? other);
    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.ParagraphStyle plus(androidx.compose.ui.text.ParagraphStyle other);
    property public final long lineHeight;
    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
  }

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

  @androidx.compose.runtime.Immutable public final class Placeholder {
    ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
    method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
    method public operator boolean equals(Object? other);
    method public long getHeight();
    method public int getPlaceholderVerticalAlign();
    method public long getWidth();
    property public final long height;
    property public final int placeholderVerticalAlign;
    property public final long width;
  }

  @kotlin.jvm.JvmInline public final value class PlaceholderVerticalAlign {
    field public static final androidx.compose.ui.text.PlaceholderVerticalAlign.Companion Companion;
  }

  public static final class PlaceholderVerticalAlign.Companion {
    method public int getAboveBaseline();
    method public int getBottom();
    method public int getCenter();
    method public int getTextBottom();
    method public int getTextCenter();
    method public int getTextTop();
    method public int getTop();
    property public final int AboveBaseline;
    property public final int Bottom;
    property public final int Center;
    property public final int TextBottom;
    property public final int TextCenter;
    property public final int TextTop;
    property public final int Top;
  }

  public final class SaversKt {
  }

  @androidx.compose.runtime.Immutable public final class SpanStyle {
    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
    method public operator boolean equals(Object? other);
    method public long getBackground();
    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
    method public long getColor();
    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
    method public String? getFontFeatureSettings();
    method public long getFontSize();
    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
    method public long getLetterSpacing();
    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
    method public androidx.compose.ui.graphics.Shadow? getShadow();
    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle merge(optional androidx.compose.ui.text.SpanStyle? other);
    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.SpanStyle plus(androidx.compose.ui.text.SpanStyle other);
    property public final long background;
    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
    property public final long color;
    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
    property public final String? fontFeatureSettings;
    property public final long fontSize;
    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
    property public final long letterSpacing;
    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
    property public final androidx.compose.ui.graphics.Shadow? shadow;
    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
  }

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

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

  public final class TempListUtilsKt {
  }

  public final class TextLayoutInput {
    ctor @Deprecated public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
    ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, long constraints);
    method @Deprecated public androidx.compose.ui.text.TextLayoutInput copy(optional androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean softWrap, optional int overflow, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, optional long constraints);
    method public operator boolean equals(Object? other);
    method public long getConstraints();
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.text.font.FontFamily.Resolver getFontFamilyResolver();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public int getMaxLines();
    method public int getOverflow();
    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
    method @Deprecated public androidx.compose.ui.text.font.Font.ResourceLoader getResourceLoader();
    method public boolean getSoftWrap();
    method public androidx.compose.ui.text.TextStyle getStyle();
    method public androidx.compose.ui.text.AnnotatedString getText();
    property public final long constraints;
    property public final androidx.compose.ui.unit.Density density;
    property public final androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver;
    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public final int maxLines;
    property public final int overflow;
    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
    property @Deprecated public final androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader;
    property public final boolean softWrap;
    property public final androidx.compose.ui.text.TextStyle style;
    property public final androidx.compose.ui.text.AnnotatedString text;
  }

  public final class TextLayoutResult {
    ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
    method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
    method public operator boolean equals(Object? other);
    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.compose.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.compose.ui.text.TextLayoutInput getLayoutInput();
    method public float getLineBottom(int lineIndex);
    method public int getLineCount();
    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
    method public int getLineForOffset(int offset);
    method public int getLineForVerticalPosition(float vertical);
    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 androidx.compose.ui.text.MultiParagraph getMultiParagraph();
    method public int getOffsetForPosition(long position);
    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
    method public long getSize();
    method public long getWordBoundary(int offset);
    method public boolean isLineEllipsized(int lineIndex);
    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 androidx.compose.ui.text.TextLayoutInput layoutInput;
    property public final int lineCount;
    property public final androidx.compose.ui.text.MultiParagraph multiParagraph;
    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
    property public final long size;
  }

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

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TextRange {
    method public operator boolean contains(long other);
    method public operator boolean contains(int offset);
    method public boolean getCollapsed();
    method public int getEnd();
    method public int getLength();
    method public int getMax();
    method public int getMin();
    method public boolean getReversed();
    method public int getStart();
    method public boolean intersects(long other);
    property public final boolean collapsed;
    property public final int end;
    property public final int length;
    property public final int max;
    property public final int min;
    property public final boolean reversed;
    property public final int start;
    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
  }

  public static final class TextRange.Companion {
    method public long getZero();
    property public final long Zero;
  }

  public final class TextRangeKt {
    method public static long TextRange(int start, int end);
    method public static long TextRange(int index);
    method public static String substring(CharSequence, long range);
  }

  @androidx.compose.runtime.Immutable public final class TextStyle {
    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
    method public long getBackground();
    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
    method public long getColor();
    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
    method public String? getFontFeatureSettings();
    method public long getFontSize();
    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
    method public long getLetterSpacing();
    method public long getLineHeight();
    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
    method public androidx.compose.ui.graphics.Shadow? getShadow();
    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(optional androidx.compose.ui.text.TextStyle? other);
    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.SpanStyle other);
    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.ParagraphStyle other);
    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.TextStyle other);
    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.ParagraphStyle other);
    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.SpanStyle other);
    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle toParagraphStyle();
    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle toSpanStyle();
    property public final long background;
    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
    property public final long color;
    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
    property public final String? fontFeatureSettings;
    property public final long fontSize;
    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
    property public final long letterSpacing;
    property public final long lineHeight;
    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
    property public final androidx.compose.ui.graphics.Shadow? shadow;
    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
    field public static final androidx.compose.ui.text.TextStyle.Companion Companion;
  }

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

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

  public abstract sealed class TtsAnnotation {
  }

  public final class VerbatimTtsAnnotation extends androidx.compose.ui.text.TtsAnnotation {
    ctor public VerbatimTtsAnnotation(String verbatim);
    method public String getVerbatim();
    property public final String verbatim;
  }

}

package androidx.compose.ui.text.android {

  public final class LayoutCompatKt {
  }

  public final class LayoutHelperKt {
  }

  public final class LayoutIntrinsicsKt {
  }

  public final class PaintExtensionsKt {
  }

  public final class SpannedExtensionsKt {
  }

  public final class StaticLayoutFactoryKt {
  }

  public final class TempListUtilsKt {
  }

  public final class TextLayoutKt {
  }

}

package androidx.compose.ui.text.android.style {

  public final class PlaceholderSpanKt {
  }

}

package androidx.compose.ui.text.caches {

  public final class ContainerHelpersKt {
  }

  public final class SimpleArrayMapKt {
  }

}

package androidx.compose.ui.text.font {

  public abstract class AndroidFont implements androidx.compose.ui.text.font.Font {
    ctor public AndroidFont(int loadingStrategy);
    method public final int getLoadingStrategy();
    method public abstract androidx.compose.ui.text.font.AndroidFont.TypefaceLoader getTypefaceLoader();
    property public final int loadingStrategy;
    property public abstract androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader;
  }

  public static interface AndroidFont.TypefaceLoader {
    method public suspend Object? awaitLoad(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font, kotlin.coroutines.Continuation<? super android.graphics.Typeface> p);
    method public android.graphics.Typeface? loadBlocking(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font);
  }

  public final class AndroidFontKt {
  }

  public final class AndroidFontLoader_androidKt {
  }

  public final class AndroidFontResolveInterceptor_androidKt {
  }

  public final class AndroidFontUtils_androidKt {
  }

  public final class AndroidTypeface_androidKt {
    method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
    method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
    method public static androidx.compose.ui.text.font.Typeface Typeface(android.graphics.Typeface typeface);
  }

  public final class DelegatingFontLoaderForDeprecatedUsage_androidKt {
    method @Deprecated public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(androidx.compose.ui.text.font.Font.ResourceLoader fontResourceLoader, android.content.Context context);
  }

  public final class DeviceFontFamilyNameFontKt {
  }

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

  @androidx.compose.runtime.Immutable public interface Font {
    method public int getStyle();
    method public androidx.compose.ui.text.font.FontWeight getWeight();
    property public abstract int style;
    property public abstract androidx.compose.ui.text.font.FontWeight weight;
    field public static final androidx.compose.ui.text.font.Font.Companion Companion;
  }

  public static final class Font.Companion {
  }

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

  @androidx.compose.runtime.Immutable public abstract sealed class FontFamily {
    method @Deprecated public final boolean getCanLoadSynchronously();
    property @Deprecated public final boolean canLoadSynchronously;
    field public static final androidx.compose.ui.text.font.FontFamily.Companion Companion;
  }

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

  public static sealed interface FontFamily.Resolver {
    method public suspend Object? preload(androidx.compose.ui.text.font.FontFamily fontFamily, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
    method public androidx.compose.runtime.State<java.lang.Object> resolve(optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional androidx.compose.ui.text.font.FontWeight fontWeight, optional int fontStyle, optional int fontSynthesis);
  }

  public final class FontFamilyKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(java.util.List<? extends androidx.compose.ui.text.font.Font> fonts);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Font... fonts);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Typeface typeface);
  }

  public final class FontFamilyResolverKt {
  }

  public final class FontFamilyResolver_androidKt {
    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
  }

  public final class FontKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional int loadingStrategy);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font! Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily toFontFamily(androidx.compose.ui.text.font.Font);
  }

  @androidx.compose.runtime.Immutable public final class FontListFontFamily extends androidx.compose.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.ui.text.font.Font> {
    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
  }

  public final class FontListFontFamilyTypefaceAdapterKt {
  }

  @kotlin.jvm.JvmInline public final value class FontLoadingStrategy {
    method public int getValue();
    property public final int value;
    field public static final androidx.compose.ui.text.font.FontLoadingStrategy.Companion Companion;
  }

  public static final class FontLoadingStrategy.Companion {
    method public int getAsync();
    method public int getBlocking();
    method public int getOptionalLocal();
    property public final int Async;
    property public final int Blocking;
    property public final int OptionalLocal;
  }

  @kotlin.jvm.JvmInline public final value class FontStyle {
    ctor public FontStyle(int value);
    method public int getValue();
    property public final int value;
    field public static final androidx.compose.ui.text.font.FontStyle.Companion Companion;
  }

  public static final class FontStyle.Companion {
    method public int getItalic();
    method public int getNormal();
    method public java.util.List<androidx.compose.ui.text.font.FontStyle> values();
    property public final int Italic;
    property public final int Normal;
  }

  @kotlin.jvm.JvmInline public final value class FontSynthesis {
    field public static final androidx.compose.ui.text.font.FontSynthesis.Companion Companion;
  }

  public static final class FontSynthesis.Companion {
    method public int getAll();
    method public int getNone();
    method public int getStyle();
    method public int getWeight();
    property public final int All;
    property public final int None;
    property public final int Style;
    property public final int Weight;
  }

  public final class FontSynthesis_androidKt {
  }

  @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
    ctor public FontWeight(int weight);
    method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
    method public int getWeight();
    property public final int weight;
    field public static final androidx.compose.ui.text.font.FontWeight.Companion Companion;
  }

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

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

  @androidx.compose.runtime.Immutable public final class GenericFontFamily extends androidx.compose.ui.text.font.SystemFontFamily {
    method public String getName();
    property public final String name;
  }

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

  public final class ResourceFont implements androidx.compose.ui.text.font.Font {
    method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
    method public int getResId();
    method public int getStyle();
    method public androidx.compose.ui.text.font.FontWeight getWeight();
    property public final int resId;
    property public int style;
    property public androidx.compose.ui.text.font.FontWeight weight;
  }

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

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

}

package androidx.compose.ui.text.input {

  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public BackspaceCommand();
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
  }

  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
    ctor public CommitTextCommand(String text, int newCursorPosition);
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
    method public int getNewCursorPosition();
    method public String getText();
    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
    property public final int newCursorPosition;
    property public final String text;
  }

  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public DeleteAllCommand();
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
  }

  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
    method public int getLengthAfterCursor();
    method public int getLengthBeforeCursor();
    property public final int lengthAfterCursor;
    property public final int lengthBeforeCursor;
  }

  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
    method public int getLengthAfterCursor();
    method public int getLengthBeforeCursor();
    property public final int lengthAfterCursor;
    property public final int lengthBeforeCursor;
  }

  public interface EditCommand {
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
  }

  public final class EditCommandKt {
  }

  public final class EditProcessor {
    ctor public EditProcessor();
    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
  }

  public final class EditingBuffer {
    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
  }

  public final class EditingBufferKt {
  }

  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public FinishComposingTextCommand();
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
  }

  public final class GapBufferKt {
  }

  @kotlin.jvm.JvmInline public final value class ImeAction {
    field public static final androidx.compose.ui.text.input.ImeAction.Companion Companion;
  }

  public static final class ImeAction.Companion {
    method public int getDefault();
    method public int getDone();
    method public int getGo();
    method public int getNext();
    method public int getNone();
    method public int getPrevious();
    method public int getSearch();
    method public int getSend();
    property public final int Default;
    property public final int Done;
    property public final int Go;
    property public final int Next;
    property public final int None;
    property public final int Previous;
    property public final int Search;
    property public final int Send;
  }

  @androidx.compose.runtime.Immutable public final class ImeOptions {
    ctor public ImeOptions(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
    method public boolean getAutoCorrect();
    method public int getCapitalization();
    method public int getImeAction();
    method public int getKeyboardType();
    method public boolean getSingleLine();
    property public final boolean autoCorrect;
    property public final int capitalization;
    property public final int imeAction;
    property public final int keyboardType;
    property public final boolean singleLine;
    field public static final androidx.compose.ui.text.input.ImeOptions.Companion Companion;
  }

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

  @Deprecated public interface InputEventCallback {
    method @Deprecated public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
    method @Deprecated public void onImeAction(int imeAction);
  }

  @kotlin.jvm.JvmInline public final value class KeyboardCapitalization {
    field public static final androidx.compose.ui.text.input.KeyboardCapitalization.Companion Companion;
  }

  public static final class KeyboardCapitalization.Companion {
    method public int getCharacters();
    method public int getNone();
    method public int getSentences();
    method public int getWords();
    property public final int Characters;
    property public final int None;
    property public final int Sentences;
    property public final int Words;
  }

  @kotlin.jvm.JvmInline public final value class KeyboardType {
    field public static final androidx.compose.ui.text.input.KeyboardType.Companion Companion;
  }

  public static final class KeyboardType.Companion {
    method public int getAscii();
    method public int getDecimal();
    method public int getEmail();
    method public int getNumber();
    method public int getNumberPassword();
    method public int getPassword();
    method public int getPhone();
    method public int getText();
    method public int getUri();
    property public final int Ascii;
    property public final int Decimal;
    property public final int Email;
    property public final int Number;
    property public final int NumberPassword;
    property public final int Password;
    property public final int Phone;
    property public final int Text;
    property public final int Uri;
  }

  public final class MoveCursorCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public MoveCursorCommand(int amount);
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
    method public int getAmount();
    property public final int amount;
  }

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

  public static final class OffsetMapping.Companion {
    method public androidx.compose.ui.text.input.OffsetMapping getIdentity();
    property public final androidx.compose.ui.text.input.OffsetMapping Identity;
  }

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

  public interface PlatformTextInputService {
    method public void hideSoftwareKeyboard();
    method @Deprecated public default void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
    method public void showSoftwareKeyboard();
    method public void startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
    method public void stopInput();
    method public void updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
  }

  public final class SetComposingRegionCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public SetComposingRegionCommand(int start, int end);
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
    method public int getEnd();
    method public int getStart();
    property public final int end;
    property public final int start;
  }

  public final class SetComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public SetComposingTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
    ctor public SetComposingTextCommand(String text, int newCursorPosition);
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
    method public int getNewCursorPosition();
    method public String getText();
    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
    property public final int newCursorPosition;
    property public final String text;
  }

  public final class SetSelectionCommand implements androidx.compose.ui.text.input.EditCommand {
    ctor public SetSelectionCommand(int start, int end);
    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
    method public int getEnd();
    method public int getStart();
    property public final int end;
    property public final int start;
  }

  @androidx.compose.runtime.Immutable public final class TextFieldValue {
    ctor public TextFieldValue(androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
    ctor public TextFieldValue(optional String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
    method public androidx.compose.ui.text.input.TextFieldValue copy(optional androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
    method public androidx.compose.ui.text.input.TextFieldValue copy(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
    method public androidx.compose.ui.text.TextRange? getComposition();
    method public long getSelection();
    method public String getText();
    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
    property public final androidx.compose.ui.text.TextRange? composition;
    property public final long selection;
    property public final String text;
    field public static final androidx.compose.ui.text.input.TextFieldValue.Companion Companion;
  }

  public static final class TextFieldValue.Companion {
    method public androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> getSaver();
    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> Saver;
  }

  public final class TextFieldValueKt {
    method public static androidx.compose.ui.text.AnnotatedString getSelectedText(androidx.compose.ui.text.input.TextFieldValue);
    method public static androidx.compose.ui.text.AnnotatedString getTextAfterSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
    method public static androidx.compose.ui.text.AnnotatedString getTextBeforeSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
  }

  public class TextInputService {
    ctor public TextInputService(androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
    method public final void hideSoftwareKeyboard();
    method public final void showSoftwareKeyboard();
    method public androidx.compose.ui.text.input.TextInputSession startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
    method public void stopInput(androidx.compose.ui.text.input.TextInputSession session);
  }

  public final class TextInputSession {
    ctor public TextInputSession(androidx.compose.ui.text.input.TextInputService textInputService, androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
    method public void dispose();
    method public boolean hideSoftwareKeyboard();
    method public boolean isOpen();
    method @Deprecated public boolean notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
    method public boolean showSoftwareKeyboard();
    method public boolean updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
    property public final boolean isOpen;
  }

  public final class TransformedText {
    ctor public TransformedText(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.input.OffsetMapping offsetMapping);
    method public androidx.compose.ui.text.input.OffsetMapping getOffsetMapping();
    method public androidx.compose.ui.text.AnnotatedString getText();
    property public final androidx.compose.ui.text.input.OffsetMapping offsetMapping;
    property public final androidx.compose.ui.text.AnnotatedString text;
  }

  @androidx.compose.runtime.Immutable public fun interface VisualTransformation {
    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
    field public static final androidx.compose.ui.text.input.VisualTransformation.Companion Companion;
  }

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

}

package androidx.compose.ui.text.intl {

  public final class AndroidPlatformLocale_androidKt {
  }

  @androidx.compose.runtime.Immutable 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.compose.ui.text.intl.Locale.Companion Companion;
  }

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

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

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

  public final class PlatformLocaleKt {
  }

}

package androidx.compose.ui.text.platform {

  public final class AndroidAccessibilitySpannableString_androidKt {
  }

  public final class AndroidParagraphHelper_androidKt {
  }

  public final class AndroidParagraphIntrinsics_androidKt {
  }

  public final class AndroidParagraph_androidKt {
  }

  public final class AndroidStringDelegate_androidKt {
  }

  public final class Synchronization_jvmKt {
  }

}

package androidx.compose.ui.text.platform.extensions {

  public final class LocaleExtensions_androidKt {
  }

  public final class PlaceholderExtensions_androidKt {
  }

  public final class SpannableExtensions_androidKt {
  }

  public final class TextPaintExtensions_androidKt {
  }

  public final class TtsAnnotationExtensions_androidKt {
    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.TtsAnnotation);
    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.VerbatimTtsAnnotation);
  }

}

package androidx.compose.ui.text.style {

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BaselineShift {
    ctor public BaselineShift(float multiplier);
    method public float getMultiplier();
    property public final float multiplier;
    field public static final androidx.compose.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 @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
  }

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

  @kotlin.jvm.JvmInline public final value class TextAlign {
    field public static final androidx.compose.ui.text.style.TextAlign.Companion Companion;
  }

  public static final class TextAlign.Companion {
    method public int getCenter();
    method public int getEnd();
    method public int getJustify();
    method public int getLeft();
    method public int getRight();
    method public int getStart();
    method public java.util.List<androidx.compose.ui.text.style.TextAlign> values();
    property public final int Center;
    property public final int End;
    property public final int Justify;
    property public final int Left;
    property public final int Right;
    property public final int Start;
  }

  @androidx.compose.runtime.Immutable public final class TextDecoration {
    method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
    method public operator boolean equals(Object? other);
    method public int getMask();
    method public operator androidx.compose.ui.text.style.TextDecoration plus(androidx.compose.ui.text.style.TextDecoration decoration);
    property public final int mask;
    field public static final androidx.compose.ui.text.style.TextDecoration.Companion Companion;
  }

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

  @kotlin.jvm.JvmInline public final value class TextDirection {
    field public static final androidx.compose.ui.text.style.TextDirection.Companion Companion;
  }

  public static final class TextDirection.Companion {
    method public int getContent();
    method public int getContentOrLtr();
    method public int getContentOrRtl();
    method public int getLtr();
    method public int getRtl();
    property public final int Content;
    property public final int ContentOrLtr;
    property public final int ContentOrRtl;
    property public final int Ltr;
    property public final int Rtl;
  }

  @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
    ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
    method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
    method public operator boolean equals(Object? other);
    method public float getScaleX();
    method public float getSkewX();
    property public final float scaleX;
    property public final float skewX;
    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
  }

  public static final class TextGeometricTransform.Companion {
  }

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

  @androidx.compose.runtime.Immutable public final class TextIndent {
    ctor public TextIndent(optional long firstLine, optional long restLine);
    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
    method public operator boolean equals(Object? other);
    method public long getFirstLine();
    method public long getRestLine();
    property public final long firstLine;
    property public final long restLine;
    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
  }

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

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

  @kotlin.jvm.JvmInline public final value class TextOverflow {
    field public static final androidx.compose.ui.text.style.TextOverflow.Companion Companion;
  }

  public static final class TextOverflow.Companion {
    method public int getClip();
    method public int getEllipsis();
    method public int getVisible();
    property public final int Clip;
    property public final int Ellipsis;
    property public final int Visible;
  }

}

