@siemens/ix-icons 0.0.0-pr-69-20250203134847 → 0.0.0-pr-69-20250205144920
Sign up to get free protection for your applications and to get access to all the features.
- package/components/index.js +1 -2
- package/components/index.js.map +1 -1
- package/components/ix-icon.js +1 -1
- package/components/p-187634d0.js +1363 -0
- package/components/p-187634d0.js.map +1 -0
- package/dist/cjs/{icon-88309350.js → icon-319056c0.js} +61 -51
- package/dist/cjs/icon-319056c0.js.map +1 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/ix-icon.cjs.entry.js +1 -1
- package/dist/collection/components/icon/icon.js +23 -15
- package/dist/collection/components/icon/icon.js.map +1 -1
- package/dist/collection/components/icon/parser.js +22 -0
- package/dist/collection/components/icon/parser.js.map +1 -0
- package/dist/collection/components/icon/resolveIcon.js +26 -43
- package/dist/collection/components/icon/resolveIcon.js.map +1 -1
- package/dist/esm/{icon-4feff534.js → icon-fc868c56.js} +62 -52
- package/dist/esm/icon-fc868c56.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/ix-icon.entry.js +1 -1
- package/dist/ix-icons/index.esm.js +1 -1
- package/dist/ix-icons/ix-icons.esm.js +1 -1
- package/dist/ix-icons/p-423803cb.js +2 -0
- package/dist/ix-icons/p-423803cb.js.map +1 -0
- package/dist/ix-icons/p-ca4fc358.entry.js +2 -0
- package/dist/types/components/icon/icon.d.ts +5 -2
- package/dist/types/components/icon/meta-tag.d.ts +1 -1
- package/dist/types/components/icon/parser.d.ts +2 -0
- package/dist/types/components/icon/resolveIcon.d.ts +1 -2
- package/dist/types/components.d.ts +8 -2
- package/icons/package.json +1 -1
- package/package.json +1 -1
- package/components/icon.js +0 -248
- package/components/icon.js.map +0 -1
- package/dist/cjs/icon-88309350.js.map +0 -1
- package/dist/collection/components/icon/icons.js +0 -1258
- package/dist/collection/components/icon/icons.js.map +0 -1
- package/dist/esm/icon-4feff534.js.map +0 -1
- package/dist/ix-icons/p-08f117ce.entry.js +0 -2
- package/dist/ix-icons/p-588f84dc.js +0 -2
- package/dist/ix-icons/p-588f84dc.js.map +0 -1
- package/dist/types/components/icon/icons.d.ts +0 -1256
- /package/dist/ix-icons/{p-08f117ce.entry.js.map → p-ca4fc358.entry.js.map} +0 -0
@@ -16,6 +16,28 @@ function getCustomAssetUrl() {
|
|
16
16
|
return false;
|
17
17
|
}
|
18
18
|
|
19
|
+
/*
|
20
|
+
* COPYRIGHT (c) Siemens AG 2018-2025 ALL RIGHTS RESERVED.
|
21
|
+
*/
|
22
|
+
let parser = null;
|
23
|
+
const errorSymbol = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'><path fill-rule='evenodd' d='M384,0 L384,384 L0,384 L0,0 L384,0 Z M192,207.085 L57.751,341.333 L326.248,341.333 L192,207.085 Z M42.666,57.751 L42.666,326.248 L176.915,192 L42.666,57.751 Z M341.333,57.751 L207.085,192 L341.333,326.248 L341.333,57.751 Z M326.248,42.666 L57.751,42.666 L192,176.915 L326.248,42.666 Z' transform='translate(64 64)'/></svg>";
|
24
|
+
function parseSVGDataContent(content) {
|
25
|
+
if (typeof window['DOMParser'] === 'undefined') {
|
26
|
+
console.error('DOMParser not supported by your browser.');
|
27
|
+
return '';
|
28
|
+
}
|
29
|
+
if (parser === null) {
|
30
|
+
parser = new window['DOMParser']();
|
31
|
+
}
|
32
|
+
const svgDocument = parser.parseFromString(content, 'text/html');
|
33
|
+
const svgElement = svgDocument.querySelector('svg');
|
34
|
+
if (!svgElement) {
|
35
|
+
console.error('No valid svg data provided');
|
36
|
+
return '';
|
37
|
+
}
|
38
|
+
return svgElement.outerHTML;
|
39
|
+
}
|
40
|
+
|
19
41
|
/*
|
20
42
|
* SPDX-FileCopyrightText: 2023 Siemens AG
|
21
43
|
*
|
@@ -26,7 +48,6 @@ function getCustomAssetUrl() {
|
|
26
48
|
*/
|
27
49
|
let fetchCache;
|
28
50
|
const requests = new Map();
|
29
|
-
let parser = null;
|
30
51
|
const getIconCacheMap = () => {
|
31
52
|
if (typeof window === 'undefined') {
|
32
53
|
return new Map();
|
@@ -46,21 +67,6 @@ const isSvgDataUrl = (url) => {
|
|
46
67
|
}
|
47
68
|
return url.startsWith('data:image/svg+xml');
|
48
69
|
};
|
49
|
-
function parseSVGDataContent(content) {
|
50
|
-
if (typeof window['DOMParser'] === 'undefined') {
|
51
|
-
console.warn('DOMParser not supported by your browser.');
|
52
|
-
return;
|
53
|
-
}
|
54
|
-
if (parser === null) {
|
55
|
-
parser = new window['DOMParser']();
|
56
|
-
}
|
57
|
-
const svgDocument = parser.parseFromString(content, 'text/html');
|
58
|
-
const svgElement = svgDocument.querySelector('svg');
|
59
|
-
if (!svgElement) {
|
60
|
-
throw Error('No valid svg data provided');
|
61
|
-
}
|
62
|
-
return svgElement.outerHTML;
|
63
|
-
}
|
64
70
|
async function fetchSVG(url) {
|
65
71
|
const cache = getIconCacheMap();
|
66
72
|
if (cache.has(url)) {
|
@@ -69,18 +75,27 @@ async function fetchSVG(url) {
|
|
69
75
|
if (requests.has(url)) {
|
70
76
|
return requests.get(url);
|
71
77
|
}
|
72
|
-
const fetching = fetch(url)
|
78
|
+
const fetching = fetch(url)
|
79
|
+
.then(async (response) => {
|
73
80
|
const responseText = await response.text();
|
74
|
-
|
75
|
-
|
76
|
-
|
81
|
+
let svgContent = '';
|
82
|
+
if (response.ok) {
|
83
|
+
svgContent = parseSVGDataContent(responseText);
|
84
|
+
cache.set(url, svgContent);
|
85
|
+
}
|
86
|
+
else {
|
87
|
+
console.error('Failed to request svg data from', url, 'with status code', response.status);
|
77
88
|
}
|
78
|
-
const svgContent = parseSVGDataContent(responseText);
|
79
|
-
cache.set(url, svgContent);
|
80
|
-
requests.delete(url);
|
81
89
|
return svgContent;
|
90
|
+
})
|
91
|
+
.catch(() => {
|
92
|
+
console.error('Failed to fetch svg data:', url);
|
93
|
+
cache.set(url, '');
|
94
|
+
return '';
|
95
|
+
})
|
96
|
+
.finally(() => {
|
97
|
+
requests.delete(url);
|
82
98
|
});
|
83
|
-
requests.set(url, fetching);
|
84
99
|
return fetching;
|
85
100
|
}
|
86
101
|
const urlRegex = /^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:www\.)?(?:\S+\.\S+)(?:\S*)$/i;
|
@@ -97,20 +112,19 @@ function getIconUrl(name) {
|
|
97
112
|
url = index.getAssetPath(url);
|
98
113
|
}
|
99
114
|
catch (error) {
|
100
|
-
console.warn(
|
101
|
-
index.setAssetPath(`${window.location.origin}/`);
|
102
|
-
url = index.getAssetPath(url);
|
115
|
+
console.warn(`Could not load icon with name "${name}". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to property.`);
|
103
116
|
}
|
104
117
|
return url;
|
105
118
|
}
|
106
|
-
async function resolveIcon(iconName) {
|
119
|
+
async function resolveIcon(element, iconName) {
|
107
120
|
if (!iconName) {
|
108
|
-
|
121
|
+
console.warn('No icon was provided', element);
|
122
|
+
return '';
|
109
123
|
}
|
110
124
|
if (isSvgDataUrl(iconName)) {
|
111
125
|
return parseSVGDataContent(iconName);
|
112
126
|
}
|
113
|
-
return
|
127
|
+
return loadIcon(iconName);
|
114
128
|
}
|
115
129
|
async function loadIcon(iconName) {
|
116
130
|
const cache = getIconCacheMap();
|
@@ -118,19 +132,9 @@ async function loadIcon(iconName) {
|
|
118
132
|
return cache.get(iconName);
|
119
133
|
}
|
120
134
|
if (isValidUrl(iconName)) {
|
121
|
-
|
122
|
-
return fetchSVG(iconName);
|
123
|
-
}
|
124
|
-
catch (error) {
|
125
|
-
throw error;
|
126
|
-
}
|
127
|
-
}
|
128
|
-
try {
|
129
|
-
return fetchSVG(getIconUrl(iconName));
|
130
|
-
}
|
131
|
-
catch (error) {
|
132
|
-
throw Error(`Could not resolve ${iconName}`);
|
135
|
+
return fetchSVG(iconName);
|
133
136
|
}
|
137
|
+
return fetchSVG(getIconUrl(iconName));
|
134
138
|
}
|
135
139
|
function removePrefix(name, prefix) {
|
136
140
|
if (name.startsWith(prefix)) {
|
@@ -162,10 +166,16 @@ function addIconToCache(name, icon) {
|
|
162
166
|
const iconCss = ":host{display:inline-flex;height:1.5rem;width:1.5rem;min-height:1.5rem;min-width:1.5rem;color:inherit}:host .svg-container{display:block;position:relative;width:100%;height:100%}:host .svg-container svg{display:block;position:relative;height:100%;width:100%}:host .svg-container svg,:host .svg-container svg[fill],:host .svg-container svg [fill]{fill:currentColor !important}:host(.size-12){height:0.75rem;width:0.75rem;min-height:0.75rem;min-width:0.75rem}:host(.size-16){height:1rem;width:1rem;min-height:1rem;min-width:1rem}:host(.size-32){height:2rem;width:2rem;min-height:2rem;min-width:2rem}";
|
163
167
|
const IxIconStyle0 = iconCss;
|
164
168
|
|
165
|
-
const iconMissingSymbol = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'><path fill-rule='evenodd' d='M384,0 L384,384 L0,384 L0,0 L384,0 Z M192,207.085 L57.751,341.333 L326.248,341.333 L192,207.085 Z M42.666,57.751 L42.666,326.248 L176.915,192 L42.666,57.751 Z M341.333,57.751 L207.085,192 L341.333,326.248 L341.333,57.751 Z M326.248,42.666 L57.751,42.666 L192,176.915 L326.248,42.666 Z' transform='translate(64 64)'/></svg>";
|
166
169
|
const Icon = class {
|
167
170
|
constructor(hostRef) {
|
168
171
|
index.registerInstance(this, hostRef);
|
172
|
+
/**
|
173
|
+
* Size of the icon
|
174
|
+
*/
|
175
|
+
this.size = '24';
|
176
|
+
/**
|
177
|
+
* Only fetch and parse svg data when icon is visible
|
178
|
+
*/
|
169
179
|
this.lazyLoading = false;
|
170
180
|
this.isVisible = false;
|
171
181
|
}
|
@@ -176,12 +186,12 @@ const Icon = class {
|
|
176
186
|
});
|
177
187
|
}
|
178
188
|
async loadIconContent() {
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
this.svgContent = parseSVGDataContent(iconMissingSymbol);
|
189
|
+
const content = await resolveIcon(this.hostElement, this.name);
|
190
|
+
if (!content) {
|
191
|
+
this.svgContent = parseSVGDataContent(errorSymbol);
|
192
|
+
return;
|
184
193
|
}
|
194
|
+
this.svgContent = content;
|
185
195
|
}
|
186
196
|
waitForRendering(onRender) {
|
187
197
|
if (this.lazyLoading && typeof window !== 'undefined' && window.IntersectionObserver) {
|
@@ -206,12 +216,12 @@ const Icon = class {
|
|
206
216
|
if (this.color) {
|
207
217
|
style['color'] = `var(--theme-${this.color})`;
|
208
218
|
}
|
209
|
-
return (index.h(index.Host, { key: '
|
219
|
+
return (index.h(index.Host, { key: '484071b4f74e0b803b8d36913c866bfdb4b1a259', style: style, class: {
|
210
220
|
['size-12']: this.size === '12',
|
211
221
|
['size-16']: this.size === '16',
|
212
222
|
['size-24']: this.size === '24',
|
213
223
|
['size-32']: this.size === '32',
|
214
|
-
} }, index.h("div", { key: '
|
224
|
+
} }, index.h("div", { key: 'd988ef0fcc83087c24c905cf95ff02fe187aed5e', class: 'svg-container', innerHTML: this.svgContent })));
|
215
225
|
}
|
216
226
|
static get assetsDirs() { return ["svg"]; }
|
217
227
|
get hostElement() { return index.getElement(this); }
|
@@ -225,4 +235,4 @@ exports.Icon = Icon;
|
|
225
235
|
exports.addIconToCache = addIconToCache;
|
226
236
|
exports.addIcons = addIcons;
|
227
237
|
|
228
|
-
//# sourceMappingURL=icon-
|
238
|
+
//# sourceMappingURL=icon-319056c0.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"file":"icon-319056c0.js","mappings":"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","names":["getAssetPath","h","Host"],"sources":["src/components/icon/meta-tag.ts","src/components/icon/parser.ts","src/components/icon/resolveIcon.ts","src/components/icon/icon.scss?tag=ix-icon&encapsulation=shadow","src/components/icon/icon.tsx"],"sourcesContent":["/**\n * Provide custom SVG path for icons\n *\n * <meta name=\"ix-icons:path\" content=\"/build/svg\" />\n */\nexport function getCustomAssetUrl() {\n const assetPath = document.querySelector(\"meta[name='ix-icons:path']\");\n if (assetPath) {\n const path = assetPath.getAttribute('content');\n return path;\n }\n\n return false;\n}\n","/*\n * COPYRIGHT (c) Siemens AG 2018-2025 ALL RIGHTS RESERVED.\n */\n\nlet parser: any = null;\n\nexport const errorSymbol =\n \"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'><path fill-rule='evenodd' d='M384,0 L384,384 L0,384 L0,0 L384,0 Z M192,207.085 L57.751,341.333 L326.248,341.333 L192,207.085 Z M42.666,57.751 L42.666,326.248 L176.915,192 L42.666,57.751 Z M341.333,57.751 L207.085,192 L341.333,326.248 L341.333,57.751 Z M326.248,42.666 L57.751,42.666 L192,176.915 L326.248,42.666 Z' transform='translate(64 64)'/></svg>\";\n\nexport function parseSVGDataContent(content: string): string {\n if (typeof window['DOMParser'] === 'undefined') {\n console.error('DOMParser not supported by your browser.');\n return '';\n }\n\n if (parser === null) {\n parser = new window['DOMParser']();\n }\n\n const svgDocument = parser.parseFromString(content, 'text/html');\n const svgElement = svgDocument.querySelector('svg') as HTMLElement;\n\n if (!svgElement) {\n console.error('No valid svg data provided');\n return '';\n }\n\n return svgElement.outerHTML;\n}\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { getAssetPath } from '@stencil/core';\nimport { getCustomAssetUrl } from './meta-tag';\nimport { parseSVGDataContent } from './parser';\n\ndeclare global {\n interface Window {\n IxIcons: any;\n }\n}\n\nlet fetchCache: Map<string, string>;\nconst requests = new Map<string, Promise<string>>();\n\nexport const getIconCacheMap = (): Map<string, string> => {\n if (typeof window === 'undefined') {\n return new Map();\n }\n\n if (!fetchCache) {\n window.IxIcons = window.IxIcons || {};\n fetchCache = window.IxIcons.map = window.IxIcons.map || new Map();\n }\n\n return fetchCache;\n};\n\nexport const isSvgDataUrl = (url: string) => {\n if (!url) {\n return false;\n }\n\n if (typeof url !== 'string') {\n return false;\n }\n\n return url.startsWith('data:image/svg+xml');\n};\n\nasync function fetchSVG(url: string) {\n const cache = getIconCacheMap();\n\n if (cache.has(url)) {\n return cache.get(url)!;\n }\n\n if (requests.has(url)) {\n return requests.get(url)!;\n }\n\n const fetching = fetch(url)\n .then(async response => {\n const responseText = await response.text();\n\n let svgContent = '';\n if (response.ok) {\n svgContent = parseSVGDataContent(responseText);\n cache.set(url, svgContent);\n } else {\n console.error('Failed to request svg data from', url, 'with status code', response.status);\n }\n\n return svgContent;\n })\n .catch(() => {\n console.error('Failed to fetch svg data:', url);\n cache.set(url, '');\n return '';\n })\n .finally(() => {\n requests.delete(url);\n });\n\n return fetching;\n}\n\nconst urlRegex = /^(?:(?:https?|ftp):\\/\\/)?(?:\\S+(?::\\S*)?@)?(?:www\\.)?(?:\\S+\\.\\S+)(?:\\S*)$/i;\n\nfunction isValidUrl(url: string) {\n return urlRegex.test(url);\n}\n\nexport function getIconUrl(name: string) {\n const customAssetUrl = getCustomAssetUrl();\n\n if (customAssetUrl) {\n return `${customAssetUrl}/${name}.svg`;\n }\n\n let url: string = `svg/${name}.svg`;\n\n try {\n url = getAssetPath(url);\n } catch (error) {\n console.warn(`Could not load icon with name \"${name}\". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to property.`);\n }\n\n return url;\n}\n\nexport async function resolveIcon(element: HTMLIxIconElement, iconName?: string): Promise<string> {\n if (!iconName) {\n console.warn('No icon was provided', element);\n return '';\n }\n\n if (isSvgDataUrl(iconName)) {\n return parseSVGDataContent(iconName);\n }\n\n return loadIcon(iconName);\n}\n\nasync function loadIcon(iconName: string): Promise<string> {\n const cache = getIconCacheMap();\n\n if (cache.has(iconName)) {\n return cache.get(iconName)!;\n }\n\n if (isValidUrl(iconName)) {\n return fetchSVG(iconName);\n }\n\n return fetchSVG(getIconUrl(iconName));\n}\n\nfunction removePrefix(name: string, prefix: string) {\n if (name.startsWith(prefix)) {\n name = name.slice(prefix.length);\n return name.replace(/^(\\w)/, (_match, p1) => p1.toLowerCase());\n }\n\n return name;\n}\n\nexport function addIcons(icons: { [name: string]: any }) {\n Object.keys(icons).forEach(name => {\n const icon = icons[name];\n name = removePrefix(name, 'icon');\n\n addIconToCache(name, icon);\n });\n}\n\nexport function addIconToCache(name: string, icon: string) {\n const cache = getIconCacheMap();\n\n if (cache.has(name)) {\n console.warn(`Icon name '${name}' already in cache. Overwritting with new icon data.`);\n }\n\n const svg = parseSVGDataContent(icon);\n\n cache.set(name, svg);\n\n const toKebabCase = name.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g, '$1-$2').toLowerCase();\n\n if (name != toKebabCase) {\n cache.set(toKebabCase, svg);\n }\n}\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n@mixin size($size) {\n height: $size;\n width: $size;\n min-height: $size;\n min-width: $size;\n}\n\n:host {\n display: inline-flex;\n @include size(1.5rem);\n color: inherit;\n\n .svg-container {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n\n svg {\n display: block;\n position: relative;\n height: 100%;\n width: 100%;\n }\n\n svg,\n svg[fill],\n svg [fill] {\n fill: currentColor !important;\n }\n }\n}\n\n:host(.size-12) {\n @include size(0.75rem);\n}\n\n:host(.size-16) {\n @include size(1rem);\n}\n\n:host(.size-32) {\n @include size(2rem);\n}\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Component, h, Host, Prop, State, Watch, Element, Build } from '@stencil/core';\nimport { resolveIcon } from './resolveIcon';\nimport { errorSymbol, parseSVGDataContent } from './parser';\n\n@Component({\n tag: 'ix-icon',\n styleUrl: 'icon.scss',\n shadow: true,\n assetsDirs: ['svg'],\n})\nexport class Icon {\n @Element() hostElement!: HTMLIxIconElement;\n\n /**\n * Size of the icon\n */\n @Prop() size: '12' | '16' | '24' | '32' = '24';\n\n /**\n * Color of the icon\n */\n @Prop() color?: string;\n\n /**\n * Use one of our defined icon names e.g. `copy`\n *\n * https://ix.siemens.io/docs/icon-library/icons\n *\n * or the import variant\n *\n * ```\n * import { rocket } from '@siemens/ix-icons/icons';\n *\n * <ix-icon name={rocket}></ix-icon>\n * ```\n */\n @Prop() name?: string;\n\n /**\n * Only fetch and parse svg data when icon is visible\n */\n @Prop() lazyLoading = false;\n\n @State() svgContent?: string;\n @State() isVisible = false;\n\n componentWillLoad() {\n this.waitForRendering(() => {\n this.isVisible = true;\n this.loadIconContent();\n });\n }\n\n @Watch('name')\n async loadIconContent() {\n const content = await resolveIcon(this.hostElement, this.name);\n\n if (!content) {\n this.svgContent = parseSVGDataContent(errorSymbol);\n return;\n }\n\n this.svgContent = content;\n }\n\n private waitForRendering(onRender: () => void) {\n if (Build.isBrowser && this.lazyLoading && typeof window !== 'undefined' && (window as any).IntersectionObserver) {\n const observer = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n onRender();\n observer.disconnect();\n }\n });\n },\n {\n rootMargin: '25px',\n },\n );\n\n observer.observe(this.hostElement);\n } else {\n onRender();\n }\n }\n\n render() {\n const style: {\n [key: string]: string;\n } = {};\n\n if (this.color) {\n style['color'] = `var(--theme-${this.color})`;\n }\n\n return (\n <Host\n style={style}\n class={{\n ['size-12']: this.size === '12',\n ['size-16']: this.size === '16',\n ['size-24']: this.size === '24',\n ['size-32']: this.size === '32',\n }}\n >\n <div class={'svg-container'} innerHTML={this.svgContent}></div>\n </Host>\n );\n }\n}\n"],"version":3}
|
package/dist/cjs/index.cjs.js
CHANGED
@@ -7,10 +7,17 @@
|
|
7
7
|
* LICENSE file in the root directory of this source tree.
|
8
8
|
*/
|
9
9
|
import { h, Host, Build } from "@stencil/core";
|
10
|
-
import {
|
11
|
-
|
10
|
+
import { resolveIcon } from "./resolveIcon";
|
11
|
+
import { errorSymbol, parseSVGDataContent } from "./parser";
|
12
12
|
export class Icon {
|
13
13
|
constructor() {
|
14
|
+
/**
|
15
|
+
* Size of the icon
|
16
|
+
*/
|
17
|
+
this.size = '24';
|
18
|
+
/**
|
19
|
+
* Only fetch and parse svg data when icon is visible
|
20
|
+
*/
|
14
21
|
this.lazyLoading = false;
|
15
22
|
this.isVisible = false;
|
16
23
|
}
|
@@ -21,12 +28,12 @@ export class Icon {
|
|
21
28
|
});
|
22
29
|
}
|
23
30
|
async loadIconContent() {
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
this.svgContent = parseSVGDataContent(iconMissingSymbol);
|
31
|
+
const content = await resolveIcon(this.hostElement, this.name);
|
32
|
+
if (!content) {
|
33
|
+
this.svgContent = parseSVGDataContent(errorSymbol);
|
34
|
+
return;
|
29
35
|
}
|
36
|
+
this.svgContent = content;
|
30
37
|
}
|
31
38
|
waitForRendering(onRender) {
|
32
39
|
if (Build.isBrowser && this.lazyLoading && typeof window !== 'undefined' && window.IntersectionObserver) {
|
@@ -51,12 +58,12 @@ export class Icon {
|
|
51
58
|
if (this.color) {
|
52
59
|
style['color'] = `var(--theme-${this.color})`;
|
53
60
|
}
|
54
|
-
return (h(Host, { key: '
|
61
|
+
return (h(Host, { key: '484071b4f74e0b803b8d36913c866bfdb4b1a259', style: style, class: {
|
55
62
|
['size-12']: this.size === '12',
|
56
63
|
['size-16']: this.size === '16',
|
57
64
|
['size-24']: this.size === '24',
|
58
65
|
['size-32']: this.size === '32',
|
59
|
-
} }, h("div", { key: '
|
66
|
+
} }, h("div", { key: 'd988ef0fcc83087c24c905cf95ff02fe187aed5e', class: 'svg-container', innerHTML: this.svgContent })));
|
60
67
|
}
|
61
68
|
static get is() { return "ix-icon"; }
|
62
69
|
static get encapsulation() { return "shadow"; }
|
@@ -90,18 +97,19 @@ export class Icon {
|
|
90
97
|
"getter": false,
|
91
98
|
"setter": false,
|
92
99
|
"attribute": "size",
|
93
|
-
"reflect": false
|
100
|
+
"reflect": false,
|
101
|
+
"defaultValue": "'24'"
|
94
102
|
},
|
95
103
|
"color": {
|
96
104
|
"type": "string",
|
97
105
|
"mutable": false,
|
98
106
|
"complexType": {
|
99
107
|
"original": "string",
|
100
|
-
"resolved": "string",
|
108
|
+
"resolved": "string | undefined",
|
101
109
|
"references": {}
|
102
110
|
},
|
103
111
|
"required": false,
|
104
|
-
"optional":
|
112
|
+
"optional": true,
|
105
113
|
"docs": {
|
106
114
|
"tags": [],
|
107
115
|
"text": "Color of the icon"
|
@@ -116,11 +124,11 @@ export class Icon {
|
|
116
124
|
"mutable": false,
|
117
125
|
"complexType": {
|
118
126
|
"original": "string",
|
119
|
-
"resolved": "string",
|
127
|
+
"resolved": "string | undefined",
|
120
128
|
"references": {}
|
121
129
|
},
|
122
130
|
"required": false,
|
123
|
-
"optional":
|
131
|
+
"optional": true,
|
124
132
|
"docs": {
|
125
133
|
"tags": [],
|
126
134
|
"text": "Use one of our defined icon names e.g. `copy`\n\nhttps://ix.siemens.io/docs/icon-library/icons\n\nor the import variant\n\n```\nimport { rocket } from '@siemens/ix-icons/icons';\n\n<ix-icon name={rocket}></ix-icon>\n```"
|
@@ -142,7 +150,7 @@ export class Icon {
|
|
142
150
|
"optional": false,
|
143
151
|
"docs": {
|
144
152
|
"tags": [],
|
145
|
-
"text": ""
|
153
|
+
"text": "Only fetch and parse svg data when icon is visible"
|
146
154
|
},
|
147
155
|
"getter": false,
|
148
156
|
"setter": false,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../../src/components/icon/icon.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../../src/components/icon/icon.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAQ5D,MAAM,OAAO,IAAI;IANjB;QASE;;WAEG;QACK,SAAI,GAA8B,IAAI,CAAC;QAsB/C;;WAEG;QACK,gBAAW,GAAG,KAAK,CAAC;QAGnB,cAAS,GAAG,KAAK,CAAC;KAkE5B;IAhEC,iBAAiB;QACf,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE;YACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAGD,KAAK,CAAC,eAAe;QACnB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC5B,CAAC;IAEO,gBAAgB,CAAC,QAAoB;QAC3C,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,oBAAoB,EAAE,CAAC;YACjH,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,OAAO,CAAC,EAAE;gBACR,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACtB,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;wBACzB,QAAQ,EAAE,CAAC;wBACX,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACxB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,EACD;gBACE,UAAU,EAAE,MAAM;aACnB,CACF,CAAC;YAEF,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAEP,EAAE,CAAC;QAEP,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,OAAO,CAAC,GAAG,eAAe,IAAI,CAAC,KAAK,GAAG,CAAC;QAChD,CAAC;QAED,OAAO,CACL,EAAC,IAAI,qDACH,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE;gBACL,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI;gBAC/B,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI;gBAC/B,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI;gBAC/B,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI;aAChC;YAED,4DAAK,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,GAAQ,CAC1D,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Component, h, Host, Prop, State, Watch, Element, Build } from '@stencil/core';\nimport { resolveIcon } from './resolveIcon';\nimport { errorSymbol, parseSVGDataContent } from './parser';\n\n@Component({\n tag: 'ix-icon',\n styleUrl: 'icon.scss',\n shadow: true,\n assetsDirs: ['svg'],\n})\nexport class Icon {\n @Element() hostElement!: HTMLIxIconElement;\n\n /**\n * Size of the icon\n */\n @Prop() size: '12' | '16' | '24' | '32' = '24';\n\n /**\n * Color of the icon\n */\n @Prop() color?: string;\n\n /**\n * Use one of our defined icon names e.g. `copy`\n *\n * https://ix.siemens.io/docs/icon-library/icons\n *\n * or the import variant\n *\n * ```\n * import { rocket } from '@siemens/ix-icons/icons';\n *\n * <ix-icon name={rocket}></ix-icon>\n * ```\n */\n @Prop() name?: string;\n\n /**\n * Only fetch and parse svg data when icon is visible\n */\n @Prop() lazyLoading = false;\n\n @State() svgContent?: string;\n @State() isVisible = false;\n\n componentWillLoad() {\n this.waitForRendering(() => {\n this.isVisible = true;\n this.loadIconContent();\n });\n }\n\n @Watch('name')\n async loadIconContent() {\n const content = await resolveIcon(this.hostElement, this.name);\n\n if (!content) {\n this.svgContent = parseSVGDataContent(errorSymbol);\n return;\n }\n\n this.svgContent = content;\n }\n\n private waitForRendering(onRender: () => void) {\n if (Build.isBrowser && this.lazyLoading && typeof window !== 'undefined' && (window as any).IntersectionObserver) {\n const observer = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n onRender();\n observer.disconnect();\n }\n });\n },\n {\n rootMargin: '25px',\n },\n );\n\n observer.observe(this.hostElement);\n } else {\n onRender();\n }\n }\n\n render() {\n const style: {\n [key: string]: string;\n } = {};\n\n if (this.color) {\n style['color'] = `var(--theme-${this.color})`;\n }\n\n return (\n <Host\n style={style}\n class={{\n ['size-12']: this.size === '12',\n ['size-16']: this.size === '16',\n ['size-24']: this.size === '24',\n ['size-32']: this.size === '32',\n }}\n >\n <div class={'svg-container'} innerHTML={this.svgContent}></div>\n </Host>\n );\n }\n}\n"]}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/*
|
2
|
+
* COPYRIGHT (c) Siemens AG 2018-2025 ALL RIGHTS RESERVED.
|
3
|
+
*/
|
4
|
+
let parser = null;
|
5
|
+
export const errorSymbol = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'><path fill-rule='evenodd' d='M384,0 L384,384 L0,384 L0,0 L384,0 Z M192,207.085 L57.751,341.333 L326.248,341.333 L192,207.085 Z M42.666,57.751 L42.666,326.248 L176.915,192 L42.666,57.751 Z M341.333,57.751 L207.085,192 L341.333,326.248 L341.333,57.751 Z M326.248,42.666 L57.751,42.666 L192,176.915 L326.248,42.666 Z' transform='translate(64 64)'/></svg>";
|
6
|
+
export function parseSVGDataContent(content) {
|
7
|
+
if (typeof window['DOMParser'] === 'undefined') {
|
8
|
+
console.error('DOMParser not supported by your browser.');
|
9
|
+
return '';
|
10
|
+
}
|
11
|
+
if (parser === null) {
|
12
|
+
parser = new window['DOMParser']();
|
13
|
+
}
|
14
|
+
const svgDocument = parser.parseFromString(content, 'text/html');
|
15
|
+
const svgElement = svgDocument.querySelector('svg');
|
16
|
+
if (!svgElement) {
|
17
|
+
console.error('No valid svg data provided');
|
18
|
+
return '';
|
19
|
+
}
|
20
|
+
return svgElement.outerHTML;
|
21
|
+
}
|
22
|
+
//# sourceMappingURL=parser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/components/icon/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,IAAI,MAAM,GAAQ,IAAI,CAAC;AAEvB,MAAM,CAAC,MAAM,WAAW,GACtB,gdAAgd,CAAC;AAEnd,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,WAAW,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,KAAK,CAAgB,CAAC;IAEnE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,UAAU,CAAC,SAAS,CAAC;AAC9B,CAAC","sourcesContent":["/*\n * COPYRIGHT (c) Siemens AG 2018-2025 ALL RIGHTS RESERVED.\n */\n\nlet parser: any = null;\n\nexport const errorSymbol =\n \"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'><path fill-rule='evenodd' d='M384,0 L384,384 L0,384 L0,0 L384,0 Z M192,207.085 L57.751,341.333 L326.248,341.333 L192,207.085 Z M42.666,57.751 L42.666,326.248 L176.915,192 L42.666,57.751 Z M341.333,57.751 L207.085,192 L341.333,326.248 L341.333,57.751 Z M326.248,42.666 L57.751,42.666 L192,176.915 L326.248,42.666 Z' transform='translate(64 64)'/></svg>\";\n\nexport function parseSVGDataContent(content: string): string {\n if (typeof window['DOMParser'] === 'undefined') {\n console.error('DOMParser not supported by your browser.');\n return '';\n }\n\n if (parser === null) {\n parser = new window['DOMParser']();\n }\n\n const svgDocument = parser.parseFromString(content, 'text/html');\n const svgElement = svgDocument.querySelector('svg') as HTMLElement;\n\n if (!svgElement) {\n console.error('No valid svg data provided');\n return '';\n }\n\n return svgElement.outerHTML;\n}\n"]}
|
@@ -6,11 +6,11 @@
|
|
6
6
|
* This source code is licensed under the MIT license found in the
|
7
7
|
* LICENSE file in the root directory of this source tree.
|
8
8
|
*/
|
9
|
-
import { getAssetPath
|
9
|
+
import { getAssetPath } from "@stencil/core";
|
10
10
|
import { getCustomAssetUrl } from "./meta-tag";
|
11
|
+
import { parseSVGDataContent } from "./parser";
|
11
12
|
let fetchCache;
|
12
13
|
const requests = new Map();
|
13
|
-
let parser = null;
|
14
14
|
export const getIconCacheMap = () => {
|
15
15
|
if (typeof window === 'undefined') {
|
16
16
|
return new Map();
|
@@ -30,21 +30,6 @@ export const isSvgDataUrl = (url) => {
|
|
30
30
|
}
|
31
31
|
return url.startsWith('data:image/svg+xml');
|
32
32
|
};
|
33
|
-
export function parseSVGDataContent(content) {
|
34
|
-
if (typeof window['DOMParser'] === 'undefined') {
|
35
|
-
console.warn('DOMParser not supported by your browser.');
|
36
|
-
return;
|
37
|
-
}
|
38
|
-
if (parser === null) {
|
39
|
-
parser = new window['DOMParser']();
|
40
|
-
}
|
41
|
-
const svgDocument = parser.parseFromString(content, 'text/html');
|
42
|
-
const svgElement = svgDocument.querySelector('svg');
|
43
|
-
if (!svgElement) {
|
44
|
-
throw Error('No valid svg data provided');
|
45
|
-
}
|
46
|
-
return svgElement.outerHTML;
|
47
|
-
}
|
48
33
|
async function fetchSVG(url) {
|
49
34
|
const cache = getIconCacheMap();
|
50
35
|
if (cache.has(url)) {
|
@@ -53,18 +38,27 @@ async function fetchSVG(url) {
|
|
53
38
|
if (requests.has(url)) {
|
54
39
|
return requests.get(url);
|
55
40
|
}
|
56
|
-
const fetching = fetch(url)
|
41
|
+
const fetching = fetch(url)
|
42
|
+
.then(async (response) => {
|
57
43
|
const responseText = await response.text();
|
58
|
-
|
59
|
-
|
60
|
-
|
44
|
+
let svgContent = '';
|
45
|
+
if (response.ok) {
|
46
|
+
svgContent = parseSVGDataContent(responseText);
|
47
|
+
cache.set(url, svgContent);
|
48
|
+
}
|
49
|
+
else {
|
50
|
+
console.error('Failed to request svg data from', url, 'with status code', response.status);
|
61
51
|
}
|
62
|
-
const svgContent = parseSVGDataContent(responseText);
|
63
|
-
cache.set(url, svgContent);
|
64
|
-
requests.delete(url);
|
65
52
|
return svgContent;
|
53
|
+
})
|
54
|
+
.catch(() => {
|
55
|
+
console.error('Failed to fetch svg data:', url);
|
56
|
+
cache.set(url, '');
|
57
|
+
return '';
|
58
|
+
})
|
59
|
+
.finally(() => {
|
60
|
+
requests.delete(url);
|
66
61
|
});
|
67
|
-
requests.set(url, fetching);
|
68
62
|
return fetching;
|
69
63
|
}
|
70
64
|
const urlRegex = /^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:www\.)?(?:\S+\.\S+)(?:\S*)$/i;
|
@@ -81,20 +75,19 @@ export function getIconUrl(name) {
|
|
81
75
|
url = getAssetPath(url);
|
82
76
|
}
|
83
77
|
catch (error) {
|
84
|
-
console.warn(
|
85
|
-
setAssetPath(`${window.location.origin}/`);
|
86
|
-
url = getAssetPath(url);
|
78
|
+
console.warn(`Could not load icon with name "${name}". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to property.`);
|
87
79
|
}
|
88
80
|
return url;
|
89
81
|
}
|
90
|
-
export async function resolveIcon(iconName) {
|
82
|
+
export async function resolveIcon(element, iconName) {
|
91
83
|
if (!iconName) {
|
92
|
-
|
84
|
+
console.warn('No icon was provided', element);
|
85
|
+
return '';
|
93
86
|
}
|
94
87
|
if (isSvgDataUrl(iconName)) {
|
95
88
|
return parseSVGDataContent(iconName);
|
96
89
|
}
|
97
|
-
return
|
90
|
+
return loadIcon(iconName);
|
98
91
|
}
|
99
92
|
async function loadIcon(iconName) {
|
100
93
|
const cache = getIconCacheMap();
|
@@ -102,19 +95,9 @@ async function loadIcon(iconName) {
|
|
102
95
|
return cache.get(iconName);
|
103
96
|
}
|
104
97
|
if (isValidUrl(iconName)) {
|
105
|
-
|
106
|
-
return fetchSVG(iconName);
|
107
|
-
}
|
108
|
-
catch (error) {
|
109
|
-
throw error;
|
110
|
-
}
|
111
|
-
}
|
112
|
-
try {
|
113
|
-
return fetchSVG(getIconUrl(iconName));
|
114
|
-
}
|
115
|
-
catch (error) {
|
116
|
-
throw Error(`Could not resolve ${iconName}`);
|
98
|
+
return fetchSVG(iconName);
|
117
99
|
}
|
100
|
+
return fetchSVG(getIconUrl(iconName));
|
118
101
|
}
|
119
102
|
function removePrefix(name, prefix) {
|
120
103
|
if (name.startsWith(prefix)) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"resolveIcon.js","sourceRoot":"","sources":["../../../src/components/icon/resolveIcon.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,
|
1
|
+
{"version":3,"file":"resolveIcon.js","sourceRoot":"","sources":["../../../src/components/icon/resolveIcon.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { getAssetPath } from '@stencil/core';\nimport { getCustomAssetUrl } from './meta-tag';\nimport { parseSVGDataContent } from './parser';\n\ndeclare global {\n interface Window {\n IxIcons: any;\n }\n}\n\nlet fetchCache: Map<string, string>;\nconst requests = new Map<string, Promise<string>>();\n\nexport const getIconCacheMap = (): Map<string, string> => {\n if (typeof window === 'undefined') {\n return new Map();\n }\n\n if (!fetchCache) {\n window.IxIcons = window.IxIcons || {};\n fetchCache = window.IxIcons.map = window.IxIcons.map || new Map();\n }\n\n return fetchCache;\n};\n\nexport const isSvgDataUrl = (url: string) => {\n if (!url) {\n return false;\n }\n\n if (typeof url !== 'string') {\n return false;\n }\n\n return url.startsWith('data:image/svg+xml');\n};\n\nasync function fetchSVG(url: string) {\n const cache = getIconCacheMap();\n\n if (cache.has(url)) {\n return cache.get(url)!;\n }\n\n if (requests.has(url)) {\n return requests.get(url)!;\n }\n\n const fetching = fetch(url)\n .then(async response => {\n const responseText = await response.text();\n\n let svgContent = '';\n if (response.ok) {\n svgContent = parseSVGDataContent(responseText);\n cache.set(url, svgContent);\n } else {\n console.error('Failed to request svg data from', url, 'with status code', response.status);\n }\n\n return svgContent;\n })\n .catch(() => {\n console.error('Failed to fetch svg data:', url);\n cache.set(url, '');\n return '';\n })\n .finally(() => {\n requests.delete(url);\n });\n\n return fetching;\n}\n\nconst urlRegex = /^(?:(?:https?|ftp):\\/\\/)?(?:\\S+(?::\\S*)?@)?(?:www\\.)?(?:\\S+\\.\\S+)(?:\\S*)$/i;\n\nfunction isValidUrl(url: string) {\n return urlRegex.test(url);\n}\n\nexport function getIconUrl(name: string) {\n const customAssetUrl = getCustomAssetUrl();\n\n if (customAssetUrl) {\n return `${customAssetUrl}/${name}.svg`;\n }\n\n let url: string = `svg/${name}.svg`;\n\n try {\n url = getAssetPath(url);\n } catch (error) {\n console.warn(`Could not load icon with name \"${name}\". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to property.`);\n }\n\n return url;\n}\n\nexport async function resolveIcon(element: HTMLIxIconElement, iconName?: string): Promise<string> {\n if (!iconName) {\n console.warn('No icon was provided', element);\n return '';\n }\n\n if (isSvgDataUrl(iconName)) {\n return parseSVGDataContent(iconName);\n }\n\n return loadIcon(iconName);\n}\n\nasync function loadIcon(iconName: string): Promise<string> {\n const cache = getIconCacheMap();\n\n if (cache.has(iconName)) {\n return cache.get(iconName)!;\n }\n\n if (isValidUrl(iconName)) {\n return fetchSVG(iconName);\n }\n\n return fetchSVG(getIconUrl(iconName));\n}\n\nfunction removePrefix(name: string, prefix: string) {\n if (name.startsWith(prefix)) {\n name = name.slice(prefix.length);\n return name.replace(/^(\\w)/, (_match, p1) => p1.toLowerCase());\n }\n\n return name;\n}\n\nexport function addIcons(icons: { [name: string]: any }) {\n Object.keys(icons).forEach(name => {\n const icon = icons[name];\n name = removePrefix(name, 'icon');\n\n addIconToCache(name, icon);\n });\n}\n\nexport function addIconToCache(name: string, icon: string) {\n const cache = getIconCacheMap();\n\n if (cache.has(name)) {\n console.warn(`Icon name '${name}' already in cache. Overwritting with new icon data.`);\n }\n\n const svg = parseSVGDataContent(icon);\n\n cache.set(name, svg);\n\n const toKebabCase = name.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g, '$1-$2').toLowerCase();\n\n if (name != toKebabCase) {\n cache.set(toKebabCase, svg);\n }\n}\n"]}
|