tablo_ui/components/primitives/
card.rs1use topcoat::{
3 Result,
4 view::{Attributes, Child, StaticClass, View, class, component, view},
5};
6
7const CARD: StaticClass = class!(
10 "flex flex-col gap-5 rounded-xl border border-border bg-card py-6 \
11 text-card-foreground shadow-sm",
12);
13
14#[component]
35pub async fn card(
36 #[default] mut attrs: Attributes,
37 #[default] child: Child<'_>,
38) -> Result<impl View> {
39 Ok(view! { <div class=(class!(CARD, attrs.remove("class"))) (attrs)>(child)</div> })
40}
41
42#[component]
45pub async fn card_header(
46 #[default] mut attrs: Attributes,
47 #[default] child: Child<'_>,
48) -> Result<impl View> {
49 Ok(view! {
50 <div
51 class=(class!("flex flex-col gap-1.5 px-6", attrs.remove("class")))
52 (attrs)
53 >
54 (child)
55 </div>
56 })
57}
58
59#[component]
61pub async fn card_title(
62 #[default] mut attrs: Attributes,
63 #[default] child: Child<'_>,
64) -> Result<impl View> {
65 Ok(view! {
66 <h3
67 class=(class!("text-base leading-none font-semibold", attrs.remove("class")))
68 (attrs)
69 >
70 (child)
71 </h3>
72 })
73}
74
75#[component]
77pub async fn card_description(
78 #[default] mut attrs: Attributes,
79 #[default] child: Child<'_>,
80) -> Result<impl View> {
81 Ok(view! {
82 <p
83 class=(class!("text-sm text-muted-foreground", attrs.remove("class")))
84 (attrs)
85 >
86 (child)
87 </p>
88 })
89}
90
91#[component]
93pub async fn card_content(
94 #[default] mut attrs: Attributes,
95 #[default] child: Child<'_>,
96) -> Result<impl View> {
97 Ok(view! { <div class=(class!("px-6", attrs.remove("class"))) (attrs)>(child)</div> })
98}
99
100#[component]
102pub async fn card_footer(
103 #[default] mut attrs: Attributes,
104 #[default] child: Child<'_>,
105) -> Result<impl View> {
106 Ok(view! {
107 <div
108 class=(class!("flex items-center gap-2 px-6", attrs.remove("class")))
109 (attrs)
110 >
111 (child)
112 </div>
113 })
114}