Menu
ui.widgets.MenuActions contextuelles avec indications de raccourcis.
BEHAVIOR CONTRACT
Déclencheur, portal, séparateurs, éléments dangereux, fermeture au clic extérieur et Escape sont livrés ensemble.
RECORDED INTERACTION
Le harness ouvre le menu Actions : Cut / Copy / Delete.
// ── Menu(trigger+popover:item 在弹层里,story 给 trigger 加按钮,e2e 点开验 item)──
pub fn buildMenu(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 menu"));
const items = [_]W.MenuItem{
.{ .id = "cut", .label_text = "Cut", .shortcut = "⌘X" },
.{ .id = "copy", .label_text = "Copy", .shortcut = "⌘C" },
.{ .id = "sep", .kind = .separator },
.{ .id = "del", .label_text = "Delete", .danger = true },
};
const m = try W.Menu(.{ .items = &items }).mount(scope, cx);
// 给 trigger 放一个有标签的按钮,让 story 可见可点
try m.trigger.appendChild(a, try W.Button(.{ .label = "Actions ▾", .variant = .secondary }).mount(scope, cx));
m.wrapper.meta.ownership.meta.test_id = "story.menu.trigger";
try c.appendChild(a, m.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.
MenuProps
ui.widgets.Menufn Menu(props: MenuProps) MenuBuilderChamp
Type
Défaut
Description
items[]const MenuItem&.{}—
on_select?core.HandlerRefnull—
widthf32220—
positionpopover_mod.PopoverPosition.bottom_start—
MenuResult
ui.widgets.MenuChamp
Type
Défaut
Description
wrapper*Node—
—
trigger*Node—
—
state*MenuState—
—