3de3a36
editor: Add `diffs_expanded` to key context when diff hunks are expanded (#40617)
Click to expand commit body
including a new identifier on the Editor key context will allow for some
more flexibility when creating keybindings.
for example i would like to be able to set the following:
```json
{
"context": "Editor",
"bindings": {
"pageup": ["editor::MovePageUp", { "center_cursor": true }],
"pagedown": ["editor::MovePageDown", { "center_cursor": true }],
}
},
{
"context": "Editor && diffs_expanded",
"bindings": {
"pageup": "editor::GoToPrevHunk",
"pagedown": "editor::GoToHunk",
}
},
```
<img width="1392" height="1167" alt="Screenshot 2025-10-18 at 23 51 46"
src="https://github.com/user-attachments/assets/cf4e262e-97e7-4dd9-bbda-cd272770f1ac"
/>
very open to suggestions for the name. that's the best i could come up
with.
the action *IS* called `editor::ExpandAllDiffHunks` so this seems
fitting.
the identifier is included if *any* diff hunk is visible, even if some
of them have been closed using `editor::ToggleSelectedDiffHunk`
Release Notes:
- The Editor key context now includes 'diffs_expanded' when diff changes
are visible
Josh Piasecki
created
28a0b82
git_panel: Fix FocusChanges does nothing with no entries (#42553)
Click to expand commit body
Closes #31155
Release Notes:
- Ensure `git_panel::FocusChanges` bypasses the panel’s `Focusable`
logic and directly focuses the `ChangesList` handle so the command works
even when the repository has no entries.
- Keep the `Focusable` behavior from the commit 45b126a (which routes
empty panels to the commit editor) by handling this special-case action
rather than regressing the default focus experience.
Xipeng Jin
created
e2c95a8
git: Continue parsing other branches when refs have missing fields (#42523)
Click to expand commit body
Closes #34684
Release Notes:
- (Let's Git Together) Fixed Git panel not showing any branches when
repository contains refs with missing fields
Mayank Verma
created
3da4d3a
settings_ui: Make open project settings action open settings UI (#42669)
Click to expand commit body
This PR makes the `OpenProjectSettings` action open the settings UI in
project settings mode for the first visible worktree, instead of opening
the file. It also adds a `OpenProjectSettingsFile` action that maintains
the old behavior.
Finally, this PR partially fixes a bug where the settings UI won't load
project settings when the settings window is loaded before opening a
project/workspace. This happens because the global `app_state` isn't
correct in the `Subscription` that refreshes the available setting files
to open. The bug is still present in some cases, but it's out of scope
for this PR.
Release Notes:
- settings ui: Project Settings action now opens settings UI instead of
a file
15ab96a
Add windows nightly update banner (#42576)
Click to expand commit body
Hopefully this will nudge some of the beta users who were on nightly to
get on the official stable builds now that they're out.
Release Notes:
- N/A
Julia Ryan
created
e80b490
client: Clear plan and usage information when signing out (#42678)
Click to expand commit body
This PR makes it so we clear the user's plan and usage information when
they sign out.
Release Notes:
- Signing out will now clear the local cache containing the plan and
usage information.
Closes https://github.com/zed-industries/zed/issues/36330
Closes https://github.com/zed-industries/zed/issues/35460
This PR improves how we display markdown tables by relying on grids
rather than flexbox. Given this makes text inside each cell wrap, I
ended up removing the `table_overflow_x_scroll` method, as it was 1)
used only in the agent panel, and 2) arguably not the best approach as a
whole, because as soon as you need to scroll a table, you probably need
more elements to make it be really great.
One thing I'm slightly unsatisfied with, though, is the border
situation. I added a half pixel border to the cell so they all sum up to
1px, but there are cases where there's a tiny space between rows and I
don't quite know where that's coming from and how it happens. But I
think it's a reasonable improvement overall.
<img width="500" height="1248" alt="Screenshot 2025-11-13 at 7 05@2x"
src="https://github.com/user-attachments/assets/182b2235-efeb-4a61-ada2-98262967355d"
/>
Release Notes:
- agent: Improved table rendering in the agent panel, ensuring cell text
wraps, not going off-screen.
Release Notes:
- Adds support for `:[range]w {file}`
- This writes the lines in the range to the specified
- Adds support for `:[range]w`
- This replaces the current file with the selected lines
Closes #41467
My first PR in Zed, any guidance or tips are appreciated.
This fixes the flickering/resize loop that occurred on the tab
immediately to the right of a pinned tab.
Removed the conditional border on the pinned tabs container. The border
was a visual indicator to show when unpinned tabs were scrolled, but it
wasn't essential and was causing the layout thrashing.
Release Notes:
- Fixed
---------
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Abul Hossain Khan
and
Smit Barmase
created
c626e77
outline_panel: Remove toggle expanded behavior from OpenSelectedEntry (#42214)
Click to expand commit body
Fixed outline panel space key behavior by removing duplicate toggle call
The `open_selected_entry` function in `outline_panel.rs` was incorrectly
calling `self.toggle_expanded(&selected_entry, window, cx)` in addition
to its primary logic, causing the space key to both open/close entries
AND toggle their expanded state. Removed the redundant `toggle_expanded`
call to achieve the intended behavior.
Closes #41711
Release Notes:
- Fixed issue with the outline panel where pressing space would cause an
open selected entry to collapse and cause a closed selected entry to
open.
---------
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Kevin Rubio
and
Smit Barmase
created
fa0c750
Update runtimed to fix compatibility issue with the Ark kernel (#40889)
Click to expand commit body
Closes #40888
This updates runtimed to the latest version, which handles the
"starting" variant of `execution_state`. It actually handles a bunch of
other variants that are not documented in the protocol (see
https://jupyter-client.readthedocs.io/en/stable/messaging.html#kernel-status),
like "starting", "terminating", etc. I added implementations for these
variants as well.
Release Notes:
- Fixed issue that prevented the Ark kernel from working in Zed
(#40888).
---------
Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
Release Notes:
- Fixed logging into Gemini CLI and Claude Code when remoting and
authenticating via CLI
Co-authored-by: Lukas Wirth <me@lukaswirth.dev>
Richard Feldman
and
Lukas Wirth
created
46eb9e5
Update scale factor and drawable size when macOS window changes screen (#38269)
Click to expand commit body
Summary
Fixes UI scaling issue that occurs when starting Zed after disconnecting
an external monitor on macOS. The window's scale factor and drawable
size are now properly updated when the window changes screens.
Problem Description
When an external monitor is disconnected and Zed is started with only
the built-in screen active, the UI scale becomes incorrect. This happens
because:
1. macOS triggers the `window_did_change_screen` callback when a window
moves between displays (including when displays are disconnected)
2. The existing implementation only restarted the display link but
didn't update the window's scale factor or drawable size
3. This left the window with stale scaling information from the previous
display configuration
Root Cause
The `window_did_change_screen` callback in
`crates/gpui/src/platform/mac/window.rs` was missing the logic to update
the window's scale factor and drawable size when moving between screens.
This logic was only present in the `view_did_change_backing_properties
callback`, which isn't triggered when external monitors are
disconnected.
Solution
- Extracted common logic: Created a new `update_window_scale_factor()`
function that encapsulates the scale factor and drawable size update
logic
- Added scale factor update to screen change: Modified
`window_did_change_screen` to call this function after restarting the
display link
- Refactored existing code: Updated `view_did_change_backing_properties`
to use the new shared function, reducing code duplication
The fix ensures that whenever a window changes screens (due to monitor
disconnect, reconnect, or manual movement), the scale factor, drawable
size, and renderer state are properly synchronized.
Testing
- ✅ Verified that UI scaling remains correct after disconnecting
external monitor
- ✅ Confirmed that reconnecting external monitor works properly
- ✅ Tested that manual window movement between displays updates scaling
correctly
- ✅ No regressions observed in normal window operations
To verity my fix worked I had to copy my preview workspace over my dev
workspace, once I had done this I could reproduce the issue on main
consistently. After switching to the branch with this fix the issue was
resolved.
The fix is similar to what was done on
https://github.com/zed-industries/zed/pull/35686 (Windows)
Closes #37245 #38229
Release Notes:
- Fixed: Update scale factor and drawable size when macOS window changes
screen
---------
Co-authored-by: Kate <work@localcc.cc>
Rafael Lüder
and
Kate
created
cb7bd5f
Include source PR number in cherry-picks (#42642)
Click to expand commit body
Release Notes:
- N/A
Conrad Irwin
created
b900ac2
ci: Fix `script/clear-target-dir-if-larger-than` post #41652 (#42640)
Click to expand commit body
Closes #ISSUE
The namespace runners mount the `target` directory to the cache drive,
so `rm -rf target` would fail with `Device Busy`. Instead we now do `rm
-rf target/* target/.*` to remove all files (including hidden files)
from the `target` directory, without removing the target directory
itself
Release Notes:
- N/A *or* Added/Fixed/Improved ...
Ben Kunkle
created
b709996
editor: Fix pane's tab buttons flicker on right-click (#42549)
Click to expand commit body
Whenever right-click was used on the editor, the pane's tab buttons
would flicker, which was confirmed to happen because of the following
check:
```
self.focus_handle.contains_focused(window, cx)
|| self
.active_item()
.is_some_and(|item| {
item.item_focus_handle(cx).contains_focused(window, cx)
})
```
This check was returning `false` right after right-clicking but
returning `true` right after. When digging into it a little bit more,
this appears to be happening because the editor's `MouseContextMenu`
relies on `ContextMenu` which is rendered in a deferred fashion but
`MouseContextMenu` updates the window's focus to it instantaneously.
Since the `ContextMenu` is rendered in a deferred fashion, its focus
handle is not yet a descendant of the editor (pane's active item) focus
handle, so the `contains_focused(window, cx)` call would return `false`,
with it returning `true` after the menu was rendered.
This commit updates the `MouseContextMenu::new` function to leverage
`cx.on_next_frame` and ensure that the focus is only moved to the
`ContextMenu` 2 frames later, ensuring that by the time the focus is
moved, the `ContextMenu`'s focus handle is a descendant of the editor's.
Closes #41771
Release Notes:
- Fixed pane's tab buttons flickering when using right-click on the
editor
Dino
created
b6972d7
editor: Fix panic when calculating jump data for buffer header (#42639)
Click to expand commit body
Just on nightly.
Release Notes:
- N/A *or* Added/Fixed/Improved ...
Co-authored-by: Lukas Wirth <me@lukaswirth.dev>
Smit Barmase
and
Lukas Wirth
created
ec1664f
zed: Enable line wrapping for cli help (#42496)
Click to expand commit body
This enables clap's [wrap-help] feature and sets max_term_width to wrap
after 100 columns (the value clap is planning to default to in clap-v5).
This commit also adds blank lines which cause clap to split longer doc
comments into separate help (displayed for `-h`) and long_help
(displayed for `--help`) messages, as per [doc-processing].
[wrap-help]:
https://docs.rs/clap/4.5.49/clap/_features/index.html#optional-features
[doc-processing]:
https://docs.rs/clap/4.5.49/clap/_derive/index.html#pre-processing

Release Notes:
- N/A
kitt
created
c2c5fce
zeta eval: Allow no headings under "Expected Context" (#42638)
Click to expand commit body
Release Notes:
- N/A
Agus Zubiaga
created
eadc230
Fetch the unit eval commit before checking it out (#42636)
Hides the aggregated scores if only one example/repetition ran. It also
fixes an issue with the expected context scoring.
Release Notes:
- N/A
Agus Zubiaga
created
fb90b12
Add retry support for OpenAI-compatible LLM providers (#37891)
Click to expand commit body
Automatically retry the agent's LLM completion requests when the
provider returns 429 Too Many Requests. Uses the Retry-After header to
determine the retry delay if it is available.
Many providers are frequently overloaded or have low rate limits. These
providers are essentially unusable without automatic retries.
Tested with Cerebras configured via openai_compatible.
Related: #31531
Release Notes:
- Added automatic retries for OpenAI-compatible LLM providers
---------
Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
Tim McLean
and
Bennet Bo Fenner
created
92e64f9
settings: Add tilde expansion support for LSP binary path (#41715)
Click to expand commit body
Closes #38227
Release Notes:
- Added tilde expansion support for LSP binary path in `settings.json`
Mayank Verma
created
f318bb5
markdown: Add support for `HTML` href elements (#42265)
Click to expand commit body
This PR adds support for `HTML` href elements. It also refactored the
way we stored the regions, this was done because otherwise I had to add
2 extra arguments to each `HTML` parser method. It's now also more
inline with how we have done it for the highlights.
**Small note**: the markdown parser only supports HTML href tags inside
a paragraph tag. So adding them as a root node will result in just
showing the inner text. This is a limitation of the markdown parser we
use itself.
**Before**
<img width="935" height="174" alt="Screenshot 2025-11-08 at 15 40 28"
src="https://github.com/user-attachments/assets/42172222-ed49-4a4b-8957-a46330e54c69"
/>
**After**
<img width="1026" height="180" alt="Screenshot 2025-11-08 at 15 29 55"
src="https://github.com/user-attachments/assets/9e139c2d-d43a-4952-8d1f-15eb92966241"
/>
**Example code**
```markdown
<p>asd <a href="https://example.com">Link Text</a> more text</p>
<p><a href="https://example.com">Link Text</a></p>
[Duck Duck Go](https://duckduckgo.com)
```
**TODO**:
- [x] Add tests
cc @bennetbo
Release Notes:
- Markdown Preview: Add support for `HTML` href elements.
---------
Co-authored-by: Bennet Bo Fenner <bennet@zed.dev>
Remco Smits
and
Bennet Bo Fenner
created
430b554
search: New recent old search implementation (#40835)
Click to expand commit body
This is an in-progress work on changing how task scheduler affects
performance of project search. Instead of relying on tasks being
executed at a discretion of the task scheduler, we want to experiment
with having a set of "agents" that prioritize driving in-progress
project search matches to completion over pushing the whole thing to
completion. This should hopefully significantly improve throughput &
latency of project search.
This PR has been reverted previously in #40831.
Release Notes:
- Improved project search performance in local projects.
---------
Co-authored-by: Smit Barmase <smit@zed.dev>
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Piotr Osiewicz
,
Smit Barmase
, and
Smit Barmase
created
27f700e
askpass: Quote paths in generated askpass script (#42622)
b5633f5
editor: Improve multi-buffer header filename click to jump to the latest selection from that buffer - take 2 (#42613)
Click to expand commit body
Relands https://github.com/zed-industries/zed/pull/42480
Release Notes:
- Clicking the multi-buffer header file name or the "Open file" button
now jumps to the most recent selection in that buffer, if one exists.
---------
Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
Smit Barmase
and
Piotr Osiewicz
created
b9ce52d
agent_ui: Fix scrolling in context server configuration modal (#42502)
Click to expand commit body
## Summary
Fixes #42342
When installing a dev extension with long installation instructions, the
configuration modal would overflow and users couldn't scroll to see the
full content or interact with buttons at the bottom.
## Solution
This PR adds a `ScrollHandle` to the `ConfigureContextServerModal` and
passes it to the `Modal` component, enabling the built-in modal
scrolling capability. This ensures all content remains accessible
regardless of length.
## Changes
- Added `ScrollHandle` import to the ui imports
- Added `scroll_handle: ScrollHandle` field to
`ConfigureContextServerModal` struct
- Initialize `scroll_handle` with `ScrollHandle::new()` when creating
the modal
- Pass the scroll handle to `Modal::new()` instead of `None`
## Testing
- Built the changes locally
- Tested with extensions that have long installation instructions
- Verified scrolling works and all content is accessible
- Confirmed no regression for extensions with short descriptions
Release Notes:
- Fixed scrolling issue in extension configuration modal when
installation instructions overflow the viewport
---------
Co-authored-by: Finn Evers <finn.evers@outlook.de>
R.Amogh
and
Finn Evers
created
34a7cfb
Update cargo.rs to allow debugging of integration test annotated with the ignore attribute (#42574)
Click to expand commit body
Address #40429
If an integration test is annotated with the ignore attribute, allow the
"debug: Test" option of the debug scenario or Code Action to run with
"--include-ignored"
Closes #40429
Release Notes:
- N/A
New rustc starts to output a few warnings, fix them by updating the
corresponding packages.
<details>
<summary>Incompatibility notes</summary>
```
The following warnings were discovered during the build. These warnings
are an
indication that the packages contain code that will become an error in a
future release of Rust. These warnings typically cover changes to close
soundness problems, unintended or undocumented behavior, or critical
problems
that cannot be fixed in a backwards-compatible fashion, and are not
expected
to be in wide use.
Each warning should contain a link for more information on what the
warning
means and how to resolve it.
To solve this problem, you can try the following approaches:
- Some affected dependencies have newer versions available.
You may want to consider updating them to a newer version to see if the
issue has been fixed.
num-bigint-dig v0.8.4 has the following newer versions available: 0.8.5,
0.9.0, 0.9.1
- If the issue is not solved by updating the dependencies, a fix has to
be
implemented by those dependencies. You can help with that by notifying
the
maintainers of this problem (e.g. by creating a bug report) or by
proposing a
fix to the maintainers (e.g. by creating a pull request):
- num-bigint-dig@0.8.4
- Repository: https://github.com/dignifiedquire/num-bigint
- Detailed warning command: `cargo report future-incompatibilities --id
1 --package num-bigint-dig@0.8.4`
- If waiting for an upstream fix is not an option, you can use the
`[patch]`
section in `Cargo.toml` to use your own version of the dependency. For
more
information, see:
https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html#the-patch-section
The package `num-bigint-dig v0.8.4` currently triggers the following
future incompatibility lints:
> warning: macro `vec` is private
> -->
/Users/someonetoignore/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.4/src/biguint.rs:490:22
> |
> 490 | BigUint::new(vec![1])
> | ^^^
> |
> = warning: this was previously accepted by the compiler but is being
phased out; it will become a hard error in a future release!
> = note: for more information, see issue #120192
<https://github.com/rust-lang/rust/issues/120192>
>
> warning: macro `vec` is private
> -->
/Users/someonetoignore/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.4/src/biguint.rs:2005:9
> |
> 2005 | vec![0]
> | ^^^
> |
> = warning: this was previously accepted by the compiler but is being
phased out; it will become a hard error in a future release!
> = note: for more information, see issue #120192
<https://github.com/rust-lang/rust/issues/120192>
>
> warning: macro `vec` is private
> -->
/Users/someonetoignore/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.4/src/biguint.rs:2027:16
> |
> 2027 | return vec![b'0'];
> | ^^^
> |
> = warning: this was previously accepted by the compiler but is being
phased out; it will become a hard error in a future release!
> = note: for more information, see issue #120192
<https://github.com/rust-lang/rust/issues/120192>
>
> warning: macro `vec` is private
> -->
/Users/someonetoignore/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.4/src/biguint.rs:2313:13
> |
> 2313 | vec![0]
> | ^^^
> |
> = warning: this was previously accepted by the compiler but is being
phased out; it will become a hard error in a future release!
> = note: for more information, see issue #120192
<https://github.com/rust-lang/rust/issues/120192>
>
> warning: macro `vec` is private
> -->
/Users/someonetoignore/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.4/src/prime.rs:138:22
> |
> 138 | let mut moduli = vec![BigUint::zero(); prime_limit];
> | ^^^
> |
> = warning: this was previously accepted by the compiler but is being
phased out; it will become a hard error in a future release!
> = note: for more information, see issue #120192
<https://github.com/rust-lang/rust/issues/120192>
>
> warning: macro `vec` is private
> -->
/Users/someonetoignore/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.4/src/bigrand.rs:319:25
> |
> 319 | let mut bytes = vec![0u8; bytes_len];
> | ^^^
> |
> = warning: this was previously accepted by the compiler but is being
phased out; it will become a hard error in a future release!
> = note: for more information, see issue #120192
<https://github.com/rust-lang/rust/issues/120192>
>
```
</details>
Release Notes:
- N/A
1fc0642
vim: Make each vim repeat its own transaction (#41735)
Click to expand commit body
Release Notes:
- Pressing `u` after multiple `.` in rapid succession will now only undo
the latest repeat instead of all repeats.
---------
Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
1936f16
editor: Use a single newline between each copied line from a multi-cursor selection (#41204)
Click to expand commit body
Closes #40923
Release Notes:
- Fixed the amount of newlines between copied lines from a multi-cursor
selection of multiple full-line copies.
---
https://github.com/user-attachments/assets/ab7474d6-0e49-4c29-9700-7692cd019cef
Sean Hagstrom
created
b32559f
Avoid re-creating releases when re-running workflows (#42573)
Click to expand commit body
Closes #ISSUE
Release Notes:
- N/A
Conrad Irwin
created
28adedf
Disable env clearing for npm subcommands (#42587)
Click to expand commit body
Fixes #39448
Several node version managers such as [volta](https://volta.sh) use thin
wrappers that locate the "real" node/npm binary with an env var that
points at their install root. When it finds this, it prepends the
correct directory to PATH, otherwise it'll check a hardcoded default
location and prepend that to PATH if it exists.
We were clearing env for npm subcommands, which meant that volta and co.
failed to locate the install root, and because they were installed via
scoop they don't use the default install path either so it simply
doesn't prepend anything to PATH (winget on the other hand installs
volta to the right place, which is why it worked when using that instead
of scoop to install volta @IllusionaryX).
So volta's npm wrapper executes a subcommand `npm`, but when that
doesn't prepend a different directory to PATH the first `npm` found in
PATH is that same wrapper itself, which horrifyingly causes itself to
re-exec continuously. I think they might have some logic to try to
prevent this using, you'll never guess, another env var that they set
whenever a volta wrapper execs something. Of course since we clear the
env that var also fails to propagate.
Removing env clearing (but keeping the prepending of npm path from your
settings) fixes these issues.
Release Notes:
- Fixed issues with scoop installations of mise/volta
Co-authored-by: John Tur <john-tur@outlook.com>
Julia Ryan
and
John Tur
created
c9e2310
Report discarded zeta predictions and indicate whether they were shown (#42403)
Click to expand commit body
Release Notes:
- N/A
---------
Co-authored-by: Michael Sloan <mgsloan@gmail.com>
Co-authored-by: Ben Kunkle <ben@zed.dev>
Co-authored-by: Agus Zubiaga <agus@zed.dev>
Max Brunsfeld
,
Michael Sloan
,
Ben Kunkle
, and
Agus Zubiaga
created
ede3b1d
Allow running concurrent unit evals (#42578)
Click to expand commit body
Right now only one unit eval GitHub Action can be run at a time. This
permits them to run concurrently.
Release Notes:
- N/A
Adds a `--repeat` flag to the zeta eval that runs each example as many
times as specified. Also makes the output nicer in a few ways.
Release Notes:
- N/A
---------
Co-authored-by: Ben Kunkle <ben@zed.dev>
Co-authored-by: Michael <michael@zed.dev>
Agus Zubiaga
,
Ben Kunkle
, and
Michael
created
f2a1eb9
Make check-licenses script check that AGPL crates are not included in release binaries (#42571)
Click to expand commit body
See discussion in #24657. Recalled that I had a stashed change for this,
so polished it up
Release Notes:
- N/A
Michael Sloan
created
0c1ca2a
Improve `pane: reopen closed item` to not reopen closed tabs (#42568)
Click to expand commit body
Closes #42134
Release Notes:
- Improved `pane: reopen closed item` to not reopen closed tabs.
Andrew Farkas
created
8fd8b98
Use powershell for winget job steps (#42565)
Click to expand commit body
Co-Authored-By: Claude
Release Notes:
- N/A
Conrad Irwin
created
fd837b3
project_panel: Make natural sort ordering consistent with other apps (#41080)
Click to expand commit body
The existing sorting approach when faced with `Dir1`, `dir2`, `Dir3`,
would only get as far as comparing the stems without numbers (`dir` and
`Dir`), and then the lowercase-first tie breaker in that function would
determine that `dir2` should come first, resulting in an undesirable
order of `dir2`, `Dir1`, `Dir3`.
This patch defers tie-breaking until it's determined that there's no
other difference in the strings outside of case to order on, at which
point we tie-break to provide a stable sort.
Natural number sorting is still preserved, and mixing different cases
alphabetically (as opposed to all lowercase alpha, followed by all
uppercase alpha) is preserved.
Closes #41080
Release Notes:
- Fixed: ProjectPanel sorting bug
Screenshots:
Before | After
----|---
<img width="237" height="325" alt="image"
src="https://github.com/user-attachments/assets/6e92e8c0-2172-4a8f-a058-484749da047b"
/> | <img width="239" height="325" alt="image"
src="https://github.com/user-attachments/assets/874ad29f-7238-4bfc-b89b-fd64f9b8889a"
/>
I'm having trouble reasoning through what was previously going wrong
with `docs` in the before screenshot, but it also seems to now appear
alphabetically where you'd expect it with this patch
---------
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>