gioser

tawasuyu/brahman

Rust 582TOML 222Markdown 73JSON 198635 Definiciones

⎇ 5b9d8107fc41efc09344a70a7f0280ebc64b1e19 crates/modules/nahual/widgets/card/src/lib.rs Rust · 80 líneas · 2.5 KB Historia Quién tocó qué crudo

refactor(monorepo): reorganización lógica + renames + SDDs + split CHANGELOG 550c98f27 · sergio ·

1//! `nahual-widget-card` — container card-shape para entries de
2//! timeline, info cards y similares.
3//!
4//! Aporta la **forma**: padding consistente (12/8), `rounded(4)`,
5//! `flex_col` con `gap(2)`. NO aporta colores — el caller decide
6//! `bg`, `border_color`, etc. via builder calls. Esto permite que
7//! distintos consumers (timeline con accent por kind, info card
8//! con bg uniforme) compartan la misma proporción visual sin
9//! acoplarse a una paleta fija.
10//!
11//! # Ejemplo
12//!
13//! ```ignore
14//! use nahual_widget_card::card;
15//! use gpui::{rgb, prelude::*, px};
16//!
17//! // Card con accent border-l (típico timeline entry):
18//! let entry = card()
19//!     .bg(rgb(0x1d2128))
20//!     .border_l_4()
21//!     .border_color(rgb(0x88c0d0))
22//!     .child(div().child("header"))
23//!     .child(div().child("body"));
24//!
25//! // Card sin border (info card uniforme):
26//! let info = card()
27//!     .bg(rgb(0x1d2128))
28//!     .child("contenido");
29//! ```
30
31#![forbid(unsafe_code)]
32
33use gpui::{div, prelude::*, px, App, Div};
34use nahual_theme::Theme;
35
36/// Container card-shape: `flex_col` con padding `12/8`, `rounded(4)`,
37/// `gap(2)` interno entre children y `mb(4)` para separación
38/// vertical de cards apiladas.
39///
40/// Sin colores aplicados — el caller agrega `.bg(...)`,
41/// `.border_color(...)`, `.border_l_4()`, etc. según necesite.
42///
43/// El return es un `Div` GPUI — todas las builder methods de div
44/// están disponibles (children, hover, on_click, ids, etc.).
45pub fn card() -> Div {
46    div()
47        .flex()
48        .flex_col()
49        .px(px(12.))
50        .py(px(8.))
51        .mb(px(4.))
52        .rounded(px(4.))
53        .gap(px(2.))
54}
55
56/// Variante themed: igual que [`card`] pero pre-aplica `bg(panel)`
57/// del [`Theme`] global. El caller no necesita conocer la paleta —
58/// el bg sigue al theme actual cuando éste cambia.
59///
60/// Si la app no instaló un Theme, esta función panicea (gpui's
61/// `cx.global::<Theme>()` requiere el global instalado). Para apps
62/// sin theme, usar [`card`] directo.
63pub fn card_themed(cx: &App) -> Div {
64    let theme = Theme::global(cx);
65    card().bg(theme.bg_panel.clone())
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    /// Sanity smoke: el constructor devuelve un Div sin panic. No
73    /// podemos asertar las property de styling sin renderear (que
74    /// requiere TestAppContext + window). Si la signature cambia,
75    /// el código no compila — eso es la real garantía.
76    #[test]
77    fn card_returns_div_without_panic() {
78        let _d = card();
79    }
80}