mirror of
https://github.com/luxfi/explore.git
synced 2026-09-24 00:28:18 +00:00
77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
import React from 'react';
|
|
|
|
import type { TabItem } from './types';
|
|
|
|
import DotsIcon from 'icons/dots.svg';
|
|
|
|
import { IconButton } from '@luxfi/ui/icon-button';
|
|
import type { IconButtonProps } from '@luxfi/ui/icon-button';
|
|
import { PopoverBody, PopoverCloseTriggerWrapper, PopoverContent, PopoverRoot, PopoverTrigger } from '@luxfi/ui/popover';
|
|
import { TabsCounter, TabsTrigger } from '@luxfi/ui/tabs';
|
|
import { getTabValue } from './utils';
|
|
|
|
interface Props extends IconButtonProps {
|
|
tabs: Array<TabItem>;
|
|
tabsCut: number;
|
|
isActive: boolean;
|
|
}
|
|
|
|
const AdaptiveTabsMenu = ({ tabs, tabsCut, isActive, ...props }: Props, ref: React.Ref<HTMLButtonElement>) => {
|
|
|
|
return (
|
|
<PopoverRoot positioning={{ placement: 'bottom-end' }}>
|
|
<PopoverTrigger>
|
|
<IconButton
|
|
// we use "div" so the :last-of-type pseudo-class targets the last tab and not the menu trigger
|
|
as="div"
|
|
variant="plain"
|
|
color="tabs.solid.fg"
|
|
_hover={{
|
|
color: 'hover',
|
|
}}
|
|
_expanded={{
|
|
color: 'selected.control.text',
|
|
bg: 'selected.control.bg',
|
|
}}
|
|
ref={ ref }
|
|
expanded={ isActive }
|
|
px="18px"
|
|
aria-label="Open tabs menu"
|
|
{ ...props }
|
|
>
|
|
<DotsIcon className="w-5 h-5"/>
|
|
</IconButton>
|
|
</PopoverTrigger>
|
|
<PopoverContent>
|
|
<PopoverBody display="flex" flexDir="column" rowGap={ 2 } px={ 0 }>
|
|
{ tabs.slice(tabsCut).map((tab) => {
|
|
const value = getTabValue(tab);
|
|
|
|
return (
|
|
<PopoverCloseTriggerWrapper key={ value }>
|
|
<TabsTrigger
|
|
className="group"
|
|
value={ value }
|
|
w="100%"
|
|
py="5px"
|
|
borderRadius="none"
|
|
fontWeight="normal"
|
|
color="tabs.solid.fg"
|
|
_hover={{
|
|
bg: 'selected.control.bg',
|
|
}}
|
|
>
|
|
{ typeof tab.title === 'function' ? tab.title() : tab.title }
|
|
<TabsCounter count={ tab.count }/>
|
|
</TabsTrigger>
|
|
</PopoverCloseTriggerWrapper>
|
|
);
|
|
}) }
|
|
</PopoverBody>
|
|
</PopoverContent>
|
|
</PopoverRoot>
|
|
);
|
|
};
|
|
|
|
export default React.memo(React.forwardRef(AdaptiveTabsMenu));
|