import { HttpBackend, HttpClient } from '@angular/common/http'; import * as i0 from '@angular/core'; import { isDevMode, InjectionToken, inject, RendererFactory2, DOCUMENT, SecurityContext, Optional, Inject, Injectable, ElementRef, Renderer2, Input, Directive, makeEnvironmentProviders } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { Subject, of, Observable } from 'rxjs'; import { map, tap, finalize, catchError, share, filter, take } from 'rxjs/operators'; import { generate } from '@ant-design/colors'; const ANT_ICON_ANGULAR_CONSOLE_PREFIX = '[@ant-design/icons-angular]:'; function error(message) { console.error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX} ${message}.`); } function warn(message) { if (isDevMode()) { console.warn(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX} ${message}.`); } } function getSecondaryColor(primaryColor) { return generate(primaryColor)[0]; } function withSuffix(name, theme) { switch (theme) { case 'fill': return `${name}-fill`; case 'outline': return `${name}-o`; case 'twotone': return `${name}-twotone`; case undefined: return name; default: throw new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}Theme "${theme}" is not a recognized theme!`); } } function withSuffixAndColor(name, theme, pri, sec) { return `${withSuffix(name, theme)}-${pri}-${sec}`; } function mapAbbrToTheme(abbr) { return abbr === 'o' ? 'outline' : abbr; } function alreadyHasAThemeSuffix(name) { return name.endsWith('-fill') || name.endsWith('-o') || name.endsWith('-twotone'); } function isIconDefinition(target) { return (typeof target === 'object' && typeof target.name === 'string' && (typeof target.theme === 'string' || target.theme === undefined) && typeof target.icon === 'string'); } /** * Get an `IconDefinition` object from abbreviation type, like `account-book-fill`. * @param str */ function getIconDefinitionFromAbbr(str) { const arr = str.split('-'); const theme = mapAbbrToTheme(arr.splice(arr.length - 1, 1)[0]); const name = arr.join('-'); return { name, theme, icon: '' }; } function cloneSVG(svg) { return svg.cloneNode(true); } /** * Parse inline SVG string and replace colors with placeholders. For twotone icons only. */ function replaceFillColor(raw) { return raw .replace(/['"]#333['"]/g, '"primaryColor"') .replace(/['"]#E6E6E6['"]/g, '"secondaryColor"') .replace(/['"]#D9D9D9['"]/g, '"secondaryColor"') .replace(/['"]#D8D8D8['"]/g, '"secondaryColor"'); } /** * Split a name with namespace in it into a tuple like [ name, namespace ]. */ function getNameAndNamespace(type) { const split = type.split(':'); switch (split.length) { case 1: return [type, '']; case 2: return [split[1], split[0]]; default: throw new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}The icon type ${type} is not valid!`); } } function hasNamespace(type) { return getNameAndNamespace(type)[1] !== ''; } function NameSpaceIsNotSpecifyError() { return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}Type should have a namespace. Try "namespace:${name}".`); } function IconNotFoundError(icon) { return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}the icon ${icon} does not exist or is not registered.`); } function HttpModuleNotImport() { error(`you need to import "HttpClientModule" to use dynamic importing.`); return null; } function UrlNotSafeError(url) { return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}The url "${url}" is unsafe.`); } function SVGTagNotFoundError() { return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX} tag not found.`); } function DynamicLoadingTimeoutError() { return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}Importing timeout error.`); } const JSONP_HANDLER_NAME = '__ant_icon_load'; const ANT_ICONS = new InjectionToken('ant_icons'); class IconService { set twoToneColor({ primaryColor, secondaryColor }) { this._twoToneColorPalette.primaryColor = primaryColor; this._twoToneColorPalette.secondaryColor = secondaryColor || getSecondaryColor(primaryColor); } get twoToneColor() { // Make a copy to avoid unexpected changes. return { ...this._twoToneColorPalette }; } /** * Disable dynamic loading (support static loading only). */ get _disableDynamicLoading() { return false; } constructor(_antIcons) { this._antIcons = _antIcons; this.defaultTheme = 'outline'; /** * All icon definitions would be registered here. */ this._svgDefinitions = new Map(); /** * Cache all rendered icons. Icons are identified by name, theme, * and for twotone icons, primary color and secondary color. */ this._svgRenderedDefinitions = new Map(); this._inProgressFetches = new Map(); /** * Url prefix for fetching inline SVG by dynamic importing. */ this._assetsUrlRoot = ''; this._twoToneColorPalette = { primaryColor: '#333333', secondaryColor: '#E6E6E6' }; /** A flag indicates whether jsonp loading is enabled. */ this._enableJsonpLoading = false; this._jsonpIconLoad$ = new Subject(); this._rendererFactory = inject(RendererFactory2); this._handler = inject(HttpBackend, { optional: true }); this._document = inject(DOCUMENT); this.sanitizer = inject(DomSanitizer); this._renderer = this._rendererFactory.createRenderer(null, null); if (this._handler) { this._http = new HttpClient(this._handler); } if (this._antIcons) { this.addIcon(...this._antIcons); } } /** * Call this method to switch to jsonp like loading. */ useJsonpLoading() { if (!this._enableJsonpLoading) { this._enableJsonpLoading = true; window[JSONP_HANDLER_NAME] = (icon) => { this._jsonpIconLoad$.next(icon); }; } else { warn('You are already using jsonp loading.'); } } /** * Change the prefix of the inline svg resources, so they could be deployed elsewhere, like CDN. * @param prefix */ changeAssetsSource(prefix) { this._assetsUrlRoot = prefix.endsWith('/') ? prefix : prefix + '/'; } /** * Add icons provided by ant design. * @param icons */ addIcon(...icons) { icons.forEach(icon => { this._svgDefinitions.set(withSuffix(icon.name, icon.theme), icon); }); } /** * Register an icon. Namespace is required. * @param type * @param literal */ addIconLiteral(type, literal) { const [_, namespace] = getNameAndNamespace(type); if (!namespace) { throw NameSpaceIsNotSpecifyError(); } this.addIcon({ name: type, icon: literal }); } /** * Remove all cache. */ clear() { this._svgDefinitions.clear(); this._svgRenderedDefinitions.clear(); } /** * Get a rendered `SVGElement`. * @param icon * @param twoToneColor */ getRenderedContent(icon, twoToneColor) { // If `icon` is a `IconDefinition`, go to the next step. If not, try to fetch it from cache. const definition = isIconDefinition(icon) ? icon : this._svgDefinitions.get(icon) || null; if (!definition && this._disableDynamicLoading) { throw IconNotFoundError(icon); } // If `icon` is a `IconDefinition` of successfully fetch, wrap it in an `Observable`. // Otherwise try to fetch it from remote. const $iconDefinition = definition ? of(definition) : this._loadIconDynamically(icon); // If finally get an `IconDefinition`, render and return it. Otherwise throw an error. return $iconDefinition.pipe(map(i => { if (!i) { throw IconNotFoundError(icon); } return this._loadSVGFromCacheOrCreateNew(i, twoToneColor); })); } getCachedIcons() { return this._svgDefinitions; } /** * Get raw svg and assemble a `IconDefinition` object. * @param type */ _loadIconDynamically(type) { // If developer doesn't provide HTTP module nor enable jsonp loading, just throw an error. if (!this._http && !this._enableJsonpLoading) { return of(HttpModuleNotImport()); } // If multi directive ask for the same icon at the same time, // request should only be fired once. let inProgress = this._inProgressFetches.get(type); if (!inProgress) { const [name, namespace] = getNameAndNamespace(type); // If the string has a namespace within, create a simple `IconDefinition`. const icon = namespace ? { name: type, icon: '' } : getIconDefinitionFromAbbr(name); const suffix = this._enableJsonpLoading ? '.js' : '.svg'; const url = (namespace ? `${this._assetsUrlRoot}assets/${namespace}/${name}` : `${this._assetsUrlRoot}assets/${icon.theme}/${icon.name}`) + suffix; const safeUrl = this.sanitizer.sanitize(SecurityContext.URL, url); if (!safeUrl) { throw UrlNotSafeError(url); } const source = !this._enableJsonpLoading ? this._http.get(safeUrl, { responseType: 'text' }).pipe(map(literal => ({ ...icon, icon: literal }))) : this._loadIconDynamicallyWithJsonp(icon, safeUrl); inProgress = source.pipe(tap(definition => this.addIcon(definition)), finalize(() => this._inProgressFetches.delete(type)), catchError(() => of(null)), share()); this._inProgressFetches.set(type, inProgress); } return inProgress; } _loadIconDynamicallyWithJsonp(icon, url) { return new Observable(subscriber => { const loader = this._document.createElement('script'); const timer = setTimeout(() => { clean(); subscriber.error(DynamicLoadingTimeoutError()); }, 6000); loader.src = url; function clean() { loader.parentNode.removeChild(loader); clearTimeout(timer); } this._document.body.appendChild(loader); this._jsonpIconLoad$ .pipe(filter(i => i.name === icon.name && i.theme === icon.theme), take(1)) .subscribe(i => { subscriber.next(i); clean(); }); }); } /** * Render a new `SVGElement` for a given `IconDefinition`, or make a copy from cache. * @param icon * @param twoToneColor */ _loadSVGFromCacheOrCreateNew(icon, twoToneColor) { let svg; const pri = twoToneColor || this._twoToneColorPalette.primaryColor; const sec = getSecondaryColor(pri) || this._twoToneColorPalette.secondaryColor; const key = icon.theme === 'twotone' ? withSuffixAndColor(icon.name, icon.theme, pri, sec) : icon.theme === undefined ? icon.name : withSuffix(icon.name, icon.theme); // Try to make a copy from cache. const cached = this._svgRenderedDefinitions.get(key); if (cached) { svg = cached.icon; } else { svg = this._setSVGAttribute(this._colorizeSVGIcon( // Icons provided by ant design should be refined to remove preset colors. this._createSVGElementFromString(hasNamespace(icon.name) ? icon.icon : replaceFillColor(icon.icon)), icon.theme === 'twotone', pri, sec)); // Cache it. this._svgRenderedDefinitions.set(key, { ...icon, icon: svg }); } return cloneSVG(svg); } _createSVGElementFromString(str) { const div = this._document.createElement('div'); div.innerHTML = str; const svg = div.querySelector('svg'); if (!svg) { throw SVGTagNotFoundError; } return svg; } _setSVGAttribute(svg) { this._renderer.setAttribute(svg, 'width', '1em'); this._renderer.setAttribute(svg, 'height', '1em'); return svg; } _colorizeSVGIcon(svg, twotone, pri, sec) { if (twotone) { const children = svg.childNodes; const length = children.length; for (let i = 0; i < length; i++) { const child = children[i]; if (child.getAttribute('fill') === 'secondaryColor') { this._renderer.setAttribute(child, 'fill', sec); } else { this._renderer.setAttribute(child, 'fill', pri); } } } this._renderer.setAttribute(svg, 'fill', 'currentColor'); return svg; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: IconService, deps: [{ token: ANT_ICONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: IconService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: IconService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [ANT_ICONS] }] }] }); function checkMeta(prev, after) { return prev.type === after.type && prev.theme === after.theme && prev.twoToneColor === after.twoToneColor; } class IconDirective { constructor(_iconService) { this._iconService = _iconService; this._elementRef = inject(ElementRef); this._renderer = inject(Renderer2); } ngOnChanges(changes) { if (changes.type || changes.theme || changes.twoToneColor) { this._changeIcon(); } } /** * Render a new icon in the current element. Remove the icon when `type` is falsy. */ _changeIcon() { return new Promise(resolve => { if (!this.type) { this._clearSVGElement(); resolve(null); return; } const beforeMeta = this._getSelfRenderMeta(); this._iconService .getRenderedContent(this._parseIconType(this.type, this.theme), this.twoToneColor) .subscribe(svg => { // avoid race condition // see https://github.com/ant-design/ant-design-icons/issues/315 const afterMeta = this._getSelfRenderMeta(); if (checkMeta(beforeMeta, afterMeta)) { this._setSVGElement(svg); resolve(svg); } else { resolve(null); } }); }); } _getSelfRenderMeta() { return { type: this.type, theme: this.theme, twoToneColor: this.twoToneColor }; } /** * Parse a icon to the standard form, an `IconDefinition` or a string like 'account-book-fill` (with a theme suffixed). * If namespace is specified, ignore theme because it meaningless for users' icons. * * @param type * @param theme */ _parseIconType(type, theme) { if (isIconDefinition(type)) { return type; } else { const [name, namespace] = getNameAndNamespace(type); if (namespace) { return type; } if (alreadyHasAThemeSuffix(name)) { if (theme) { warn(`'type' ${name} already gets a theme inside so 'theme' ${theme} would be ignored`); } return name; } else { return withSuffix(name, theme || this._iconService.defaultTheme); } } } _setSVGElement(svg) { this._clearSVGElement(); this._renderer.appendChild(this._elementRef.nativeElement, svg); } _clearSVGElement() { const el = this._elementRef.nativeElement; const children = el.childNodes; const length = children.length; for (let i = length - 1; i >= 0; i--) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const child = children[i]; if (child.tagName?.toLowerCase() === 'svg') { this._renderer.removeChild(el, child); } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: IconDirective, deps: [{ token: IconService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.0", type: IconDirective, isStandalone: true, selector: "[antIcon]", inputs: { type: "type", theme: "theme", twoToneColor: "twoToneColor" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: IconDirective, decorators: [{ type: Directive, args: [{ selector: '[antIcon]' }] }], ctorParameters: () => [{ type: IconService }], propDecorators: { type: [{ type: Input }], theme: [{ type: Input }], twoToneColor: [{ type: Input }] } }); /** * Provide icon definitions in root * * @param icons Icon definitions */ function provideAntIcons(icons) { return makeEnvironmentProviders([ { provide: ANT_ICONS, useValue: icons } ]); } const manifest = { fill: [ 'account-book', 'alert', 'aliwangwang', 'alipay-square', 'alipay-circle', 'amazon-circle', 'api', 'appstore', 'apple', 'audio', 'backward', 'android', 'amazon-square', 'bank', 'bell', 'behance-circle', 'behance-square', 'bilibili', 'book', 'box-plot', 'build', 'calculator', 'bulb', 'calendar', 'bug', 'car', 'caret-down', 'camera', 'caret-right', 'caret-left', 'caret-up', 'check-circle', 'check-square', 'ci-circle', 'chrome', 'carry-out', 'clock-circle', 'close-circle', 'close-square', 'cloud', 'code', 'codepen-square', 'code-sandbox-square', 'codepen-circle', 'control', 'contacts', 'copyright-circle', 'copy', 'credit-card', 'crown', 'customer-service', 'database', 'delete', 'compass', 'diff', 'dingtalk-square', 'dingtalk-circle', 'discord', 'dislike', 'dollar-circle', 'container', 'down-circle', 'down-square', 'dribbble-circle', 'dribbble-square', 'dropbox-square', 'edit', 'environment', 'euro-circle', 'dashboard', 'exclamation-circle', 'experiment', 'eye', 'fast-backward', 'facebook', 'eye-invisible', 'file-add', 'file-excel', 'file-exclamation', 'file', 'dropbox-circle', 'file-image', 'file-markdown', 'file-pdf', 'file-ppt', 'file-unknown', 'file-word', 'file-zip', 'fast-forward', 'code-sandbox-circle', 'fire', 'folder-add', 'folder', 'filter', 'file-text', 'format-painter', 'frown', 'forward', 'folder-open', 'gift', 'gitlab', 'funnel-plot', 'gold', 'google-circle', 'google-plus-circle', 'google-plus-square', 'google-square', 'hdd', 'heart', 'highlight', 'home', 'hourglass', 'html5', 'idcard', 'fund', 'ie-circle', 'golden', 'flag', 'ie-square', 'insurance', 'instagram', 'layout', 'interaction', 'left-circle', 'like', 'info-circle', 'lock', 'linkedin', 'mail', 'mac-command', 'medicine-box', 'medium-square', 'left-square', 'medium-circle', 'merge', 'message', 'minus-circle', 'minus-square', 'money-collect', 'mobile', 'moon', 'notification', 'github', 'pause-circle', 'pay-circle', 'muted', 'phone', 'picture', 'pinterest', 'pie-chart', 'play-square', 'play-circle', 'plus-circle', 'plus-square', 'pound-circle', 'meh', 'product', 'profile', 'property-safety', 'open-a-i', 'pushpin', 'printer', 'qq-circle', 'question-circle', 'qq-square', 'read', 'reconciliation', 'reddit-square', 'red-envelope', 'rest', 'project', 'robot', 'rocket', 'safety-certificate', 'save', 'schedule', 'setting', 'right-circle', 'shop', 'shopping', 'signal', 'sketch-circle', 'sketch-square', 'skin', 'skype', 'slack-square', 'signature', 'sliders', 'slack-circle', 'smile', 'snippets', 'sound', 'spotify', 'star', 'step-backward', 'step-forward', 'right-square', 'stop', 'sun', 'reddit-circle', 'tablet', 'tags', 'tag', 'taobao-square', 'taobao-circle', 'thunderbolt', 'tik-tok', 'tool', 'trademark-circle', 'truck', 'trophy', 'twitter-circle', 'twitter-square', 'twitch', 'up-circle', 'up-square', 'unlock', 'usb', 'video-camera', 'wallet', 'warning', 'weibo-circle', 'wechat-work', 'windows', 'yuque', 'x', 'yahoo', 'weibo-square', 'zhihu-circle', 'zhihu-square', 'switcher', 'wechat', 'security-scan', 'youtube' ], outline: [ 'align-center', 'alert', 'alipay-circle', 'aim', 'alipay', 'aliwangwang', 'amazon', 'apartment', 'ant-cloud', 'ant-design', 'apple', 'api', 'align-left', 'arrow-up', 'area-chart', 'appstore-add', 'arrow-down', 'align-right', 'arrow-right', 'audio-muted', 'audio', 'backward', 'bank', 'bars', 'barcode', 'arrow-left', 'behance', 'bar-chart', 'aliyun', 'appstore', 'bg-colors', 'bell', 'bilibili', 'block', 'border-bottom', 'border', 'border-outer', 'baidu', 'border-horizontal', 'border-verticle', 'border-left', 'behance-square', 'border-top', 'border-right', 'book', 'branches', 'box-plot', 'borderless-table', 'bug', 'build', 'bulb', 'calculator', 'camera', 'car', 'account-book', 'caret-down', 'android', 'caret-right', 'audit', 'caret-up', 'carry-out', 'check-circle', 'check', 'caret-left', 'calendar', 'ci-circle', 'ci', 'clock-circle', 'alibaba', 'close', 'close-circle', 'check-square', 'cloud-download', 'border-inner', 'chrome', 'cloud-server', 'arrows-alt', 'cloud-upload', 'cluster', 'cloud-sync', 'code-sandbox', 'clear', 'codepen', 'coffee', 'codepen-circle', 'column-width', 'cloud', 'column-height', 'compass', 'contacts', 'close-square', 'compress', 'copy', 'copyright-circle', 'container', 'bold', 'control', 'customer-service', 'dash', 'crown', 'copyright', 'database', 'dashboard', 'delete-column', 'deployment-unit', 'delete', 'delivered-procedure', 'desktop', 'diff', 'dingding', 'discord', 'dingtalk', 'dislike', 'disconnect', 'docker', 'dollar-circle', 'dollar', 'double-left', 'delete-row', 'down-circle', 'double-right', 'down', 'dot-net', 'down-square', 'dribbble', 'drag', 'download', 'dropbox', 'credit-card', 'console-sql', 'edit', 'enter', 'environment', 'euro-circle', 'euro', 'ellipsis', 'exclamation', 'code', 'exclamation-circle', 'dribbble-square', 'export', 'eye', 'experiment', 'eye-invisible', 'fall', 'fast-backward', 'fast-forward', 'facebook', 'exception', 'field-binary', 'field-string', 'field-time', 'comment', 'file-done', 'field-number', 'file-excel', 'file-gif', 'expand', 'file-markdown', 'file-image', 'file', 'file-exclamation', 'file-protect', 'file-search', 'expand-alt', 'file-text', 'file-jpg', 'file-unknown', 'file-word', 'file-zip', 'filter', 'file-add', 'flag', 'folder-add', 'folder', 'file-pdf', 'folder-view', 'font-colors', 'fork', 'font-size', 'forward', 'form', 'dot-chart', 'frown', 'fullscreen', 'folder-open', 'fullscreen-exit', 'function', 'fund', 'format-painter', 'fund-projection-screen', 'funnel-plot', 'file-sync', 'fund-view', 'gif', 'gift', 'gateway', 'file-ppt', 'global', 'github', 'google-plus', 'google', 'group', 'hdd', 'harmony-o-s', 'heart', 'holder', 'history', 'gitlab', 'highlight', 'home', 'hourglass', 'heat-map', 'gold', 'ie', 'html5', 'import', 'insert-row-above', 'info', 'inbox', 'insert-row-below', 'instagram', 'insurance', 'insert-row-right', 'interaction', 'issues-close', 'java-script', 'idcard', 'kubernetes', 'key', 'laptop', 'insert-row-left', 'left-circle', 'java', 'left', 'like', 'line', 'info-circle', 'link', 'loading-3-quarters', 'line-chart', 'linux', 'linkedin', 'loading', 'logout', 'lock', 'mail', 'login', 'medicine-box', 'mac-command', 'layout', 'medium', 'meh', 'medium-workmark', 'menu-unfold', 'merge-cells', 'merge', 'menu', 'message', 'menu-fold', 'minus-circle', 'minus-square', 'minus', 'moon', 'money-collect', 'mobile', 'man', 'monitor', 'muted', 'node-expand', 'node-index', 'italic', 'node-collapse', 'ordered-list', 'more', 'paper-clip', 'open-a-i', 'number', 'one-to-one', 'partition', 'pause', 'pause-circle', 'pay-circle', 'pic-center', 'pic-right', 'pic-left', 'percentage', 'pie-chart', 'pinterest', 'plus-circle', 'play-circle', 'play-square', 'plus', 'pound-circle', 'plus-square', 'picture', 'fire', 'left-square', 'poweroff', 'phone', 'product', 'notification', 'profile', 'project', 'property-safety', 'pound', 'pushpin', 'pull-request', 'qrcode', 'qq', 'question-circle', 'python', 'radar-chart', 'radius-bottomright', 'question', 'radius-upright', 'radius-upleft', 'radius-bottomleft', 'line-height', 'reconciliation', 'radius-setting', 'red-envelope', 'redo', 'rest', 'reload', 'read', 'retweet', 'right-square', 'right', 'rise', 'robot', 'rotate-left', 'safety', 'rotate-right', 'safety-certificate', 'rollback', 'reddit', 'ruby', 'save', 'scan', 'schedule', 'scissor', 'security-scan', 'rocket', 'search', 'send', 'right-circle', 'setting', 'shake', 'shopping', 'shopping-cart', 'select', 'shrink', 'signature', 'sketch', 'skin', 'slack', 'skype', 'small-dash', 'slack-square', 'sliders', 'sort-ascending', 'smile', 'snippets', 'sort-descending', 'solution', 'split-cells', 'spotify', 'share-alt', 'star', 'step-forward', 'stock', 'stop', 'strikethrough', 'sound', 'swap-left', 'sun', 'swap', 'sync', 'swap-right', 'table', 'tablet', 'switcher', 'tag', 'step-backward', 'tags', 'taobao-circle', 'team', 'taobao', 'thunderbolt', 'tik-tok', 'printer', 'to-top', 'trademark', 'translation', 'tool', 'trophy', 'truck', 'twitch', 'twitter', 'undo', 'underline', 'trademark-circle', 'unlock', 'ungroup', 'unordered-list', 'up', 'transaction', 'upload', 'up-square', 'usb', 'user', 'user-switch', 'usergroup-add', 'user-add', 'vertical-align-bottom', 'vertical-align-middle', 'usergroup-delete', 'verified', 'vertical-left', 'vertical-right', 'video-camera-add', 'video-camera', 'user-delete', 'wallet', 'warning', 'up-circle', 'subnode', 'weibo', 'weibo-square', 'wifi', 'weibo-circle', 'wechat', 'vertical-align-top', 'windows', 'yahoo', 'woman', 'x', 'yuque', 'shop', 'zhihu', 'zoom-in', 'youtube', 'wechat-work', 'zoom-out', 'whats-app', 'sisternode' ], twotone: [ 'alert', 'api', 'appstore', 'audio', 'bank', 'bell', 'account-book', 'book', 'bug', 'box-plot', 'bulb', 'build', 'camera', 'car', 'carry-out', 'calculator', 'check-circle', 'ci', 'ci-circle', 'clock-circle', 'close-circle', 'check-square', 'calendar', 'code', 'cloud', 'compass', 'contacts', 'container', 'copy', 'control', 'copyright-circle', 'copyright', 'credit-card', 'crown', 'customer-service', 'dashboard', 'database', 'close-square', 'diff', 'dislike', 'dollar-circle', 'down-circle', 'down-square', 'delete', 'environment', 'edit', 'euro-circle', 'experiment', 'exclamation-circle', 'eye-invisible', 'file-add', 'eye', 'euro', 'file-excel', 'file-exclamation', 'file-image', 'file-markdown', 'file-ppt', 'file-text', 'file', 'file-pdf', 'file-unknown', 'file-word', 'filter', 'file-zip', 'dollar', 'flag', 'folder-open', 'folder-add', 'frown', 'funnel-plot', 'folder', 'fire', 'gold', 'gift', 'heart', 'highlight', 'hourglass', 'home', 'html5', 'idcard', 'info-circle', 'insurance', 'interaction', 'fund', 'left-circle', 'left-square', 'like', 'lock', 'mail', 'layout', 'medicine-box', 'message', 'minus-circle', 'minus-square', 'mobile', 'meh', 'hdd', 'notification', 'pause-circle', 'phone', 'picture', 'pie-chart', 'play-circle', 'plus-circle', 'plus-square', 'play-square', 'profile', 'printer', 'property-safety', 'project', 'pushpin', 'question-circle', 'rest', 'pound-circle', 'money-collect', 'reconciliation', 'rocket', 'right-circle', 'safety-certificate', 'save', 'schedule', 'security-scan', 'right-square', 'shop', 'shopping', 'red-envelope', 'skin', 'smile', 'snippets', 'sound', 'star', 'stop', 'switcher', 'tablet', 'tag', 'thunderbolt', 'tool', 'setting', 'trademark-circle', 'trophy', 'sliders', 'unlock', 'up-circle', 'usb', 'wallet', 'up-square', 'warning', 'video-camera', 'tags' ] }; /** * Generated bundle index. Do not edit. */ export { ANT_ICONS, ANT_ICON_ANGULAR_CONSOLE_PREFIX, DynamicLoadingTimeoutError, HttpModuleNotImport, IconDirective, IconNotFoundError, IconService, NameSpaceIsNotSpecifyError, SVGTagNotFoundError, UrlNotSafeError, alreadyHasAThemeSuffix, cloneSVG, error, getIconDefinitionFromAbbr, getNameAndNamespace, getSecondaryColor, hasNamespace, isIconDefinition, manifest, mapAbbrToTheme, provideAntIcons, replaceFillColor, warn, withSuffix, withSuffixAndColor }; //# sourceMappingURL=ant-design-icons-angular.mjs.map