import * as vue from 'vue';
import { ComponentInternalInstance, Ref, ComputedRef, JSXComponent, PropType } from 'vue';

interface GroupItem {
    id: number;
    value: Ref<unknown>;
    disabled: Ref<boolean | undefined>;
}
interface GroupProvide {
    register: (item: GroupItem, cmp: ComponentInternalInstance) => void;
    unregister: (id: number) => void;
    select: (id: number, value: boolean) => void;
    selected: Ref<Readonly<number[]>>;
    isSelected: (id: number) => boolean;
    prev: () => void;
    next: () => void;
    selectedClass: Ref<string | undefined>;
    items: ComputedRef<{
        id: number;
        value: unknown;
        disabled: boolean | undefined;
    }[]>;
    disabled: Ref<boolean | undefined>;
    getItemIndex: (value: unknown) => number;
}

type IconValue = string | JSXComponent;
declare const IconValue: PropType<IconValue>;

interface TouchHandlers {
    start?: (wrapperEvent: {
        originalEvent: TouchEvent;
    } & TouchData) => void;
    end?: (wrapperEvent: {
        originalEvent: TouchEvent;
    } & TouchData) => void;
    move?: (wrapperEvent: {
        originalEvent: TouchEvent;
    } & TouchData) => void;
    left?: (wrapper: TouchData) => void;
    right?: (wrapper: TouchData) => void;
    up?: (wrapper: TouchData) => void;
    down?: (wrapper: TouchData) => void;
}
interface TouchData {
    touchstartX: number;
    touchstartY: number;
    touchmoveX: number;
    touchmoveY: number;
    touchendX: number;
    touchendY: number;
    offsetX: number;
    offsetY: number;
}

type ControlProps = {
    icon: IconValue;
    class: string;
    onClick: () => void;
    ariaLabel: string;
};
declare const VWindow: vue.DefineComponent<{
    reverse: boolean;
    direction: string;
    disabled: boolean;
    tag: string;
    mandatory: "force";
    selectedClass: string;
    continuous: boolean;
    nextIcon: IconValue;
    prevIcon: IconValue;
} & {
    touch?: boolean | TouchHandlers | undefined;
    theme?: string | undefined;
    modelValue?: any;
    showArrows?: string | boolean | undefined;
} & {
    $children?: {} | vue.VNodeChild | {
        default?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        additional?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        prev?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
        next?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
    };
    $slots?: {
        default?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        additional?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        prev?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
        next?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
    } | undefined;
    'v-slots'?: {
        default?: false | ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        additional?: false | ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        prev?: false | ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
        next?: false | ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
    } | undefined;
} & {
    "v-slot:default"?: false | ((args_0: {
        group: GroupProvide;
    }) => vue.VNodeChild) | undefined;
    "v-slot:additional"?: false | ((args_0: {
        group: GroupProvide;
    }) => vue.VNodeChild) | undefined;
    "v-slot:prev"?: false | ((args_0: {
        props: ControlProps;
    }) => vue.VNodeChild) | undefined;
    "v-slot:next"?: false | ((args_0: {
        props: ControlProps;
    }) => vue.VNodeChild) | undefined;
}, {
    group: GroupProvide;
}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
    'update:modelValue': (v: any) => boolean;
}, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, {
    reverse: boolean;
    direction: string;
    disabled: boolean;
    tag: string;
    mandatory: "force";
    selectedClass: string;
    continuous: boolean;
    nextIcon: IconValue;
    prevIcon: IconValue;
} & {
    touch?: boolean | TouchHandlers | undefined;
    theme?: string | undefined;
    modelValue?: any;
    showArrows?: string | boolean | undefined;
} & {
    $children?: {} | vue.VNodeChild | {
        default?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        additional?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        prev?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
        next?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
    };
    $slots?: {
        default?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        additional?: ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        prev?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
        next?: ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
    } | undefined;
    'v-slots'?: {
        default?: false | ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        additional?: false | ((args_0: {
            group: GroupProvide;
        }) => vue.VNodeChild) | undefined;
        prev?: false | ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
        next?: false | ((args_0: {
            props: ControlProps;
        }) => vue.VNodeChild) | undefined;
    } | undefined;
} & {
    "v-slot:default"?: false | ((args_0: {
        group: GroupProvide;
    }) => vue.VNodeChild) | undefined;
    "v-slot:additional"?: false | ((args_0: {
        group: GroupProvide;
    }) => vue.VNodeChild) | undefined;
    "v-slot:prev"?: false | ((args_0: {
        props: ControlProps;
    }) => vue.VNodeChild) | undefined;
    "v-slot:next"?: false | ((args_0: {
        props: ControlProps;
    }) => vue.VNodeChild) | undefined;
} & {
    "onUpdate:modelValue"?: ((v: any) => any) | undefined;
}, {
    reverse: boolean;
    direction: string;
    disabled: boolean;
    tag: string;
    mandatory: "force";
    touch: boolean | TouchHandlers;
    selectedClass: string;
    continuous: boolean;
    nextIcon: IconValue;
    prevIcon: IconValue;
}>;
type VWindow = InstanceType<typeof VWindow>;

declare const VWindowItem: vue.DefineComponent<{
    eager: boolean;
    disabled: boolean;
} & {
    transition?: string | boolean | undefined;
    value?: any;
    selectedClass?: string | undefined;
    reverseTransition?: string | boolean | undefined;
} & {
    $children?: vue.VNodeChild | (() => vue.VNodeChild) | {
        default?: (() => vue.VNodeChild) | undefined;
    };
    $slots?: {
        default?: (() => vue.VNodeChild) | undefined;
    } | undefined;
    'v-slots'?: {
        default?: false | (() => vue.VNodeChild) | undefined;
    } | undefined;
} & {
    "v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
}, {}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
    'group:selected': (val: {
        value: boolean;
    }) => boolean;
}, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, {
    eager: boolean;
    disabled: boolean;
} & {
    transition?: string | boolean | undefined;
    value?: any;
    selectedClass?: string | undefined;
    reverseTransition?: string | boolean | undefined;
} & {
    $children?: vue.VNodeChild | (() => vue.VNodeChild) | {
        default?: (() => vue.VNodeChild) | undefined;
    };
    $slots?: {
        default?: (() => vue.VNodeChild) | undefined;
    } | undefined;
    'v-slots'?: {
        default?: false | (() => vue.VNodeChild) | undefined;
    } | undefined;
} & {
    "v-slot:default"?: false | (() => vue.VNodeChild) | undefined;
} & {
    "onGroup:selected"?: ((val: {
        value: boolean;
    }) => any) | undefined;
}, {
    transition: string | boolean;
    eager: boolean;
    disabled: boolean;
    reverseTransition: string | boolean;
}>;
type VWindowItem = InstanceType<typeof VWindowItem>;

export { VWindow, VWindowItem };
