Skip to content

Commit f57a175

Browse files
committed
feat: Keyboard navigation support for Checkbox
1 parent 8b09791 commit f57a175

File tree

3 files changed

+34
-12
lines changed

3 files changed

+34
-12
lines changed

crates/components/src/checkbox.rs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
use dioxus::prelude::*;
2-
use freya_elements::elements as dioxus_elements;
2+
use freya_elements::{
3+
elements as dioxus_elements,
4+
events::KeyboardEvent,
5+
};
36
use freya_hooks::{
47
use_applied_theme,
8+
use_focus,
59
CheckboxTheme,
610
CheckboxThemeWith,
711
};
@@ -68,30 +72,46 @@ pub fn Checkbox(
6872
/// Theme override.
6973
theme: Option<CheckboxThemeWith>,
7074
) -> Element {
75+
let focus = use_focus();
7176
let CheckboxTheme {
77+
border_fill,
7278
unselected_fill,
7379
selected_fill,
7480
selected_icon_fill,
7581
} = use_applied_theme!(&theme, checkbox);
76-
let (fill, border) = if selected {
82+
let (inner_fill, outer_fill) = if selected {
7783
(selected_fill.as_ref(), selected_fill.as_ref())
7884
} else {
7985
("transparent", unselected_fill.as_ref())
8086
};
87+
let border = if focus.is_selected() {
88+
format!("4 solid {}", border_fill)
89+
} else {
90+
"none".to_string()
91+
};
92+
93+
let onkeydown = move |_: KeyboardEvent| {};
8194

8295
rsx!(
8396
rect {
84-
width: "18",
85-
height: "18",
86-
padding: "4",
87-
main_align: "center",
88-
cross_align: "center",
97+
border,
98+
border_align: "outer",
8999
corner_radius: "4",
90-
border: "2 solid {border}",
91-
background: "{fill}",
92-
if selected {
93-
TickIcon {
94-
fill: selected_icon_fill
100+
rect {
101+
a11y_id: focus.attribute(),
102+
width: "18",
103+
height: "18",
104+
padding: "4",
105+
main_align: "center",
106+
cross_align: "center",
107+
corner_radius: "4",
108+
border: "2 solid {outer_fill}",
109+
background: "{inner_fill}",
110+
onkeydown,
111+
if selected {
112+
TickIcon {
113+
fill: selected_icon_fill
114+
}
95115
}
96116
}
97117
}

crates/hooks/src/theming/base.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ pub(crate) const BASE_THEME: Theme = Theme {
180180
unselected_fill: cow_borrowed!("key(solid)"),
181181
selected_fill: cow_borrowed!("key(primary)"),
182182
selected_icon_fill: cow_borrowed!("key(secondary)"),
183+
border_fill: cow_borrowed!("key(surface)"),
183184
},
184185
menu_item: MenuItemTheme {
185186
hover_background: cow_borrowed!("key(focused_surface)"),

crates/hooks/src/theming/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ define_theme! {
482482
unselected_fill: str,
483483
selected_fill: str,
484484
selected_icon_fill: str,
485+
border_fill: str,
485486
}
486487
}
487488

0 commit comments

Comments
 (0)