Files
tom goriunovandGitHub f0e713b877 Add support for customizing the UI color theme (#2923)
* UI customizations: new features

Fixes #2905

* colors for graphs

* introduce env variable

* colors for topbar, stats, selected state and tabs

* fix build

* fix validator

* refactor link.primary.hover color token

* refactor selected colors

* update styles for switch and fix some color tokens

* change color for selectable controls

* icon color tokens refactoring

* UI customizations: new features

Fixes #2905

* test for common components

* tweaks

* migrate from color-mode-hex cookie to color-theme cookie

* clean up

* update screenshots

* more screenshot updates

* update default color of chart line

* update envs for mega eth
2025-08-19 11:58:05 +02:00

78 lines
2.4 KiB
TypeScript

import { Icon } from '@chakra-ui/react';
import React from 'react';
import type { TabItem } from './types';
import DotsIcon from 'icons/dots.svg';
import { IconButton } from '../../chakra/icon-button';
import type { IconButtonProps } from '../../chakra/icon-button';
import { PopoverBody, PopoverCloseTriggerWrapper, PopoverContent, PopoverRoot, PopoverTrigger } from '../../chakra/popover';
import { TabsCounter, TabsTrigger } from '../../chakra/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 }
>
<Icon boxSize={ 5 }><DotsIcon/></Icon>
</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));