import { clsx } from 'clsx';
import { useContext, type ReactNode } from 'react';
import IconButtonComp, { type IconButtonProps } from '../../iconButton';
import { useListItemControl } from '../useListItemControl';
import { ListItemContext } from '../ListItemContext';
export type ListItemIconButtonProps = Pick<
IconButtonProps,
'type' | 'onClick' | 'href' | 'target' | 'aria-label'
> & {
children: ReactNode;
partiallyInteractive?: boolean;
/** @default 'minimal' */
priority?: IconButtonProps['priority'];
};
/**
* This component allows for rendering a IconButton control. It's a thin wrapper around the
* [IconButton component](https://storybook.wise.design/?path=/docs/actions-iconbutton--docs), but offers only
* a subset of its features in line with the ListItem's constraints.
*
* Please refer to the [Design documentation](https://wise.design/components/list-item---icon-button) for details.
*/
export const IconButton = function ({
priority = 'minimal',
'aria-label': ariaLabel,
...props
}: ListItemIconButtonProps) {
const { partiallyInteractive, ...restProps } = props;
const { ids, props: itemProps } = useContext(ListItemContext);
const { baseItemProps } = useListItemControl('icon-button', {
partiallyInteractive,
...restProps,
});
const getAriaProps = () => {
const labelIds = [
itemProps.inverted ? ids.subtitle : ids.title,
itemProps.inverted ? ids.title : ids.subtitle,
itemProps.inverted ? ids.valueSubtitle : ids.valueTitle,
itemProps.inverted ? ids.valueTitle : ids.valueSubtitle,
].join(' ');
const descriptorIds = [ids.additionalInfo, ids.prompt].join(' ');
if (ariaLabel) {
return {
'aria-label': ariaLabel,
'aria-describedby': labelIds.concat(descriptorIds),
};
}
return {
'aria-labelledby': labelIds,
'aria-describedby': descriptorIds,
};
};
return (
);
};
IconButton.displayName = 'ListItem.IconButton';