@siemens/ix-icons 0.0.0-pr-69-20250205144920 → 0.0.0-v3-preview-20250130095430

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. package/README.md +17 -46
  2. package/components/icon.js +252 -0
  3. package/components/icon.js.map +1 -0
  4. package/components/index.js +2 -1
  5. package/components/index.js.map +1 -1
  6. package/components/ix-icon.js +1 -1
  7. package/dist/cjs/{icon-319056c0.js → icon-2c9dc943.js} +56 -62
  8. package/dist/cjs/icon-2c9dc943.js.map +1 -0
  9. package/dist/cjs/{index-f6043fa9.js → index-ea94711c.js} +70 -178
  10. package/dist/cjs/index-ea94711c.js.map +1 -0
  11. package/dist/cjs/index.cjs.js +2 -2
  12. package/dist/cjs/ix-icon.cjs.entry.js +2 -2
  13. package/dist/cjs/ix-icons.cjs.js +2 -2
  14. package/dist/cjs/ix-icons.cjs.js.map +1 -1
  15. package/dist/cjs/loader.cjs.js +1 -1
  16. package/dist/collection/collection-manifest.json +2 -2
  17. package/dist/collection/components/icon/icon.js +19 -31
  18. package/dist/collection/components/icon/icon.js.map +1 -1
  19. package/dist/collection/components/icon/icons.js +1258 -0
  20. package/dist/collection/components/icon/icons.js.map +1 -0
  21. package/dist/collection/components/icon/resolveIcon.js +43 -26
  22. package/dist/collection/components/icon/resolveIcon.js.map +1 -1
  23. package/dist/esm/{icon-fc868c56.js → icon-e3f6595d.js} +56 -62
  24. package/dist/esm/icon-e3f6595d.js.map +1 -0
  25. package/dist/esm/{index-051cb4f1.js → index-050dd9d6.js} +70 -178
  26. package/dist/esm/index-050dd9d6.js.map +1 -0
  27. package/dist/esm/index.js +2 -2
  28. package/dist/esm/ix-icon.entry.js +2 -2
  29. package/dist/esm/ix-icons.js +3 -3
  30. package/dist/esm/ix-icons.js.map +1 -1
  31. package/dist/esm/loader.js +2 -2
  32. package/dist/ix-icons/index.esm.js +1 -1
  33. package/dist/ix-icons/ix-icons.esm.js +1 -1
  34. package/dist/ix-icons/ix-icons.esm.js.map +1 -1
  35. package/dist/ix-icons/p-0194ffaa.js +3 -0
  36. package/dist/ix-icons/p-0194ffaa.js.map +1 -0
  37. package/dist/ix-icons/p-196f504a.js +2 -0
  38. package/dist/ix-icons/p-196f504a.js.map +1 -0
  39. package/dist/ix-icons/p-45457b43.entry.js +2 -0
  40. package/dist/types/components/icon/icon.d.ts +2 -5
  41. package/dist/types/components/icon/icons.d.ts +1256 -0
  42. package/dist/types/components/icon/meta-tag.d.ts +1 -1
  43. package/dist/types/components/icon/resolveIcon.d.ts +2 -1
  44. package/dist/types/components.d.ts +2 -8
  45. package/dist/types/stencil-public-runtime.d.ts +0 -6
  46. package/icons/package.json +1 -1
  47. package/package.json +2 -2
  48. package/components/p-187634d0.js +0 -1363
  49. package/components/p-187634d0.js.map +0 -1
  50. package/dist/cjs/icon-319056c0.js.map +0 -1
  51. package/dist/cjs/index-f6043fa9.js.map +0 -1
  52. package/dist/collection/components/icon/parser.js +0 -22
  53. package/dist/collection/components/icon/parser.js.map +0 -1
  54. package/dist/esm/icon-fc868c56.js.map +0 -1
  55. package/dist/esm/index-051cb4f1.js.map +0 -1
  56. package/dist/ix-icons/p-423803cb.js +0 -2
  57. package/dist/ix-icons/p-423803cb.js.map +0 -1
  58. package/dist/ix-icons/p-48b5ebf2.js +0 -3
  59. package/dist/ix-icons/p-48b5ebf2.js.map +0 -1
  60. package/dist/ix-icons/p-ca4fc358.entry.js +0 -2
  61. package/dist/sample.json +0 -1259
  62. package/dist/types/components/icon/parser.d.ts +0 -2
  63. /package/dist/ix-icons/{p-ca4fc358.entry.js.map → p-45457b43.entry.js.map} +0 -0
package/README.md CHANGED
@@ -12,67 +12,38 @@ SPDX-License-Identifier: MIT
12
12
 
13
13
  ## Usage
14
14
 
15
- ### With Siemens Industrial Experience design system
16
-
17
- If you are also using the library [Siemens Industrial Experience](https://github.com/siemens/ix/), no additional project setup will be neccessary. The packages `@siemens/ix-angular`, `@siemens/ix-react` or `@siemens/ix-vue` will take care of setting up the icon library for you.
18
-
19
- ### Without Siemens Industrial Experience design system
20
-
21
- If you want to use `@siemens/ix-icons` without `@siemens/ix` you need to follow these steps:
22
-
23
- #### Using CDN
24
-
25
- Place the following `<script>` near the end of your page, right before the closing </body> tag.
26
-
27
- ```html
28
- <script type="module" src="https://cdn.jsdelivr.net/npm/@siemens/ix-icons@%5E3.0.0/dist/ix-icons/ix-icons.esm.js"></script>
29
- <script nomodule src="https://cdn.jsdelivr.net/npm/@siemens/ix-icons@%5E3.0.0/dist/ix-icons/ix-icons.js"></script>
30
- ```
31
-
32
- Now you can render icons in you applicaton:
33
-
34
- ```html
35
- <ix-icon name="star"></ix-icon>
36
- ```
37
-
38
- ### Using a package manager like `npm`/`pnpm`/`yarn`
15
+ ### Installation
39
16
 
40
- First install the package `@siemens/ix-icons@latest` in your project (e.g. `npm install --save @siemens/ix-icons`).
17
+ First install the package `@siemens/ix-icons` in your project (e.g. `npm install --save @siemens/ix-icons`).
41
18
 
42
19
  Then load the icon component:
43
20
 
44
21
  ```javascript
45
22
  import { defineCustomElements } from '@siemens/ix-icons/loader';
46
23
 
47
- // Register Web Component <ix-icon></ix-icon>
48
- defineCustomElements();
24
+ (async () => {
25
+ await defineCustomElements();
26
+ })();
49
27
  ```
50
28
 
51
- ### Prepare your project
52
-
53
- 1. **Copy SVG Files:**
54
- Copy all SVG files located under `node_modules/@siemens/ix-icons/svg` to an asset folder in your project. This allows the `ix-icon` component to fetch the images.
29
+ ### Angular / Web Components
55
30
 
56
- 2. **Alternative Method:**
57
- Alternatively, you can use the `addIcons` function to load specific icons directly in your code. For example:
58
-
59
- ```javascript
60
- import { addIcons } from '@siemens/ix-icons';
61
- import { iconStar } from '@siemens/ix-icons/icons';
31
+ ```html
32
+ <ix-icon name="rocket"></ix-icon>
33
+ ```
62
34
 
63
- addIcons({ iconStar });
64
- ```
35
+ ### React and Vue
65
36
 
66
- ```html
67
- <ix-icon name="star"></ix-icon>
68
- ```
37
+ ```tsx
38
+ import { rocket } from '@siemens/ix-icons/icons';
69
39
 
70
- You only need to add the same icon once. Additional calls to `addIcons` will not add redundant copies of the same icons to the collection.
40
+ <ix-icon name={rocket}></ix-icon>;
41
+ ```
71
42
 
72
- ### Use the `ix-icon` component with custom SVG's
43
+ ### Use `ix-icon` component with custom svg's
73
44
 
74
45
  ```tsx
75
- <ix-icon name="/your/asset/path/my-icon.svg"></ix-icon>
46
+ <ix-icon name="/your/asset/path/my-icon.svg"></ix-icon>;
76
47
  ```
77
48
 
78
49
  ## Development
@@ -95,6 +66,6 @@ Contributions, issues and feature requests are welcome!
95
66
 
96
67
  ## 📝 License
97
68
 
98
- Copyright © 2019–2025 [Siemens AG](https://www.siemens.com/).
69
+ Copyright © 2019–2023 [Siemens AG](https://www.siemens.com/).
99
70
 
100
71
  This project is MIT licensed.
@@ -0,0 +1,252 @@
1
+ import { getAssetPath, setAssetPath, proxyCustomElement, HTMLElement, Build, h, Host } from '@stencil/core/internal/client';
2
+
3
+ /**
4
+ * Provide custom SVG path for icons
5
+ *
6
+ * <meta name="ix-icons:path" content="/build/svg" />
7
+ */
8
+ function getCustomAssetUrl() {
9
+ const assetPath = document.querySelector("meta[name='ix-icons:path']");
10
+ if (assetPath) {
11
+ const path = assetPath.getAttribute('content');
12
+ return path;
13
+ }
14
+ return false;
15
+ }
16
+
17
+ /*
18
+ * SPDX-FileCopyrightText: 2023 Siemens AG
19
+ *
20
+ * SPDX-License-Identifier: MIT
21
+ *
22
+ * This source code is licensed under the MIT license found in the
23
+ * LICENSE file in the root directory of this source tree.
24
+ */
25
+ let fetchCache;
26
+ const requests = new Map();
27
+ let parser = null;
28
+ const getIconCacheMap = () => {
29
+ if (typeof window === 'undefined') {
30
+ return new Map();
31
+ }
32
+ if (!fetchCache) {
33
+ window.IxIcons = window.IxIcons || {};
34
+ fetchCache = window.IxIcons.map = window.IxIcons.map || new Map();
35
+ }
36
+ return fetchCache;
37
+ };
38
+ const isSvgDataUrl = (url) => {
39
+ if (!url) {
40
+ return false;
41
+ }
42
+ if (typeof url !== 'string') {
43
+ return false;
44
+ }
45
+ return url.startsWith('data:image/svg+xml');
46
+ };
47
+ function parseSVGDataContent(content) {
48
+ if (typeof window['DOMParser'] === 'undefined') {
49
+ console.warn('DOMParser not supported by your browser.');
50
+ return;
51
+ }
52
+ if (parser === null) {
53
+ parser = new window['DOMParser']();
54
+ }
55
+ const svgDocument = parser.parseFromString(content, 'text/html');
56
+ const svgElement = svgDocument.querySelector('svg');
57
+ if (!svgElement) {
58
+ throw Error('No valid svg data provided');
59
+ }
60
+ return svgElement.outerHTML;
61
+ }
62
+ async function fetchSVG(url) {
63
+ const cache = getIconCacheMap();
64
+ if (cache.has(url)) {
65
+ return cache.get(url);
66
+ }
67
+ if (requests.has(url)) {
68
+ return requests.get(url);
69
+ }
70
+ const fetching = fetch(url).then(async (response) => {
71
+ const responseText = await response.text();
72
+ if (!response.ok) {
73
+ console.error(responseText);
74
+ throw Error(responseText);
75
+ }
76
+ const svgContent = parseSVGDataContent(responseText);
77
+ cache.set(url, svgContent);
78
+ requests.delete(url);
79
+ return svgContent;
80
+ });
81
+ requests.set(url, fetching);
82
+ return fetching;
83
+ }
84
+ const urlRegex = /^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:www\.)?(?:\S+\.\S+)(?:\S*)$/i;
85
+ function isValidUrl(url) {
86
+ return urlRegex.test(url);
87
+ }
88
+ function getIconUrl(name) {
89
+ const customAssetUrl = getCustomAssetUrl();
90
+ if (customAssetUrl) {
91
+ return `${customAssetUrl}/${name}.svg`;
92
+ }
93
+ let url = `svg/${name}.svg`;
94
+ try {
95
+ url = getAssetPath(url);
96
+ }
97
+ catch (error) {
98
+ console.warn(error);
99
+ setAssetPath(`${window.location.origin}/`);
100
+ url = getAssetPath(url);
101
+ }
102
+ return url;
103
+ }
104
+ async function resolveIcon(iconName) {
105
+ if (!iconName) {
106
+ throw Error('No icon name provided');
107
+ }
108
+ if (isSvgDataUrl(iconName)) {
109
+ return parseSVGDataContent(iconName);
110
+ }
111
+ return await loadIcon(iconName);
112
+ }
113
+ async function loadIcon(iconName) {
114
+ const cache = getIconCacheMap();
115
+ if (cache.has(iconName)) {
116
+ return cache.get(iconName);
117
+ }
118
+ if (isValidUrl(iconName)) {
119
+ try {
120
+ return fetchSVG(iconName);
121
+ }
122
+ catch (error) {
123
+ throw error;
124
+ }
125
+ }
126
+ try {
127
+ return fetchSVG(getIconUrl(iconName));
128
+ }
129
+ catch (error) {
130
+ throw Error(`Could not resolve ${iconName}`);
131
+ }
132
+ }
133
+ function removePrefix(name, prefix) {
134
+ if (name.startsWith(prefix)) {
135
+ name = name.slice(prefix.length);
136
+ return name.replace(/^(\w)/, (_match, p1) => p1.toLowerCase());
137
+ }
138
+ return name;
139
+ }
140
+ function addIcons(icons) {
141
+ Object.keys(icons).forEach(name => {
142
+ const icon = icons[name];
143
+ name = removePrefix(name, 'icon');
144
+ addIconToCache(name, icon);
145
+ });
146
+ }
147
+ function addIconToCache(name, icon) {
148
+ const cache = getIconCacheMap();
149
+ if (cache.has(name)) {
150
+ console.warn(`Icon name '${name}' already in cache. Overwritting with new icon data.`);
151
+ }
152
+ const svg = parseSVGDataContent(icon);
153
+ cache.set(name, svg);
154
+ const toKebabCase = name.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g, '$1-$2').toLowerCase();
155
+ if (name != toKebabCase) {
156
+ cache.set(toKebabCase, svg);
157
+ }
158
+ }
159
+
160
+ 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}";
161
+ const IxIconStyle0 = iconCss;
162
+
163
+ 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>";
164
+ const Icon = /*@__PURE__*/ proxyCustomElement(class Icon extends HTMLElement {
165
+ constructor() {
166
+ super();
167
+ this.__registerHost();
168
+ this.__attachShadow();
169
+ this.size = undefined;
170
+ this.color = undefined;
171
+ this.name = undefined;
172
+ this.lazyLoading = false;
173
+ this.svgContent = undefined;
174
+ this.isVisible = false;
175
+ }
176
+ componentWillLoad() {
177
+ this.waitForRendering(() => {
178
+ this.isVisible = true;
179
+ this.loadIconContent();
180
+ });
181
+ }
182
+ async loadIconContent() {
183
+ try {
184
+ this.svgContent = await resolveIcon(this.name);
185
+ }
186
+ catch (error) {
187
+ this.svgContent = parseSVGDataContent(iconMissingSymbol);
188
+ }
189
+ }
190
+ waitForRendering(onRender) {
191
+ if (Build.isBrowser && this.lazyLoading && typeof window !== 'undefined' && window.IntersectionObserver) {
192
+ const observer = new IntersectionObserver(entries => {
193
+ entries.forEach(entry => {
194
+ if (entry.isIntersecting) {
195
+ onRender();
196
+ observer.disconnect();
197
+ }
198
+ });
199
+ }, {
200
+ rootMargin: '25px',
201
+ });
202
+ observer.observe(this.hostElement);
203
+ }
204
+ else {
205
+ onRender();
206
+ }
207
+ }
208
+ render() {
209
+ const style = {};
210
+ if (this.color) {
211
+ style['color'] = `var(--theme-${this.color})`;
212
+ }
213
+ return (h(Host, { key: '8dc18bf3b1ab1e2a521bd0fee33fa91b856dc52b', style: style, class: {
214
+ ['size-12']: this.size === '12',
215
+ ['size-16']: this.size === '16',
216
+ ['size-24']: this.size === '24',
217
+ ['size-32']: this.size === '32',
218
+ } }, h("div", { key: '48c3e8ae8e0d36be5fa112dbd408756f56c19535', class: 'svg-container', innerHTML: this.svgContent })));
219
+ }
220
+ static get assetsDirs() { return ["svg"]; }
221
+ get hostElement() { return this; }
222
+ static get watchers() { return {
223
+ "name": ["loadIconContent"]
224
+ }; }
225
+ static get style() { return IxIconStyle0; }
226
+ }, [1, "ix-icon", {
227
+ "size": [1],
228
+ "color": [1],
229
+ "name": [1],
230
+ "lazyLoading": [4, "lazy-loading"],
231
+ "svgContent": [32],
232
+ "isVisible": [32]
233
+ }, undefined, {
234
+ "name": ["loadIconContent"]
235
+ }]);
236
+ function defineCustomElement() {
237
+ if (typeof customElements === "undefined") {
238
+ return;
239
+ }
240
+ const components = ["ix-icon"];
241
+ components.forEach(tagName => { switch (tagName) {
242
+ case "ix-icon":
243
+ if (!customElements.get(tagName)) {
244
+ customElements.define(tagName, Icon);
245
+ }
246
+ break;
247
+ } });
248
+ }
249
+
250
+ export { Icon as I, addIcons as a, addIconToCache as b, defineCustomElement as d };
251
+
252
+ //# sourceMappingURL=icon.js.map
@@ -0,0 +1 @@
1
+ {"file":"icon.js","mappings":"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","names":[],"sources":["src/components/icon/meta-tag.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 * 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, setAssetPath } from '@stencil/core';\nimport { getCustomAssetUrl } from './meta-tag';\n\ndeclare global {\n interface Window {\n IxIcons: any;\n }\n}\n\nlet fetchCache: Map<string, string>;\nconst requests = new Map<string, Promise<string>>();\nlet parser = null;\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\nexport function parseSVGDataContent(content: string) {\n if (typeof window['DOMParser'] === 'undefined') {\n console.warn('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 throw Error('No valid svg data provided');\n }\n\n return svgElement.outerHTML;\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).then(async response => {\n const responseText = await response.text();\n\n if (!response.ok) {\n console.error(responseText);\n throw Error(responseText);\n }\n\n const svgContent = parseSVGDataContent(responseText);\n cache.set(url, svgContent);\n\n requests.delete(url);\n\n return svgContent;\n });\n\n requests.set(url, fetching);\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(error);\n setAssetPath(`${window.location.origin}/`);\n url = getAssetPath(url);\n }\n\n return url;\n}\n\nexport async function resolveIcon(iconName: string) {\n if (!iconName) {\n throw Error('No icon name provided');\n }\n\n if (isSvgDataUrl(iconName)) {\n return parseSVGDataContent(iconName);\n }\n\n return await loadIcon(iconName);\n}\n\nasync function loadIcon(iconName: string) {\n const cache = getIconCacheMap();\n\n if (cache.has(iconName)) {\n return cache.get(iconName);\n }\n\n if (isValidUrl(iconName)) {\n try {\n return fetchSVG(iconName);\n } catch (error) {\n throw error;\n }\n }\n\n try {\n return fetchSVG(getIconUrl(iconName));\n } catch (error) {\n throw Error(`Could not resolve ${iconName}`);\n }\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 { parseSVGDataContent, resolveIcon } from './resolveIcon';\n\nconst iconMissingSymbol =\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\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';\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 @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 try {\n this.svgContent = await resolveIcon(this.name);\n } catch (error) {\n this.svgContent = parseSVGDataContent(iconMissingSymbol);\n }\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}
@@ -1,3 +1,4 @@
1
- export { I as Icon, d as addIconToCache, c as addIcons, e as defineCustomElement, g as getAssetPath, s as setAssetPath, a as setNonce, b as setPlatformOptions } from './p-187634d0.js';
1
+ export { getAssetPath, setAssetPath, setNonce, setPlatformOptions } from '@stencil/core/internal/client';
2
+ export { I as Icon, b as addIconToCache, a as addIcons, d as defineCustomElement } from './icon.js';
2
3
 
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"file":"index.js","mappings":"","names":[],"sources":[],"sourcesContent":[],"version":3}
1
+ {"file":"index.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
@@ -1,4 +1,4 @@
1
- import { I as Icon, e as defineCustomElement$1 } from './p-187634d0.js';
1
+ import { I as Icon, d as defineCustomElement$1 } from './icon.js';
2
2
 
3
3
  const IxIcon = Icon;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const index = require('./index-f6043fa9.js');
3
+ const index = require('./index-ea94711c.js');
4
4
 
5
5
  /**
6
6
  * Provide custom SVG path for icons
@@ -16,28 +16,6 @@ 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
-
41
19
  /*
42
20
  * SPDX-FileCopyrightText: 2023 Siemens AG
43
21
  *
@@ -48,6 +26,7 @@ function parseSVGDataContent(content) {
48
26
  */
49
27
  let fetchCache;
50
28
  const requests = new Map();
29
+ let parser = null;
51
30
  const getIconCacheMap = () => {
52
31
  if (typeof window === 'undefined') {
53
32
  return new Map();
@@ -67,6 +46,21 @@ const isSvgDataUrl = (url) => {
67
46
  }
68
47
  return url.startsWith('data:image/svg+xml');
69
48
  };
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
+ }
70
64
  async function fetchSVG(url) {
71
65
  const cache = getIconCacheMap();
72
66
  if (cache.has(url)) {
@@ -75,27 +69,18 @@ async function fetchSVG(url) {
75
69
  if (requests.has(url)) {
76
70
  return requests.get(url);
77
71
  }
78
- const fetching = fetch(url)
79
- .then(async (response) => {
72
+ const fetching = fetch(url).then(async (response) => {
80
73
  const responseText = await response.text();
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);
74
+ if (!response.ok) {
75
+ console.error(responseText);
76
+ throw Error(responseText);
88
77
  }
89
- return svgContent;
90
- })
91
- .catch(() => {
92
- console.error('Failed to fetch svg data:', url);
93
- cache.set(url, '');
94
- return '';
95
- })
96
- .finally(() => {
78
+ const svgContent = parseSVGDataContent(responseText);
79
+ cache.set(url, svgContent);
97
80
  requests.delete(url);
81
+ return svgContent;
98
82
  });
83
+ requests.set(url, fetching);
99
84
  return fetching;
100
85
  }
101
86
  const urlRegex = /^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:www\.)?(?:\S+\.\S+)(?:\S*)$/i;
@@ -112,19 +97,20 @@ function getIconUrl(name) {
112
97
  url = index.getAssetPath(url);
113
98
  }
114
99
  catch (error) {
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.`);
100
+ console.warn(error);
101
+ index.setAssetPath(`${window.location.origin}/`);
102
+ url = index.getAssetPath(url);
116
103
  }
117
104
  return url;
118
105
  }
119
- async function resolveIcon(element, iconName) {
106
+ async function resolveIcon(iconName) {
120
107
  if (!iconName) {
121
- console.warn('No icon was provided', element);
122
- return '';
108
+ throw Error('No icon name provided');
123
109
  }
124
110
  if (isSvgDataUrl(iconName)) {
125
111
  return parseSVGDataContent(iconName);
126
112
  }
127
- return loadIcon(iconName);
113
+ return await loadIcon(iconName);
128
114
  }
129
115
  async function loadIcon(iconName) {
130
116
  const cache = getIconCacheMap();
@@ -132,9 +118,19 @@ async function loadIcon(iconName) {
132
118
  return cache.get(iconName);
133
119
  }
134
120
  if (isValidUrl(iconName)) {
135
- return fetchSVG(iconName);
121
+ try {
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}`);
136
133
  }
137
- return fetchSVG(getIconUrl(iconName));
138
134
  }
139
135
  function removePrefix(name, prefix) {
140
136
  if (name.startsWith(prefix)) {
@@ -166,17 +162,15 @@ function addIconToCache(name, icon) {
166
162
  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}";
167
163
  const IxIconStyle0 = iconCss;
168
164
 
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>";
169
166
  const Icon = class {
170
167
  constructor(hostRef) {
171
168
  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
+ this.size = undefined;
170
+ this.color = undefined;
171
+ this.name = undefined;
179
172
  this.lazyLoading = false;
173
+ this.svgContent = undefined;
180
174
  this.isVisible = false;
181
175
  }
182
176
  componentWillLoad() {
@@ -186,12 +180,12 @@ const Icon = class {
186
180
  });
187
181
  }
188
182
  async loadIconContent() {
189
- const content = await resolveIcon(this.hostElement, this.name);
190
- if (!content) {
191
- this.svgContent = parseSVGDataContent(errorSymbol);
192
- return;
183
+ try {
184
+ this.svgContent = await resolveIcon(this.name);
185
+ }
186
+ catch (error) {
187
+ this.svgContent = parseSVGDataContent(iconMissingSymbol);
193
188
  }
194
- this.svgContent = content;
195
189
  }
196
190
  waitForRendering(onRender) {
197
191
  if (this.lazyLoading && typeof window !== 'undefined' && window.IntersectionObserver) {
@@ -216,12 +210,12 @@ const Icon = class {
216
210
  if (this.color) {
217
211
  style['color'] = `var(--theme-${this.color})`;
218
212
  }
219
- return (index.h(index.Host, { key: '484071b4f74e0b803b8d36913c866bfdb4b1a259', style: style, class: {
213
+ return (index.h(index.Host, { key: '8dc18bf3b1ab1e2a521bd0fee33fa91b856dc52b', style: style, class: {
220
214
  ['size-12']: this.size === '12',
221
215
  ['size-16']: this.size === '16',
222
216
  ['size-24']: this.size === '24',
223
217
  ['size-32']: this.size === '32',
224
- } }, index.h("div", { key: 'd988ef0fcc83087c24c905cf95ff02fe187aed5e', class: 'svg-container', innerHTML: this.svgContent })));
218
+ } }, index.h("div", { key: '48c3e8ae8e0d36be5fa112dbd408756f56c19535', class: 'svg-container', innerHTML: this.svgContent })));
225
219
  }
226
220
  static get assetsDirs() { return ["svg"]; }
227
221
  get hostElement() { return index.getElement(this); }
@@ -235,4 +229,4 @@ exports.Icon = Icon;
235
229
  exports.addIconToCache = addIconToCache;
236
230
  exports.addIcons = addIcons;
237
231
 
238
- //# sourceMappingURL=icon-319056c0.js.map
232
+ //# sourceMappingURL=icon-2c9dc943.js.map
@@ -0,0 +1 @@
1
+ {"file":"icon-2c9dc943.js","mappings":"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","names":["getAssetPath","setAssetPath","h","Host"],"sources":["src/components/icon/meta-tag.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 * 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, setAssetPath } from '@stencil/core';\nimport { getCustomAssetUrl } from './meta-tag';\n\ndeclare global {\n interface Window {\n IxIcons: any;\n }\n}\n\nlet fetchCache: Map<string, string>;\nconst requests = new Map<string, Promise<string>>();\nlet parser = null;\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\nexport function parseSVGDataContent(content: string) {\n if (typeof window['DOMParser'] === 'undefined') {\n console.warn('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 throw Error('No valid svg data provided');\n }\n\n return svgElement.outerHTML;\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).then(async response => {\n const responseText = await response.text();\n\n if (!response.ok) {\n console.error(responseText);\n throw Error(responseText);\n }\n\n const svgContent = parseSVGDataContent(responseText);\n cache.set(url, svgContent);\n\n requests.delete(url);\n\n return svgContent;\n });\n\n requests.set(url, fetching);\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(error);\n setAssetPath(`${window.location.origin}/`);\n url = getAssetPath(url);\n }\n\n return url;\n}\n\nexport async function resolveIcon(iconName: string) {\n if (!iconName) {\n throw Error('No icon name provided');\n }\n\n if (isSvgDataUrl(iconName)) {\n return parseSVGDataContent(iconName);\n }\n\n return await loadIcon(iconName);\n}\n\nasync function loadIcon(iconName: string) {\n const cache = getIconCacheMap();\n\n if (cache.has(iconName)) {\n return cache.get(iconName);\n }\n\n if (isValidUrl(iconName)) {\n try {\n return fetchSVG(iconName);\n } catch (error) {\n throw error;\n }\n }\n\n try {\n return fetchSVG(getIconUrl(iconName));\n } catch (error) {\n throw Error(`Could not resolve ${iconName}`);\n }\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 { parseSVGDataContent, resolveIcon } from './resolveIcon';\n\nconst iconMissingSymbol =\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\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';\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 @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 try {\n this.svgContent = await resolveIcon(this.name);\n } catch (error) {\n this.svgContent = parseSVGDataContent(iconMissingSymbol);\n }\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}