// Signature format: 4.0
package androidx.wear.compose.foundation {

  @kotlin.jvm.JvmInline public final value class AnchorType {
    field public static final androidx.wear.compose.foundation.AnchorType.Companion Companion;
  }

  public static final class AnchorType.Companion {
    method public float getCenter();
    method public float getEnd();
    method public float getStart();
    property public final float Center;
    property public final float End;
    property public final float Start;
  }

  @androidx.compose.runtime.Stable public interface ArcPaddingValues {
    method public float calculateAfterPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection, int angularDirection);
    method public float calculateBeforePadding(androidx.compose.ui.unit.LayoutDirection layoutDirection, int angularDirection);
    method public float calculateInnerPadding(int radialDirection);
    method public float calculateOuterPadding(int radialDirection);
  }

  public final class BasicCurvedTextKt {
    method public static void basicCurvedText(androidx.wear.compose.foundation.CurvedScope, String text, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional androidx.wear.compose.foundation.CurvedDirection.Angular? angularDirection, optional int overflow, optional kotlin.jvm.functions.Function0<androidx.wear.compose.foundation.CurvedTextStyle> style);
    method public static void basicCurvedText(androidx.wear.compose.foundation.CurvedScope, String text, androidx.wear.compose.foundation.CurvedTextStyle style, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional androidx.wear.compose.foundation.CurvedDirection.Angular? angularDirection, optional int overflow);
  }

  public interface CurvedAlignment {
  }

  @kotlin.jvm.JvmInline public static final value class CurvedAlignment.Angular {
    field public static final androidx.wear.compose.foundation.CurvedAlignment.Angular.Companion Companion;
  }

  public static final class CurvedAlignment.Angular.Companion {
    method public float Custom(float ratio);
    method public float getCenter();
    method public float getEnd();
    method public float getStart();
    property public final float Center;
    property public final float End;
    property public final float Start;
  }

  @kotlin.jvm.JvmInline public static final value class CurvedAlignment.Radial {
    field public static final androidx.wear.compose.foundation.CurvedAlignment.Radial.Companion Companion;
  }

  public static final class CurvedAlignment.Radial.Companion {
    method public float Custom(float ratio);
    method public float getCenter();
    method public float getInner();
    method public float getOuter();
    property public final float Center;
    property public final float Inner;
    property public final float Outer;
  }

  public final class CurvedColumnKt {
    method public static void curvedColumn(androidx.wear.compose.foundation.CurvedScope, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional androidx.wear.compose.foundation.CurvedDirection.Radial? radialDirection, optional androidx.wear.compose.foundation.CurvedAlignment.Angular? angularAlignment, kotlin.jvm.functions.Function1<? super androidx.wear.compose.foundation.CurvedScope,kotlin.Unit> contentBuilder);
  }

  public final class CurvedComposableKt {
    method public static void curvedComposable(androidx.wear.compose.foundation.CurvedScope, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional float radialAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
  }

  public interface CurvedDirection {
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public static final value class CurvedDirection.Angular {
    field public static final androidx.wear.compose.foundation.CurvedDirection.Angular.Companion Companion;
  }

  public static final class CurvedDirection.Angular.Companion {
    method public int getClockwise();
    method public int getCounterClockwise();
    method public int getNormal();
    method public int getReversed();
    property public final int Clockwise;
    property public final int CounterClockwise;
    property public final int Normal;
    property public final int Reversed;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public static final value class CurvedDirection.Radial {
    field public static final androidx.wear.compose.foundation.CurvedDirection.Radial.Companion Companion;
  }

  public static final class CurvedDirection.Radial.Companion {
    method public int getInsideOut();
    method public int getOutsideIn();
    property public final int InsideOut;
    property public final int OutsideIn;
  }

  public final class CurvedDrawKt {
    method public static androidx.wear.compose.foundation.CurvedModifier angularGradientBackground(androidx.wear.compose.foundation.CurvedModifier, kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional int cap);
    method public static androidx.wear.compose.foundation.CurvedModifier angularGradientBackground(androidx.wear.compose.foundation.CurvedModifier, java.util.List<androidx.compose.ui.graphics.Color> colors, optional int cap);
    method public static androidx.wear.compose.foundation.CurvedModifier background(androidx.wear.compose.foundation.CurvedModifier, long color, optional int cap);
    method public static androidx.wear.compose.foundation.CurvedModifier radialGradientBackground(androidx.wear.compose.foundation.CurvedModifier, kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional int cap);
    method public static androidx.wear.compose.foundation.CurvedModifier radialGradientBackground(androidx.wear.compose.foundation.CurvedModifier, java.util.List<androidx.compose.ui.graphics.Color> colors, optional int cap);
  }

  public final class CurvedLayoutKt {
    method @androidx.compose.runtime.Composable public static void CurvedLayout(optional androidx.compose.ui.Modifier modifier, optional float anchor, optional float anchorType, optional androidx.wear.compose.foundation.CurvedAlignment.Radial? radialAlignment, optional int angularDirection, kotlin.jvm.functions.Function1<? super androidx.wear.compose.foundation.CurvedScope,kotlin.Unit> contentBuilder);
  }

  @androidx.compose.runtime.Stable public sealed interface CurvedModifier {
    method public default infix androidx.wear.compose.foundation.CurvedModifier then(androidx.wear.compose.foundation.CurvedModifier other);
    field public static final androidx.wear.compose.foundation.CurvedModifier.Companion Companion;
  }

  public static final class CurvedModifier.Companion implements androidx.wear.compose.foundation.CurvedModifier {
  }

  public final class CurvedModifierKt {
  }

  public final class CurvedPaddingKt {
    method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(optional float outer, optional float inner, optional float before, optional float after);
    method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(float all);
    method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(optional float radial, optional float angular);
    method public static androidx.wear.compose.foundation.CurvedModifier padding(androidx.wear.compose.foundation.CurvedModifier, androidx.wear.compose.foundation.ArcPaddingValues paddingValues);
    method public static androidx.wear.compose.foundation.CurvedModifier padding(androidx.wear.compose.foundation.CurvedModifier, float outer, float inner, float before, float after);
    method public static androidx.wear.compose.foundation.CurvedModifier padding(androidx.wear.compose.foundation.CurvedModifier, optional float radial, optional float angular);
    method public static androidx.wear.compose.foundation.CurvedModifier padding(androidx.wear.compose.foundation.CurvedModifier, optional float all);
  }

  public final class CurvedParentDataKt {
    method public static androidx.wear.compose.foundation.CurvedModifier parentDataModifier(androidx.wear.compose.foundation.CurvedModifier, kotlin.jvm.functions.Function1<java.lang.Object,?> modifyParentData);
    method public static androidx.wear.compose.foundation.CurvedModifier weight(androidx.wear.compose.foundation.CurvedModifier, float weight);
  }

  public final class CurvedRowKt {
    method public static void curvedRow(androidx.wear.compose.foundation.CurvedScope, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional androidx.wear.compose.foundation.CurvedAlignment.Radial? radialAlignment, optional androidx.wear.compose.foundation.CurvedDirection.Angular? angularDirection, kotlin.jvm.functions.Function1<? super androidx.wear.compose.foundation.CurvedScope,kotlin.Unit> contentBuilder);
  }

  @androidx.compose.foundation.layout.LayoutScopeMarker public final class CurvedScope {
  }

  public final class CurvedSizeKt {
    method public static androidx.wear.compose.foundation.CurvedModifier angularSize(androidx.wear.compose.foundation.CurvedModifier, float sweepDegrees);
    method public static androidx.wear.compose.foundation.CurvedModifier radialSize(androidx.wear.compose.foundation.CurvedModifier, float thickness);
    method public static androidx.wear.compose.foundation.CurvedModifier size(androidx.wear.compose.foundation.CurvedModifier, float sweepDegrees, float thickness);
    method public static androidx.wear.compose.foundation.CurvedModifier sizeIn(androidx.wear.compose.foundation.CurvedModifier, optional float minSweepDegrees, optional float maxSweepDegrees, optional float minThickness, optional float maxThickness);
  }

  public final class CurvedTextStyle {
    ctor public CurvedTextStyle(optional long background, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight);
    ctor public CurvedTextStyle(androidx.compose.ui.text.TextStyle style);
    ctor @Deprecated public CurvedTextStyle(optional long background, optional long color, optional long fontSize);
    method @Deprecated public androidx.wear.compose.foundation.CurvedTextStyle copy(optional long background, optional long color, optional long fontSize);
    method public androidx.wear.compose.foundation.CurvedTextStyle copy(optional long background, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight);
    method public long getBackground();
    method public long getColor();
    method public long getFontSize();
    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
    method public androidx.wear.compose.foundation.CurvedTextStyle merge(optional androidx.wear.compose.foundation.CurvedTextStyle? other);
    method public operator androidx.wear.compose.foundation.CurvedTextStyle plus(androidx.wear.compose.foundation.CurvedTextStyle other);
    property public final long background;
    property public final long color;
    property public final long fontSize;
    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
  }

  public final class CurvedTextStyleKt {
  }

}

