refactor(web): one icon system — fold settings' lucide-solid icons into the vendored Icon component, drop the dependency #199
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab#199
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What to build
Consolidate the SPA back to a single icon mechanism: the vendored
Iconcomponent (ADR-0019). The settings rework (#198) introducedlucide-solidas a package dependency for its section/category icons, so the app currently has two icon systems — vendored Lucide glyphs behindIcon, and per-iconlucide-solidimports in the settings UI. Both render the same Lucide designs; the split is purely in delivery mechanism.Direction (maintainer decision, triage 2026-08-03): vendor the missing glyphs into the
Iconcomponent, migrate the settings UI onto it, and remove thelucide-soliddependency — honoring ADR-0019's "no icon package" decision rather than superseding it.Historical note: this issue originally prescribed the opposite migration (everything →
lucide-solid) back when one-off<svg>elements were scattered across components. Those have since been consolidated into the vendoredIconcomponent, and ADR-0019 pins that approach; only the settings UI still imports the package.See the agent brief in the comments for the authoritative spec.
refactor(web): migrate all ad-hoc inline SVG icons to lucide-solidto refactor(web): one icon system — fold settings' lucide-solid icons into the vendored Icon component, drop the dependencyAgent Brief
Category: enhancement
Summary: Migrate the settings UI's
lucide-solidicons into the vendoredIconcomponent and remove thelucide-solidpackage dependency.Current behavior:
The SPA has two icon systems rendering the same Lucide designs. Most of the app uses the vendored
Iconcomponent — a single component with anIconNameunion type mapping names to inline Lucide SVG glyphs (24×24 viewBox,fill="none",stroke="currentColor", stroke-width 2,aria-hidden, accessible name on the enclosing control), per ADR-0019. The settings UI (the settings layout's back/forward chevrons and the global/repo settings category registries) instead imports icons per-icon from thelucide-solidnpm package, and the shared settings category registry types its icon entries with the package'sLucidePropstype.Desired behavior:
One icon system: every icon in the SPA renders through the vendored
Iconcomponent, andlucide-solidis gone from the dependency set. Vendor the glyphs currently used only via the package into theIconcomponent's glyph map, copying the SVG paths from upstream Lucide (ISC license — keep the attribution note in the component header accurate):bell,bot,calendar-clock,container,folder-input,lock-keyhole,plane-landing,plug,settings-2,triangle-alert,chevron-left,chevron-right. (git-branchis also used by settings but already vendored.) Keep each glyph visually identical to what the package rendered.Key interfaces:
IconNameunion type — extend with the new glyph names.Iconcomponent — one entry per new name, following the existing pattern (glyphs as functions returning SVG children; note the component's caveat about which SVG child tags the Solid compiler namespaces correctly — e.g.<line>is drawn as an equivalent<path>).lucide-solidcomponent references typed viaLucideProps; rework to theIcon-based equivalent (e.g. anIconNamestring rendered by the shared layout), removing theLucidePropstype import.lucide-solidchevron imports withIconusages.package.json— remove thelucide-soliddependency (and its lockfile entries).lucide-solid(the settings layout test does) — rework to theIcon-based rendering; existing assertions on accessible names must keep passing.Acceptance criteria:
lucide-solidremains anywhere in the web app source or testslucide-solidis removed from the web app's dependencies and lockfileIconcomponent with no visible glyph change (same designs, sizes, stroke behavior)currentColorand render correctly in light and dark themes<svg>staysaria-hiddenwith accessible names on enclosing controls; existing accessibility-related test assertions still passOut of scope:
Iconcomponent API beyond extending the name unionlucide-solidusage from the settings rework was folded back in