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

  public final class CallGroup extends androidx.ui.tooling.Group {
    ctor public CallGroup(Object? key, androidx.ui.core.PxBounds box, Object![] data, androidx.ui.tooling.Group![] children);
  }

  public abstract sealed class Group {
    method public final androidx.ui.core.PxBounds getBox();
    method public final androidx.ui.tooling.Group![] getChildren();
    method public final Object![] getData();
    method public final Object? getKey();
  }

  public final class InspectableKt {
    ctor public InspectableKt();
    method public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static void Inspectable(kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static java.util.Set<androidx.compose.SlotTable>! getTables();
  }

  public final class JoinedKey {
    ctor public JoinedKey(Object? left, Object? right);
    method public Object? component1();
    method public Object? component2();
    method public androidx.ui.tooling.JoinedKey copy(Object? left, Object? right);
    method public Object? getLeft();
    method public Object? getRight();
  }

  public final class NodeGroup extends androidx.ui.tooling.Group {
    ctor public NodeGroup(Object? key, Object node, androidx.ui.core.PxBounds box, Object![] data, androidx.ui.tooling.Group![] children);
    method public Object getNode();
  }

  public final class SlotTreeKt {
    ctor public SlotTreeKt();
    method public static androidx.ui.tooling.Group asTree(androidx.compose.SlotTable);
    method public static String? getPosition(androidx.ui.tooling.Group);
  }

}

package androidx.ui.tooling.preview {

  public final class ComposeViewAdapterKt {
    ctor public ComposeViewAdapterKt();
    field public static final String TOOLS_NS_URI = "http://schemas.android.com/tools";
  }

  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.FUNCTION) public @interface Preview {
    method public abstract int apiLevel() default -1;
    method public abstract float fontScale() default 1.0f;
    method public abstract int heightDp() default -1;
    method public abstract String locale() default "";
    method public abstract String name() default "";
    method public abstract String theme() default "";
    method public abstract int widthDp() default -1;
  }

}

