ant-design-icons-angular.mjs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. import * as i0 from '@angular/core';
  2. import { isDevMode, InjectionToken, SecurityContext, Injectable, Optional, Inject, inject, ElementRef, Renderer2, Directive, Input, NgModule, makeEnvironmentProviders } from '@angular/core';
  3. import { generate } from '@ant-design/colors';
  4. import { DOCUMENT } from '@angular/common';
  5. import * as i1 from '@angular/common/http';
  6. import { HttpClient } from '@angular/common/http';
  7. import { Subject, of, Observable } from 'rxjs';
  8. import { map, tap, finalize, catchError, share, filter, take } from 'rxjs/operators';
  9. import * as i2 from '@angular/platform-browser';
  10. const ANT_ICON_ANGULAR_CONSOLE_PREFIX = '[@ant-design/icons-angular]:';
  11. function error(message) {
  12. console.error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX} ${message}.`);
  13. }
  14. function warn(message) {
  15. if (isDevMode()) {
  16. console.warn(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX} ${message}.`);
  17. }
  18. }
  19. function getSecondaryColor(primaryColor) {
  20. return generate(primaryColor)[0];
  21. }
  22. function withSuffix(name, theme) {
  23. switch (theme) {
  24. case 'fill': return `${name}-fill`;
  25. case 'outline': return `${name}-o`;
  26. case 'twotone': return `${name}-twotone`;
  27. case undefined: return name;
  28. default: throw new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}Theme "${theme}" is not a recognized theme!`);
  29. }
  30. }
  31. function withSuffixAndColor(name, theme, pri, sec) {
  32. return `${withSuffix(name, theme)}-${pri}-${sec}`;
  33. }
  34. function mapAbbrToTheme(abbr) {
  35. return abbr === 'o' ? 'outline' : abbr;
  36. }
  37. function alreadyHasAThemeSuffix(name) {
  38. return name.endsWith('-fill') || name.endsWith('-o') || name.endsWith('-twotone');
  39. }
  40. function isIconDefinition(target) {
  41. return (typeof target === 'object' &&
  42. typeof target.name === 'string' &&
  43. (typeof target.theme === 'string' || target.theme === undefined) &&
  44. typeof target.icon === 'string');
  45. }
  46. /**
  47. * Get an `IconDefinition` object from abbreviation type, like `account-book-fill`.
  48. * @param str
  49. */
  50. function getIconDefinitionFromAbbr(str) {
  51. const arr = str.split('-');
  52. const theme = mapAbbrToTheme(arr.splice(arr.length - 1, 1)[0]);
  53. const name = arr.join('-');
  54. return {
  55. name,
  56. theme,
  57. icon: ''
  58. };
  59. }
  60. function cloneSVG(svg) {
  61. return svg.cloneNode(true);
  62. }
  63. /**
  64. * Parse inline SVG string and replace colors with placeholders. For twotone icons only.
  65. */
  66. function replaceFillColor(raw) {
  67. return raw
  68. .replace(/['"]#333['"]/g, '"primaryColor"')
  69. .replace(/['"]#E6E6E6['"]/g, '"secondaryColor"')
  70. .replace(/['"]#D9D9D9['"]/g, '"secondaryColor"')
  71. .replace(/['"]#D8D8D8['"]/g, '"secondaryColor"');
  72. }
  73. /**
  74. * Split a name with namespace in it into a tuple like [ name, namespace ].
  75. */
  76. function getNameAndNamespace(type) {
  77. const split = type.split(':');
  78. switch (split.length) {
  79. case 1: return [type, ''];
  80. case 2: return [split[1], split[0]];
  81. default: throw new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}The icon type ${type} is not valid!`);
  82. }
  83. }
  84. function hasNamespace(type) {
  85. return getNameAndNamespace(type)[1] !== '';
  86. }
  87. function NameSpaceIsNotSpecifyError() {
  88. return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}Type should have a namespace. Try "namespace:${name}".`);
  89. }
  90. function IconNotFoundError(icon) {
  91. return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}the icon ${icon} does not exist or is not registered.`);
  92. }
  93. function HttpModuleNotImport() {
  94. error(`you need to import "HttpClientModule" to use dynamic importing.`);
  95. return null;
  96. }
  97. function UrlNotSafeError(url) {
  98. return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}The url "${url}" is unsafe.`);
  99. }
  100. function SVGTagNotFoundError() {
  101. return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}<svg> tag not found.`);
  102. }
  103. function DynamicLoadingTimeoutError() {
  104. return new Error(`${ANT_ICON_ANGULAR_CONSOLE_PREFIX}Importing timeout error.`);
  105. }
  106. const JSONP_HANDLER_NAME = '__ant_icon_load';
  107. const ANT_ICONS = new InjectionToken('ant_icons');
  108. class IconService {
  109. set twoToneColor({ primaryColor, secondaryColor }) {
  110. this._twoToneColorPalette.primaryColor = primaryColor;
  111. this._twoToneColorPalette.secondaryColor =
  112. secondaryColor || getSecondaryColor(primaryColor);
  113. }
  114. get twoToneColor() {
  115. // Make a copy to avoid unexpected changes.
  116. return { ...this._twoToneColorPalette };
  117. }
  118. /**
  119. * Disable dynamic loading (support static loading only).
  120. */
  121. get _disableDynamicLoading() {
  122. return false;
  123. }
  124. constructor(_rendererFactory, _handler, _document, sanitizer, _antIcons) {
  125. this._rendererFactory = _rendererFactory;
  126. this._handler = _handler;
  127. this._document = _document;
  128. this.sanitizer = sanitizer;
  129. this._antIcons = _antIcons;
  130. this.defaultTheme = 'outline';
  131. /**
  132. * All icon definitions would be registered here.
  133. */
  134. this._svgDefinitions = new Map();
  135. /**
  136. * Cache all rendered icons. Icons are identified by name, theme,
  137. * and for twotone icons, primary color and secondary color.
  138. */
  139. this._svgRenderedDefinitions = new Map();
  140. this._inProgressFetches = new Map();
  141. /**
  142. * Url prefix for fetching inline SVG by dynamic importing.
  143. */
  144. this._assetsUrlRoot = '';
  145. this._twoToneColorPalette = {
  146. primaryColor: '#333333',
  147. secondaryColor: '#E6E6E6'
  148. };
  149. /** A flag indicates whether jsonp loading is enabled. */
  150. this._enableJsonpLoading = false;
  151. this._jsonpIconLoad$ = new Subject();
  152. this._renderer = this._rendererFactory.createRenderer(null, null);
  153. if (this._handler) {
  154. this._http = new HttpClient(this._handler);
  155. }
  156. if (this._antIcons) {
  157. this.addIcon(...this._antIcons);
  158. }
  159. }
  160. /**
  161. * Call this method to switch to jsonp like loading.
  162. */
  163. useJsonpLoading() {
  164. if (!this._enableJsonpLoading) {
  165. this._enableJsonpLoading = true;
  166. window[JSONP_HANDLER_NAME] = (icon) => {
  167. this._jsonpIconLoad$.next(icon);
  168. };
  169. }
  170. else {
  171. warn('You are already using jsonp loading.');
  172. }
  173. }
  174. /**
  175. * Change the prefix of the inline svg resources, so they could be deployed elsewhere, like CDN.
  176. * @param prefix
  177. */
  178. changeAssetsSource(prefix) {
  179. this._assetsUrlRoot = prefix.endsWith('/') ? prefix : prefix + '/';
  180. }
  181. /**
  182. * Add icons provided by ant design.
  183. * @param icons
  184. */
  185. addIcon(...icons) {
  186. icons.forEach(icon => {
  187. this._svgDefinitions.set(withSuffix(icon.name, icon.theme), icon);
  188. });
  189. }
  190. /**
  191. * Register an icon. Namespace is required.
  192. * @param type
  193. * @param literal
  194. */
  195. addIconLiteral(type, literal) {
  196. const [_, namespace] = getNameAndNamespace(type);
  197. if (!namespace) {
  198. throw NameSpaceIsNotSpecifyError();
  199. }
  200. this.addIcon({ name: type, icon: literal });
  201. }
  202. /**
  203. * Remove all cache.
  204. */
  205. clear() {
  206. this._svgDefinitions.clear();
  207. this._svgRenderedDefinitions.clear();
  208. }
  209. /**
  210. * Get a rendered `SVGElement`.
  211. * @param icon
  212. * @param twoToneColor
  213. */
  214. getRenderedContent(icon, twoToneColor) {
  215. // If `icon` is a `IconDefinition`, go to the next step. If not, try to fetch it from cache.
  216. const definition = isIconDefinition(icon)
  217. ? icon
  218. : this._svgDefinitions.get(icon) || null;
  219. if (!definition && this._disableDynamicLoading) {
  220. throw IconNotFoundError(icon);
  221. }
  222. // If `icon` is a `IconDefinition` of successfully fetch, wrap it in an `Observable`.
  223. // Otherwise try to fetch it from remote.
  224. const $iconDefinition = definition
  225. ? of(definition)
  226. : this._loadIconDynamically(icon);
  227. // If finally get an `IconDefinition`, render and return it. Otherwise throw an error.
  228. return $iconDefinition.pipe(map(i => {
  229. if (!i) {
  230. throw IconNotFoundError(icon);
  231. }
  232. return this._loadSVGFromCacheOrCreateNew(i, twoToneColor);
  233. }));
  234. }
  235. getCachedIcons() {
  236. return this._svgDefinitions;
  237. }
  238. /**
  239. * Get raw svg and assemble a `IconDefinition` object.
  240. * @param type
  241. */
  242. _loadIconDynamically(type) {
  243. // If developer doesn't provide HTTP module nor enable jsonp loading, just throw an error.
  244. if (!this._http && !this._enableJsonpLoading) {
  245. return of(HttpModuleNotImport());
  246. }
  247. // If multi directive ask for the same icon at the same time,
  248. // request should only be fired once.
  249. let inProgress = this._inProgressFetches.get(type);
  250. if (!inProgress) {
  251. const [name, namespace] = getNameAndNamespace(type);
  252. // If the string has a namespace within, create a simple `IconDefinition`.
  253. const icon = namespace
  254. ? { name: type, icon: '' }
  255. : getIconDefinitionFromAbbr(name);
  256. const suffix = this._enableJsonpLoading ? '.js' : '.svg';
  257. const url = (namespace
  258. ? `${this._assetsUrlRoot}assets/${namespace}/${name}`
  259. : `${this._assetsUrlRoot}assets/${icon.theme}/${icon.name}`) + suffix;
  260. const safeUrl = this.sanitizer.sanitize(SecurityContext.URL, url);
  261. if (!safeUrl) {
  262. throw UrlNotSafeError(url);
  263. }
  264. const source = !this._enableJsonpLoading
  265. ? this._http
  266. .get(safeUrl, { responseType: 'text' })
  267. .pipe(map(literal => ({ ...icon, icon: literal })))
  268. : this._loadIconDynamicallyWithJsonp(icon, safeUrl);
  269. inProgress = source.pipe(tap(definition => this.addIcon(definition)), finalize(() => this._inProgressFetches.delete(type)), catchError(() => of(null)), share());
  270. this._inProgressFetches.set(type, inProgress);
  271. }
  272. return inProgress;
  273. }
  274. _loadIconDynamicallyWithJsonp(icon, url) {
  275. return new Observable(subscriber => {
  276. const loader = this._document.createElement('script');
  277. const timer = setTimeout(() => {
  278. clean();
  279. subscriber.error(DynamicLoadingTimeoutError());
  280. }, 6000);
  281. loader.src = url;
  282. function clean() {
  283. loader.parentNode.removeChild(loader);
  284. clearTimeout(timer);
  285. }
  286. this._document.body.appendChild(loader);
  287. this._jsonpIconLoad$
  288. .pipe(filter(i => i.name === icon.name && i.theme === icon.theme), take(1))
  289. .subscribe(i => {
  290. subscriber.next(i);
  291. clean();
  292. });
  293. });
  294. }
  295. /**
  296. * Render a new `SVGElement` for a given `IconDefinition`, or make a copy from cache.
  297. * @param icon
  298. * @param twoToneColor
  299. */
  300. _loadSVGFromCacheOrCreateNew(icon, twoToneColor) {
  301. let svg;
  302. const pri = twoToneColor || this._twoToneColorPalette.primaryColor;
  303. const sec = getSecondaryColor(pri) || this._twoToneColorPalette.secondaryColor;
  304. const key = icon.theme === 'twotone'
  305. ? withSuffixAndColor(icon.name, icon.theme, pri, sec)
  306. : icon.theme === undefined
  307. ? icon.name
  308. : withSuffix(icon.name, icon.theme);
  309. // Try to make a copy from cache.
  310. const cached = this._svgRenderedDefinitions.get(key);
  311. if (cached) {
  312. svg = cached.icon;
  313. }
  314. else {
  315. svg = this._setSVGAttribute(this._colorizeSVGIcon(
  316. // Icons provided by ant design should be refined to remove preset colors.
  317. this._createSVGElementFromString(hasNamespace(icon.name) ? icon.icon : replaceFillColor(icon.icon)), icon.theme === 'twotone', pri, sec));
  318. // Cache it.
  319. this._svgRenderedDefinitions.set(key, {
  320. ...icon,
  321. icon: svg
  322. });
  323. }
  324. return cloneSVG(svg);
  325. }
  326. _createSVGElementFromString(str) {
  327. const div = this._document.createElement('div');
  328. div.innerHTML = str;
  329. const svg = div.querySelector('svg');
  330. if (!svg) {
  331. throw SVGTagNotFoundError;
  332. }
  333. return svg;
  334. }
  335. _setSVGAttribute(svg) {
  336. this._renderer.setAttribute(svg, 'width', '1em');
  337. this._renderer.setAttribute(svg, 'height', '1em');
  338. return svg;
  339. }
  340. _colorizeSVGIcon(svg, twotone, pri, sec) {
  341. if (twotone) {
  342. const children = svg.childNodes;
  343. const length = children.length;
  344. for (let i = 0; i < length; i++) {
  345. const child = children[i];
  346. if (child.getAttribute('fill') === 'secondaryColor') {
  347. this._renderer.setAttribute(child, 'fill', sec);
  348. }
  349. else {
  350. this._renderer.setAttribute(child, 'fill', pri);
  351. }
  352. }
  353. }
  354. this._renderer.setAttribute(svg, 'fill', 'currentColor');
  355. return svg;
  356. }
  357. static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconService, deps: [{ token: i0.RendererFactory2 }, { token: i1.HttpBackend, optional: true }, { token: DOCUMENT, optional: true }, { token: i2.DomSanitizer }, { token: ANT_ICONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
  358. static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconService, providedIn: 'root' }); }
  359. }
  360. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconService, decorators: [{
  361. type: Injectable,
  362. args: [{
  363. providedIn: 'root'
  364. }]
  365. }], ctorParameters: () => [{ type: i0.RendererFactory2 }, { type: i1.HttpBackend, decorators: [{
  366. type: Optional
  367. }] }, { type: undefined, decorators: [{
  368. type: Optional
  369. }, {
  370. type: Inject,
  371. args: [DOCUMENT]
  372. }] }, { type: i2.DomSanitizer }, { type: undefined, decorators: [{
  373. type: Optional
  374. }, {
  375. type: Inject,
  376. args: [ANT_ICONS]
  377. }] }] });
  378. function checkMeta(prev, after) {
  379. return prev.type === after.type && prev.theme === after.theme && prev.twoToneColor === after.twoToneColor;
  380. }
  381. class IconDirective {
  382. constructor(_iconService) {
  383. this._iconService = _iconService;
  384. this._elementRef = inject(ElementRef);
  385. this._renderer = inject(Renderer2);
  386. }
  387. ngOnChanges(changes) {
  388. if (changes.type || changes.theme || changes.twoToneColor) {
  389. this._changeIcon();
  390. }
  391. }
  392. /**
  393. * Render a new icon in the current element. Remove the icon when `type` is falsy.
  394. */
  395. _changeIcon() {
  396. return new Promise(resolve => {
  397. if (!this.type) {
  398. this._clearSVGElement();
  399. resolve(null);
  400. return;
  401. }
  402. const beforeMeta = this._getSelfRenderMeta();
  403. this._iconService.getRenderedContent(this._parseIconType(this.type, this.theme), this.twoToneColor).subscribe(svg => {
  404. // avoid race condition
  405. // see https://github.com/ant-design/ant-design-icons/issues/315
  406. const afterMeta = this._getSelfRenderMeta();
  407. if (checkMeta(beforeMeta, afterMeta)) {
  408. this._setSVGElement(svg);
  409. resolve(svg);
  410. }
  411. else {
  412. resolve(null);
  413. }
  414. });
  415. });
  416. }
  417. _getSelfRenderMeta() {
  418. return {
  419. type: this.type,
  420. theme: this.theme,
  421. twoToneColor: this.twoToneColor
  422. };
  423. }
  424. /**
  425. * Parse a icon to the standard form, an `IconDefinition` or a string like 'account-book-fill` (with a theme suffixed).
  426. * If namespace is specified, ignore theme because it meaningless for users' icons.
  427. *
  428. * @param type
  429. * @param theme
  430. */
  431. _parseIconType(type, theme) {
  432. if (isIconDefinition(type)) {
  433. return type;
  434. }
  435. else {
  436. const [name, namespace] = getNameAndNamespace(type);
  437. if (namespace) {
  438. return type;
  439. }
  440. if (alreadyHasAThemeSuffix(name)) {
  441. if (!!theme) {
  442. warn(`'type' ${name} already gets a theme inside so 'theme' ${theme} would be ignored`);
  443. }
  444. return name;
  445. }
  446. else {
  447. return withSuffix(name, theme || this._iconService.defaultTheme);
  448. }
  449. }
  450. }
  451. _setSVGElement(svg) {
  452. this._clearSVGElement();
  453. this._renderer.appendChild(this._elementRef.nativeElement, svg);
  454. }
  455. _clearSVGElement() {
  456. const el = this._elementRef.nativeElement;
  457. const children = el.childNodes;
  458. const length = children.length;
  459. for (let i = length - 1; i >= 0; i--) {
  460. const child = children[i];
  461. if (child.tagName?.toLowerCase() === 'svg') {
  462. this._renderer.removeChild(el, child);
  463. }
  464. }
  465. }
  466. static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconDirective, deps: [{ token: IconService }], target: i0.ɵɵFactoryTarget.Directive }); }
  467. static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.0", type: IconDirective, isStandalone: true, selector: "[antIcon]", inputs: { type: "type", theme: "theme", twoToneColor: "twoToneColor" }, usesOnChanges: true, ngImport: i0 }); }
  468. }
  469. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconDirective, decorators: [{
  470. type: Directive,
  471. args: [{
  472. selector: '[antIcon]'
  473. }]
  474. }], ctorParameters: () => [{ type: IconService }], propDecorators: { type: [{
  475. type: Input
  476. }], theme: [{
  477. type: Input
  478. }], twoToneColor: [{
  479. type: Input
  480. }] } });
  481. /**
  482. * @deprecated Please use `IconDirective` instead, will be removed in v20.
  483. */
  484. class IconModule {
  485. static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
  486. static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: IconModule, imports: [IconDirective], exports: [IconDirective] }); }
  487. static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconModule }); }
  488. }
  489. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IconModule, decorators: [{
  490. type: NgModule,
  491. args: [{
  492. imports: [IconDirective],
  493. exports: [IconDirective]
  494. }]
  495. }] });
  496. /**
  497. * Provide icon definitions in root
  498. *
  499. * @param icons Icon definitions
  500. */
  501. function provideAntIcons(icons) {
  502. return makeEnvironmentProviders([
  503. {
  504. provide: ANT_ICONS,
  505. useValue: icons
  506. }
  507. ]);
  508. }
  509. const manifest = {
  510. fill: [
  511. 'alipay-square', 'aliwangwang', 'alipay-circle', 'alert', 'amazon-circle', 'android', 'apple', 'amazon-square', 'appstore', 'api', 'bank', 'behance-circle', 'behance-square', 'bell', 'bilibili', 'audio', 'book', 'account-book', 'box-plot', 'bug', 'backward', 'build', 'calculator', 'calendar', 'bulb', 'camera', 'caret-down', 'caret-right', 'caret-left', 'carry-out', 'car', 'caret-up', 'chrome', 'ci-circle', 'check-square', 'clock-circle', 'close-circle', 'close-square', 'cloud', 'code-sandbox-circle', 'code', 'codepen-square', 'code-sandbox-square', 'codepen-circle', 'compass', 'check-circle', 'contacts', 'container', 'credit-card', 'control', 'crown', 'copy', 'copyright-circle', 'customer-service', 'dashboard', 'database', 'delete', 'diff', 'dingtalk-circle', 'dingtalk-square', 'discord', 'dislike', 'dollar-circle', 'down-circle', 'down-square', 'dribbble-square', 'dribbble-circle', 'edit', 'environment', 'euro-circle', 'experiment', 'eye', 'eye-invisible', 'exclamation-circle', 'dropbox-circle', 'fast-backward', 'facebook', 'file-excel', 'file-exclamation', 'file', 'file-image', 'file-markdown', 'file-pdf', 'file-ppt', 'fast-forward', 'dropbox-square', 'file-text', 'file-zip', 'file-unknown', 'file-word', 'filter', 'fire', 'flag', 'folder-add', 'folder', 'folder-open', 'file-add', 'frown', 'fund', 'forward', 'funnel-plot', 'gift', 'gitlab', 'gold', 'github', 'golden', 'google-plus-square', 'google-plus-circle', 'google-square', 'heart', 'format-painter', 'highlight', 'home', 'hourglass', 'hdd', 'html5', 'idcard', 'google-circle', 'ie-square', 'insurance', 'instagram', 'ie-circle', 'layout', 'left-circle', 'interaction', 'left-square', 'linkedin', 'like', 'mail', 'mac-command', 'medicine-box', 'medium-circle', 'medium-square', 'meh', 'lock', 'merge', 'message', 'minus-circle', 'minus-square', 'mobile', 'moon', 'muted', 'notification', 'pay-circle', 'phone', 'pinterest', 'play-circle', 'pie-chart', 'pause-circle', 'picture', 'play-square', 'pound-circle', 'plus-circle', 'plus-square', 'printer', 'product', 'profile', 'property-safety', 'project', 'qq-circle', 'question-circle', 'qq-square', 'reconciliation', 'red-envelope', 'reddit-circle', 'read', 'reddit-square', 'right-circle', 'right-square', 'rest', 'money-collect', 'safety-certificate', 'rocket', 'schedule', 'security-scan', 'pushpin', 'setting', 'save', 'shopping', 'shop', 'signal', 'open-a-i', 'signature', 'sketch-circle', 'skype', 'slack-circle', 'sketch-square', 'slack-square', 'skin', 'sliders', 'smile', 'snippets', 'sound', 'spotify', 'star', 'step-backward', 'step-forward', 'stop', 'sun', 'info-circle', 'tablet', 'tag', 'taobao-circle', 'tags', 'thunderbolt', 'taobao-square', 'tik-tok', 'tool', 'trademark-circle', 'trophy', 'twitch', 'robot', 'truck', 'twitter-square', 'twitter-circle', 'unlock', 'up-circle', 'switcher', 'up-square', 'usb', 'video-camera', 'wallet', 'wechat', 'weibo-circle', 'windows', 'yahoo', 'youtube', 'yuque', 'zhihu-circle', 'zhihu-square', 'wechat-work', 'weibo-square', 'x', 'warning'
  512. ],
  513. outline: [
  514. 'aim', 'alert', 'align-right', 'align-center', 'aliwangwang', 'amazon', 'ant-design', 'api', 'ant-cloud', 'align-left', 'apple', 'alipay-circle', 'appstore-add', 'alipay', 'arrow-down', 'arrows-alt', 'apartment', 'audio', 'audio-muted', 'arrow-up', 'android', 'aliyun', 'area-chart', 'arrow-left', 'backward', 'bank', 'baidu', 'barcode', 'bars', 'behance-square', 'behance', 'bell', 'bilibili', 'bg-colors', 'block', 'bold', 'border-bottom', 'border-horizontal', 'border-left', 'border', 'border-inner', 'bar-chart', 'border-right', 'border-verticle', 'account-book', 'alibaba', 'branches', 'border-top', 'arrow-right', 'bug', 'audit', 'calendar', 'calculator', 'camera', 'box-plot', 'car', 'bulb', 'book', 'caret-right', 'carry-out', 'caret-left', 'caret-down', 'check', 'check-square', 'chrome', 'caret-up', 'clock-circle', 'ci', 'ci-circle', 'close', 'close-circle', 'close-square', 'cloud-download', 'cloud', 'cloud-server', 'cloud-sync', 'code', 'check-circle', 'codepen-circle', 'code-sandbox', 'codepen', 'cluster', 'column-height', 'cloud-upload', 'column-width', 'compress', 'compass', 'console-sql', 'appstore', 'contacts', 'coffee', 'container', 'copy', 'control', 'copyright-circle', 'clear', 'build', 'dash', 'database', 'border-outer', 'delete', 'dashboard', 'delete-row', 'delivered-procedure', 'deployment-unit', 'delete-column', 'desktop', 'diff', 'dingtalk', 'dingding', 'dislike', 'disconnect', 'comment', 'docker', 'dollar-circle', 'double-left', 'dollar', 'dot-chart', 'dot-net', 'double-right', 'down-circle', 'down', 'borderless-table', 'drag', 'dribbble-square', 'dribbble', 'down-square', 'ellipsis', 'dropbox', 'enter', 'euro-circle', 'environment', 'exception', 'euro', 'customer-service', 'exclamation-circle', 'expand-alt', 'exclamation', 'expand', 'export', 'experiment', 'eye-invisible', 'eye', 'facebook', 'fast-forward', 'fall', 'download', 'field-binary', 'field-number', 'credit-card', 'field-string', 'field-time', 'file-excel', 'file-exclamation', 'file-add', 'file-done', 'crown', 'discord', 'file-markdown', 'file', 'file-pdf', 'file-jpg', 'file-gif', 'file-sync', 'file-protect', 'file-search', 'file-unknown', 'file-word', 'file-text', 'file-zip', 'filter', 'flag', 'fire', 'folder-add', 'folder-open', 'folder', 'font-size', 'edit', 'file-ppt', 'form', 'folder-view', 'copyright', 'fork', 'forward', 'function', 'fullscreen-exit', 'fund', 'fund-projection-screen', 'funnel-plot', 'gateway', 'gift', 'gif', 'font-colors', 'frown', 'global', 'gitlab', 'gold', 'google', 'google-plus', 'group', 'hdd', 'harmony-o-s', 'heart', 'heat-map', 'highlight', 'home', 'html5', 'format-painter', 'ie', 'idcard', 'github', 'hourglass', 'holder', 'fullscreen', 'info-circle', 'fund-view', 'inbox', 'insert-row-left', 'info', 'import', 'insert-row-above', 'insert-row-right', 'interaction', 'italic', 'java', 'issues-close', 'java-script', 'kubernetes', 'instagram', 'laptop', 'layout', 'insurance', 'left-square', 'line-chart', 'left-circle', 'line', 'like', 'loading', 'loading-3-quarters', 'linux', 'line-height', 'left', 'lock', 'mac-command', 'mail', 'link', 'man', 'medicine-box', 'medium-workmark', 'medium', 'meh', 'logout', 'menu-fold', 'login', 'linkedin', 'message', 'menu', 'minus-circle', 'key', 'minus-square', 'mobile', 'money-collect', 'fast-backward', 'monitor', 'moon', 'more', 'node-index', 'node-collapse', 'node-expand', 'merge', 'menu-unfold', 'number', 'merge-cells', 'notification', 'ordered-list', 'paper-clip', 'partition', 'muted', 'pause', 'one-to-one', 'pay-circle', 'percentage', 'pic-center', 'pic-right', 'pic-left', 'pause-circle', 'pie-chart', 'picture', 'play-circle', 'play-square', 'plus', 'plus-square', 'plus-circle', 'pound-circle', 'pound', 'poweroff', 'profile', 'printer', 'project', 'product', 'phone', 'property-safety', 'python', 'pinterest', 'pushpin', 'qrcode', 'question-circle', 'radius-bottomleft', 'radius-bottomright', 'pull-request', 'question', 'radius-setting', 'radar-chart', 'radius-upleft', 'radius-upright', 'read', 'reconciliation', 'red-envelope', 'reddit', 'redo', 'reload', 'retweet', 'rest', 'right-circle', 'right-square', 'right', 'robot', 'rise', 'rocket', 'rollback', 'rotate-right', 'safety-certificate', 'rotate-left', 'qq', 'ruby', 'save', 'scan', 'security-scan', 'scissor', 'schedule', 'select', 'send', 'minus', 'shake', 'setting', 'shop', 'shopping', 'shopping-cart', 'shrink', 'sisternode', 'sketch', 'skin', 'skype', 'slack', 'slack-square', 'sliders', 'small-dash', 'smile', 'snippets', 'file-image', 'solution', 'sort-ascending', 'split-cells', 'sort-descending', 'signature', 'spotify', 'search', 'star', 'step-forward', 'stock', 'sound', 'step-backward', 'share-alt', 'stop', 'sun', 'strikethrough', 'swap-left', 'swap', 'switcher', 'sync', 'table', 'tag', 'tablet', 'taobao-circle', 'taobao', 'team', 'subnode', 'thunderbolt', 'tags', 'tool', 'trademark-circle', 'tik-tok', 'to-top', 'swap-right', 'translation', 'safety', 'truck', 'twitch', 'underline', 'undo', 'unlock', 'ungroup', 'trademark', 'twitter', 'open-a-i', 'up', 'up-square', 'upload', 'usb', 'trophy', 'user', 'user-delete', 'usergroup-add', 'usergroup-delete', 'unordered-list', 'verified', 'vertical-left', 'vertical-right', 'video-camera', 'video-camera-add', 'vertical-align-top', 'user-add', 'history', 'insert-row-below', 'wechat', 'wechat-work', 'warning', 'weibo-circle', 'weibo', 'wifi', 'weibo-square', 'windows', 'whats-app', 'woman', 'user-switch', 'yahoo', 'x', 'yuque', 'zhihu', 'youtube', 'vertical-align-middle', 'up-circle', 'transaction', 'zoom-out', 'zoom-in', 'vertical-align-bottom', 'wallet'
  515. ],
  516. twotone: [
  517. 'account-book', 'alert', 'api', 'audio', 'bank', 'bell', 'book', 'appstore', 'bug', 'bulb', 'calendar', 'calculator', 'car', 'camera', 'box-plot', 'carry-out', 'ci-circle', 'ci', 'check-square', 'clock-circle', 'close-circle', 'close-square', 'check-circle', 'cloud', 'code', 'compass', 'contacts', 'container', 'copy', 'build', 'credit-card', 'copyright', 'customer-service', 'crown', 'dashboard', 'delete', 'diff', 'database', 'dollar-circle', 'dollar', 'down-circle', 'dislike', 'copyright-circle', 'down-square', 'edit', 'euro-circle', 'environment', 'euro', 'exclamation-circle', 'experiment', 'eye-invisible', 'eye', 'file-add', 'file-excel', 'file-exclamation', 'control', 'file-image', 'file-markdown', 'file', 'file-text', 'file-unknown', 'file-zip', 'filter', 'fire', 'file-ppt', 'flag', 'folder-open', 'folder-add', 'folder', 'frown', 'fund', 'funnel-plot', 'gift', 'gold', 'file-word', 'hdd', 'heart', 'file-pdf', 'home', 'hourglass', 'html5', 'idcard', 'highlight', 'info-circle', 'insurance', 'layout', 'interaction', 'left-square', 'like', 'left-circle', 'lock', 'mail', 'medicine-box', 'meh', 'minus-square', 'minus-circle', 'mobile', 'money-collect', 'notification', 'message', 'pause-circle', 'phone', 'picture', 'play-circle', 'play-square', 'pie-chart', 'plus-circle', 'pound-circle', 'plus-square', 'printer', 'project', 'profile', 'property-safety', 'pushpin', 'question-circle', 'reconciliation', 'red-envelope', 'rest', 'right-circle', 'right-square', 'rocket', 'safety-certificate', 'save', 'security-scan', 'schedule', 'setting', 'shop', 'shopping', 'skin', 'sliders', 'snippets', 'star', 'stop', 'switcher', 'tablet', 'tag', 'tags', 'sound', 'tool', 'trophy', 'thunderbolt', 'unlock', 'up-square', 'usb', 'smile', 'video-camera', 'wallet', 'warning', 'trademark-circle', 'up-circle'
  518. ]
  519. };
  520. /**
  521. * Generated bundle index. Do not edit.
  522. */
  523. export { ANT_ICONS, ANT_ICON_ANGULAR_CONSOLE_PREFIX, DynamicLoadingTimeoutError, HttpModuleNotImport, IconDirective, IconModule, IconNotFoundError, IconService, NameSpaceIsNotSpecifyError, SVGTagNotFoundError, UrlNotSafeError, alreadyHasAThemeSuffix, cloneSVG, error, getIconDefinitionFromAbbr, getNameAndNamespace, getSecondaryColor, hasNamespace, isIconDefinition, manifest, mapAbbrToTheme, provideAntIcons, replaceFillColor, warn, withSuffix, withSuffixAndColor };
  524. //# sourceMappingURL=ant-design-icons-angular.mjs.map