diff --git a/data/resources/resources.gresource.xml b/data/resources/resources.gresource.xml
index b38a6083..4e2683c3 100644
--- a/data/resources/resources.gresource.xml
+++ b/data/resources/resources.gresource.xml
@@ -23,6 +23,7 @@
ui/pill.ui
ui/spinner-button.ui
ui/in-app-notification.ui
+ ui/components-avatar.ui
style.css
icons/scalable/actions/send-symbolic.svg
icons/scalable/status/welcome.svg
diff --git a/data/resources/ui/components-avatar.ui b/data/resources/ui/components-avatar.ui
new file mode 100644
index 00000000..a692dd5a
--- /dev/null
+++ b/data/resources/ui/components-avatar.ui
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
diff --git a/data/resources/ui/content-invite.ui b/data/resources/ui/content-invite.ui
index 0cb680c1..3e59ff07 100644
--- a/data/resources/ui/content-invite.ui
+++ b/data/resources/ui/content-invite.ui
@@ -46,10 +46,11 @@
Invite
-
diff --git a/data/resources/ui/content-message-row.ui b/data/resources/ui/content-message-row.ui
index 87a7e300..bba2bfbf 100644
--- a/data/resources/ui/content-message-row.ui
+++ b/data/resources/ui/content-message-row.ui
@@ -5,11 +5,9 @@
10
-
- True
+
36
start
-
@@ -55,3 +53,4 @@
+
diff --git a/data/resources/ui/pill.ui b/data/resources/ui/pill.ui
index 8a51ec22..0f57182a 100644
--- a/data/resources/ui/pill.ui
+++ b/data/resources/ui/pill.ui
@@ -10,10 +10,8 @@
6
-
- True
+
24
-
diff --git a/data/resources/ui/sidebar-room-row.ui b/data/resources/ui/sidebar-room-row.ui
index d5060291..68410ddb 100644
--- a/data/resources/ui/sidebar-room-row.ui
+++ b/data/resources/ui/sidebar-room-row.ui
@@ -5,10 +5,8 @@
12
-
- True
+
24
-
@@ -31,3 +29,4 @@
+
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 2d43d112..28cd433e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -5,6 +5,7 @@ data/org.gnome.FractalNext.gschema.xml.in
data/org.gnome.FractalNext.metainfo.xml.in.in
# UI files
+data/resources/ui/components-avatar.ui
data/resources/ui/content-divider-row.ui
data/resources/ui/content-item-row-menu.ui
data/resources/ui/content-item.ui
@@ -30,6 +31,7 @@ data/resources/ui/window.ui
# Rust files
src/application.rs
+src/components/avatar.rs
src/components/context_menu_bin.rs
src/components/label_with_widgets.rs
src/components/in_app_notification.rs
diff --git a/src/components/avatar.rs b/src/components/avatar.rs
new file mode 100644
index 00000000..8a4f78af
--- /dev/null
+++ b/src/components/avatar.rs
@@ -0,0 +1,155 @@
+use adw::subclass::prelude::*;
+use gtk::{glib, glib::clone, prelude::*, subclass::prelude::*, CompositeTemplate};
+
+use crate::session::{Room, User};
+
+mod imp {
+ use super::*;
+ use glib::subclass::InitializingObject;
+ use std::cell::RefCell;
+
+ #[derive(Debug, Default, CompositeTemplate)]
+ #[template(resource = "/org/gnome/FractalNext/components-avatar.ui")]
+ pub struct Avatar {
+ /// A `Room` or `User`
+ pub item: RefCell