import { Injectable } from '@angular/core'
import { MatIconRegistry } from '@angular/material/icon'
import { DomSanitizer } from '@angular/platform-browser'
import {
mdiAccount,
mdiArchive,
mdiBackspace,
mdiBookOpenPageVariant,
mdiCancel,
mdiChartBar,
mdiChartLine,
mdiCheck,
mdiCheckboxBlankOutline,
mdiCheckboxMarked,
mdiChevronDown,
mdiChevronLeft,
mdiChevronRight,
mdiChevronUp,
mdiClose,
mdiCodeArray,
mdiCog,
mdiCommentText,
mdiConsole,
mdiContentCopy,
mdiContentSave,
mdiDelete,
mdiDeleteForever,
mdiDeleteSweep,
mdiDns,
mdiDownload,
mdiEye,
mdiEyeOff,
mdiFileDocumentOutline,
mdiFileTree,
mdiFingerprint,
mdiFormatLineSpacing,
mdiGraph,
mdiHeart,
mdiHeartPulse,
mdiImage,
mdiInformation,
mdiLogin,
mdiLogout,
mdiMagnify,
mdiMinus,
mdiNoteText,
mdiPalette,
mdiPencil,
mdiPlus,
mdiPlusBox,
mdiPound,
mdiPower,
mdiRefresh,
mdiSkipNext,
mdiSkipPrevious,
mdiSwapVertical,
mdiTimer,
mdiTimerSand,
mdiUndo,
mdiUnfoldLessHorizontal,
mdiUnfoldMoreHorizontal,
mdiUpload,
mdiWrap,
} from '@mdi/js'
// Map Angular Material icon names to @mdi/js SVG paths (tree-shakeable)
const ICON_MAP: Record<string, string> = {
'account_tree': mdiFileTree,
'add': mdiPlus,
'add_box': mdiPlusBox,
'analytics': mdiChartBar,
'archive': mdiArchive,
'auto_graph': mdiGraph,
'backspace': mdiBackspace,
'bar_chart': mdiChartBar,
'cancel': mdiCancel,
'check_box': mdiCheckboxMarked,
'check_box_outline_blank': mdiCheckboxBlankOutline,
'chevron_right': mdiChevronRight,
'close': mdiClose,
'color_lens': mdiPalette,
'content_copy': mdiContentCopy,
'data_array': mdiCodeArray,
'delete': mdiDelete,
'delete_forever': mdiDeleteForever,
'delete_sweep': mdiDeleteSweep,
'description': mdiFileDocumentOutline,
'difference': mdiSwapVertical,
'done': mdiCheck,
'download': mdiDownload,
'edit': mdiPencil,
'expand_more': mdiChevronDown,
'favorite': mdiHeart,
'file_download': mdiDownload,
'file_upload': mdiUpload,
'fingerprint': mdiFingerprint,
'format_line_spacing': mdiFormatLineSpacing,
'hourglass_empty': mdiTimerSand,
'image': mdiImage,
'info': mdiInformation,
'keyboard_arrow_down': mdiChevronDown,
'keyboard_arrow_left': mdiChevronLeft,
'keyboard_arrow_right': mdiChevronRight,
'keyboard_arrow_up': mdiChevronUp,
'login': mdiLogin,
'logout': mdiLogout,
'menu_book': mdiBookOpenPageVariant,
'mode_comment': mdiCommentText,
'monitor_heart': mdiHeartPulse,
'notes': mdiNoteText,
'numbers': mdiPound,
'person': mdiAccount,
'power': mdiPower,
'refresh': mdiRefresh,
'remove': mdiMinus,
'save': mdiContentSave,
'search': mdiMagnify,
'settings': mdiCog,
'show_chart': mdiChartLine,
'skip_next': mdiSkipNext,
'skip_previous': mdiSkipPrevious,
'storage': mdiDns,
'terminal': mdiConsole,
'timer': mdiTimer,
'undo': mdiUndo,
'unfold_less': mdiUnfoldLessHorizontal,
'unfold_more': mdiUnfoldMoreHorizontal,
'upload': mdiUpload,
'visibility': mdiEye,
'visibility_off': mdiEyeOff,
'wrap_text': mdiWrap,
}
@Injectable({ providedIn: 'root' })
export class IconRegistryService {
constructor(
private iconRegistry: MatIconRegistry,
private sanitizer: DomSanitizer,
) {}
registerAll(): void {
for (const [name, path] of Object.entries(ICON_MAP)) {
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="${path}" fill="currentColor"/></svg>`
this.iconRegistry.addSvgIconLiteral(
name,
this.sanitizer.bypassSecurityTrustHtml(svg),
)
}
}
}