chore(core/eckhart): enable menu separators by default
What changed, and why it matters
This is a routine user-interface cleanup for the upcoming Trezor 'Eckhart' device layout. It makes menu divider lines always appear instead of requiring each screen to opt in. There is no security change, no bug fix, and no handling of secrets or sensitive data.
No security action required. Treat as normal UI maintenance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit removes the optional separators boolean field from the VerticalMenu component and deletes the with_separators() builder method. All call sites that previously called .with_separators() now simply use VerticalMenu::empty(). The render() method now always calls render_separators() unconditionally. This is a pure UI presentation refactor; no logic, cryptography, input handling, or access control is modified.
Changed components
core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rscore/embed/rust/src/ui/layout_eckhart/firmware/vertical_menu.rscore/embed/rust/src/ui/layout_eckhart/flow/show_danger.rscore/embed/rust/src/ui/layout_eckhart/ui_firmware.rsInspect captured patch +4 / −15
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
index e5f54505..50fcbf16 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
@@ -384,7 +384,7 @@ impl<'a> DeviceMenuScreen<'a> {
match self.subscreens[self.active_subscreen] {
Subscreen::Submenu(ref mut submenu_index) => {
let submenu = &self.submenus[*submenu_index];
- let mut menu = VerticalMenu::<ShortMenuVec>::empty().with_separators();
+ let mut menu = VerticalMenu::<ShortMenuVec>::empty();
for item in &submenu.items {
let button = if let Some((subtext, subtext_style)) = item.subtext {
let subtext_style =
@@ -413,7 +413,7 @@ impl<'a> DeviceMenuScreen<'a> {
ActiveScreen::Menu(VerticalMenuScreen::new(menu).with_header(header));
}
Subscreen::DeviceScreen(device, _) => {
- let mut menu = VerticalMenu::empty().with_separators();
+ let mut menu = VerticalMenu::empty();
menu.item(Button::new_menu_item(device, theme::menu_item_title()));
menu.item(Button::new_menu_item(
"Disconnect".into(),
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/vertical_menu.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/vertical_menu.rs
index 50b61882..84881ad8 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/vertical_menu.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/vertical_menu.rs
@@ -97,8 +97,6 @@ pub struct VerticalMenu<T = ShortMenuVec> {
offset_y: i16,
/// Maximum vertical offset.
offset_y_max: i16,
- /// Whether to show separators between buttons.
- separators: bool,
}
pub enum VerticalMenuMsg {
@@ -116,7 +114,6 @@ impl<T: MenuItems> VerticalMenu<T> {
total_height: 0,
offset_y: 0,
offset_y_max: 0,
- separators: false,
}
}
@@ -124,11 +121,6 @@ impl<T: MenuItems> VerticalMenu<T> {
Self::new(T::default())
}
- pub fn with_separators(mut self) -> Self {
- self.separators = true;
- self
- }
-
pub fn with_item(mut self, button: Button) -> Self {
self.buttons.push(button);
self
@@ -337,9 +329,7 @@ impl<T: MenuItems> Component for VerticalMenu<T> {
self.render_buttons(target);
// Render separators between buttons
- if self.separators {
- self.render_separators(target);
- }
+ self.render_separators(target);
});
});
}
diff --git a/core/embed/rust/src/ui/layout_eckhart/flow/show_danger.rs b/core/embed/rust/src/ui/layout_eckhart/flow/show_danger.rs
index 4ed45819..1e6baebd 100644
--- a/core/embed/rust/src/ui/layout_eckhart/flow/show_danger.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/flow/show_danger.rs
@@ -92,7 +92,6 @@ pub fn new_show_danger(
// Menu
let content_menu = VerticalMenuScreen::new(
VerticalMenu::<ShortMenuVec>::empty()
- .with_separators()
.with_item(Button::new_menu_item(verb_cancel, theme::menu_item_title()))
.with_item(Button::new_menu_item(
TR::words__continue_anyway.into(),
diff --git a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
index 8ab822c2..8c826abc 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -984,7 +984,7 @@ impl FirmwareUI for UIEckhart {
_current: usize,
cancel: Option<TString<'static>>,
) -> Result<impl LayoutMaybeTrace, Error> {
- let mut menu = VerticalMenu::<ShortMenuVec>::empty().with_separators();
+ let mut menu = VerticalMenu::<ShortMenuVec>::empty();
for text in &items {
menu.item(Button::new_menu_item(*text, theme::menu_item_title()));
}
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.