Tag
ui.widgets.Tag可关闭或只读的分类标签。
BEHAVIOR CONTRACT
颜色、variant、size、closable 和回调拥有一致的尺寸与焦点语义。
RECORDED INTERACTION
录像展示 neutral / accent / status 颜色和 outline。
// ── Tag ──
pub fn buildTag(scope: *ui.Scope, cx: *ui.Cx) anyerror!*ui.Node {
const a = cx.allocator;
const c = try col(cx, 12);
// ── 全部颜色(含 info)──
const r1 = try row(cx, 8);
inline for (.{ W.TagColor.neutral, .accent, .success, .warning, .danger, .info }, .{ "neutral", "accent", "success", "warning", "danger", "info" }) |col_, t| {
try r1.appendChild(a, try W.Tag(.{ .text = t, .color = col_ }).mount(scope, cx));
}
try c.appendChild(a, try label(cx, "Colors"));
try c.appendChild(a, r1);
// ── 尺寸 ──
try c.appendChild(a, try label(cx, "Sizes (sm / md)"));
const r_sz = try row(cx, 8);
inline for (.{ W.TagSize.sm, .md }, .{ "Small", "Medium" }) |sz, t| {
try r_sz.appendChild(a, try W.Tag(.{ .text = t, .color = .accent, .size = sz }).mount(scope, cx));
}
try c.appendChild(a, r_sz);
// ── 变体 ──
try c.appendChild(a, try label(cx, "Variants"));
const r2 = try row(cx, 8);
try r2.appendChild(a, try W.Tag(.{ .text = "Default", .variant = .default }).mount(scope, cx));
try r2.appendChild(a, try W.Tag(.{ .text = "Outline", .variant = .outline }).mount(scope, cx));
try r2.appendChild(a, try W.Tag(.{ .text = "Closable", .closable = true }).mount(scope, cx));
try r2.appendChild(a, try W.Tag(.{ .text = "Outline + close", .variant = .outline, .color = .danger, .closable = true }).mount(scope, cx));
try c.appendChild(a, r2);
return c;
}这是 Storybook 中该 story 的原样代码(zenit 5f9add5+wip 2026-09-30)。其中 W 即 ui.widgets,col / row / label 是 Storybook 内的布局小工具。
TagProps
ui.widgets.Tagfn Tag(props: TagProps) TagBuilder字段
类型
默认值
说明
text[]const u8""—
variantTagVariant.default.outline.default—
colorTagColor.neutral.accent.success.warning.danger.info.neutral—
sizeTagSize.sm.md.md—
closableboolfalse—
on_close?core.HandlerRefnull—
close_icon_asset?svg_assets.Assetnull—
*Node
ui.widgets.Tagmount 直接返回 *Node,把它 append 到父节点即可。