From 10cf73f8cc961209a2f5a19d7c7a94291caba516 Mon Sep 17 00:00:00 2001
From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com>
Date: Mon, 20 Apr 2026 09:51:26 -0300
Subject: [PATCH] agent_ui: Add setting for turning off content max-width
(#54316)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Follow up to https://github.com/zed-industries/zed/pull/52730.
This PR adds a boolean setting `limit_content_width` in the Agent Panel
settings that allows turning off the content max-width entirely, which
was added for better readability. We had a handful of requests for it,
so it feels fair.
Release Notes:
- Agent: Added a new `limit_content_width` setting in the agent panel
that allows turning off the content max-width limit.
---
assets/settings/default.json | 6 +-
crates/agent/src/tool_permissions.rs | 2 +-
crates/agent_settings/src/agent_settings.rs | 8 ++-
crates/agent_ui/src/agent_panel.rs | 3 +-
crates/agent_ui/src/agent_ui.rs | 2 +-
.../src/conversation_view/thread_view.rs | 19 ++---
crates/settings_content/src/agent.rs | 6 ++
crates/settings_ui/src/page_data.rs | 69 ++++++++++++++-----
8 files changed, 83 insertions(+), 32 deletions(-)
diff --git a/assets/settings/default.json b/assets/settings/default.json
index e13396bb0e046365dff2408b99af74793ce30596..d0cd8d2276f4173489a6b8c3e1040e00f7330658 100644
--- a/assets/settings/default.json
+++ b/assets/settings/default.json
@@ -992,7 +992,11 @@
"default_width": 640,
// Default height when the agent panel is docked to the bottom.
"default_height": 320,
- // Maximum content width when the agent panel is wider than this value.
+ // Whether to limit the content width in the agent panel. When enabled,
+ // content will be constrained to `max_content_width` and centered when
+ // the panel is wider, for optimal readability.
+ "limit_content_width": true,
+ // Maximum content width in pixels when limit_content_width is enabled.
// Content will be centered within the panel.
"max_content_width": 850,
// The default model to use when creating new threads.
diff --git a/crates/agent/src/tool_permissions.rs b/crates/agent/src/tool_permissions.rs
index ff9e735b6c4181588ed5cddbd6dada7fbae5f18f..65cbcfb2c609cb146537d784dd04f7749d71fe90 100644
--- a/crates/agent/src/tool_permissions.rs
+++ b/crates/agent/src/tool_permissions.rs
@@ -574,7 +574,7 @@ mod tests {
flexible: true,
default_width: px(300.),
default_height: px(600.),
- max_content_width: px(850.),
+ max_content_width: Some(px(850.)),
default_model: None,
inline_assistant_model: None,
inline_assistant_use_streaming_tools: false,
diff --git a/crates/agent_settings/src/agent_settings.rs b/crates/agent_settings/src/agent_settings.rs
index a8b21fcbd849962a4a1d098eaa681b0f56016bc6..a5706752f41324d2ffa5075621f6cb651694df86 100644
--- a/crates/agent_settings/src/agent_settings.rs
+++ b/crates/agent_settings/src/agent_settings.rs
@@ -142,7 +142,7 @@ pub struct AgentSettings {
pub sidebar_side: SidebarDockPosition,
pub default_width: Pixels,
pub default_height: Pixels,
- pub max_content_width: Pixels,
+ pub max_content_width: Option,
pub default_model: Option,
pub inline_assistant_model: Option,
pub inline_assistant_use_streaming_tools: bool,
@@ -593,7 +593,11 @@ impl Settings for AgentSettings {
sidebar_side: agent.sidebar_side.unwrap(),
default_width: px(agent.default_width.unwrap()),
default_height: px(agent.default_height.unwrap()),
- max_content_width: px(agent.max_content_width.unwrap()),
+ max_content_width: if agent.limit_content_width.unwrap() {
+ Some(px(agent.max_content_width.unwrap()))
+ } else {
+ None
+ },
flexible: agent.flexible.unwrap(),
default_model: Some(agent.default_model.unwrap()),
inline_assistant_model: agent.inline_assistant_model,
diff --git a/crates/agent_ui/src/agent_panel.rs b/crates/agent_ui/src/agent_panel.rs
index d40d00f60e2baffb809fc39f973f2a113b8427db..48a80ed0fe784ebb9601a32b6561e4aba5f3d455 100644
--- a/crates/agent_ui/src/agent_panel.rs
+++ b/crates/agent_ui/src/agent_panel.rs
@@ -3553,9 +3553,8 @@ impl AgentPanel {
let base_container = h_flex()
.size_full()
- // TODO: This is only until we remove Agent settings from the panel.
.when(!is_in_history_or_config, |this| {
- this.max_w(max_content_width).mx_auto()
+ this.when_some(max_content_width, |this, max_w| this.max_w(max_w).mx_auto())
})
.flex_none()
.justify_between()
diff --git a/crates/agent_ui/src/agent_ui.rs b/crates/agent_ui/src/agent_ui.rs
index fca8bd6e7ba68c8b754b3306147a27829ec52c51..437627105c6a1837555518c33447c6797f89f098 100644
--- a/crates/agent_ui/src/agent_ui.rs
+++ b/crates/agent_ui/src/agent_ui.rs
@@ -733,7 +733,7 @@ mod tests {
flexible: true,
default_width: px(300.),
default_height: px(600.),
- max_content_width: px(850.),
+ max_content_width: Some(px(850.)),
default_model: None,
inline_assistant_model: None,
inline_assistant_use_streaming_tools: false,
diff --git a/crates/agent_ui/src/conversation_view/thread_view.rs b/crates/agent_ui/src/conversation_view/thread_view.rs
index d0d3ee37447e57d6c6cb440bff5df70714d6d346..37c99e7bd31d7b6afdd3882f930bb1618d8c5c69 100644
--- a/crates/agent_ui/src/conversation_view/thread_view.rs
+++ b/crates/agent_ui/src/conversation_view/thread_view.rs
@@ -2289,7 +2289,8 @@ impl ThreadView {
.justify_center()
.child(
v_flex()
- .flex_basis(max_content_width)
+ .when_some(max_content_width, |this, max_w| this.flex_basis(max_w))
+ .when(max_content_width.is_none(), |this| this.w_full())
.flex_shrink()
.flex_grow_0()
.max_w_full()
@@ -3195,8 +3196,7 @@ impl ThreadView {
.child(
h_flex()
.size_full()
- .max_w(max_content_width)
- .mx_auto()
+ .when_some(max_content_width, |this, max_w| this.max_w(max_w).mx_auto())
.pl_2()
.pr_1()
.flex_shrink_0()
@@ -3293,7 +3293,8 @@ impl ThreadView {
})
.child(
v_flex()
- .flex_basis(max_content_width)
+ .when_some(max_content_width, |this, max_w| this.flex_basis(max_w))
+ .when(max_content_width.is_none(), |this| this.w_full())
.flex_shrink()
.flex_grow_0()
.when(fills_container, |this| this.h_full())
@@ -4481,10 +4482,12 @@ impl ThreadView {
fn render_entries(&mut self, cx: &mut Context) -> List {
let max_content_width = AgentSettings::get_global(cx).max_content_width;
let centered_container = move |content: AnyElement| {
- h_flex()
- .w_full()
- .justify_center()
- .child(div().max_w(max_content_width).w_full().child(content))
+ h_flex().w_full().justify_center().child(
+ div()
+ .when_some(max_content_width, |this, max_w| this.max_w(max_w))
+ .w_full()
+ .child(content),
+ )
};
list(
diff --git a/crates/settings_content/src/agent.rs b/crates/settings_content/src/agent.rs
index 76891185c42ee36324c1cc160edfb27d63ecc0d6..d5c9c54a222de727ad112779ced518e261714616 100644
--- a/crates/settings_content/src/agent.rs
+++ b/crates/settings_content/src/agent.rs
@@ -128,6 +128,12 @@ pub struct AgentSettingsContent {
/// Default: 320
#[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]
pub default_height: Option,
+ /// Whether to limit the content width in the agent panel. When enabled,
+ /// content will be constrained to `max_content_width` and centered when
+ /// the panel is wider than that value, for optimal readability.
+ ///
+ /// Default: true
+ pub limit_content_width: Option,
/// Maximum content width in pixels for the agent panel. Content will be
/// centered when the panel is wider than this value.
///
diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs
index 03cff7bb025f1fc55d45da6635bc7394ef0312d1..c502c1058f08bba5259faeccb424c448607367b4 100644
--- a/crates/settings_ui/src/page_data.rs
+++ b/crates/settings_ui/src/page_data.rs
@@ -5859,23 +5859,58 @@ fn panels_page() -> SettingsPage {
metadata: None,
files: USER,
}),
- SettingsPageItem::SettingItem(SettingItem {
- title: "Agent Panel Max Content Width",
- description: "Maximum content width in pixels. Content will be centered when the panel is wider than this value.",
- field: Box::new(SettingField {
- json_path: Some("agent.max_content_width"),
- pick: |settings_content| {
- settings_content.agent.as_ref()?.max_content_width.as_ref()
- },
- write: |settings_content, value| {
- settings_content
- .agent
- .get_or_insert_default()
- .max_content_width = value;
- },
- }),
- metadata: None,
- files: USER,
+ SettingsPageItem::DynamicItem(DynamicItem {
+ discriminant: SettingItem {
+ files: USER,
+ title: "Limit Content Width",
+ description: "Whether to constrain the agent panel content to a maximum width, centering it when the panel is wider, for optimal readability.",
+ field: Box::new(SettingField:: {
+ json_path: Some("agent.limit_content_width"),
+ pick: |settings_content| {
+ settings_content
+ .agent
+ .as_ref()?
+ .limit_content_width
+ .as_ref()
+ },
+ write: |settings_content, value| {
+ settings_content
+ .agent
+ .get_or_insert_default()
+ .limit_content_width = value;
+ },
+ }),
+ metadata: None,
+ },
+ pick_discriminant: |settings_content| {
+ let enabled = settings_content
+ .agent
+ .as_ref()?
+ .limit_content_width
+ .unwrap_or(true);
+ Some(if enabled { 1 } else { 0 })
+ },
+ fields: vec![
+ vec![],
+ vec![SettingItem {
+ files: USER,
+ title: "Max Content Width",
+ description: "Maximum content width in pixels. Content will be centered when the panel is wider than this value.",
+ field: Box::new(SettingField {
+ json_path: Some("agent.max_content_width"),
+ pick: |settings_content| {
+ settings_content.agent.as_ref()?.max_content_width.as_ref()
+ },
+ write: |settings_content, value| {
+ settings_content
+ .agent
+ .get_or_insert_default()
+ .max_content_width = value;
+ },
+ }),
+ metadata: None,
+ }],
+ ],
}),
]
}