What changed, and why it matters
This commit is a user-interface layout tweak for Trezor hardware wallets. It adds configurable vertical spacing between key/value property pairs shown on device screens. There is no security-relevant change, no bug fix, and no handling of secrets or memory.
No security action required. Treat as normal UI feature commit.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change introduces two new padding parameters to the Rust PropsList component (key_value_padding and props_padding) and wires theme constants (PROP_INNER_SPACING, PROPS_SPACING) across four UI layout themes (bolt, caesar, delizia, eckhart). It only affects paragraph rendering spacing in confirmation/property screens. No cryptographic, input-validation, memory-safety, or trust-boundary code is touched.
Changed components
core/embed/rust/src/ui/layout/util.rscore/embed/rust/src/ui/layout_bolt/theme/mod.rscore/embed/rust/src/ui/layout_bolt/ui_firmware.rscore/embed/rust/src/ui/layout_caesar/theme/mod.rscore/embed/rust/src/ui/layout_delizia/theme/mod.rscore/embed/rust/src/ui/layout_delizia/ui_firmware.rscore/embed/rust/src/ui/layout_eckhart/ui_firmware.rsInspect captured patch +41 / −5
diff --git a/core/embed/rust/src/ui/layout/util.rs b/core/embed/rust/src/ui/layout/util.rs
index c21b0e63..51cfa967 100644
--- a/core/embed/rust/src/ui/layout/util.rs
+++ b/core/embed/rust/src/ui/layout/util.rs
@@ -92,6 +92,8 @@ pub struct PropsList {
key_font: &'static TextStyle,
value_font: &'static TextStyle,
value_mono_font: &'static TextStyle,
+ key_value_padding: i16,
+ props_padding: i16,
}
impl PropsList {
@@ -100,12 +102,16 @@ impl PropsList {
key_font: &'static TextStyle,
value_font: &'static TextStyle,
value_mono_font: &'static TextStyle,
+ key_value_padding: i16,
+ props_padding: i16,
) -> Result<Self, Error> {
Ok(Self {
items: obj.try_into()?,
key_font,
value_font,
value_mono_font,
+ key_value_padding,
+ props_padding,
})
}
}
@@ -138,7 +144,9 @@ impl ParagraphSource<'static> for PropsList {
};
if obj == Obj::const_none() {
- return Ok(Paragraph::new(style, StrBuffer::empty()));
+ return Ok(Paragraph::new(style, StrBuffer::empty())
+ .with_bottom_padding(0)
+ .with_top_padding(0));
}
let para = if obj.is_str() {
@@ -152,7 +160,11 @@ impl ParagraphSource<'static> for PropsList {
};
if obj == key && value != Obj::const_none() {
- Ok(para.no_break())
+ Ok(para.with_bottom_padding(self.key_value_padding).no_break())
+ } else if (obj == key && value == Obj::const_none() && index != self.size() - 2)
+ || (obj == value && index != self.size() - 1)
+ {
+ Ok(para.with_bottom_padding(self.props_padding))
} else {
Ok(para)
}
diff --git a/core/embed/rust/src/ui/layout_bolt/theme/mod.rs b/core/embed/rust/src/ui/layout_bolt/theme/mod.rs
index 9adf3e70..0fa15625 100644
--- a/core/embed/rust/src/ui/layout_bolt/theme/mod.rs
+++ b/core/embed/rust/src/ui/layout_bolt/theme/mod.rs
@@ -5,7 +5,10 @@ use crate::{
time::ShortDuration,
ui::{
component::{
- text::{layout::Chunks, LineBreaking, PageBreaking, TextStyle},
+ text::{
+ layout::Chunks, paragraphs::PARAGRAPH_BOTTOM_SPACE, LineBreaking, PageBreaking,
+ TextStyle,
+ },
FixedHeightBar,
},
display::Color,
@@ -664,6 +667,10 @@ pub const RESULT_PADDING: i16 = 6;
pub const RESULT_FOOTER_START: i16 = 171;
pub const RESULT_FOOTER_HEIGHT: i16 = 62;
+// props settings
+pub const PROP_INNER_SPACING: i16 = PARAGRAPH_BOTTOM_SPACE;
+pub const PROPS_SPACING: i16 = PARAGRAPH_BOTTOM_SPACE;
+
// checklist settings
pub const CHECKLIST_CHECK_WIDTH: i16 = 16;
pub const CHECKLIST_DONE_OFFSET: Offset = Offset::new(-2, 6);
diff --git a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
index 91557f67..b8263d4b 100644
--- a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
@@ -399,6 +399,8 @@ impl FirmwareUI for UIBolt {
&theme::TEXT_NORMAL,
&theme::TEXT_MONO,
&theme::TEXT_MONO_DATA,
+ theme::PROP_INNER_SPACING,
+ theme::PROPS_SPACING,
)?;
let page = if hold {
ButtonPage::new(paragraphs.into_paragraphs(), theme::BG).with_hold()?
diff --git a/core/embed/rust/src/ui/layout_caesar/theme/mod.rs b/core/embed/rust/src/ui/layout_caesar/theme/mod.rs
index 1b1220bd..c4ca1a6b 100644
--- a/core/embed/rust/src/ui/layout_caesar/theme/mod.rs
+++ b/core/embed/rust/src/ui/layout_caesar/theme/mod.rs
@@ -1,6 +1,6 @@
use crate::ui::{
component::{
- text::{layout::Chunks, TextStyle},
+ text::{layout::Chunks, paragraphs::PARAGRAPH_BOTTOM_SPACE, TextStyle},
LineBreaking, PageBreaking,
},
display::{Color, Font},
@@ -96,6 +96,10 @@ include_icon!(ICON_TICK_FAT, "layout_caesar/res/tick_fat.toif"); // 8*6
include_icon!(ICON_WARNING, "layout_caesar/res/warning.toif"); // 11*12
include_icon!(ICON_WARN_TITLE, "layout_caesar/res/bld_header_warn.toif");
+// props settings
+pub const PROP_INNER_SPACING: i16 = PARAGRAPH_BOTTOM_SPACE;
+pub const PROPS_SPACING: i16 = PARAGRAPH_BOTTOM_SPACE;
+
// checklist settings
pub const CHECKLIST_SPACING: i16 = 5;
pub const CHECKLIST_CHECK_WIDTH: i16 = 12;
diff --git a/core/embed/rust/src/ui/layout_delizia/theme/mod.rs b/core/embed/rust/src/ui/layout_delizia/theme/mod.rs
index 2181e2e2..5fd3e43e 100644
--- a/core/embed/rust/src/ui/layout_delizia/theme/mod.rs
+++ b/core/embed/rust/src/ui/layout_delizia/theme/mod.rs
@@ -6,7 +6,10 @@ use crate::{
time::ShortDuration,
ui::{
component::{
- text::{layout::Chunks, LineBreaking, PageBreaking, TextStyle},
+ text::{
+ layout::Chunks, paragraphs::PARAGRAPH_BOTTOM_SPACE, LineBreaking, PageBreaking,
+ TextStyle,
+ },
FixedHeightBar,
},
display::Color,
@@ -827,6 +830,10 @@ pub const RESULT_FOOTER_START: i16 = 171;
pub const RESULT_FOOTER_HEIGHT: i16 = 62;
pub const DETAILS_SPACING: i16 = 8;
+// props settings
+pub const PROP_INNER_SPACING: i16 = PARAGRAPH_BOTTOM_SPACE;
+pub const PROPS_SPACING: i16 = PARAGRAPH_BOTTOM_SPACE;
+
// checklist settings
pub const CHECKLIST_CHECK_WIDTH: i16 = 32; // icon width (20px) + padding (12px)
pub const CHECKLIST_DONE_OFFSET: Offset = Offset::y(-2);
diff --git a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
index 2996a100..dae42075 100644
--- a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
@@ -453,6 +453,8 @@ impl FirmwareUI for UIDelizia {
&theme::TEXT_SUB_GREY_LIGHT,
&theme::TEXT_MONO,
&theme::TEXT_MONO_DATA,
+ theme::PROP_INNER_SPACING,
+ theme::PROPS_SPACING,
)?;
let flow = flow::new_confirm_action_simple(
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 a31e7172..e799bc16 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -389,6 +389,8 @@ impl FirmwareUI for UIEckhart {
&theme::TEXT_SMALL_LIGHT,
&theme::TEXT_MONO_MEDIUM_LIGHT,
&theme::TEXT_MONO_MEDIUM_LIGHT_DATA,
+ theme::PROP_INNER_SPACING,
+ theme::PROPS_SPACING,
)?;
let flow = flow::new_confirm_with_menu(
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.