import type { FC, PropsWithChildren, CSSProperties, RefObject, } from "react"; /** * Интерфейс для React-компонента. * @example * import type { IComponent } from "@delement/ui/types"; * * // Интерфейс компонента * interface IMyComponentProps = { propName: string }; * * export const MyComponent: IComponent = ({ * propName: "val" * }} => {}; */ export interface IComponent extends FC> {} /** * Интерфейс для базовых пропсов React-компонента. */ export interface IComponentBaseProps extends PropsWithChildren { baseClass?: string; extraClasses?: { [key: string]: string | boolean; }; extraAttrs?: { [key: string]: unknown; }; style?: CSSProperties; } /** * Базовый интерфейс для компонентов, принимающих `ref`. Используется для компонентов с `imperativeHandle` */ export interface IComponentImperativeHandle< API = null, StateActions = null, Utils = Record unknown>, Data = Record, > { /** * Целевой DOM-элемент */ el: HTMLElement | null; /** * Объект, содержащий функции для внешнего управления состоянием */ stateActions: StateActions; /** * Объект, содержащий утилитарные функции компонента */ utils: Utils | null; /** * Функция, возвращающая актуальные данные компонента */ getData: () => Data | null; /** * Референс на внешнее API, если компонент использует внешний пакет */ ref: RefObject | null; } /** * Универсальные базовые размеры для компонентов. * Используются для кнопок и иконок. */ export type TBaseSizes = "small" | "medium" | "large" | "max" | "auto"; /** * Генерируемый тип для пропсов React-компонента. * @example * import type { IComponent } from "@delement/ui/types"; * * // Интерфейс компонента * interface IMyComponentProps = { propName: string }; * * export const MyComponent: IComponent = ({ * baseClass: "myComponent", * extraClasses, * extraAttrs, * children * }} => {}; */ export type TComponentProps< I extends object, Excluded = Omit, > = IComponentBaseProps & Excluded; /** * Функция генерации пользовательских размеров элементов */ export type TCustomBaseSize = () => string;