diff --git a/crates/typst/src/text/deco.rs b/crates/typst/src/text/deco.rs
index 7f0b9e467..d105a3535 100644
--- a/crates/typst/src/text/deco.rs
+++ b/crates/typst/src/text/deco.rs
@@ -5,12 +5,14 @@ use ttf_parser::{GlyphId, OutlineBuilder};
use crate::diag::SourceResult;
use crate::engine::Engine;
use crate::foundations::{elem, Content, Packed, Show, Smart, StyleChain};
-use crate::layout::{Abs, Em, Frame, FrameItem, Length, Point, Size};
+use crate::layout::{
+ Abs, Corners, Em, Frame, FrameItem, Length, Point, Rel, Sides, Size,
+};
use crate::syntax::Span;
use crate::text::{
BottomEdge, BottomEdgeMetric, TextElem, TextItem, TopEdge, TopEdgeMetric,
};
-use crate::visualize::{Color, FixedStroke, Geometry, Paint, Stroke};
+use crate::visualize::{styled_rect, Color, FixedStroke, Geometry, Paint, Stroke};
/// Underlines text.
///
@@ -283,6 +285,12 @@ pub struct HighlightElem {
#[default(Color::from_u8(0xFF, 0xFD, 0x11, 0xA1).into())]
pub fill: Paint,
+ /// The highlight's border color. See the
+ /// [rectangle's documentation]($rect.stroke) for more details.
+ #[resolve]
+ #[fold]
+ pub stroke: Sides