Merge pull request #190 from l0ng-ai/feat/icon-set-humanist

feat(icons): redraw the bundled icon set to one humanist spec
This commit is contained in:
l0ng-ai
2026-07-26 20:19:38 +08:00
committed by GitHub
18 changed files with 87 additions and 58 deletions
+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9.5"/><path d="M12 11.25v5"/><circle cx="12" cy="7.6" r="0.95" fill="currentColor" stroke="none"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.8"/><path d="M12 11.4v5"/><circle cx="12" cy="7.7" r="1.2" fill="currentColor" stroke="none"/></svg>

Before

Width:  |  Height:  |  Size: 313 B

After

Width:  |  Height:  |  Size: 313 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="8.6" y="8.6" width="12.2" height="12.2" rx="3.2"/><path d="M5.8 15.4A2.6 2.6 0 0 1 3.2 12.8V5.8a2.6 2.6 0 0 1 2.6-2.6h7a2.6 2.6 0 0 1 2.6 2.6"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><rect x="8.6" y="8.6" width="12" height="12" rx="3.6"/><path d="M15.4 3.4H6.2A2.8 2.8 0 0 0 3.4 6.2v9.2"/></svg>

Before

Width:  |  Height:  |  Size: 343 B

After

Width:  |  Height:  |  Size: 296 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="none"><circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="none"><circle cx="5.2" cy="12" r="2.05"/><circle cx="12" cy="12" r="2.05"/><circle cx="18.8" cy="12" r="2.05"/></svg>

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 229 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M2.6 12c2.45-4.35 5.58-6.5 9.4-6.5s6.95 2.15 9.4 6.5c-2.45 4.35-5.58 6.5-9.4 6.5S5.05 16.35 2.6 12Z"/><circle cx="12" cy="12" r="2.75" fill="currentColor" stroke="none"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12c2.5-4.3 5.5-6.4 9-6.4s6.5 2.1 9 6.4c-2.5 4.3-5.5 6.4-9 6.4S5.5 16.3 3 12Z"/><circle cx="12" cy="12" r="2.8" fill="currentColor" stroke="none"/></svg>

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 348 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M13.4 3.2H7.8a2.6 2.6 0 0 0-2.6 2.6v12.4a2.6 2.6 0 0 0 2.6 2.6h8.4a2.6 2.6 0 0 0 2.6-2.6V8Z"/><path d="M13.4 3.2v2.2a2.6 2.6 0 0 0 2.6 2.6h2.8"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M13.6 3.6H8.4A2.8 2.8 0 0 0 5.6 6.4v11.2a2.8 2.8 0 0 0 2.8 2.8h7.2a2.8 2.8 0 0 0 2.8-2.8V8.6Z"/><path d="M13.6 3.6v2.4a2.6 2.6 0 0 0 2.6 2.6h2.2"/></svg>

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 346 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M3.2 7A2.6 2.6 0 0 1 5.8 4.4h3.5a2.6 2.6 0 0 1 2.08 1.04l1.04 1.39a1.6 1.6 0 0 0 1.28.64h4.5a2.6 2.6 0 0 1 2.6 2.6v7.93a2.6 2.6 0 0 1-2.6 2.6H5.8a2.6 2.6 0 0 1-2.6-2.6Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.4 8A2.8 2.8 0 0 1 6.2 5.2h3a2.8 2.8 0 0 1 2.24 1.12l.74.99a1.7 1.7 0 0 0 1.36.69h4.86a2.8 2.8 0 0 1 2.8 2.8v5.6a2.8 2.8 0 0 1-2.8 2.8H6.2a2.8 2.8 0 0 1-2.8-2.8Z"/><path d="M5.6 11.2h12.8"/></svg>

Before

Width:  |  Height:  |  Size: 370 B

After

Width:  |  Height:  |  Size: 391 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M3.2 18.4V7A2.6 2.6 0 0 1 5.8 4.4h3.5a2.6 2.6 0 0 1 2.08 1.04l1.04 1.39a1.6 1.6 0 0 0 1.28.64h4.5a2.6 2.6 0 0 1 2.6 2.6v1.13"/><path d="M5.5 20.6h12.34a2.6 2.6 0 0 0 2.47-1.78l1.92-5.76a1.3 1.3 0 0 0-1.23-1.71H7.86a2.6 2.6 0 0 0-2.47 1.78l-1.92 5.76a1.3 1.3 0 0 0 1.23 1.71Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.4 16.6V8A2.8 2.8 0 0 1 6.2 5.2h3a2.8 2.8 0 0 1 2.24 1.12l.74.99a1.7 1.7 0 0 0 1.36.69h4.86a2.8 2.8 0 0 1 2.8 2.8v1.1"/><path d="M5.6 18.8h11.5a2.8 2.8 0 0 0 2.66-1.92l1.32-3.96a1.4 1.4 0 0 0-1.33-1.84H7.9a2.8 2.8 0 0 0-2.66 1.92l-1.32 3.96a1.4 1.4 0 0 0 1.33 1.84Z"/></svg>

Before

Width:  |  Height:  |  Size: 476 B

After

Width:  |  Height:  |  Size: 469 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M3.2 7A2.6 2.6 0 0 1 5.8 4.4h3.5a2.6 2.6 0 0 1 2.08 1.04l1.04 1.39a1.6 1.6 0 0 0 1.28.64h4.5a2.6 2.6 0 0 1 2.6 2.6v7.93a2.6 2.6 0 0 1-2.6 2.6H5.8a2.6 2.6 0 0 1-2.6-2.6Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.4 8A2.8 2.8 0 0 1 6.2 5.2h3a2.8 2.8 0 0 1 2.24 1.12l.74.99a1.7 1.7 0 0 0 1.36.69h4.86a2.8 2.8 0 0 1 2.8 2.8v5.6a2.8 2.8 0 0 1-2.8 2.8H6.2a2.8 2.8 0 0 1-2.8-2.8Z"/></svg>

Before

Width:  |  Height:  |  Size: 370 B

After

Width:  |  Height:  |  Size: 365 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M6.2 7.6v8.8"/><path d="M6.2 12h8.6a3 3 0 0 0 3-3"/><circle cx="6.2" cy="5" r="2.6" fill="currentColor" stroke="none"/><circle cx="6.2" cy="19" r="2.6" fill="currentColor" stroke="none"/><circle cx="17.8" cy="6.4" r="2.6" fill="currentColor" stroke="none"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M7 8v8"/><path d="M7 12h6.6a3 3 0 0 0 3-3"/><circle cx="7" cy="5.4" r="2.5" fill="currentColor" stroke="none"/><circle cx="7" cy="18.6" r="2.5" fill="currentColor" stroke="none"/><circle cx="16.6" cy="6.4" r="2.5" fill="currentColor" stroke="none"/></svg>

Before

Width:  |  Height:  |  Size: 456 B

After

Width:  |  Height:  |  Size: 448 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="3.2" y="4.6" width="17.6" height="14.8" rx="3"/><path d="M7 10.4h10"/><path d="M7 14.8h5.8"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><rect x="3.4" y="4.4" width="17.2" height="15.2" rx="3.8"/><path d="M3.4 9h17.2"/><path d="M7.2 13.8h9.6"/></svg>

Before

Width:  |  Height:  |  Size: 292 B

After

Width:  |  Height:  |  Size: 297 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M9 5.6h11.8"/><path d="M9 12h11.8"/><path d="M9 18.4h7"/><circle cx="4" cy="5.6" r="1.35" fill="currentColor" stroke="none"/><circle cx="4" cy="12" r="1.35" fill="currentColor" stroke="none"/><circle cx="4" cy="18.4" r="1.35" fill="currentColor" stroke="none"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M9.2 6.8h10.8"/><path d="M9.2 12h10.8"/><path d="M9.2 17.2h7"/><circle cx="4.4" cy="6.8" r="1.6" fill="currentColor" stroke="none"/><circle cx="4.4" cy="12" r="1.6" fill="currentColor" stroke="none"/><circle cx="4.4" cy="17.2" r="1.6" fill="currentColor" stroke="none"/></svg>

Before

Width:  |  Height:  |  Size: 460 B

After

Width:  |  Height:  |  Size: 469 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="4"/><rect x="5.6" y="5.6" width="5.2" height="12.8" rx="1.8" fill="currentColor" stroke="none"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><rect x="3.4" y="3.4" width="17.2" height="17.2" rx="4.4"/><rect x="5.6" y="5.6" width="4.4" height="12.8" rx="1.8" fill="currentColor" stroke="none"/></svg>

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 341 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="4"/><rect x="13.2" y="5.6" width="5.2" height="12.8" rx="1.8" fill="currentColor" stroke="none"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><rect x="3.4" y="3.4" width="17.2" height="17.2" rx="4.4"/><rect x="14" y="5.6" width="4.4" height="12.8" rx="1.8" fill="currentColor" stroke="none"/></svg>

Before

Width:  |  Height:  |  Size: 330 B

After

Width:  |  Height:  |  Size: 340 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 6v12"/><path d="M6 12h12"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round"><path d="M12 6v12"/><path d="M6 12h12"/></svg>

Before

Width:  |  Height:  |  Size: 206 B

After

Width:  |  Height:  |  Size: 206 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M21.3 12a9.3 9.3 0 1 1-2.72-6.58"/><path d="M21.3 2.7v5.2h-5.2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M20.6 12a8.6 8.6 0 1 1-2.5-6.1"/><path d="M20.6 4v4.9h-4.9"/></svg>

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 260 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.8" cy="10.8" r="7.4"/><path d="M16.3 16.3 20.8 20.8"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.8" cy="10.8" r="6.9"/><path d="M15.7 15.7 20.2 20.2"/></svg>

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 259 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round"><path d="m4 17 6-6-6-6"/><path d="M12 19h8"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M5.8 8.4 9.7 12l-3.9 3.6"/><path d="M12.9 15.6h5.6"/></svg>

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 252 B

+70 -41
View File
@@ -68,53 +68,77 @@ fn agent_icon(path: &str) -> Option<&'static [u8]> {
"icons/terminal.svg" => include_bytes!("../../assets/icons/terminal.svg"),
// A git glyph on the detail-panel spec below (gpui-component bundles
// none). Serves both the sidebar row's branch line and the Changes tab.
// Drawn as an actual commit graph — a trunk with a node at each end,
// branching once — rather than lucide's long arc slung between two
// floating rings: that one is the loosest, most lopsided shape in a row
// of four, and at the sidebar's 11px a stroked ring's hole collapses into
// a blur anyway. Nodes are filled here.
// Drawn as a commit graph — a trunk with a node at each end, branching
// once — rather than lucide's long arc slung between two floating rings:
// that one is the loosest, most lopsided shape in a row of four. Nodes
// are filled, because at the sidebar's 11px a stroked ring's hole
// collapses into a blur.
"icons/git-branch.svg" => include_bytes!("../../assets/icons/git-branch.svg"),
// Filled-panel dock glyphs for the window chrome: an outlined frame with
// one inset solid block marking which dock is open (the "commercial-app"
// look). gpui-component only ships the hollow line `panel-left/right`, so
// tty7 carries its own filled variants for the title bar controls.
// Dock glyphs for the window chrome: a rounded frame with one inset solid
// block marking which dock is open. gpui-component only ships the hollow
// line `panel-left/right`, which says a panel exists but not which one is
// showing, so tty7 carries its own. The block is a flat fill, not a wash —
// nothing in this set relies on partial alpha surviving rasterisation.
"icons/panel-left.svg" => include_bytes!("../../assets/icons/panel-left.svg"),
"icons/panel-right.svg" => include_bytes!("../../assets/icons/panel-right.svg"),
// The chrome glyphs that sit beside those dock tiles, redrawn to share
// their weight and their solid-mass vocabulary. Lucide's stock `plus` is
// a thin bare cross that reads far lighter than the framed dock icon
// next to it, and its `ellipsis` strokes three `r=1` circles — at 18px
// the cap overlaps its own fill and the dots blur into grey smudges.
//
// `plus` is the one deliberate departure from the spec below: a bare
// cross has no enclosing shape to carry weight, so it runs stroke 2.4 on
// a tighter 6→18 span. Matching the spec exactly would leave it visibly
// frailer than the framed tile beside it.
// The chrome glyphs beside those dock tiles. Lucide's `ellipsis` strokes
// three `r=1` circles, and at 18px the cap overlaps its own fill and the
// dots blur into grey smudges, so these are filled to the node rule below.
"icons/plus.svg" => include_bytes!("../../assets/icons/plus.svg"),
"icons/ellipsis.svg" => include_bytes!("../../assets/icons/ellipsis.svg"),
// The detail panel's own set: four tab tiles at 18px and four controls at
// 13px, all in one panel, so they're drawn to one spec instead of taken
// from lucide as-is.
//
// stroke 1.9 (except `plus` — see above)
// radius 2.63.2, never 2.0
// span 3.2→20.8, both axes; circles widen to ~2.5→21.5, since a
// round shape reads smaller at equal geometry
// nodes always filled, r ≥ 1.35 — a stroked dot hazes below 16px
// The spec is "humanist": full, rounded, near-square. Every glyph here
// draws the *conventional* thing — a magnifier is a magnifier, a folder
// is a folder, a sheet has a dog-ear. Several rounds of this set tried
// swapping those metaphors for cleverer ones (terminal-native objects,
// brand-derived panels, deliberately unclosed forms) and every one of
// them cost more recognition than it bought character. What carries the
// set is how the familiar shape is *drawn*, not which shape it is.
//
// The stock glyphs share none of that: they mix stroke weights, sit a
// 21-wide circle next to an 18-wide folder, and leave so much dead space
// inside the frame that the row reads as four glyphs from four sets.
// stroke 2.1, flat across the set, round caps and joins
// radius 3.44.4 — generous, matching the app's own 10px panels
// span 3.4→20.6, near-square bounding box; circles widen ~4%,
// since a round shape reads smaller at equal geometry
// curvature one step fuller than a mechanical arc would give (`eye`,
// `folder`'s shoulder), which is what makes the set feel
// drawn rather than constructed
// nodes filled, r ≥ 1.6 — a stroked dot hazes below 16px
//
// Shape choices worth keeping: `info` is a panel with two lines written
// in it — a picture of what the tab actually opens (cwd, shell, branch,
// changes) — rather than the circled `i`, which is the most-drawn icon
// there is and says "help" as readily as "details"; Outline's last row is
// cut short, because three full-width rules read as a hamburger menu
// rather than a list;
// `folder-closed` drops its lid rule, which at 18px only crowded the top
// of the box; `copy`'s back sheet wraps three sides and stops on its own
// curves instead of poking two raw stubs out of an L.
// The five craft rules the set is held to, in the order they're usually
// violated:
//
// 1. Optical weight, not geometric: round shapes are drawn ~4% larger
// than square ones so a row of mixed glyphs reads level.
// 2. Tangent, never intrusion: `search`'s handle leaves the circle at
// its 45° tangent point rather than aiming at the centre — an
// overlap there shows as a lump at 64px.
// 3. Even interior rhythm: within one glyph, gaps between strokes are
// equal (`file`'s two text rules are spaced as far apart as each is
// from the frame). Uneven interior air is the single biggest source
// of "drawn sloppily".
// 4. One terminal treatment: every end is round, every corner shares
// the radius band. Don't mix a hard-folded corner into this set.
// 5. Equal apparent size, not equal bounds: `folder` is wide and short
// so it's drawn wider; `file` is narrow and tall so it's drawn
// taller. They occupy the same visual area, not the same rectangle.
//
// The stock lucide glyphs share none of that: they mix stroke weights,
// sit a 21-wide circle next to an 18-wide folder, and leave so much dead
// space inside the frame that a row reads as four glyphs from four sets.
//
// Shape choices worth keeping: `info` is a panel with a title bar ruled
// across the top and one content line under it — a picture of what the
// tab actually opens (cwd, shell, branch, changes) — rather than the
// circled `i`, which is the most-drawn icon there is and says "help" as
// readily as "details"; the title rule is also what keeps it from
// colliding with `panel-left`, which is the same frame with a block in
// it. Outline's last row is cut short, because three full-width rules
// read as a hamburger menu rather than a list. `copy`'s back sheet wraps
// three sides and stops on its own curves instead of poking two raw stubs
// out of an L.
"icons/list.svg" => include_bytes!("../../assets/icons/list.svg"),
"icons/folder-closed.svg" => include_bytes!("../../assets/icons/folder-closed.svg"),
"icons/folder-open.svg" => include_bytes!("../../assets/icons/folder-open.svg"),
@@ -125,9 +149,13 @@ fn agent_icon(path: &str) -> Option<&'static [u8]> {
// `folder` and `file` carry no detail-panel role of their own — they're
// here because overriding `folder-open` above would otherwise split the
// file tree down the middle, drawing expanded rows on this spec and
// collapsed ones (and every file) from stock lucide. Same shape as
// `folder-closed`: upstream's only difference between the two is the lid
// rule this set drops anyway.
// collapsed ones (and every file) from stock lucide.
//
// `folder` is the file tree's collapsed row; `folder-closed` is the
// Files *tab* label, and carries one inner rule so the two names stop
// resolving to one identical drawing. The rule is legible there because
// the tab renders at 18px — at the tree's 13px it would only crowd the
// box, which is why the collapsed row doesn't wear it.
"icons/folder.svg" => include_bytes!("../../assets/icons/folder.svg"),
"icons/file.svg" => include_bytes!("../../assets/icons/file.svg"),
// The circled `i` that `info.svg` used to be, kept under its own name for
@@ -139,8 +167,9 @@ fn agent_icon(path: &str) -> Option<&'static [u8]> {
// The Files tab's remote (SFTP) mode needs a refresh it doesn't need
// locally: the local tree runs a recursive filesystem watcher and
// invalidates itself, a remote listing has nothing watching it. Drawn to
// the circle rule above (2.7→21.3) so it sits level with the `eye` beside
// it rather than lucide's r=9 `rotate-cw`, which reads a step small.
// the circle rule above (r 8.6) so it sits level with the `eye` beside it
// rather than lucide's r=9 `rotate-cw`, whose arrow head is also a size
// step heavier than anything else in the row.
"icons/refresh.svg" => include_bytes!("../../assets/icons/refresh.svg"),
"icons/agents/claude.svg" => include_bytes!("../../assets/icons/agents/claude.svg"),
"icons/agents/codex.svg" => include_bytes!("../../assets/icons/agents/codex.svg"),