diff --git a/helix-term/src/commands/dap.rs b/helix-term/src/commands/dap.rs
index c556f214..8935bc9c 100644
--- a/helix-term/src/commands/dap.rs
+++ b/helix-term/src/commands/dap.rs
@@ -619,22 +619,41 @@ pub fn dap_variables(cx: &mut Context) {
     // TODO: group by scope
     // TODO: ui::Text to use tui::text + styled builder
 
+    // let contents = tui::text::Text::new();
+
+    let theme = &cx.editor.theme;
+    let scope_style = theme.get("ui.linenr.selected");
+    let type_style = theme.get("ui.text");
+    let text_style = theme.get("ui.text.focus");
+
     for scope in scopes.iter() {
+        // use helix_view::graphics::Style;
+        use tui::text::{Span, Spans};
         let response = block_on(debugger.variables(scope.variables_reference));
 
+        variables.push(Spans::from(Span::styled(
+            format!("▸ {}", scope.name),
+            scope_style,
+        )));
+
         if let Ok(vars) = response {
             variables.reserve(vars.len());
             for var in vars {
-                let prefix = match var.ty {
-                    Some(data_type) => format!("{} ", data_type),
-                    None => "".to_owned(),
-                };
-                variables.push(format!("{}{} = {}", prefix, var.name, var.value));
+                let mut spans = Vec::with_capacity(5);
+
+                spans.push(Span::styled(var.name.to_owned(), text_style));
+                if let Some(ty) = var.ty {
+                    spans.push(Span::raw(": "));
+                    spans.push(Span::styled(ty.to_owned(), type_style));
+                }
+                spans.push(Span::raw(" = "));
+                spans.push(Span::styled(var.value.to_owned(), text_style));
+                variables.push(Spans::from(spans));
             }
         }
     }
 
-    let contents = Text::new(variables.join("\n"));
+    let contents = Text::from(tui::text::Text::from(variables));
     let popup = Popup::new(contents);
     cx.push_layer(Box::new(popup));
 }
diff --git a/helix-term/src/ui/text.rs b/helix-term/src/ui/text.rs
index 4641fae1..caece049 100644
--- a/helix-term/src/ui/text.rs
+++ b/helix-term/src/ui/text.rs
@@ -4,13 +4,23 @@ use tui::buffer::Buffer as Surface;
 use helix_view::graphics::Rect;
 
 pub struct Text {
-    contents: String,
+    contents: tui::text::Text<'static>,
     size: (u16, u16),
     viewport: (u16, u16),
 }
 
 impl Text {
     pub fn new(contents: String) -> Self {
+        Self {
+            contents: tui::text::Text::from(contents),
+            size: (0, 0),
+            viewport: (0, 0),
+        }
+    }
+}
+
+impl From<tui::text::Text<'static>> for Text {
+    fn from(contents: tui::text::Text<'static>) -> Self {
         Self {
             contents,
             size: (0, 0),
@@ -18,12 +28,12 @@ impl Text {
         }
     }
 }
+
 impl Component for Text {
     fn render(&mut self, area: Rect, surface: &mut Surface, _cx: &mut Context) {
         use tui::widgets::{Paragraph, Widget, Wrap};
-        let contents = tui::text::Text::from(self.contents.clone());
 
-        let par = Paragraph::new(contents).wrap(Wrap { trim: false });
+        let par = Paragraph::new(self.contents.clone()).wrap(Wrap { trim: false });
         // .scroll(x, y) offsets
 
         par.render(area, surface);
@@ -31,9 +41,8 @@ impl Component for Text {
 
     fn required_size(&mut self, viewport: (u16, u16)) -> Option<(u16, u16)> {
         if viewport != self.viewport {
-            let contents = tui::text::Text::from(self.contents.clone());
-            let width = std::cmp::min(contents.width() as u16, viewport.0);
-            let height = std::cmp::min(contents.height() as u16, viewport.1);
+            let width = std::cmp::min(self.contents.width() as u16, viewport.0);
+            let height = std::cmp::min(self.contents.height() as u16, viewport.1);
             self.size = (width, height);
             self.viewport = viewport;
         }