import "./action_menu.css"; import type * as React from "react"; import type { Button as BaseButton } from "@base-ui/react/button"; import type { PopoverAlign, PopoverSide } from "./popover"; import { type StyleProps } from "./style_props"; import type { IconName } from "./icon"; import type { IconButtonSize } from "./icon_button"; export interface ActionMenuItem { key: string; /** The row's visible name. A NODE where the row shows the thing itself rather * than a second spelling of it — a board column's own heading, drawn by the * component that data role owns — and then `accessibilityLabel` carries what * is announced. */ label: React.ReactNode; /** Announced name, where `label` is a node or the sentence a reader needs * differs from what the row shows. A menu item is read WITHOUT the trigger * beside it, so a row that shows only a destination announces the whole act. */ accessibilityLabel?: string; icon?: IconName; /** Destructive styling — still confirm destructive actions per the * Action Layout rules before executing. */ danger?: boolean; disabled?: boolean; onPress: () => void; } export interface ActionMenuProps extends StyleProps { /** The row's actions, in priority order. Destructive items last. */ items: ActionMenuItem[]; /** Announced name for the trigger ("Hành động cho SR-2026-0081"). */ accessibilityLabel: string; /** The trigger's glyph. `ellipsis` is the OVERFLOW menu — a row's leftovers — * and stays the default; name another only where the menu is one ACT with a * choice of destinations, which is what a glyph can say and ⋯ cannot. */ icon?: IconName; /** The trigger's rung, matching whatever cluster it sits in. */ size?: IconButtonSize; side?: PopoverSide; align?: PopoverAlign; testID?: string; /** The TRIGGER — the only one of the boxes that is in the layout. */ ref?: React.Ref; /** Substitutes the trigger's element, for the same reason `ref` names it. */ render?: BaseButton.Props["render"]; } /** * The ⋯ overflow menu for a list row — the MINIMUM door a row may have. * Every listed record must be actionable somehow: primary press → workspace * Drawer; read-only drill → Accordion/Peek; everything else → this menu. * A row with none of those is furniture. * * It is a real `menu`: one tab stop, arrow keys and typeahead between the rows, * Escape closing back to the ⋯. `className` / `style` / `ref` land on the * trigger, which is the box a caller's layout contains. */ export declare function ActionMenu(props: ActionMenuProps): React.JSX.Element;