import React from 'react'; import { CustomRender } from '../../commonTypes'; import { COMPONENTS_NAMESPACES } from '../../constants'; import { GlobalDefaultTheme, PartialGlobalDefaultTheme } from '../../utils/useTheme'; import { LiProps } from '../Li'; import { defaultTabsTheme } from './theme'; export interface TabsProps { /** Классы переданные через _ */ [x: string]: unknown; /** Устанавливает номер выбранного таба */ activeTabKey?: string | number; /** Вложенные элементы */ children?: React.ReactNode; /** Кастомный content */ contentRender?: CustomRender; /** Кастомный heading */ headingRender?: CustomRender; /** Обработчик выбора таба */ onChange?: (event: ChangeEvent) => void; /** Reference */ ref?: React.Ref; /** Скролл для табов */ shouldScrollTabs?: boolean; /** DOM-узел, в который будет помещено содержимое вкладки */ tabContentNode?: HTMLElement | null; /** Кастомный tab */ tabRender?: CustomRender; /** Тема компонента */ theme?: PartialGlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.tabs]; /** Кастомный wrapper */ wrapperRender?: CustomRender; } export interface TabsState { activeTabKey: string | number; } export declare type TabProps = Omit, 'title'> & { /** Классы переданные через _ */ [x: string]: unknown; /** Вложенные элементы */ children?: React.ReactNode; /** Делает вкладку неактивной */ isDisabled?: boolean; /** Номер вкладки. Нумерация от 0, т.к. обработчик onSelect комопнента Tabs возвращает номер вкладки начиная с 0. */ tabKey: string | number; /** Кастомный tab */ tabRender?: CustomRender; /** Тема копмонента */ theme?: PartialGlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.tabs]; /** Название таба. Может принимать название в виде строки или ReactNode */ title: React.ReactNode; }; export interface TabsContextType { activeTabKey: string | number; onTabSelect: SelectHandler; tabRender?: CustomRender; theme: GlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.tabs]; } export interface SelectHandler { (ev: React.MouseEvent, tabKey: string | number): void; } export interface CreateSelectHandler { (props: TabsProps, activeTabKey: string | number, setActiveTabKey: React.Dispatch>): SelectHandler; } export interface TabContentProps { /** EventKey выбранной вкладки */ activeTabKey: string | number; /** Вложенные элементы */ children?: React.ReactNode; } export interface ChangeEvent extends React.MouseEvent { component: { value: string | number; }; } export interface WrapperProps { children?: React.ReactNode; className?: string; ref?: React.Ref; style?: React.CSSProperties; } export interface ContentProps { children?: React.ReactNode; className?: string; tabContentNode?: Element | null; } export interface HeadingProps { children?: React.ReactNode; className?: string; } export interface CustomElements { Content: React.FC; Heading: React.FC; Wrapper: React.FC; } export interface TabsRefCurrent { content: HTMLElement | null; wrapper: HTMLElement | null; } export interface TabRefCurrent { wrapper: HTMLLIElement | null; } export interface ArrowProps { onClick: React.MouseEventHandler; theme: PartialGlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.tabs]; } export interface TabsScroll { containerRef: React.Ref; hasLeftArrow: boolean; hasRightArrow: boolean; hasScroll: boolean; onLeftClick: React.MouseEventHandler; onRightClick: React.MouseEventHandler; } export interface TabsScrollProps { shouldScrollTabs?: boolean; theme: typeof defaultTabsTheme; }