adui_dioxus/components/
config_provider.rs1use crate::theme::{Theme, ThemeProvider, ThemeTokens};
2use dioxus::prelude::*;
3
4#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
6pub enum ComponentSize {
7 Small,
8 #[default]
9 Middle,
10 Large,
11}
12
13#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
15pub enum Locale {
16 #[default]
18 ZhCN,
19 EnUS,
21}
22
23#[derive(Clone, Debug, PartialEq)]
28pub struct ConfigContextValue {
29 pub size: ComponentSize,
30 pub disabled: bool,
31 pub prefix_cls: String,
32 pub locale: Locale,
33}
34
35impl Default for ConfigContextValue {
36 fn default() -> Self {
37 Self {
38 size: ComponentSize::Middle,
39 disabled: false,
40 prefix_cls: "adui".to_string(),
41 locale: Locale::ZhCN,
42 }
43 }
44}
45
46#[derive(Props, Clone, PartialEq)]
48pub struct ConfigProviderProps {
49 #[props(optional)]
51 pub size: Option<ComponentSize>,
52 #[props(optional)]
55 pub disabled: Option<bool>,
56 #[props(optional)]
58 pub prefix_cls: Option<String>,
59 #[props(optional)]
62 pub locale: Option<Locale>,
63 #[props(optional)]
66 pub theme: Option<Theme>,
67 pub children: Element,
68}
69
70#[component]
73pub fn ConfigProvider(props: ConfigProviderProps) -> Element {
74 let parent = try_use_context::<ConfigContextValue>().unwrap_or_default();
75
76 let value = ConfigContextValue {
77 size: props.size.unwrap_or(parent.size),
78 disabled: props.disabled.unwrap_or(parent.disabled),
79 prefix_cls: props.prefix_cls.clone().unwrap_or(parent.prefix_cls),
80 locale: props.locale.unwrap_or(parent.locale),
81 };
82
83 use_context_provider(|| value.clone());
87
88 rsx! {
89 ThemeProvider { theme: props.theme.clone(), {props.children} }
90 }
91}
92
93pub fn use_config() -> ConfigContextValue {
95 try_use_context::<ConfigContextValue>().unwrap_or_default()
96}
97
98pub fn control_heights(config: &ConfigContextValue, tokens: &ThemeTokens) -> (f32, f32, f32) {
102 let base = tokens.control_height;
103 let small = tokens.control_height_small;
104 let large = tokens.control_height_large;
105 match config.size {
106 ComponentSize::Small => (small, small, base),
107 ComponentSize::Large => (large, large, base),
108 ComponentSize::Middle => (base, small, large),
109 }
110}