Card
Displays a card with header, content, and footer.
Overview
登录卡:header 标题+描述+右上角 Sign Up,content 表单字段,footer 两个全宽按钮。
Installation
Card 是单个 Rust 文件(src/card.rs)—— 容器与 section 辅助函数自绘,动作位复用 button.rs。
[dependencies]gpui-kit = "0.6.6"# card.rs composes button.rs for actions — both ship in source.zip.# Download the runnable example crate, then:cargo run --locked -- --card# Other demos:cargo run --locked -- --card smcargo run --locked -- --card spacingcargo run --locked -- --card imageUsage
Card 是 render-once 容器:按序 .child(..) 堆叠 card_header / card_content / card_footer / card_cover。每个 section 函数接收 spacing(内边距来源)和一个 spec 闭包。
use justdo_command::card::{Card, card_header, card_content, card_footer, CARD_SPACING};Card::new().dark(dark) .child(card_header(CARD_SPACING, dark, |h| { h.title("Card Title") .description("Card Description") .action(action_button); // CardAction — top right })) .child(card_content(CARD_SPACING, dark, |c| { c.child(body_content); })) .child(card_footer(CARD_SPACING, dark, |f| { f.child(footer_button); }))网页预览与桌面端运行同一份 Rust / GPUI 组件。
Composition
组合结构对齐 shadcn/ui 的 Card / CardHeader / CardTitle / CardDescription / CardAction / CardContent / CardFooter。
Card root — flex-col, gap/py = spacing, rounded-xl + border├── card_cover(el, sp) edge-to-edge media, mt(-sp) eats top padding├── card_header title + description column│ .action(el) top-right slot (CardAction)│ .bordered(true) border-b + pb — divided header├── card_content main body; .bleed() = -mx-spacing edge-to-edge└── card_footer action row; .bordered(true) = border-t + ptNotes
Spacing scale. shadcn 的 --card-spacing 变量在 GPUI 里就是一个 f32:.size(CardSize::Sm) 切到 16px,.spacing(..) 任意覆盖 —— gap、py、section px 同步生效。Edge-to-edge 内容用 mx(-sp)(divider)或整段 .bleed()。
// --card-spacing equivalent: one number drives gap, py and// every section's px. CARD_SPACING = 24, CARD_SPACING_SM = 16.let sp = 20.;Card::new().spacing(sp) .child(card_content(sp, dark, |c| { // bleed a hairline through the inset (shadcn's -mx-(--card-spacing)) c.child(div().h(px(1.)).w_full().mx(px(-sp)).bg(edge)); }))Text wrapping. GPUI 文本默认不换行 —— header 的 title/description 已启用 whitespace_normal() 且所在列 flex_1 + min_w_0(CSS 里 flex-1 + min-w-0 的同款约束),长描述在窄卡里正确折行。
RTL. shadcn 的 RTL 示例依赖阿拉伯文字形;Geist 不包含阿拉伯文,本移植不做该演示。
API Reference
容器与 section helper 的 API。
| API | Signature | Notes |
|---|---|---|
Card::new() | -> Card | Render-once root container (384px default width). |
.size(..) | CardSize | Default (24px) | Sm (16px) spacing scale. |
.spacing(..) | f32 | Explicit --card-spacing override. |
.w(..) / .dark(..) | f32 / bool | Card width / theme. |
.child(..) | impl IntoElement | Append section or free content, in order. |
card_header(sp, dark, |h|) | -> AnyElement | h.title / .description / .action / .bordered / .child. |
card_content(sp, dark, |c|) | -> AnyElement | c.child / .bleed (edge-to-edge). |
card_footer(sp, dark, |f|) | -> AnyElement | f.child / .bordered / .column / .justify_end. |
card_cover(el, sp) | -> AnyElement | Top-bleed media child (image, gradient, map). |
Source & inspiration
结构与视觉参考 shadcn/ui Card (React Aria) 。本页交互由 Rust / GPUI 绘制,基础样式来自 gpui-kit 。