22581b2f创建于 2025年12月16日历史提交
/*
 * -------------------------------------------------------------------------
 * This file is part of the MindStudio project.
 * Copyright (c) 2025 Huawei Technologies Co.,Ltd.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 */
import React from 'react';
import styled from '@emotion/styled';
import { Dropdown } from 'antd';
import type { DropdownButtonProps } from 'antd/lib/dropdown';
import { useTheme } from '@emotion/react';

const DropdownContainer = styled.div`
    .ant-dropdown-menu {
        transition: all .1s ease;
        user-select: none;
        min-width: 150px;
        padding: 0;
        border-radius: ${(props): string => props.theme.borderRadiusBase};
        background-color: ${(props): string => props.theme.contextMenuBgColor};
        box-shadow: ${(props): string => props.theme.boxShadowLight};

        .ant-dropdown-menu-item {
            grid-template-columns: 1fr 0.2fr;
            color: ${(props): string => props.theme.textColorPrimary};

            &:not(.ant-dropdown-menu-item-disabled):hover {
                background: ${(props): string => props.theme.primaryColorHover};
                color: #ffffff;
            }

            &.ant-dropdown-menu-item-disabled {
                color: ${(props): string => props.theme.textColorDisabled};
            }
            &.ant-dropdown-menu-item-disabled:hover {
                background: none;
            }
        }
    }
`;

export const MIDropdown: React.FC<DropdownButtonProps> = (props) => {
    const theme = useTheme();
    const { children, overlayStyle = {}, ...restProps } = props;
    return <Dropdown dropdownRender={(menu): React.ReactNode => <DropdownContainer>{menu}</DropdownContainer> }
        overlayStyle={{
            borderRadius: theme.borderRadiusBase,
            ...overlayStyle,
        }}
        {...restProps}>
        {children}
    </Dropdown>;
};