import { Component, CSSProperties, ReactChild, ReactNode, ContextType } from 'react';
import { DataAttributes } from '../../utils/types';
import ResponsiveContext from '../ResponsiveContext';
import '../../helpers/base.less';
import './SegmentedControl.less';
type SingleProps<T> = {
    multiple?: false;
    /**
     * Selected value or an array of values (for multiple version).
     * Used in controlled version or as default value in uncontrolled version (with onChange property)
     * @since 0.0.68
     */
    selected?: T;
    /**
     * On change selection callback for uncontrolled mode.
     * @since 0.0.68
     */
    onChange?: (newSelection: T) => void;
};
type MultipleProps<T> = {
    multiple: true;
    selected?: T[];
    onChange?: (newSelection: T[]) => void;
};
type MultipleBaseProps<T> = MultipleProps<T> | SingleProps<T>;
export type SegmentedControlProps<T> = {
    /**
     * Label
     * @since 0.0.68
     */
    label: ReactNode;
    /**
     * Where to place label
     * @since 0.0.68
     */
    labelPlacement?: 'top' | 'left';
    /**
     * Array of buttons to display (every array item must contain an unique "value" property)
     * @since 0.0.68
     */
    buttons: ({
        value: T;
        title?: ReactChild;
        icon?: ReactNode;
        className?: string;
        style?: CSSProperties;
        disabled?: boolean;
    } & DataAttributes)[];
    /**
     * Monospaced version of buttons (all button would have the same width).
     * Attention: using it with buttons dynamic update may cause to wrong behavior!
     * @since 0.0.68
     */
    monospaced?: boolean;
    /**
     * Should component displays as inline element?
     * @since 0.0.68
     */
    inline?: boolean;
    /**
     * Use buttons with transparent background (ghost buttons)
     * @since 2.3.0
     */
    ghost?: boolean;
    /**
     * @ignore
     */
    className?: string;
    /**
     * @ignore
     */
    baseClassName?: string;
} & MultipleBaseProps<T>;
export interface SegmentedControlState<T> {
    selected?: T | T[];
    prevSelected?: T | T[];
    monoWidth: number;
    compact?: boolean;
}
export declare const SEGMENTED_CONTROL_BASE_CLASS_NAME: string;
/**
 *  `Segmented Control` is a group of several [Buttons](#!/Button)
 * each of which functions as a mutually exclusive option.
 * @since 0.0.68
 */
declare class SegmentedControl<T = unknown> extends Component<SegmentedControlProps<T>, SegmentedControlState<T>> {
    static defaultProps: {
        label: null;
        labelPlacement: string;
        monospaced: boolean;
        multiple: boolean;
        onChange: null;
        inline: boolean;
        ghost: boolean;
        className: null;
        baseClassName: string;
    };
    state: SegmentedControlState<T>;
    static getDerivedStateFromProps<T>(props: SegmentedControlProps<T>, state: SegmentedControlState<T>): Partial<SegmentedControlState<T>>;
    componentDidMount(): void;
    componentDidUpdate(): void;
    static contextType: import("react").Context<boolean | undefined>;
    context: ContextType<typeof ResponsiveContext>;
    isCompact: boolean;
    rootRef: import("react").RefObject<Element>;
    adjustMonospaced: () => void;
    isResponsive(): boolean;
    handleChange: (value: T) => () => void;
    compact: () => boolean;
    uncompact: () => boolean;
    renderControl(): import("react/jsx-runtime").JSX.Element;
    renderDropdown(): import("react/jsx-runtime").JSX.Element;
    renderButtonGroup(): import("react/jsx-runtime").JSX.Element;
    render(): import("react/jsx-runtime").JSX.Element;
}
export default SegmentedControl;
