# Inline-SVG → Subframe Feather migration (cheat sheet) The icon-**component** migration is complete (all `components/ui/icons/**`, `components/layouts/icons/**`, `modules/workflowEngine/components/icons/**`, plus the `lucide-react` / `@radix-ui/react-icons` / `@heroicons` vendor libraries via `components/ui/icons/vendor.tsx`). Remaining: ~178 files contain raw inline `…` glyphs (270 occurrences). Many are standard heroicons/lucide glyphs that should be replaced with the Subframe Feather icons exported from `~/components/ui/icons/vendor`. Replace the whole `…` element with the mapped icon component, **preserving the original `className` verbatim** (the vendor wrapper bridges sizing via `[&>svg]:size-full`). ## Known path `d` → vendor icon (deterministic) | path `d` (prefix) | glyph | replace with | | --- | --- | --- | | `M12 6v6m0 0v6m0-6h6m-6 0H6` | plus (outline) | `PlusIcon` | | `M12 4v16m8-8H4` | plus (outline) | `PlusIcon` | | `M10.75 4.75a.75.75 0 00-1.5 0v4.5…` | plus (small) | `PlusIcon` | | `M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293…` | chevron-down (solid) | `ChevronDownIcon` | | `M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293…` | chevron-up (solid) | `ChevronUpIcon` | | `M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707…` | chevron-right (solid) | `ChevronRightIcon` | | `M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293…` | chevron-left (solid) | `ChevronLeftIcon` | | `M15.75 19.5L8.25 12l7.5-7.5` | chevron-left (outline) | `ChevronLeftIcon` | | `M9 5l7 7-7 7` | chevron-right (outline) | `ChevronRightIcon` | | `M6 18L18 6M6 6l12 12` | x-mark (outline) | `XIcon` | | `M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0…` | x-circle | `XCircleIcon` | | `M16.707 5.293a1 1 0 010 1.414l-8 8…` | check (solid) | `CheckIcon` | | `M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z` | check-circle | `CheckCircleIcon` | | `M6 12L3.269 3.126A59.768 59.768 0 0121.485 12…` | paper-airplane / send | `SendIcon` | | `M15 12H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z` | minus-circle | `MinusIcon` | | `M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7…` | calendar | `CalendarIcon` | | `M8 4a4 4 0 100 8 4 4 0 000-8z…` / `M21 21l-6-6m2-5a7 7 0 11-14 0…` | search | `SearchIcon` | | `M2.458 12C3.732 7.943 7.523 5 12 5…` (+ `M15 12a3 3 0 11-6 0…`) | eye | `EyeIcon` | | home / house glyph (`M2.25 12l8.954-8.955…` or `M3 12l2-2m0 0l7-7 7 7…`) | home | `HomeIcon` | | star (`M11.48 3.499a.562…` or `M9.049 2.927c.3-.921…`) | star | `StarIcon` | | envelope (`M2.25 6.75c0-1.243…` / `M3 8l7.89 5.26…` / `M4 4h16v16H4z`-mail) | mail | `MailIcon` | | at-symbol (`M16.5 12a4.5 4.5 0 11-9 0…`) | at-sign | `AtSignIcon` | | phone (`M2.25 6.75c0 8.284…` / `M3 5a2 2 0…`) | phone | `PhoneIcon` | | exclamation-triangle (`M12 9v3.75m-9.303 3.376…` / `M10.29 3.86…`) | warning | `AlertTriangleIcon` | | arrow-up (solid `M3.293 9.707a1 1 0 010-1.414l6-6…` / outline `M4.5 15.75l7.5-7.5 7.5 7.5`) | arrow-up | `ArrowUpIcon` | | globe (`M12 21a9.004 9.004 0 008.716-6.747…` / `M21 12a9 9 0 11-18 0…` with meridians) | globe/language | `GlobeIcon` or `LanguagesIcon` | | question-mark-circle (`M9.879 7.519c1.171-1.025…`) / info (`M11.25 11.25l.041-.02…`) | help/info | `HelpCircleIcon` / `InfoIcon` | | trending-up (`M2.25 18L9 11.25l4.306 4.307…`) / trending-down | trend | `TrendingUpIcon` / `TrendingDownIcon` | | pilcrow / paragraph (`M13 4v16M17 4v16M19 4H9.5a4.5…`) | pilcrow | `PilcrowIcon` | ## Rules for the migration 1. **Preserve `className` exactly** (copy the original `className=…` onto the replacement icon). Sizing (`h-4 w-4`, `size-4`) and color (`text-*`) keep working. 2. Only replace SVGs that are a **standard single-glyph UI icon** identifiable from the table above or unambiguous context. When in doubt, leave it. 3. **Leave bespoke graphics**: multi-path illustrations, brand logos, the `viewBox="0 0 172 172"` icon8-style art, empty-state art, charts, the PDF viewer, `dangerouslySetInnerHTML` icons. These are not icon-set glyphs. 4. Add `import { … } from "~/components/ui/icons/vendor"` (merge into an existing vendor import if present). 5. Never insert JSX comments inside `{cond && ( … )}` expressions. 6. After each batch: `npm run typecheck` and `npm run build` must stay green.