# Migrating from `lucide-angular` ⇒ `@lucide/angular` ## What changed `@lucide/angular` moves from a module + single component based API to a more modern Angular approach: - The library defines modern signal-based, standalone components, without zone.js based change detection. - Icons are consumed as standalone imports (one component per icon). - Dynamic icon registration is done via `provideLucideIcons()`, not using `NgModule`. - Static icons use per-icon components for better tree-shaking. - Dynamic icons still use a single dynamic component (`svg[lucideIcon]`). - Global defaults are configured via `provideLucideConfig()`. --- ## Step 1 – Update dependencies Remove `lucide-angular`, add `@lucide/angular`, see http://lucide.dev/guide/packages/angular#installation --- ## Step 2 – Replace `LucideAngularModule.pick(...)` with `provideLucideIcons(...)` > Notes: > - Old imports like `AirVentIcon` / `AlarmClock` from `lucide-angular` should be replaced with the new per-icon exports `LucideAirVent` and `LucideAlarmClock`. > - If you mostly used static icons, you may not need to provide them **at all**, please refer to Step 3. ### Before #### NgModule based ```ts import { BrowserModule, NgModule } from '@angular/core'; import { LucideAngularModule, AirVent, AlarmClock } from 'lucide-angular'; @NgModule({ imports: [ BrowserModule, LucideAngularModule.pick({ AirVent, AlarmClock }), ], }) export class AppModule {} ``` #### Standalone ```ts import { ApplicationConfig } from '@angular/core'; import { LucideAngularModule, AirVent, AlarmClock } from 'lucide-angular'; export const appConfig: ApplicationConfig = { providers: [ // ... importProvidersFrom(LucideAngularModule.pick({ AirVent, AlarmClock })), ] }; ``` ### After ```ts import { ApplicationConfig } from '@angular/core'; import { provideLucideIcons, LucideAirVent, LucideAlarmClock } from '@lucide/angular'; export const appConfig: ApplicationConfig = { providers: [ // ... provideLucideIcons( LucideAirVent, LucideAlarmClock, ), ] }; ``` --- ## Step 3 – Replace `` / `` / `` / `` The legacy package rendered everything through a single component. All of these selectors must be migrated to `` usage. ### A. Static icons by name If the icon is known at build time, just use a static import: #### Before ```html ``` #### After ```html ``` ### B. Static icons with icon data binding #### Before ```ts import { CircleCheck } from 'lucide-angular'; ``` ```html ``` #### After ```ts import { LucideCircleCheck } from '@lucide/angular'; ``` ```html ``` ...and import `LucideCircleCheck` from `@lucide/angular`. --- ### C. Dynamic icons If the icon varies at runtime, use the dynamic component: #### Before ```html ``` #### After ```html ``` --- ## Step 4 – Replace `LucideIconConfig` with `provideLucideConfig()` ### Before ```ts import { inject } from '@angular/core'; import { LucideIconConfig } from 'lucide-angular'; inject(LucideIconConfig).size = 12; ``` ### After ```ts import { provideLucideConfig } from '@lucide/angular'; providers: [ provideLucideConfig({ size: 12 }), ] ``` ### Where to place it - App-wide: `AppModule.providers` or `bootstrapApplication(...providers)` - Feature-level: feature module providers - Component-level (standalone): component `providers` --- ## Troubleshooting ### The icon is not being displayed If using per-icon-components: 1. Ensure that the icon component is being imported, if using per-icon-components 2. Check that the icon name matches exactly (case-sensitive) If using the dynamic component: 1. Ensure the icon is provided via `provideLucideIcons()` if using string names 2. Verify the icon is imported from `@lucide/angular` and not the legacy package ### TypeScript errors? Make sure you're importing from `@lucide/angular` and not `lucide-angular`. ### Icons render with wrong defaults Ensure `provideLucideConfig()` is used at the right level. --- ## TL;DR - `LucideAngularModule` ⇒ static: removed; dynamic: `LucideIcon` - `LucideAngularModule.pick(...)` ⇒ `provideLucideIcons(...)` - `` ⇒ `` - `` ⇒ `` - `` ⇒ `` - `LucideIconConfig` ⇒ `provideLucideConfig(...)`