import React, { ButtonHTMLAttributes, forwardRef } from 'react';
import { isFragment, isElement } from 'react-is';
import { type TStyle, useClassnames } from '../../../hooks/use-classnames';
import style from './index.module.pcss';
type TNative = ButtonHTMLAttributes;
export interface IProps {
/**
* Устанавливает связь с формой
**/
readonly form?: TNative['form'],
/**
* CSS класс или классы, которые будут применены к кнопке.
**/
readonly className?: TStyle | string,
/**
* Устанавливает размер кнопки.
**/
readonly presetSize?: 'medium' | 'small',
/**
* Устанавливает стиль кнопки.
**/
readonly presetStyle?: 'primary' | 'primary-circle' | 'secondary' | 'secondary-circle' | 'interface' | 'interface-circle' | 'error' | 'ghost' | 'ghost-error',
/**
* Если установлен в true, то кнопка будет в состоянии загрузки.
**/
readonly isLoading?: boolean,
/**
* Если установлен в true, то кнопка будет компактной.
**/
readonly isCompact?: boolean,
/**
* Уникальный идентификатор для кнопки.
**/
readonly id?: TNative['id'],
/**
* Устанавливает тип кнопки.
**/
readonly type?: TNative['type'],
/**
* Устанавливает порядок перехода по кнопке с помощью клавиши `Tab`.
**/
readonly tabIndex?: TNative['tabIndex'],
/**
* Определяет функцию обратного вызова, которая будет вызвана при фокусировке на кнопке.
**/
readonly onFocus?: TNative['onFocus'],
/**
* Определяет функцию обратного вызова, которая будет выполнена при нажатии на кнопку.
**/
readonly onClick?: TNative['onClick'],
/**
* Содержимое кнопки.
**/
readonly children?: TNative['children'],
/**
* Устанавливает горячую клавишу для кнопки.
**/
readonly accessKey?: TNative['accessKey'],
/**
* Если установлен в true, то кнопка будет заблокирована.
**/
readonly disabled?: TNative['disabled']
}
const isValidCompact = (element: IProps['children']) => {
// @ts-expect-error Непонятно как быть с типом
return isElement(element) && !!(element.type === 'svg' || !isFragment(element) && element.type.name?.startsWith('Icon'));
};
const isCompact = (element: IProps['children']) => {
return !Array.isArray(element) && isValidCompact(element);
};
/**
* Компонент `Button` представляет собой кнопку, которая может использоваться для выполнения каких-либо действий в приложении.
**/
export const Button = forwardRef(({ presetSize = 'medium', presetStyle = 'primary', type = 'button', ...props }, ref) => {
const cn = useClassnames(style, props.className);
return (
);
});