import * as RadixMenu from '@radix-ui/react-dropdown-menu' import Block from '../Primitives/Block/Block' import Text from '../Text/Text' import { ChevronRight } from 'lucide-react' import styled from 'styled-components' import { SelectItemV2 } from '../SelectV2' import type { SingleSelectV2ItemType } from './singleSelectV2.types' import type { SingleSelectV2TokensType } from './singleSelectV2.tokens' import { submenuContentAnimations, hoverTransition, } from './singleSelectV2.animations' const StyledSubMenu = styled(RadixMenu.Sub)<{ $padding: string $margin: string }>` padding: ${({ $padding }) => $padding}; margin: ${({ $margin }) => $margin}; ` const SubTrigger = styled(RadixMenu.SubTrigger)<{ $padding: string $margin: string $borderRadius: string $bgHover: string $bgFocus: string }>` align-items: center; padding: ${({ $padding }) => $padding}; margin: ${({ $margin }) => $margin}; border-radius: ${({ $borderRadius }) => $borderRadius}; ${hoverTransition} &:hover { background-color: ${({ $bgHover }) => $bgHover}; } &[data-disabled] { opacity: 0.5; cursor: not-allowed; } &[data-highlighted] { border: none; outline: none; background-color: ${({ $bgFocus }) => $bgFocus}; } ` const SubContent = styled(RadixMenu.SubContent)<{ $backgroundColor: string $border: string $borderRadius: string $padding: string $boxShadow: string }>` background-color: ${({ $backgroundColor }) => $backgroundColor}; border: ${({ $border }) => $border}; border-radius: ${({ $borderRadius }) => $borderRadius}; padding: ${({ $padding }) => $padding}; box-shadow: ${({ $boxShadow }) => $boxShadow}; z-index: 1000; ${submenuContentAnimations} ` export type SubMenuProps = { item: SingleSelectV2ItemType selected: string onSelect: (value: string) => void singleSelectTokens: SingleSelectV2TokensType focusIdentityEnabled?: boolean } export const SubMenu = ({ item, onSelect, selected, singleSelectTokens, focusIdentityEnabled, }: SubMenuProps) => { const sub = singleSelectTokens.menu.submenu const triggerPadding = [ sub.trigger.paddingTop, sub.trigger.paddingRight, sub.trigger.paddingBottom, sub.trigger.paddingLeft, ] .filter(Boolean) .join(' ') const triggerMargin = String(sub.trigger.margin ?? '') const triggerRadius = String(sub.trigger.borderRadius ?? '') const bgHover = String(sub.trigger.backgroundColor.hover ?? '') const bgFocus = String(sub.trigger.backgroundColor.focus ?? '') const contentBg = String(sub.content.backgroundColor ?? '') const contentBorder = String(sub.content.border ?? '') const contentRadius = String(sub.content.borderRadius ?? '') const contentPadding = [ sub.content.paddingTop, sub.content.paddingRight, sub.content.paddingBottom, sub.content.paddingLeft, ] .filter(Boolean) .join(' ') const contentShadow = String(sub.content.boxShadow ?? '') return ( {item.slot1 && ( {item.slot1} )} {item.label} {item.slot2 && ( {item.slot2} )} {item.slot3 && ( {item.slot3} )} {item.slot4 && ( {item.slot4} )} {item.subMenu?.map((subItem, subIdx) => ( ))} ) } export type MenuItemProps = { item: SingleSelectV2ItemType selected: string onSelect: (value: string) => void singleSelectTokens?: SingleSelectV2TokensType index?: number focusIdentityEnabled?: boolean } export const MenuItem = ({ item, onSelect, selected, singleSelectTokens, index, focusIdentityEnabled, }: MenuItemProps) => { if (item.subMenu) { if (!singleSelectTokens) { console.error( 'SingleSelectV2 MenuItem: singleSelectTokens is required when item has subMenu' ) return null } return ( ) } if (!singleSelectTokens) return null return ( ) }