feat(ui): icon semantic remap + stroke unification + governance contract - #662
Merged
Conversation
Sidebar icons rejected vs competitor: semantics were wrong and the glyph
family fragmented (12 different strokeWidth values from 1.5→3 across 163
call sites), nav text too weak.
Semantic remap (session-sidebar-nav.tsx):
新任务 SquarePen → Plus
每日回顾 LineChart → CalendarCheck
技能 Sparkles → Blocks
定时任务 Clock → Timer
设置 Settings (unchanged)
Blocks also replaces Sparkles on skill-entity surfaces: skills-panel skill
rows / empty-state / featured card, and the ⌘K "打开 · 技能" nav jump.
Sparkles is kept where it genuinely means AI-magic: 新建深度研究 (⌘K),
深度研究 mode pill, hero avatar / deep-research eyebrow, onboarding hint,
first-run checklist, about page. Blocks/CalendarCheck/Timer added to the
icons.tsx funnel (alphabetized); Plus/Settings already exported.
Stroke unification: deleted every per-call-site strokeWidth={...} prop
across apps/desktop/src/renderer and packages/ui/src (~163 call sites) so
all lucide glyphs ride the single governed svg.lucide weight (D5). Brand
assets (bot-brand-logo.tsx, provider-brand-marks.tsx) untouched.
Nav typography: navRowVariants base now carries font-medium (weight 500);
active rows keep semibold. Settings footer already font-medium.
Contract (icon-governance-contract.test.ts) pins: (a) no strokeWidth={ in
renderer/ui .tsx outside brand-asset files, (b) the sidebar imports exactly
Plus/CalendarCheck/Blocks/Timer/Settings from ./icons.js, (c) icons.tsx is
the only lucide-react importer in packages/ui/src. Updated two collision
pins (model-oauth-section, subagent-ui) to the stroke-less <X> form.
5 tasks
jackwener
added a commit
that referenced
this pull request
Jul 9, 2026
…one splits from info (#697) - Maintainer: the expanded sidebar row (Plus since #662) and the collapsed topbar compose button (SquarePen) showed different icons for the same action — unified on SquarePen, the collapsed one, per instruction. icon-governance contract re-pinned. - Found while sweeping 健康: --warning was literally var(--info) — the 提示 and 警告 tiers rendered the same amber and could not be told apart. Warning now steps deeper + more orange (l .75→.66, h 70→55) with its own --warning-text mix; info keeps its amber. CDP capture confirms the two tiers finally read differently. Desktop 2296/2296.
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Icon + typography governance round (user rejected the old sidebar vs a competitor's: wrong icon semantics, mixed icon families, weak nav text).
Semantic remap (icons say the function)
Sidebar: 新任务 SquarePen→Plus · 每日回顾 LineChart→CalendarCheck · 技能 Sparkles→Blocks · 定时任务 Clock→Timer. Skill-entity icons across skills-panel + palette nav follow to Blocks; Sparkles kept only where it genuinely means AI-magic (deep-research launcher, hero, onboarding hint — 7 sites, each audited).
One stroke family
Deleted all 167 per-callsite
strokeWidth={...}props (12 distinct values, 1.5→3). Icons ride the governed D5 rulesvg.lucide { stroke-width: 1.75 }(already contract-pinned) — one uniform stroke, verified via CDP computed style. Brand assets (provider marks) exempt.Nav typography
Nav rows now font-medium (500), matching the reference density; active stays semibold.
Governance encoded
New
icon-governance-contract.test.ts: bans callsite strokeWidth, pins the sidebar semantic mapping, pins icons.tsx as the sole lucide-react funnel. Two stale contracts re-pinned to the strokeless form.Verification
Implemented by an opus worktree agent to the maintainer's decided spec; reviewed and re-verified before merge.