adui_dioxus/foundation/
variant.rs

1//! Variant system for form controls, aligned with Ant Design 6.0.
2//!
3//! The variant determines the visual style of input-like components.
4
5/// Visual variant for form controls (Input, Select, etc.).
6///
7/// This aligns with Ant Design 6.0's variant system introduced in v5.13.0.
8#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
9pub enum Variant {
10    /// Default variant with outline border.
11    #[default]
12    Outlined,
13    /// Filled background variant.
14    Filled,
15    /// No border variant.
16    Borderless,
17}
18
19impl Variant {
20    /// Get the CSS class suffix for this variant.
21    pub fn as_class_suffix(&self) -> &'static str {
22        match self {
23            Variant::Outlined => "outlined",
24            Variant::Filled => "filled",
25            Variant::Borderless => "borderless",
26        }
27    }
28
29    /// Get the full CSS class for a component prefix.
30    pub fn class_for(&self, prefix: &str) -> String {
31        format!("{}-{}", prefix, self.as_class_suffix())
32    }
33}
34
35/// Bordered prop support for backwards compatibility.
36///
37/// In Ant Design 6.0, `bordered` is deprecated in favor of `variant`.
38/// This helper converts the legacy `bordered` prop to a `Variant`.
39pub fn variant_from_bordered(bordered: Option<bool>, variant: Option<Variant>) -> Variant {
40    // If variant is explicitly set, use it
41    if let Some(v) = variant {
42        return v;
43    }
44
45    // Otherwise, derive from bordered (legacy prop)
46    match bordered {
47        Some(false) => Variant::Borderless,
48        _ => Variant::Outlined, // Default
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55
56    #[test]
57    fn variant_class_suffix() {
58        assert_eq!(Variant::Outlined.as_class_suffix(), "outlined");
59        assert_eq!(Variant::Filled.as_class_suffix(), "filled");
60        assert_eq!(Variant::Borderless.as_class_suffix(), "borderless");
61    }
62
63    #[test]
64    fn variant_class_for_prefix() {
65        assert_eq!(
66            Variant::Outlined.class_for("adui-input"),
67            "adui-input-outlined"
68        );
69        assert_eq!(
70            Variant::Filled.class_for("adui-select"),
71            "adui-select-filled"
72        );
73    }
74
75    #[test]
76    fn variant_from_bordered_priority() {
77        // variant takes priority
78        assert_eq!(
79            variant_from_bordered(Some(false), Some(Variant::Filled)),
80            Variant::Filled
81        );
82
83        // bordered=false -> Borderless
84        assert_eq!(
85            variant_from_bordered(Some(false), None),
86            Variant::Borderless
87        );
88
89        // bordered=true or None -> Outlined
90        assert_eq!(variant_from_bordered(Some(true), None), Variant::Outlined);
91        assert_eq!(variant_from_bordered(None, None), Variant::Outlined);
92    }
93}