UNPKG

carbon-components-angular

Version:
127 lines 14.7 kB
import { Directive, Input } from "@angular/core"; import { getAttributes } from "@carbon/icon-helpers"; import * as i0 from "@angular/core"; import * as i1 from "./icon.service"; /** * A directive for populating a svg element based on the provided carbon icon name. * * Get started with importing the module: * * ```typescript * import { IconModule } from 'carbon-components-angular'; * ``` * * [See demo](../../?path=/story/components-icon--basic) */ export class IconDirective { constructor(elementRef, iconService) { this.elementRef = elementRef; this.iconService = iconService; this.cdsIcon = ""; this.size = "16"; this.title = ""; this.ariaLabel = ""; this.ariaLabelledBy = ""; this.ariaHidden = ""; this.isFocusable = false; } /** * @deprecated since v5 - Use `cdsIcon` input property instead */ set ibmIcon(iconName) { this.cdsIcon = iconName; } renderIcon(iconName) { const root = this.elementRef.nativeElement; let icon; try { icon = this.iconService.get(iconName, this.size.toString()); } catch (error) { console.warn(error); // bail out return; } const domParser = new DOMParser(); const rawSVG = icon.svg; const svgElement = domParser.parseFromString(rawSVG, "image/svg+xml").documentElement; let node = root.tagName.toUpperCase() !== "SVG" ? svgElement : svgElement.firstChild; root.innerHTML = ""; // Clear root element while (node) { // importNode makes a clone of the node // this ensures we keep looping over the nodes in the parsed document root.appendChild(root.ownerDocument.importNode(node, true)); // type the node because the angular compiler freaks out if it // ends up thinking it's a `Node` instead of a `ChildNode` node = node.nextSibling; } const svg = root.tagName.toUpperCase() !== "SVG" ? svgElement : root; svg.setAttribute("xmlns", "http://www.w3.org/2000/svg"); const attributes = getAttributes({ width: icon.attrs.width, height: icon.attrs.height, viewBox: icon.attrs.viewBox, title: this.title, "aria-label": this.ariaLabel, "aria-labelledby": this.ariaLabelledBy, "aria-hidden": this.ariaHidden, focusable: this.isFocusable.toString() }); const attrKeys = Object.keys(attributes); for (let i = 0; i < attrKeys.length; i++) { const key = attrKeys[i]; const value = attributes[key]; if (key === "title") { continue; } if (value) { svg.setAttribute(key, value); } } if (attributes["title"]) { const title = document.createElement("title"); title.textContent = attributes.title; IconDirective.titleIdCounter++; title.setAttribute("id", `${icon.name}-title-${IconDirective.titleIdCounter}`); // title must be first for screen readers svg.insertBefore(title, svg.firstElementChild); svg.setAttribute("aria-labelledby", `${icon.name}-title-${IconDirective.titleIdCounter}`); } } ngAfterViewInit() { this.renderIcon(this.cdsIcon); } ngOnChanges({ cdsIcon }) { // We want to ignore first change to let the icon register // and add only after view has been initialized if (cdsIcon && !cdsIcon.isFirstChange()) { this.renderIcon(this.cdsIcon); } } } IconDirective.titleIdCounter = 0; IconDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconDirective, deps: [{ token: i0.ElementRef }, { token: i1.IconService }], target: i0.ɵɵFactoryTarget.Directive }); IconDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: { ibmIcon: "ibmIcon", cdsIcon: "cdsIcon", size: "size", title: "title", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", ariaHidden: "ariaHidden", isFocusable: "isFocusable" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconDirective, decorators: [{ type: Directive, args: [{ selector: "[cdsIcon], [ibmIcon]" }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.IconService }]; }, propDecorators: { ibmIcon: [{ type: Input }], cdsIcon: [{ type: Input }], size: [{ type: Input }], title: [{ type: Input }], ariaLabel: [{ type: Input }], ariaLabelledBy: [{ type: Input }], ariaHidden: [{ type: Input }], isFocusable: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaWNvbi9pY29uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sU0FBUyxFQUVULEtBQUssRUFHTCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUVyRDs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFPLGFBQWE7SUF5QnpCLFlBQ1csVUFBc0IsRUFDdEIsV0FBd0I7UUFEeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWhCMUIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLFNBQUksR0FBRyxJQUFJLENBQUM7UUFFWixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXBCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFLMUIsQ0FBQztJQTFCSjs7T0FFRztJQUNILElBQWEsT0FBTyxDQUFDLFFBQWdCO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUF1QkQsVUFBVSxDQUFDLFFBQWdCO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBNEIsQ0FBQztRQUUxRCxJQUFJLElBQUksQ0FBQztRQUNULElBQUk7WUFDSCxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixXQUFX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QUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDMUY7SUFDRixDQUFDO0lBRUQsZUFBZTtRQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQWlCO1FBQ3JDLDBEQUEwRDtRQUMxRCwrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUI7SUFDRixDQUFDOztBQWpHTSw0QkFBYyxHQUFHLENBQUMsQ0FBQzswR0FUZCxhQUFhOzhGQUFiLGFBQWE7MkZBQWIsYUFBYTtrQkFIekIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsc0JBQXNCO2lCQUNoQzsySEFNYSxPQUFPO3NCQUFuQixLQUFLO2dCQU1HLE9BQU87c0JBQWYsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBZnRlclZpZXdJbml0LFxuXHREaXJlY3RpdmUsXG5cdEVsZW1lbnRSZWYsXG5cdElucHV0LFxuXHRPbkNoYW5nZXMsXG5cdFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEljb25TZXJ2aWNlIH0gZnJvbSBcIi4vaWNvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBnZXRBdHRyaWJ1dGVzIH0gZnJvbSBcIkBjYXJib24vaWNvbi1oZWxwZXJzXCI7XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgZm9yIHBvcHVsYXRpbmcgYSBzdmcgZWxlbWVudCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY2FyYm9uIGljb24gbmFtZS5cbiAqXG4gKiBHZXQgc3RhcnRlZCB3aXRoIGltcG9ydGluZyB0aGUgbW9kdWxlOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEljb25Nb2R1bGUgfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqIGBgYFxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtaWNvbi0tYmFzaWMpXG4gKi9cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogXCJbY2RzSWNvbl0sIFtpYm1JY29uXVwiXG59KVxuZXhwb3J0IGNsYXNzIEljb25EaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2NSAtIFVzZSBgY2RzSWNvbmAgaW5wdXQgcHJvcGVydHkgaW5zdGVhZFxuXHQgKi9cblx0QElucHV0KCkgc2V0IGlibUljb24oaWNvbk5hbWU6IHN0cmluZykge1xuXHRcdHRoaXMuY2RzSWNvbiA9IGljb25OYW1lO1xuXHR9XG5cblx0c3RhdGljIHRpdGxlSWRDb3VudGVyID0gMDtcblxuXHRASW5wdXQoKSBjZHNJY29uID0gXCJcIjtcblxuXHRASW5wdXQoKSBzaXplID0gXCIxNlwiO1xuXG5cdEBJbnB1dCgpIHRpdGxlID0gXCJcIjtcblxuXHRASW5wdXQoKSBhcmlhTGFiZWwgPSBcIlwiO1xuXG5cdEBJbnB1dCgpIGFyaWFMYWJlbGxlZEJ5ID0gXCJcIjtcblxuXHRASW5wdXQoKSBhcmlhSGlkZGVuID0gXCJcIjtcblxuXHRASW5wdXQoKSBpc0ZvY3VzYWJsZSA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuXHRcdHByb3RlY3RlZCBpY29uU2VydmljZTogSWNvblNlcnZpY2Vcblx0KSB7fVxuXG5cdHJlbmRlckljb24oaWNvbk5hbWU6IHN0cmluZykge1xuXHRcdGNvbnN0IHJvb3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuXHRcdGxldCBpY29uO1xuXHRcdHRyeSB7XG5cdFx0XHRpY29uID0gdGhpcy5pY29uU2VydmljZS5nZXQoaWNvbk5hbWUsIHRoaXMuc2l6ZS50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS53YXJuKGVycm9yKTtcblx0XHRcdC8vIGJhaWwgb3V0XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdGNvbnN0IHJhd1NWRyA9IGljb24uc3ZnO1xuXHRcdGNvbnN0IHN2Z0VsZW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJhd1NWRywgXCJpbWFnZS9zdmcreG1sXCIpLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdGxldCBub2RlOiBDaGlsZE5vZGUgPSByb290LnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJTVkdcIiA/IHN2Z0VsZW1lbnQgOiBzdmdFbGVtZW50LmZpcnN0Q2hpbGQ7XG5cdFx0cm9vdC5pbm5lckhUTUwgPSBcIlwiOyAvLyBDbGVhciByb290IGVsZW1lbnRcblx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0Ly8gaW1wb3J0Tm9kZSBtYWtlcyBhIGNsb25lIG9mIHRoZSBub2RlXG5cdFx0XHQvLyB0aGlzIGVuc3VyZXMgd2Uga2VlcCBsb29waW5nIG92ZXIgdGhlIG5vZGVzIGluIHRoZSBwYXJzZWQgZG9jdW1lbnRcblx0XHRcdHJvb3QuYXBwZW5kQ2hpbGQocm9vdC5vd25lckRvY3VtZW50LmltcG9ydE5vZGUobm9kZSwgdHJ1ZSkpO1xuXHRcdFx0Ly8gdHlwZSB0aGUgbm9kZSBiZWNhdXNlIHRoZSBhbmd1bGFyIGNvbXBpbGVyIGZyZWFrcyBvdXQgaWYgaXRcblx0XHRcdC8vIGVuZHMgdXAgdGhpbmtpbmcgaXQncyBhIGBOb2RlYCBpbnN0ZWFkIG9mIGEgYENoaWxkTm9kZWBcblx0XHRcdG5vZGUgPSBub2RlLm5leHRTaWJsaW5nIGFzIENoaWxkTm9kZTtcblx0XHR9XG5cblx0XHRjb25zdCBzdmcgPSByb290LnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJTVkdcIiA/IHN2Z0VsZW1lbnQgOiByb290O1xuXHRcdHN2Zy5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIpO1xuXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoe1xuXHRcdFx0d2lkdGg6IGljb24uYXR0cnMud2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGljb24uYXR0cnMuaGVpZ2h0LFxuXHRcdFx0dmlld0JveDogaWNvbi5hdHRycy52aWV3Qm94LFxuXHRcdFx0dGl0bGU6IHRoaXMudGl0bGUsXG5cdFx0XHRcImFyaWEtbGFiZWxcIjogdGhpcy5hcmlhTGFiZWwsXG5cdFx0XHRcImFyaWEtbGFiZWxsZWRieVwiOiB0aGlzLmFyaWFMYWJlbGxlZEJ5LFxuXHRcdFx0XCJhcmlhLWhpZGRlblwiOiB0aGlzLmFyaWFIaWRkZW4sXG5cdFx0XHRmb2N1c2FibGU6IHRoaXMuaXNGb2N1c2FibGUudG9TdHJpbmcoKVxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgYXR0cktleXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBhdHRyS2V5c1tpXTtcblx0XHRcdGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc1trZXldO1xuXG5cdFx0XHRpZiAoa2V5ID09PSBcInRpdGxlXCIpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRzdmcuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhdHRyaWJ1dGVzW1widGl0bGVcIl0pIHtcblx0XHRcdGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRpdGxlXCIpO1xuXHRcdFx0dGl0bGUudGV4dENvbnRlbnQgPSBhdHRyaWJ1dGVzLnRpdGxlO1xuXHRcdFx0SWNvbkRpcmVjdGl2ZS50aXRsZUlkQ291bnRlcisrO1xuXHRcdFx0dGl0bGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgYCR7aWNvbi5uYW1lfS10aXRsZS0ke0ljb25EaXJlY3RpdmUudGl0bGVJZENvdW50ZXJ9YCk7XG5cdFx0XHQvLyB0aXRsZSBtdXN0IGJlIGZpcnN0IGZvciBzY3JlZW4gcmVhZGVyc1xuXHRcdFx0c3ZnLmluc2VydEJlZm9yZSh0aXRsZSwgc3ZnLmZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdHN2Zy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIiwgYCR7aWNvbi5uYW1lfS10aXRsZS0ke0ljb25EaXJlY3RpdmUudGl0bGVJZENvdW50ZXJ9YCk7XG5cdFx0fVxuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdHRoaXMucmVuZGVySWNvbih0aGlzLmNkc0ljb24pO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoeyBjZHNJY29uIH06IFNpbXBsZUNoYW5nZXMpIHtcblx0XHQvLyBXZSB3YW50IHRvIGlnbm9yZSBmaXJzdCBjaGFuZ2UgdG8gbGV0IHRoZSBpY29uIHJlZ2lzdGVyXG5cdFx0Ly8gYW5kIGFkZCBvbmx5IGFmdGVyIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcblx0XHRpZiAoY2RzSWNvbiAmJiAhY2RzSWNvbi5pc0ZpcnN0Q2hhbmdlKCkpIHtcblx0XHRcdHRoaXMucmVuZGVySWNvbih0aGlzLmNkc0ljb24pO1xuXHRcdH1cblx0fVxufVxuIl19