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. Screenshot 2026-04-20 at 8  57@2x 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, + }], + ], }), ] }