DropdownMenu
ui.widgets.DropdownMenuUn ensemble de commandes ouvert depuis un bouton.
BEHAVIOR CONTRACT
Les types d'éléments, les raccourcis, les callbacks de sélection, le positionnement et la fermeture sont gérés ensemble.
RECORDED INTERACTION
Le harness ouvre le menu File : New / Open / Save.
// ── DropdownMenu(同 Menu:trigger+popover)──
pub fn buildDropdownMenu(scope: *ui.Scope, cx: *ui.Cx) anyerror!*ui.Node {
const a = cx.allocator;
const c = try col(cx, 8);
try c.appendChild(a, try label(cx, "Click the trigger to open the dropdown"));
const items = [_]W.DropdownItem{
.{ .id = "new", .label_text = "New File" },
.{ .id = "open", .label_text = "Open…" },
.{ .id = "sep", .kind = .separator },
.{ .id = "save", .label_text = "Save" },
};
const dm = try W.DropdownMenu(.{ .items = &items }).mount(scope, cx);
try dm.trigger.appendChild(a, try W.Button(.{ .label = "File ▾", .variant = .secondary }).mount(scope, cx));
dm.wrapper.meta.ownership.meta.test_id = "story.dropdown.trigger";
try c.appendChild(a, dm.wrapper);
return c;
}Le code source tel quel de la story dans le Storybook (zenit 5f9add5+wip 2026-09-30). W désigne ui.widgets ; col / row / label sont de petits helpers de mise en page du Storybook.
DropdownMenuProps
ui.widgets.DropdownMenufn DropdownMenu(props: DropdownMenuProps) DropdownMenuBuilderChamp
Type
Défaut
Description
items[]const DropdownItem&.{}菜单项列表. mount copies the item records and their string fields, so callers may pass a function-local array. Handler contexts still follow the normal Scope lifetime contract.
widthf32220面板宽度
positionpopover_mod.PopoverPosition.bottom_start弹出位置
max_height?f32null可选的菜单最大高度。设置后复用 Popover 的原生 fit_or_scroll/ScrollArea。
DropdownMenuResult
ui.widgets.DropdownMenuChamp
Type
Défaut
Description
wrapper*Node—
外层包裹节点
trigger*Node—
trigger 插槽(调用方在此插入触发元素)
state*DropdownMenuState—
内部状态(可用于外部控制)