import type { LayerVariant } from '@fuel-ui/css'; import { cx } from '@fuel-ui/css'; import type { ReactNode } from 'react'; import { Children } from 'react'; import { createComponent } from '../../utils'; import type { HTMLProps } from '../../utils'; import { Box } from '../Box'; import type { ButtonBaseProps } from '../Button'; import { SPINNER_SIZE, createIcon } from '../Button'; import { Spinner } from '../Spinner'; import { TagCloseButton } from './TagCloseButton'; import * as styles from './styles'; function getIconSize(size: TagProps['size'], iconSize?: number) { if (iconSize) return iconSize; if (size === 'xs') return 14; return 16; } type GetChildrenParams = TagProps & { iconLeft?: ReactNode; iconRight?: ReactNode; }; function getChildren({ isLoading, size, children, iconLeft, iconRight, }: GetChildrenParams) { if (isLoading) { return ( <> {children} ); } const hasCloseBtn = Children.toArray(children).some( // eslint-disable-next-line @typescript-eslint/no-explicit-any (child: any) => child.type?.id?.includes('TagCloseButton'), ); return ( <> {iconLeft} {children} {!hasCloseBtn && iconRight} ); } export type TagSizes = 'xs' | 'sm' | 'md'; export type TagProps = HTMLProps['div'] & Omit & { size?: TagSizes; variant?: LayerVariant; }; type ObjProps = { CloseButton: typeof TagCloseButton; }; export const Tag = createComponent( ({ as = 'span', size = 'sm', intent = 'primary', variant = 'solid', iconSize: initialIconSize, leftIcon, rightIcon, leftIconAriaLabel, rightIconAriaLabel, isLoading, isDisabled, children, className, ...props }) => { const disabled = isLoading || isDisabled; const iconSize = getIconSize(size, initialIconSize); const iconLeft = createIcon(leftIcon, leftIconAriaLabel, iconSize); const iconRight = createIcon(rightIcon, rightIconAriaLabel, iconSize); const classes = cx( 'fuel_Tag', className, styles.tag({ size, variant, disabled, intent, }), ); const customChildren = getChildren({ isLoading, size, iconLeft, iconRight, children, }); const customProps = { ...props, 'aria-disabled': disabled, }; return ( {customChildren} ); }, ); Tag.CloseButton = TagCloseButton;