import { html } from 'lit' import { customElement, property } from 'lit/decorators.js' import { TailwindStyledElement } from '@/shared/tailwind-element' import style from './style.scss?inline' import { addPhoto } from './icons/add-photo' import { arrowDownLg } from './icons/arrow-down-lg' import { arrowDownSm } from './icons/arrow-down-sm' import { arrowLeftLg } from './icons/arrow-left-lg' import { arrowLeftSm } from './icons/arrow-left-sm' import { arrowRightLg } from './icons/arrow-right-lg' import { arrowRightSm } from './icons/arrow-right-sm' import { arrowUpLg } from './icons/arrow-up-lg' import { arrowUpSm } from './icons/arrow-up-sm' import { barbellOutline } from './icons/barbell-outline' import { bulbOutline } from './icons/bulb-outline' import { camera } from './icons/camera' import { clipboard } from './icons/clipboard' import { clock } from './icons/clock' import { closeLg } from './icons/close-lg' import { closeSm } from './icons/close-sm' import { cloud } from './icons/cloud' import { compassOutline } from './icons/compass-outline' import { completeFilled } from './icons/complete-filled' import { completeOutline } from './icons/complete-outline' import { contractLock } from './icons/contract-lock' import { connect } from './icons/connect' import { connections } from './icons/connections' import { controller } from './icons/controller' import { copy } from './icons/copy' import { crossOutline } from './icons/cross-outline' import { dots } from './icons/dots' import { edit } from './icons/edit' import { error } from './icons/error' import { expand } from './icons/expand' import { extension } from './icons/extension' import { eyeHide } from './icons/eye-hide' import { eyeShow } from './icons/eye-show' import { filter } from './icons/filter' import { fishOutline } from './icons/fish-outline' import { flip } from './icons/flip' import { globe } from './icons/globe' import { hamburger } from './icons/hamburger' import { infinite } from './icons/infinite' import { information } from './icons/information' import { keyOutline } from './icons/key-outline' import { link } from './icons/link' import { link1 } from './icons/link1' import { link2 } from './icons/link2' import { link3 } from './icons/link3' import { link4 } from './icons/link4' import { loading } from './icons/loading' import { location } from './icons/location' import { locked } from './icons/locked' import { login } from './icons/login' import { login2 } from './icons/login-2' import { login3 } from './icons/login-3' import { logoChrome } from './icons/logo-chrome' import { mail } from './icons/mail' import { menu1 } from './icons/menu-1' import { menu2 } from './icons/menu-2' import { migrate } from './icons/migrate' import { minimize } from './icons/minimize' import { network } from './icons/network' import { notifications } from './icons/notifications' import { phonePortraitOutline } from './icons/phone-portrait-outline' import { pin } from './icons/pin' import { playFilled } from './icons/play-filled' import { playOutline } from './icons/play-outline' import { plus } from './icons/plus' import { profileAdd } from './icons/profile-add' import { profileExport } from './icons/profile-export' import { profileImport } from './icons/profile-import' import { profileRecovery } from './icons/profile-recovery' import { profileRecovery2 } from './icons/profile-recovery-2' import { profileRestore } from './icons/profile-restore' import { profile } from './icons/profile' import { qrCode } from './icons/qr-code' import { relayer } from './icons/relayer' import { reload } from './icons/reload' import { returnDown } from './icons/return-down' import { returnLeft } from './icons/return-left' import { returnRight } from './icons/return-right' import { returnUp } from './icons/return-up' import { search } from './icons/search' import { settings } from './icons/settings' import { smartContractDoc } from './icons/smart-contract-doc' import { smartContract } from './icons/smart-contract' import { starFilled } from './icons/star-filled' import { starOutline } from './icons/star-outline' import { stepDot } from './icons/step-dot' import { stepProgress } from './icons/step-progress' import { steps } from './icons/steps' import { tick } from './icons/tick' import { timerOutline } from './icons/timer-outline' import { transactionReceive } from './icons/transaction-receive' import { transactionSend } from './icons/transaction-send' import { transfer } from './icons/transfer' import { trash } from './icons/trash' import { turnDown } from './icons/turn-down' import { turnLeft } from './icons/turn-left' import { turnRight } from './icons/turn-right' import { turnUp } from './icons/turn-up' import { unlocked } from './icons/unlocked' import { walletOutline } from './icons/wallet-outline' import { warningRound } from './icons/warning-round' import { warningTriangle } from './icons/warning-triangle' import { googleColor } from './icons/google-color' import { ethLogo } from './icons/eth-logo' import { lyxLogo } from './icons/lyx-logo' import { progressIndicator } from './icons/progress-indicator' import { pulseDot } from './icons/pulse-dot' import { progressComplete } from './icons/progress-complete' import { completeFilledFadeIn } from './icons/complete-filled-fade-in' export type IconOptions = { width: number height: number color: string strokeWidth: number secondaryColor?: string } export type IconSize = 'small' | 'medium' | 'large' | 'x-large' type IconSizeDef = { width: number height: number strokeWidth: number } const iconMap = { 'add-photo': addPhoto, 'arrow-down-lg': arrowDownLg, 'arrow-down-sm': arrowDownSm, 'arrow-left-lg': arrowLeftLg, 'arrow-left-sm': arrowLeftSm, 'arrow-right-lg': arrowRightLg, 'arrow-right-sm': arrowRightSm, 'arrow-up-lg': arrowUpLg, 'arrow-up-sm': arrowUpSm, 'barbell-outline': barbellOutline, 'bulb-outline': bulbOutline, camera, clipboard, clock, 'close-lg': closeLg, 'close-sm': closeSm, cloud, 'compass-outline': compassOutline, 'complete-filled': completeFilled, 'complete-outline': completeOutline, connect, connections, 'contract-lock': contractLock, controller, copy, 'cross-outline': crossOutline, dots, edit, error, expand, extension, 'eye-hide': eyeHide, 'eye-show': eyeShow, filter, 'fish-outline': fishOutline, flip, globe, hamburger, infinite, information, 'key-outline': keyOutline, link, 'link-1': link1, 'link-2': link2, 'link-3': link3, 'link-4': link4, loading, location, locked, login, 'login-2': login2, 'login-3': login3, 'logo-chrome': logoChrome, mail, 'menu-1': menu1, 'menu-2': menu2, migrate, minimize, network, notifications, 'phone-portrait-outline': phonePortraitOutline, pin, 'play-filled': playFilled, 'play-outline': playOutline, plus, 'profile-add': profileAdd, 'profile-export': profileExport, 'profile-import': profileImport, 'profile-recovery': profileRecovery, 'profile-recovery-2': profileRecovery2, 'profile-restore': profileRestore, profile, 'qr-code': qrCode, relayer, reload, 'return-down': returnDown, 'return-left': returnLeft, 'return-right': returnRight, 'return-up': returnUp, search, settings, 'smart-contract-doc': smartContractDoc, 'smart-contract': smartContract, 'star-filled': starFilled, 'star-outline': starOutline, 'step-dot': stepDot, 'step-progress': stepProgress, steps, tick, 'timer-outline': timerOutline, 'transaction-receive': transactionReceive, 'transaction-send': transactionSend, transfer, trash, 'turn-down': turnDown, 'turn-left': turnLeft, 'turn-right': turnRight, 'turn-up': turnUp, unlocked, 'wallet-outline': walletOutline, 'warning-round': warningRound, 'warning-triangle': warningTriangle, 'google-color': googleColor, 'eth-logo': ethLogo, 'lyx-logo': lyxLogo, 'progress-indicator': progressIndicator, 'pulse-dot': pulseDot, 'progress-complete': progressComplete, 'complete-filled-fade-in': completeFilledFadeIn, } @customElement('lukso-icon') export class LuksoIcon extends TailwindStyledElement(style) { @property({ type: String }) name = '' @property({ type: String }) size = 'medium' @property({ type: String }) color = 'neutral-20' @property({ type: String, attribute: 'secondary-color' }) secondaryColor = '' private sizes: { [key in IconSize]: IconSizeDef } = { small: { width: 16, height: 16, strokeWidth: 2, }, medium: { width: 24, height: 24, strokeWidth: 1.5, }, large: { width: 32, height: 32, strokeWidth: 1.5, }, 'x-large': { width: 40, height: 40, strokeWidth: 1.5, }, } render() { const icon = iconMap[this.name] if (!icon) { console.warn(`Icon ${this.name} not found`) } const size = this.sizes[this.size] if (!size) { console.warn(`Size ${this.size} not found`) } return html` ${icon({ width: size.width, height: size.height, color: this.color, strokeWidth: size.strokeWidth, secondaryColor: this.secondaryColor, })} ` } } declare global { interface HTMLElementTagNameMap { 'lukso-icon': LuksoIcon } }