import { h } from 'vue' import type { IconSet, IconProps } from 'vuetify' import { mdiAccount, mdiAccountPlus, mdiAlert, mdiArchive, mdiBackspace, mdiBookOpenPageVariant, mdiChartBar, mdiChartLine, mdiCheck, mdiCheckboxBlankOutline, mdiCheckboxMarked, mdiChevronDown, mdiChevronLeft, mdiChevronRight, mdiChevronUp, mdiClockOutline, mdiClose, mdiCloseCircle, mdiCodeArray, mdiCog, mdiCommentText, mdiConsole, mdiContentCopy, mdiContentSave, mdiDelete, mdiDeleteForever, mdiDeleteSweep, mdiDns, mdiDotsVertical, mdiDownload, mdiEarthArrowRight, mdiEye, mdiEyeOff, mdiFileDocumentOutline, mdiFileTree, mdiFingerprint, mdiFormatLineSpacing, mdiHeart, mdiHeartPulse, mdiImage, mdiInformation, mdiLock, mdiLogin, mdiLogout, mdiMagnify, mdiMenuDown, mdiMinus, mdiMonitor, mdiPalette, mdiPause, mdiPencil, mdiPlay, mdiPlus, mdiPlusBox, mdiPound, mdiPower, mdiPowerPlug, mdiRadioboxBlank, mdiRadioboxMarked, mdiRefresh, mdiShield, mdiSkipNext, mdiSkipPrevious, mdiTimer, mdiTimerSand, mdiUndo, mdiUnfoldLessHorizontal, mdiUnfoldMoreHorizontal, mdiUpload, mdiWeb, mdiWrap, mdiWrapDisabled, } from '@mdi/js' // Map kebab-case mdi icon names to SVG paths (tree-shakeable) const iconMap: Record = { 'mdi-account': mdiAccount, 'mdi-account-plus': mdiAccountPlus, 'mdi-alert': mdiAlert, 'mdi-archive': mdiArchive, 'mdi-backspace': mdiBackspace, 'mdi-book-open-page-variant': mdiBookOpenPageVariant, 'mdi-chart-bar': mdiChartBar, 'mdi-chart-line': mdiChartLine, 'mdi-check': mdiCheck, 'mdi-checkbox-blank-outline': mdiCheckboxBlankOutline, 'mdi-checkbox-marked': mdiCheckboxMarked, 'mdi-chevron-down': mdiChevronDown, 'mdi-chevron-left': mdiChevronLeft, 'mdi-chevron-right': mdiChevronRight, 'mdi-chevron-up': mdiChevronUp, 'mdi-clock-outline': mdiClockOutline, 'mdi-close': mdiClose, 'mdi-close-circle': mdiCloseCircle, 'mdi-code-array': mdiCodeArray, 'mdi-cog': mdiCog, 'mdi-comment-text': mdiCommentText, 'mdi-console': mdiConsole, 'mdi-content-copy': mdiContentCopy, 'mdi-content-save': mdiContentSave, 'mdi-delete': mdiDelete, 'mdi-delete-forever': mdiDeleteForever, 'mdi-delete-sweep': mdiDeleteSweep, 'mdi-dns': mdiDns, 'mdi-dots-vertical': mdiDotsVertical, 'mdi-download': mdiDownload, 'mdi-earth-arrow-right': mdiEarthArrowRight, 'mdi-eye': mdiEye, 'mdi-eye-off': mdiEyeOff, 'mdi-file-document-outline': mdiFileDocumentOutline, 'mdi-file-tree': mdiFileTree, 'mdi-fingerprint': mdiFingerprint, 'mdi-format-line-spacing': mdiFormatLineSpacing, 'mdi-heart': mdiHeart, 'mdi-heart-pulse': mdiHeartPulse, 'mdi-image': mdiImage, 'mdi-information': mdiInformation, 'mdi-lock': mdiLock, 'mdi-login': mdiLogin, 'mdi-logout': mdiLogout, 'mdi-magnify': mdiMagnify, 'mdi-menu-down': mdiMenuDown, 'mdi-minus': mdiMinus, 'mdi-monitor': mdiMonitor, 'mdi-palette': mdiPalette, 'mdi-pause': mdiPause, 'mdi-pencil': mdiPencil, 'mdi-play': mdiPlay, 'mdi-plus': mdiPlus, 'mdi-plus-box': mdiPlusBox, 'mdi-pound': mdiPound, 'mdi-power': mdiPower, 'mdi-power-plug': mdiPowerPlug, 'mdi-radiobox-blank': mdiRadioboxBlank, 'mdi-radiobox-marked': mdiRadioboxMarked, 'mdi-refresh': mdiRefresh, 'mdi-shield': mdiShield, 'mdi-skip-next': mdiSkipNext, 'mdi-skip-previous': mdiSkipPrevious, 'mdi-timer': mdiTimer, 'mdi-timer-sand': mdiTimerSand, 'mdi-undo': mdiUndo, 'mdi-unfold-less-horizontal': mdiUnfoldLessHorizontal, 'mdi-unfold-more-horizontal': mdiUnfoldMoreHorizontal, 'mdi-upload': mdiUpload, 'mdi-web': mdiWeb, 'mdi-wrap': mdiWrap, 'mdi-wrap-disabled': mdiWrapDisabled, } // Custom icon set: resolves both SVG path strings (from Vuetify aliases) // and mdi-* kebab-case names (from component templates) const component = (props: IconProps) => { const icon = props.icon as string // Vuetify aliases resolve to raw SVG path strings (start with 'M') const svgPath = icon.startsWith('M') ? icon : iconMap[icon] if (!svgPath) { console.warn(`[p3xr] Unknown MDI icon: ${icon}`) return h('span') } return h('svg', { class: 'v-icon__svg', xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24', role: 'img', 'aria-hidden': 'true', }, [ h('path', { d: svgPath, fill: 'currentColor' }), ]) } export const mdiSvgIconSet: IconSet = { component }