// Type definitions for agate/LabeledIcon

import { LabeledIconBaseProps as ui_LabeledIcon_LabeledIconBaseProps } from "@enact/ui/LabeledIcon";
import * as React from "react";
import { LabeledIconDecoratorProps as ui_LabeledIcon_LabeledIconDecoratorProps } from "@enact/ui/LabeledIcon";
import { SkinnableProps as agate_Skinnable_SkinnableProps } from "@enact/agate/Skinnable";

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;

export interface LabeledIconBaseProps
  extends ui_LabeledIcon_LabeledIconBaseProps {
  /**
 * Customizes the component by mapping the supplied collection of CSS class names to the
corresponding internal elements and states of this component.
 * 
 * The following classes are supported:
 * *  `labeledIcon`  - The root class name
 * *  `label`  - Applied to the label element
 */
  css?: object;
}
/**
 * A basic LabeledIcon component structure without any behaviors applied to it.
 */

export class LabeledIconBase extends React.Component<
  Merge<React.HTMLProps<HTMLElement>, LabeledIconBaseProps>
> {}

export interface LabeledIconDecoratorProps
  extends Merge<
    ui_LabeledIcon_LabeledIconDecoratorProps,
    agate_Skinnable_SkinnableProps
  > {}
export function LabeledIconDecorator<P>(
  Component: React.ComponentType<P> | string
): React.ComponentType<P & LabeledIconDecoratorProps>;

export interface LabeledIconProps
  extends Merge<LabeledIconBaseProps, LabeledIconDecoratorProps> {}
/**
 * An Agate-styled icon component with a label.
 * 
 * Usage:
 * ```
<LabeledIcon icon="star" labelPosition="after">
  Favorite
</LabeledIcon>
```
 */

export class LabeledIcon extends React.Component<
  Merge<React.HTMLProps<HTMLElement>, LabeledIconProps>
> {}

export default LabeledIcon;
