import { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react'; import { MediumSystemIconName, SmallSystemIconName } from '../../DataDisplays/SystemIcon'; import { IconButtonDropdownItem } from '../../Inputs'; /** * `MenuLink`와 `MenuButton`이 공유하는 presentation props. * * - 시맨틱 분기(`href` vs `onClick`)는 각 컴포넌트의 별도 타입으로 표현되며, * 이 타입에는 포함되지 않습니다. */ export interface MenuCommonProps { type?: 'main' | 'sub'; variant?: 'white' | 'gray'; name: string; badgeCount?: string; isSelected?: boolean; leadingIcon?: MediumSystemIconName; iconButtonName?: SmallSystemIconName; onOptionClick?: () => void; children?: ReactNode; items?: IconButtonDropdownItem[]; selectedItem?: IconButtonDropdownItem; onItemClick?: (item: IconButtonDropdownItem) => void; } /** * `MenuLink`의 props. * * - `href`가 필수이며, 기본 anchor(``) 또는 `as`로 주입된 컴포넌트로 렌더링됩니다. * - anchor 관련 native 속성(`target`, `rel`, `download` 등)을 그대로 받습니다. * - `as`로 컴포넌트를 주입하면 해당 컴포넌트의 전용 props(예: `next/link`의 `prefetch`)도 타입 추론됩니다. */ export type MenuLinkProps = MenuCommonProps & { href: string; /** * anchor 자리에 렌더할 컴포넌트. 기본값은 일반 `` 태그이며, * Next.js의 Link 등을 주입할 수 있습니다. */ as?: T; } & Omit, 'href' | 'className' | 'children' | 'as' | keyof MenuCommonProps>; /** * `MenuButton`의 props. * * - `onClick`이 필수이며, 항상 `