/* * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { BaseElement, element } from '../BaseElement.js'; @element('lit-icon') export class LitIcon extends BaseElement { private view?: number; private icon: HTMLElement | undefined | null; private use: SVGUseElement | undefined | null; private d: SVGPathElement | undefined | null; private _name?: string; private _size?: number; private _color?: string; private _path?: string; static get observedAttributes() { return ['name', 'size', 'color', 'path']; } get name(): string { return this.getAttribute('name') || ''; } set name(value: string) { this._name = value; this.setAttribute('name', value); } get size(): number { return parseInt(this.getAttribute('size') || '0', 10); } set size(value: number) { this._size = value; this.setAttribute('size', `${value}`); } set color(value: string) { this._color = value; this.setAttribute('color', value); } set path(value: string) { this._path = value; this.setAttribute('path', value); } initHtml(): string { return ` `; } initElements() { if (this.shadowRoot) { this.icon = this.shadowRoot.getElementById('icon'); this.use = this.shadowRoot.querySelector('use'); this.d = this.shadowRoot.querySelector('path'); } } attributeChangedCallback(name: string, oldValue: string, value: string) { switch (name) { case 'name': if (this.use) this.use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', `./base-ui/icon.svg#icon-${value}`); break; case 'path': if (this.d) this.d.setAttribute('d', value); break; case 'color': if (this.icon) this.icon.style.color = value as string; break; case 'size': if (this.icon) this.icon.style.fontSize = `${value}px`; break; } } }