import * as React from "react"; import { type MenuItemRenderProps, type PopoverProps, type PopoverRenderProps } from "react-aria-components"; import type { DropdownMenuPlacementProp, DropdownMenuTriggerActionProp } from "../../props/components/navigation.prop.js"; export type { DropdownMenuPlacementProp, DropdownMenuTriggerActionProp, } from "../../props/components/navigation.prop.js"; /** * Dịch trạng thái item của RAC sang bộ `data-*` mà Radix phát ra và CSS của kho đang bám. * * `data-highlighted` là móc tô sáng bàn phím (`.ui-dropdown-menu-item[data-highlighted]`); * `data-state` mang cả hai nghĩa của Radix — "open" cho sub-trigger, "checked" cho hàng có chọn. */ export declare function radixItemState(state: MenuItemRenderProps): Record; /** * Dịch trạng thái popover của RAC sang `data-state` / `data-side` của Radix. * * ĐI KÈM: hai chỗ gọi nó đều bỏ `role` khỏi DOM (`role={undefined}`). RAC tự gắn `role="dialog"` * cho MỌI popover modal — "Automatically render Popover with role=dialog except when isNonModal is * true" — kể cả khi ruột của nó là một `role="menu"`. Radix không làm thế, và hợp đồng của tệp này * là giữ hình dạng Radix ở CẢ cây a11y chứ không chỉ ở tên prop. * * Cái giá, đo được ở consumer chuột bạch (godx-chat, 08/09/2026): mở một hộp thoại TỪ một mục menu * để lại HAI phần tử `role="dialog"` trong DOM suốt ~300ms — popover của menu đang chạy animation * thoát (`data-exiting`), cộng chính hộp thoại vừa mở. 12 phép kiểm Playwright đỏ bằng "strict mode * violation" trên `getByRole('dialog')`, thứ Playwright KHÔNG thử lại. Và với trình đọc màn hình, * một menu vẫn tự xưng là "dialog". * * Bỏ đúng THUỘC TÍNH, không đụng hành vi: state `isDialog` bên trong RAC không đổi, nên việc đưa * tiêu điểm vào popover lúc mở vẫn chạy nguyên như cũ. */ export declare function radixSurfaceState(state: PopoverRenderProps): Record; /** Radix `side` + `align` → `placement` của RAC. `align="center"` là placement trần. */ export declare function toPlacement(side?: "top" | "right" | "bottom" | "left", align?: "start" | "center" | "end"): PopoverProps["placement"]; /** * Radix trao cho `onSelect` một `Event` huỷ được. RAC's `onAction` không có sự kiện nào, nên ta * dựng một cái tương đương để consumer gọi `preventDefault()` không nổ — nhưng nó KHÔNG còn giữ * menu mở được nữa (xem báo cáo di trú). */ export declare function selectEvent(name: string): Event; interface DropdownMenuPropsOwn { /** Trạng thái mở có kiểm soát (Radix). Bên trong là `isOpen` của RAC. */ open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void; /** `modal={false}` → `isNonModal` của RAC: nền không bị khoá cuộn, không bị `inert`. */ modal?: boolean; /** * Radix đọc `dir` để đảo mũi tên trái/phải. RAC lấy hướng từ locale (`I18nProvider` / * `useLocale`), nên prop này còn trong API vì hợp đồng, nhưng không tự đảo hướng. */ dir?: "ltr" | "rtl"; /** Ant Design `trigger`. @see DropdownMenuTriggerActionProp. Default `['click']`. */ trigger?: readonly DropdownMenuTriggerActionProp[]; /** Ant Design `disabled` — no gesture opens the menu (antd empties the trigger list). */ disabled?: boolean; /** Ant Design `mouseEnterDelay`, in SECONDS, for `trigger={['hover']}`. Default 0.15. */ mouseEnterDelay?: number; /** Ant Design `mouseLeaveDelay`, in SECONDS. Default 0.1 — long enough to cross the gap. */ mouseLeaveDelay?: number; } type DropdownMenuProps = React.PropsWithChildren; export declare function DropdownMenu({ children, open, defaultOpen, onOpenChange, modal, dir, trigger, disabled, mouseEnterDelay, mouseLeaveDelay, }: DropdownMenuProps): React.JSX.Element; interface DropdownMenuTriggerProps extends React.ComponentPropsWithoutRef<"button"> { /** Giao hành vi mở cho phần tử con thay vì `