refactor(web): migrate all ad-hoc inline SVG icons to lucide-solid #199

Open
opened 2026-07-22 02:08:51 +02:00 by dominik.polakovics · 0 comments

What to build

Replace every hand-inlined SVG icon in the web SPA with the equivalent icon from lucide-solid, so the app uses one icon system throughout. The dependency and usage pattern (per-icon imports, currentColor, ~18–20px) are established by the settings rework (#198) — follow the same conventions.

Known ad-hoc inline SVGs to migrate (sweep the codebase for the rest): the SideNav gear (Settings link), hamburger/menu in the mobile top strip, chevrons (rail collapse/re-open, breadcrumb/disclosure arrows), and any other one-off <svg> elements in components. Where an exact Lucide equivalent exists, use it; where the current glyph is bespoke, pick the closest Lucide icon rather than keeping a mixed system.

Visual size/stroke should match the current rendering closely enough that layouts don't shift (Lucide is 24px stroke-based like the existing glyphs; set explicit size per site).

Acceptance criteria

  • No hand-inlined <svg> icon markup remains in web/src components (decorative/non-icon SVGs, if any, are out of scope — note them in the PR if kept)
  • All icons imported per-icon from lucide-solid (tree-shaken; no full-library import)
  • Icons inherit currentColor and render correctly in light and dark themes
  • No layout shifts: sizes match the previous glyphs at each call site
  • Interactive icons keep their existing accessible names/labels (aria-label/title unchanged)

Blocked by

## What to build Replace every hand-inlined SVG icon in the web SPA with the equivalent icon from `lucide-solid`, so the app uses one icon system throughout. The dependency and usage pattern (per-icon imports, `currentColor`, ~18–20px) are established by the settings rework (#198) — follow the same conventions. Known ad-hoc inline SVGs to migrate (sweep the codebase for the rest): the SideNav gear (Settings link), hamburger/menu in the mobile top strip, chevrons (rail collapse/re-open, breadcrumb/disclosure arrows), and any other one-off `<svg>` elements in components. Where an exact Lucide equivalent exists, use it; where the current glyph is bespoke, pick the closest Lucide icon rather than keeping a mixed system. Visual size/stroke should match the current rendering closely enough that layouts don't shift (Lucide is 24px stroke-based like the existing glyphs; set explicit `size` per site). ## Acceptance criteria - [ ] No hand-inlined `<svg>` icon markup remains in `web/src` components (decorative/non-icon SVGs, if any, are out of scope — note them in the PR if kept) - [ ] All icons imported per-icon from `lucide-solid` (tree-shaken; no full-library import) - [ ] Icons inherit `currentColor` and render correctly in light and dark themes - [ ] No layout shifts: sizes match the previous glyphs at each call site - [ ] Interactive icons keep their existing accessible names/labels (aria-label/title unchanged) ## Blocked by - #198
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Cloonar/coding-lab#199
No description provided.