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

  public final class ClipKt {
    ctor public ClipKt();
    method public static void Clip(androidx.ui.engine.geometry.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ComplexLayoutBlockReceiver implements androidx.ui.core.DensityReceiver {
    method public androidx.ui.core.Density getDensity();
    method public androidx.ui.core.LayoutResult layoutResult(androidx.ui.core.IntPx width, androidx.ui.core.IntPx height, kotlin.jvm.functions.Function1<? super androidx.ui.core.PositioningBlockReceiver,kotlin.Unit> block);
    method public androidx.ui.core.IntPx maxIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
    method public androidx.ui.core.IntPx maxIntrinsicWidth(androidx.ui.core.Measurable, androidx.ui.core.IntPx h);
    method public androidx.ui.core.Placeable measure(androidx.ui.core.Measurable, androidx.ui.core.Constraints constraints);
    method public androidx.ui.core.IntPx minIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
    method public androidx.ui.core.IntPx minIntrinsicWidth(androidx.ui.core.Measurable, androidx.ui.core.IntPx h);
    property public androidx.ui.core.Density density;
  }

  public final class ComplexLayoutReceiver {
    method public void layout(kotlin.jvm.functions.Function3<? super androidx.ui.core.ComplexLayoutBlockReceiver,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,androidx.ui.core.LayoutResult> layoutBlock);
    method public void maxIntrinsicHeight(kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasurementReceiver,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.IntPx,androidx.ui.core.IntPx> maxIntrinsicHeightBlock);
    method public void maxIntrinsicWidth(kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasurementReceiver,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.IntPx,androidx.ui.core.IntPx> maxIntrinsicWidthBlock);
    method public void minIntrinsicHeight(kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasurementReceiver,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.IntPx,androidx.ui.core.IntPx> minIntrinsicHeightBlock);
    method public void minIntrinsicWidth(kotlin.jvm.functions.Function3<? super androidx.ui.core.IntrinsicMeasurementReceiver,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.IntPx,androidx.ui.core.IntPx> minIntrinsicWidthBlock);
  }

  public final class DrawKt {
    ctor public DrawKt();
    method public static void Draw(kotlin.jvm.functions.Function3<? super androidx.ui.core.DensityReceiver,? super androidx.ui.painting.Canvas,? super androidx.ui.core.PxSize,kotlin.Unit> onPaint);
    method public static void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.painting.Canvas,? super androidx.ui.core.PxSize,kotlin.Unit> onPaint);
  }

  public final class DrawShadowKt {
    ctor public DrawShadowKt();
    method public static void DrawShadow(androidx.ui.engine.geometry.Shape shape, androidx.ui.core.Dp elevation);
  }

  public final class EditorStyle {
    ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
    ctor public EditorStyle();
    method public androidx.ui.text.TextStyle? component1();
    method public androidx.ui.graphics.Color component2();
    method public androidx.ui.graphics.Color component3();
    method public androidx.ui.core.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
    method public androidx.ui.graphics.Color getCompositionColor();
    method public androidx.ui.graphics.Color getSelectionColor();
    method public androidx.ui.text.TextStyle? getTextStyle();
  }

  public final class IntrinsicMeasurementReceiver implements androidx.ui.core.DensityReceiver {
    method public androidx.ui.core.Density getDensity();
    method public androidx.ui.core.IntPx maxIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
    method public androidx.ui.core.IntPx maxIntrinsicWidth(androidx.ui.core.Measurable, androidx.ui.core.IntPx h);
    method public androidx.ui.core.IntPx minIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
    method public androidx.ui.core.IntPx minIntrinsicWidth(androidx.ui.core.Measurable, androidx.ui.core.IntPx h);
    property public androidx.ui.core.Density density;
  }

  public final class LayoutBlockReceiver implements androidx.ui.core.DensityReceiver {
    method public operator java.util.List<androidx.ui.core.Measurable> get(java.util.List<? extends androidx.ui.core.Measurable>, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public androidx.ui.core.Density getDensity();
    method public androidx.ui.core.LayoutResult layout(androidx.ui.core.IntPx width, androidx.ui.core.IntPx height, kotlin.jvm.functions.Function1<? super androidx.ui.core.PositioningBlockReceiver,kotlin.Unit> block);
    method public androidx.ui.core.Placeable measure(androidx.ui.core.Measurable, androidx.ui.core.Constraints constraints);
    property public androidx.ui.core.Density density;
  }

  public interface LayoutCoordinates {
    method public androidx.ui.core.PxPosition childToLocal(androidx.ui.core.LayoutCoordinates child, androidx.ui.core.PxPosition childLocal);
    method public androidx.ui.core.LayoutCoordinates? getParentCoordinates();
    method public androidx.ui.core.PxPosition getPosition();
    method public androidx.ui.core.PxSize getSize();
    method public androidx.ui.core.PxPosition globalToLocal(androidx.ui.core.PxPosition global);
    method public androidx.ui.core.PxPosition localToGlobal(androidx.ui.core.PxPosition local);
    method public androidx.ui.core.PxPosition localToRoot(androidx.ui.core.PxPosition local);
    property public abstract androidx.ui.core.PxPosition position;
    property public abstract androidx.ui.core.PxSize size;
  }

  public final class LayoutKt {
    ctor public LayoutKt();
    method public static void ComplexLayout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function1<? super androidx.ui.core.ComplexLayoutReceiver,kotlin.Unit> block);
    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.LayoutBlockReceiver,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,androidx.ui.core.LayoutResult> layoutBlock);
    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit>![] childrenArray, kotlin.jvm.functions.Function3<? super androidx.ui.core.LayoutBlockReceiver,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,androidx.ui.core.LayoutResult> layoutBlock);
    method public static void OnChildPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static void OnPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned);
    method public static void WithConstraints(kotlin.jvm.functions.Function1<? super androidx.ui.core.Constraints,kotlin.Unit> children);
  }

  public final class LayoutResult {
    field public static final androidx.ui.core.LayoutResult.Companion! Companion;
  }

  public static final class LayoutResult.Companion {
  }

  public interface Measurable {
    method public Object? getParentData();
    property public abstract Object? parentData;
  }

  public interface OffsetMap {
    method public int originalToTransformed(int offset);
    method public int transformedToOriginal(int offset);
  }

  public final class OpacityKt {
    ctor public OpacityKt();
    method public static void Opacity(@FloatRange(from=0.0, to=1.0) float opacity, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ParentDataKt {
    ctor public ParentDataKt();
    method public static void ParentData(Object data, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

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

  public abstract class Placeable {
    ctor public Placeable();
    method public abstract androidx.ui.core.IntPx getHeight();
    method public abstract androidx.ui.core.IntPx getWidth();
    method protected abstract void place(androidx.ui.core.IntPx x, androidx.ui.core.IntPx y);
    property public abstract androidx.ui.core.IntPx height;
    property public abstract androidx.ui.core.IntPx width;
  }

  public final class PointerInputWrapperKt {
    ctor public PointerInputWrapperKt();
    method public static void PointerInputWrapper(kotlin.jvm.functions.Function2<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? extends java.util.List<androidx.ui.core.PointerInputChange>> pointerInputHandler = { event, _ -> event }, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class PositioningBlockReceiver {
    ctor public PositioningBlockReceiver();
    method public void place(androidx.ui.core.Placeable, androidx.ui.core.IntPx x, androidx.ui.core.IntPx y);
    method public void place(androidx.ui.core.Placeable, androidx.ui.core.Px x, androidx.ui.core.Px y);
  }

  public final class RepaintBoundaryKt {
    ctor public RepaintBoundaryKt();
    method public static void RepaintBoundary(String? name = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class TestTagProviderKt {
    ctor public TestTagProviderKt();
    method public static void TestTag(String tag, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static String getDefaultTestTag();
    method public static androidx.compose.Ambient<java.lang.String> getTestTagAmbient();
  }

  public final class TextFieldKt {
    ctor public TextFieldKt();
    method public static void TextField(androidx.ui.input.EditorModel value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.core.VisualTransformation? visualTransformation = null);
  }

  public final class TextKt {
    ctor public TextKt();
    method public static void CurrentTextStyleProvider(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static void Text(String? text = null, androidx.ui.text.TextStyle? style = null, androidx.ui.text.ParagraphStyle? paragraphStyle = null, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = androidx.ui.core.TextKt.DefaultOverflow, Integer? maxLines = androidx.ui.core.TextKt.DefaultMaxLines, androidx.ui.graphics.Color selectionColor = androidx.ui.core.TextKt.DefaultSelectionColor, kotlin.jvm.functions.Function1<? super androidx.ui.core.TextSpanScope,kotlin.Unit> child);
    method public static void Text(String text, androidx.ui.text.TextStyle? style = null, androidx.ui.text.ParagraphStyle? paragraphStyle = null, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = androidx.ui.core.TextKt.DefaultOverflow, Integer? maxLines = androidx.ui.core.TextKt.DefaultMaxLines, androidx.ui.graphics.Color selectionColor = androidx.ui.core.TextKt.DefaultSelectionColor);
    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle? style = null, androidx.ui.text.ParagraphStyle? paragraphStyle = null, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = androidx.ui.core.TextKt.DefaultOverflow, Integer? maxLines = androidx.ui.core.TextKt.DefaultMaxLines, androidx.ui.graphics.Color selectionColor = androidx.ui.core.TextKt.DefaultSelectionColor);
    method public static androidx.compose.Effect<androidx.ui.text.TextStyle> currentTextStyle();
  }

  public final class TextSpanComposeKt {
    ctor public TextSpanComposeKt();
    method public static void Span(androidx.ui.core.TextSpanScope, String? text = null, androidx.ui.text.TextStyle? style = null, kotlin.jvm.functions.Function1<? super androidx.ui.core.TextSpanScope,kotlin.Unit> child);
    method public static void Span(androidx.ui.core.TextSpanScope, String? text = null, androidx.ui.text.TextStyle? style = null);
    method public static void compose(androidx.ui.text.TextSpan container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function1<? super androidx.ui.core.TextSpanScope,kotlin.Unit> composable);
    method public static void disposeComposition(androidx.ui.text.TextSpan container, androidx.compose.CompositionReference? parent = null);
  }

  public final class TextSpanComposer extends androidx.compose.Composer<androidx.ui.text.TextSpan> {
  }

  public final class TextSpanComposition {
    ctor public TextSpanComposition(androidx.ui.core.TextSpanComposer composer);
    method public inline void call(Object key, kotlin.jvm.functions.Function1<? super androidx.compose.ViewValidator,java.lang.Boolean> invalid, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public inline <T> void call(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function2<? super androidx.compose.ViewValidator,? super T,java.lang.Boolean> invalid, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
    method public inline void emit(Object key, kotlin.jvm.functions.Function0<androidx.ui.text.TextSpan> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<androidx.ui.text.TextSpan,androidx.ui.text.TextSpan>,kotlin.Unit> update);
    method public inline void emit(Object key, kotlin.jvm.functions.Function0<androidx.ui.text.TextSpan> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<androidx.ui.text.TextSpan,androidx.ui.text.TextSpan>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public androidx.ui.core.TextSpanComposer getComposer();
    method public inline Object joinKey(Object left, Object? right);
    method public inline operator <V> V! unaryPlus(androidx.compose.Effect<V>);
  }

  public final class TextSpanScope {
    method public androidx.ui.core.TextSpanComposition getComposer();
  }

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

  public interface VisualTransformation {
    method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
  }

  public final class VisualTransformationKt {
    ctor public VisualTransformationKt();
  }

  public final class WrapperKt {
    ctor public WrapperKt();
    method public static void ComposeView(kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static void WithDensity(kotlin.jvm.functions.Function1<? super androidx.ui.core.DensityReceiver,kotlin.Unit> block);
    method @CheckResult(suggest="+") public static androidx.compose.Effect<androidx.ui.core.Density> ambientDensity();
    method public static androidx.compose.Ambient<androidx.ui.autofill.Autofill> getAutofillAmbient();
    method public static androidx.compose.Ambient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
    method public static androidx.compose.Ambient<android.content.res.Configuration> getConfigurationAmbient();
    method public static androidx.compose.Ambient<android.content.Context> getContextAmbient();
    method public static androidx.compose.Ambient<kotlin.coroutines.CoroutineContext> getCoroutineContextAmbient();
    method public static androidx.compose.Ambient<androidx.ui.core.Density> getDensityAmbient();
    method public static androidx.compose.Ambient<androidx.ui.core.LayoutDirection> getLayoutDirectionAmbient();
    method public static androidx.compose.CompositionContext? setContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method public static androidx.compose.CompositionContext? setContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @CheckResult(suggest="+") public static <R> androidx.compose.Effect<R> withDensity(kotlin.jvm.functions.Function1<? super androidx.ui.core.DensityReceiver,? extends R> block);
  }

}

package androidx.ui.core.gesture {

  public final class ConstantsKt {
    ctor public ConstantsKt();
    method public static androidx.ui.core.Duration getDoubleTapMinTime();
    method public static androidx.ui.core.Dp getDoubleTapSlop();
    method public static androidx.ui.core.Duration getDoubleTapTimeout();
    method public static androidx.ui.core.Dp getDoubleTapTouchSlop();
    method public static androidx.ui.core.Dp getHoverTapSlop();
    method public static androidx.ui.core.Duration getHoverTapTimeout();
    method public static androidx.ui.core.Duration getJumpTapTimeout();
    method public static androidx.ui.core.Duration getLongPressTimeout();
    method public static androidx.ui.core.Dp getMaxFlingVelocity();
    method public static androidx.ui.core.Dp getMinFlingVelocity();
    method public static float getPagingTouchSlop();
    method public static float getPanSlop();
    method public static androidx.ui.core.Duration getPressTimeout();
    method public static androidx.ui.core.Dp getScaleSlop();
    method public static androidx.ui.core.Dp getTouchSlop();
    method public static androidx.ui.core.Dp getWindowTouchSlop();
    method public static androidx.ui.core.Duration getZoomControlsTimeout();
  }

  public final class DoubleTapGestureDetectorKt {
    ctor public DoubleTapGestureDetectorKt();
    method public static void DoubleTapGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.core.PxPosition,kotlin.Unit> onDoubleTap, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public interface DragObserver {
    method public default androidx.ui.core.PxPosition onDrag(androidx.ui.core.PxPosition dragDistance);
    method public default void onStart();
    method public default void onStop(androidx.ui.core.PxPosition velocity);
  }

  public final class LongPressGestureDetectorKt {
    ctor public LongPressGestureDetectorKt();
    method public static void LongPressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.core.PxPosition,kotlin.Unit> onLongPress, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class PressGestureDetectorKt {
    ctor public PressGestureDetectorKt();
    method public static void PressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.core.PxPosition,kotlin.Unit>? onPress = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onRelease = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class PressIndicatorGestureDetectorKt {
    ctor public PressIndicatorGestureDetectorKt();
    method public static void PressIndicatorGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.core.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class PressReleasedGestureDetectorKt {
    ctor public PressReleasedGestureDetectorKt();
    method public static void PressReleasedGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit>? onRelease = null, boolean consumeDownOnStart = true, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class RawDragGestureDetectorKt {
    ctor public RawDragGestureDetectorKt();
    method public static void RawDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class TouchSlopDragGestureDetectorKt {
    ctor public TouchSlopDragGestureDetectorKt();
    method public static void TouchSlopDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class TouchSlopExceededGestureDetectorKt {
    ctor public TouchSlopExceededGestureDetectorKt();
    method public static void TouchSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

}

package androidx.ui.core.gesture.util {

  public final class PolyFitLeastSquaresKt {
    ctor public PolyFitLeastSquaresKt();
  }

  public final class VelocityTracker {
    ctor public VelocityTracker();
    method public void addPosition(androidx.ui.core.Timestamp time, androidx.ui.core.PxPosition position);
    method public androidx.ui.core.Velocity calculateVelocity();
    method public void resetTracking();
  }

  public final class VelocityTrackerKt {
    ctor public VelocityTrackerKt();
  }

}

package androidx.ui.core.selection {

  public final class Selection {
    ctor public Selection(androidx.ui.core.PxPosition startCoordinates, androidx.ui.core.PxPosition endCoordinates, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
    method public androidx.ui.core.PxPosition component1();
    method public androidx.ui.core.PxPosition component2();
    method public androidx.ui.core.LayoutCoordinates? component3();
    method public androidx.ui.core.LayoutCoordinates? component4();
    method public androidx.ui.core.selection.Selection copy(androidx.ui.core.PxPosition startCoordinates, androidx.ui.core.PxPosition endCoordinates, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
    method public androidx.ui.core.PxPosition getEndCoordinates();
    method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
    method public androidx.ui.core.PxPosition getStartCoordinates();
    method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
  }

  public final class SelectionContainerKt {
    ctor public SelectionContainerKt();
    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class SelectionHandlesKt {
    ctor public SelectionHandlesKt();
  }

  public final class SelectionKt {
    ctor public SelectionKt();
  }

  public final class SelectionManagerKt {
    ctor public SelectionManagerKt();
  }

  public enum SelectionMode {
    enum_constant public static final androidx.ui.core.selection.SelectionMode Horizontal;
    enum_constant public static final androidx.ui.core.selection.SelectionMode Vertical;
  }

}

package androidx.ui.core.vectorgraphics {

  public final class VectorAsset {
    method public androidx.ui.core.Px getDefaultHeight();
    method public androidx.ui.core.Px getDefaultWidth();
    method public String getName();
    method public androidx.ui.core.vectorgraphics.VectorGroup getRoot();
    method public float getViewportHeight();
    method public float getViewportWidth();
  }

  public final class VectorAssetBuilder {
    ctor public VectorAssetBuilder(String name, androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth, float viewportHeight);
    method public androidx.ui.core.vectorgraphics.VectorAssetBuilder addPath(Object? pathData, String name = "", Object fill = EmptyBrush, float fillAlpha = 1.0f, Object stroke = EmptyBrush, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.painting.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.painting.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
    method public androidx.ui.core.vectorgraphics.VectorAsset build();
    method public void ensureNotConsumed();
    method public androidx.ui.core.Px getDefaultHeight();
    method public androidx.ui.core.Px getDefaultWidth();
    method public String getName();
    method public float getViewportHeight();
    method public float getViewportWidth();
    method public androidx.ui.core.vectorgraphics.VectorAssetBuilder popGroup();
    method public androidx.ui.core.vectorgraphics.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, Object? clipPathData = EmptyPath);
  }

  public final class VectorAssetKt {
    ctor public VectorAssetKt();
    method public static void DrawVector(androidx.ui.core.vectorgraphics.VectorAsset vectorImage);
  }

  public final class VectorComposeKt {
    ctor public VectorComposeKt();
    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
    method public static void Group(androidx.ui.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, Object? clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.vector.VectorScope,kotlin.Unit> children);
    method public static void Path(androidx.ui.vector.VectorScope, Object? pathData, String name = "", Object fill = EmptyBrush, float fillAlpha = 1.0f, Object stroke = EmptyBrush, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.painting.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.painting.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
  }

  public final class VectorGroup extends androidx.ui.core.vectorgraphics.VectorNode implements java.lang.Iterable<androidx.ui.core.vectorgraphics.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, Object? clipPathData);
    ctor public VectorGroup();
    method public operator androidx.ui.core.vectorgraphics.VectorNode get(int index);
    method public Object? getClipPathData();
    method public String getName();
    method public float getPivotX();
    method public float getPivotY();
    method public float getRotation();
    method public float getScaleX();
    method public float getScaleY();
    method public int getSize();
    method public float getTranslationX();
    method public float getTranslationY();
    method public java.util.Iterator<androidx.ui.core.vectorgraphics.VectorNode> iterator();
    property public final int size;
  }

  public abstract sealed class VectorNode {
  }

  public final class VectorPath extends androidx.ui.core.vectorgraphics.VectorNode {
    ctor public VectorPath(String name, Object? pathData, Object fill, float fillAlpha, Object stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.painting.StrokeCap strokeLineCap, androidx.ui.painting.StrokeJoin strokeLineJoin, float strokeLineMiter);
    method public Object getFill();
    method public float getFillAlpha();
    method public String getName();
    method public Object? getPathData();
    method public Object getStroke();
    method public float getStrokeAlpha();
    method public androidx.ui.painting.StrokeCap getStrokeLineCap();
    method public androidx.ui.painting.StrokeJoin getStrokeLineJoin();
    method public float getStrokeLineMiter();
    method public float getStrokeLineWidth();
  }

}

package androidx.ui.core.vectorgraphics.compat {

  public final class VectorResourceKt {
    ctor public VectorResourceKt();
    method public static void DrawVectorResource(int resId);
    method public static androidx.ui.core.vectorgraphics.VectorAsset loadVectorResource(android.content.res.Resources.Theme? theme = null, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
    method @CheckResult(suggest="+") public static androidx.compose.Effect<androidx.ui.core.vectorgraphics.VectorAsset> vectorResource(int resId);
  }

  public final class XmlVectorParserKt {
    ctor public XmlVectorParserKt();
  }

}

package androidx.ui.semantics {

  public final class SemanticsActions {
    ctor public SemanticsActions();
    field public static final androidx.ui.semantics.SemanticsActions.Companion! Companion;
  }

  public static final class SemanticsActions.Companion {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>>> getCustomActions();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>> getOnClick();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>>> CustomActions;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>> OnClick;
  }

  public final class SemanticsKt {
    ctor public SemanticsKt();
    method public static void Semantics(boolean container = false, boolean explicitChildNodes = false, kotlin.jvm.functions.Function1<? super androidx.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit>? properties = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class SemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityLabel();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityValue();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getEnabled();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getHidden();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.text.style.TextDirection> getTextDirection();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityLabel;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityValue;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Enabled;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Hidden;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.text.style.TextDirection> TextDirection;
    field public static final androidx.ui.semantics.SemanticsProperties! INSTANCE;
  }

  public final class SemanticsPropertiesKt {
    ctor public SemanticsPropertiesKt();
    method public static String getAccessibilityLabel(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getAccessibilityValue(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static java.util.List<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>> getCustomActions(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getEnabled(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getHidden(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>> getOnClick(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.text.style.TextDirection getTextDirection(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method public static void setAccessibilityLabel(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setAccessibilityValue(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setCustomActions(androidx.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>>> p);
    method public static void setEnabled(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setHidden(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setOnClick(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<kotlin.Unit>> p);
    method public static void setTestTag(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setTextDirection(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.text.style.TextDirection p);
  }

}

