Icon scale — where +3px actually bites

Proposed scale 12 / 14 / 18 / 48. The safe cases are omitted; these are the six surfaces where the change is visible or contentious. Left = today, right = proposed. Judge the crowding, not the icon.

risk: low medium high

1 · Data-viewer column headers highest risk

Narrow columns, two stacked header rows, an eye + a filter chevron per column. 11 → 14 is a 27% jump in the tightest space in the app.

now

glyph 11 · controls row 28px

fits comfortably — 4px gap, no clipping at 120px columns
proposed

glyph 14 · controls row 28px

tighter, still fits — but the type code and the buttons nearly touch on a narrow column
The real decision here. The controls row is 28px tall, so a 14px glyph is fine vertically. The pressure is horizontal: two 24px targets + the type code inside a column that can be 80px wide (MIN_COLUMN_WIDTH). At 80px it will crowd. Options: let it crowd, raise MIN_COLUMN_WIDTH to ~96, or make the data viewer the one sanctioned ICON_XS (12) surface. My recommendation: keep it at 14 and raise MIN_COLUMN_WIDTH — one exception surface is how scales rot.

The 80px worst case, all three ways

2 · Canvas node badges high risk

Status dot, port glyphs and the composite add badge are all positioned with hardcoded offsets derived from the glyph size.

now

status 12 · ports 12 · badge 7

offsets tuned to these exact sizes
proposed

status 12 · ports 12 · badge 12→ recomputed

badge grows; the −2px offset must be re-derived, not carried over
Good news — mostly a no-op. Status icons and port glyphs are already 12, which is ICON_XS. They change in name only. The one genuine change is the composite add badge, whose size and offset are computed as round(HEADER_ICON_SIZE × 0.6) / −round(× 0.2) — those ratios were tuned against 11. Against 14 they give 8 / −3, which needs an eyeball, not just a recompile.

3 · Section breadcrumb medium risk

The separator is 9 today — the smallest icon in the codebase. On the scale it becomes 12, a 33% jump, inside a 22→24px header next to 11px uppercase text.

now

sep 9 · trail 12 · header 22

separator recedes — reads as punctuation
proposed

sep 12 · trail 14 · header 24

separator competes with the text it separates
This is where the 4-size scale genuinely costs something. A breadcrumb chevron is punctuation — it should be smaller than the glyphs it sits between. Forcing it to 12 while the trail icons go to 14 leaves only 2px of hierarchy; forcing both to 12 flattens it entirely. Recommendation: carve out a documented exception — separators and other pure punctuation glyphs stay off the scale, the same way iconSize()-derived control icons do. Otherwise 12 has to mean two different things.

4 · Inline metadata glyphs low risk

Clock, CircleDot, GitCommit at 10, sitting inside 0.65rem (≈10.4px) text.

now

glyph 10 · text 0.65rem

venact-studio
Workspace and canvas module
glyph matches the cap height of the text
proposed

glyph 12 · text 0.65rem

venact-studio
Workspace and canvas module
slightly heavier but reads fine — arguably better

5 · Tree rows no risk

Already at TREE_ICON_SIZE = 14. The glyph does not move; only the row grows 22 → 24 for the AA target.

now

glyph 14 · row 22

proposed

glyph 14 · row 24

2px more breathing room per row · 12 rows = 24px taller list

Worth noting: a 500-row tree gets 1000px taller. Irrelevant when virtualised and scrolled, but it does mean fewer rows visible per screen — about 8% fewer.

6 · The jump itself

The 46 call sites at 11 and the 24 at 13 all land on 14. The 22 sites at 16 come down to 14 — that is the change most likely to be noticed as "icons got smaller" in toolbars.

Summary — what I need from you

SurfaceChangeRiskMy call
Data-viewer headers11 → 14highKeep 14, raise MIN_COLUMN_WIDTH 80 → 96
Canvas add badge7 → 8, offset −2 → −3highRecompute + eyeball; ratios were tuned against 11
Breadcrumb separator9 → 12mediumExempt punctuation glyphs from the scale
Toolbar icons16 → 14mediumAccept — they get smaller, box stays 24
Inline metadata10 → 12lowAccept
Tree rows14 → 14noneRow 22 → 24 only
Status / port glyphs12 → 12noneRename to ICON_XS, no visual change
Two calls I'd like you to make before I start.
1. Breadcrumb separators — exempt them from the scale (my recommendation), or force them to 12 and accept the flatter hierarchy?
2. Data-viewer — raise MIN_COLUMN_WIDTH to 96 (my recommendation), or let 80px columns crowd?