RSS Git Download  Clone
Raw Blame History 4kB 152 lines
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),
            )
        }
    }
}