@nice2dev/icons 1.3.14 → 1.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/cjs/NiceDesktopIconExporter.js +688 -599
- package/dist/cjs/NiceFaviconGenerator.js +603 -417
- package/dist/cjs/NiceIconPicker.js +788 -508
- package/dist/cjs/NiceIconPreview.js +246 -188
- package/dist/cjs/NiceIconSetCreator.js +683 -552
- package/dist/cjs/NiceIconStacker.js +547 -171
- package/dist/cjs/NiceIconValue.js +27 -35
- package/dist/cjs/NtdIconBadge.js +384 -360
- package/dist/cjs/NtdIconMorph.js +419 -354
- package/dist/cjs/NtdStateMorph.js +150 -147
- package/dist/cjs/advancedIconSearch.js +373 -510
- package/dist/cjs/animationControls.js +518 -642
- package/dist/cjs/client.js +12 -15
- package/dist/cjs/createIcon.js +349 -251
- package/dist/cjs/design-tokens.js +324 -390
- package/dist/cjs/figmaExport.js +162 -257
- package/dist/cjs/figmaSync.js +234 -316
- package/dist/cjs/headless-ui.js +240 -368
- package/dist/cjs/iconAnalytics.js +337 -393
- package/dist/cjs/iconHtml.js +64 -86
- package/dist/cjs/iconMetadata.js +392 -472
- package/dist/cjs/iconParts.js +120 -90
- package/dist/cjs/iconStack.js +136 -155
- package/dist/cjs/iconStyles.js +1609 -504
- package/dist/cjs/iconValue.js +359 -430
- package/dist/cjs/icons/accessibility.js +1119 -134
- package/dist/cjs/icons/actions.js +1290 -330
- package/dist/cjs/icons/ai.js +1424 -144
- package/dist/cjs/icons/brand.js +1344 -172
- package/dist/cjs/icons/business.js +903 -193
- package/dist/cjs/icons/devtech.js +1656 -227
- package/dist/cjs/icons/ecommerce.js +802 -111
- package/dist/cjs/icons/education.js +1345 -199
- package/dist/cjs/icons/files.js +1597 -328
- package/dist/cjs/icons/fintech.js +793 -104
- package/dist/cjs/icons/food.js +1507 -153
- package/dist/cjs/icons/fun.js +786 -109
- package/dist/cjs/icons/gaming.js +916 -170
- package/dist/cjs/icons/health.js +623 -112
- package/dist/cjs/icons/index.js +34 -35
- package/dist/cjs/icons/input.js +282 -83
- package/dist/cjs/icons/legal.js +1065 -122
- package/dist/cjs/icons/media.js +1061 -267
- package/dist/cjs/icons/navigation.js +387 -122
- package/dist/cjs/icons/omniverk.js +747 -90
- package/dist/cjs/icons/realestate.js +1520 -193
- package/dist/cjs/icons/saas.js +867 -98
- package/dist/cjs/icons/science.js +1465 -165
- package/dist/cjs/icons/shapes.js +1316 -308
- package/dist/cjs/icons/smarthome.js +786 -90
- package/dist/cjs/icons/social.js +591 -59
- package/dist/cjs/icons/sports.js +1225 -133
- package/dist/cjs/icons/sustainability.js +1211 -139
- package/dist/cjs/icons/travel.js +1470 -148
- package/dist/cjs/icons/ui.js +1508 -315
- package/dist/cjs/icons/weather.js +1160 -173
- package/dist/cjs/index.js +566 -566
- package/dist/cjs/lottieIntegration.js +261 -266
- package/dist/cjs/nicetodev-icons.css +1 -1
- package/dist/cjs/particleEffects.js +270 -251
- package/dist/cjs/resolver.js +229 -284
- package/dist/cjs/rsc.js +175 -193
- package/dist/cjs/sharpen.js +73 -130
- package/dist/cjs/smilAnimations.js +371 -165
- package/dist/cjs/stacking.js +87 -122
- package/dist/cjs/tailwind-plugin.js +280 -320
- package/dist/cjs/types.js +46 -72
- package/dist/cjs/utilities.js +163 -324
- package/dist/cjs/variantProps.js +12 -52
- package/dist/esm/NiceDesktopIconExporter.js +671 -598
- package/dist/esm/NiceFaviconGenerator.js +583 -416
- package/dist/esm/NiceIconPicker.js +789 -507
- package/dist/esm/NiceIconPreview.js +247 -187
- package/dist/esm/NiceIconSetCreator.js +685 -551
- package/dist/esm/NiceIconStacker.js +549 -170
- package/dist/esm/NiceIconValue.js +29 -34
- package/dist/esm/NtdIconBadge.js +388 -359
- package/dist/esm/NtdIconMorph.js +423 -353
- package/dist/esm/NtdStateMorph.js +152 -146
- package/dist/esm/advancedIconSearch.js +391 -509
- package/dist/esm/animationControls.js +527 -641
- package/dist/esm/client.js +48 -10
- package/dist/esm/createIcon.js +350 -250
- package/dist/esm/design-tokens.js +334 -387
- package/dist/esm/figmaExport.js +170 -256
- package/dist/esm/figmaSync.js +237 -315
- package/dist/esm/headless-ui.js +254 -365
- package/dist/esm/iconAnalytics.js +342 -392
- package/dist/esm/iconHtml.js +67 -85
- package/dist/esm/iconMetadata.js +404 -471
- package/dist/esm/iconParts.js +125 -89
- package/dist/esm/iconStack.js +145 -154
- package/dist/esm/iconStyles.js +1620 -503
- package/dist/esm/iconValue.js +361 -429
- package/dist/esm/icons/accessibility.js +1133 -133
- package/dist/esm/icons/actions.js +1320 -329
- package/dist/esm/icons/ai.js +1441 -143
- package/dist/esm/icons/brand.js +1351 -171
- package/dist/esm/icons/business.js +931 -201
- package/dist/esm/icons/devtech.js +1687 -226
- package/dist/esm/icons/ecommerce.js +816 -110
- package/dist/esm/icons/education.js +1364 -198
- package/dist/esm/icons/files.js +1628 -327
- package/dist/esm/icons/fintech.js +807 -103
- package/dist/esm/icons/food.js +1524 -152
- package/dist/esm/icons/fun.js +801 -108
- package/dist/esm/icons/gaming.js +933 -169
- package/dist/esm/icons/health.js +636 -111
- package/dist/esm/icons/index.js +596 -32
- package/dist/esm/icons/input.js +326 -82
- package/dist/esm/icons/legal.js +1079 -121
- package/dist/esm/icons/media.js +1086 -266
- package/dist/esm/icons/navigation.js +401 -121
- package/dist/esm/icons/omniverk.js +759 -89
- package/dist/esm/icons/realestate.js +1544 -198
- package/dist/esm/icons/saas.js +880 -97
- package/dist/esm/icons/science.js +1482 -164
- package/dist/esm/icons/shapes.js +1343 -307
- package/dist/esm/icons/smarthome.js +799 -89
- package/dist/esm/icons/social.js +599 -58
- package/dist/esm/icons/sports.js +1240 -132
- package/dist/esm/icons/sustainability.js +1226 -138
- package/dist/esm/icons/travel.js +1486 -147
- package/dist/esm/icons/ui.js +1540 -314
- package/dist/esm/icons/weather.js +1181 -172
- package/dist/esm/index.js +756 -58
- package/dist/esm/lottieIntegration.js +264 -265
- package/dist/esm/nicetodev-icons.css +1 -1
- package/dist/esm/particleEffects.js +271 -250
- package/dist/esm/resolver.js +231 -283
- package/dist/esm/rsc.js +182 -192
- package/dist/esm/sharpen.js +78 -129
- package/dist/esm/smilAnimations.js +376 -164
- package/dist/esm/stacking.js +99 -121
- package/dist/esm/tailwind-plugin.js +282 -319
- package/dist/esm/types.js +50 -71
- package/dist/esm/utilities.js +177 -321
- package/dist/esm/variantProps.js +23 -52
- package/dist/types/icons/index.d.ts +1 -1
- package/dist/types/icons/science.d.ts +9 -0
- package/package.json +15 -22
package/dist/esm/figmaExport.js
CHANGED
|
@@ -9,282 +9,196 @@
|
|
|
9
9
|
* @since 2026-03
|
|
10
10
|
* @license MIT
|
|
11
11
|
*/
|
|
12
|
-
/* ────────────────────────────────────────────────────────────────────────────
|
|
13
|
-
2. HELPER FUNCTIONS
|
|
14
|
-
───────────────────────────────────────────────────────────────────────────── */
|
|
15
|
-
/**
|
|
16
|
-
* Convert hex color to Figma RGB (0-1 range)
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Generate readable name from icon component name
|
|
20
|
-
*/
|
|
21
12
|
function getReadableName(name) {
|
|
22
|
-
|
|
23
|
-
.replace(/^Ntd/, '')
|
|
24
|
-
.replace(/([A-Z])/g, ' $1')
|
|
25
|
-
.trim();
|
|
13
|
+
return name.replace(/^Ntd/, "").replace(/([A-Z])/g, " $1").trim();
|
|
26
14
|
}
|
|
27
|
-
/**
|
|
28
|
-
* Generate search tags from icon name and category
|
|
29
|
-
*/
|
|
30
15
|
function generateTags(name, category) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
16
|
+
const readable = getReadableName(name).toLowerCase();
|
|
17
|
+
const words = readable.split(/\s+/);
|
|
18
|
+
const categoryLower = category.toLowerCase();
|
|
19
|
+
return [.../* @__PURE__ */ new Set([...words, categoryLower])];
|
|
35
20
|
}
|
|
36
|
-
/* ────────────────────────────────────────────────────────────────────────────
|
|
37
|
-
3. EXPORT FUNCTIONS
|
|
38
|
-
───────────────────────────────────────────────────────────────────────────── */
|
|
39
|
-
/**
|
|
40
|
-
* Export a single icon to Figma vector node JSON
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* ```ts
|
|
44
|
-
* import { exportIconToFigmaNode, NtdHome } from '@nice2dev/icons';
|
|
45
|
-
*
|
|
46
|
-
* const figmaNode = exportIconToFigmaNode(NtdHome, {
|
|
47
|
-
* size: 24,
|
|
48
|
-
* variant: 'solid',
|
|
49
|
-
* primaryColor: '#6c5ce7',
|
|
50
|
-
* });
|
|
51
|
-
* // Use in Figma plugin: figma.createNodeFromFigmaNode(figmaNode)
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
21
|
function exportIconToFigmaNode(IconComponent, options = {}) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
22
|
+
const {
|
|
23
|
+
size = 24,
|
|
24
|
+
variant = "solid",
|
|
25
|
+
primaryColor: _primaryColor = "#000000",
|
|
26
|
+
strokeWidth: _strokeWidth = 2
|
|
27
|
+
} = options;
|
|
28
|
+
const name = IconComponent.displayName || "Icon";
|
|
29
|
+
return {
|
|
30
|
+
type: "FRAME",
|
|
31
|
+
name: `${getReadableName(name)} / ${variant}`,
|
|
32
|
+
width: size,
|
|
33
|
+
height: size,
|
|
34
|
+
children: [
|
|
35
|
+
{
|
|
36
|
+
type: "VECTOR",
|
|
37
|
+
name: "icon",
|
|
62
38
|
width: size,
|
|
63
39
|
height: size,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
],
|
|
77
|
-
fills: [],
|
|
78
|
-
padding: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
79
|
-
};
|
|
40
|
+
vectorPaths: [],
|
|
41
|
+
constraints: {
|
|
42
|
+
horizontal: "SCALE",
|
|
43
|
+
vertical: "SCALE"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
fills: [],
|
|
48
|
+
padding: { top: 0, right: 0, bottom: 0, left: 0 }
|
|
49
|
+
};
|
|
80
50
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Export icon to SVG string for Figma import
|
|
83
|
-
*
|
|
84
|
-
* Returns a clean SVG string that can be imported into Figma.
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* ```ts
|
|
88
|
-
* import { exportIconToSvgString } from '@nice2dev/icons';
|
|
89
|
-
*
|
|
90
|
-
* const svg = exportIconToSvgString(NtdHome, { variant: 'solid', size: 24 });
|
|
91
|
-
* // Copy to clipboard or use in Figma plugin's figma.createNodeFromSvg()
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
51
|
function exportIconToSvgString(svgElement, options = {}) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
clone.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
clone.querySelectorAll('animate, animateTransform, animateMotion').forEach((el) => el.remove());
|
|
110
|
-
}
|
|
111
|
-
// Remove data- attributes used for interaction
|
|
112
|
-
clone.removeAttribute('data-name');
|
|
113
|
-
// Serialize
|
|
114
|
-
return new XMLSerializer().serializeToString(clone);
|
|
52
|
+
const { size = 24, removeAnimations = true } = options;
|
|
53
|
+
const clone = svgElement.cloneNode(true);
|
|
54
|
+
clone.setAttribute("width", String(size));
|
|
55
|
+
clone.setAttribute("height", String(size));
|
|
56
|
+
if (removeAnimations) {
|
|
57
|
+
clone.classList.remove(...Array.from(clone.classList).filter((c) => c.startsWith("ntd-anim-")));
|
|
58
|
+
clone.style.animation = "";
|
|
59
|
+
clone.style.animationName = "";
|
|
60
|
+
clone.style.animationDuration = "";
|
|
61
|
+
clone.style.removeProperty("--ntd-anim-duration");
|
|
62
|
+
clone.querySelectorAll("animate, animateTransform, animateMotion").forEach((el) => el.remove());
|
|
63
|
+
}
|
|
64
|
+
clone.removeAttribute("data-name");
|
|
65
|
+
return new XMLSerializer().serializeToString(clone);
|
|
115
66
|
}
|
|
116
|
-
/**
|
|
117
|
-
* Export icon as base64 data URL
|
|
118
|
-
*/
|
|
119
67
|
function exportIconToDataUrl(svgElement, options) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
68
|
+
const svgString = exportIconToSvgString(svgElement, options);
|
|
69
|
+
const base64 = btoa(unescape(encodeURIComponent(svgString)));
|
|
70
|
+
return `data:image/svg+xml;base64,${base64}`;
|
|
123
71
|
}
|
|
124
|
-
/**
|
|
125
|
-
* Generate Figma plugin manifest for all icons
|
|
126
|
-
*
|
|
127
|
-
* Creates a JSON manifest that can be used by a Figma plugin
|
|
128
|
-
* to display and insert icons.
|
|
129
|
-
*
|
|
130
|
-
* @example
|
|
131
|
-
* ```ts
|
|
132
|
-
* import { generateFigmaPluginManifest, allIcons } from '@nice2dev/icons';
|
|
133
|
-
*
|
|
134
|
-
* const manifest = generateFigmaPluginManifest(allIcons, {
|
|
135
|
-
* name: 'Nice2Dev Icons',
|
|
136
|
-
* version: '1.0.0',
|
|
137
|
-
* });
|
|
138
|
-
*
|
|
139
|
-
* // Save as icons.json for your Figma plugin
|
|
140
|
-
* ```
|
|
141
|
-
*/
|
|
142
72
|
function generateFigmaPluginManifest(icons, options = {}) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
icons: iconEntries,
|
|
176
|
-
};
|
|
73
|
+
const { name = "@nice2dev/icons", version = "1.0.0" } = options;
|
|
74
|
+
const categorySet = /* @__PURE__ */ new Set();
|
|
75
|
+
icons.forEach((icon) => categorySet.add(icon.category));
|
|
76
|
+
const categories = Array.from(categorySet).sort();
|
|
77
|
+
const iconEntries = icons.map((icon) => ({
|
|
78
|
+
name: getReadableName(icon.name),
|
|
79
|
+
category: icon.category,
|
|
80
|
+
variants: [
|
|
81
|
+
"solid",
|
|
82
|
+
"sharp",
|
|
83
|
+
"outline",
|
|
84
|
+
"wireframe",
|
|
85
|
+
"duotone",
|
|
86
|
+
"cutout",
|
|
87
|
+
"vivid",
|
|
88
|
+
"mini",
|
|
89
|
+
"3d",
|
|
90
|
+
"rounded"
|
|
91
|
+
],
|
|
92
|
+
tags: generateTags(icon.name, icon.category),
|
|
93
|
+
paths: {
|
|
94
|
+
// Paths would be extracted from actual rendering
|
|
95
|
+
// This is a placeholder structure
|
|
96
|
+
}
|
|
97
|
+
}));
|
|
98
|
+
return {
|
|
99
|
+
name,
|
|
100
|
+
version,
|
|
101
|
+
iconCount: icons.length,
|
|
102
|
+
categories,
|
|
103
|
+
icons: iconEntries
|
|
104
|
+
};
|
|
177
105
|
}
|
|
178
|
-
/**
|
|
179
|
-
* Download icons as SVG files (browser)
|
|
180
|
-
*
|
|
181
|
-
* Triggers a download of the icon as an SVG file.
|
|
182
|
-
*/
|
|
183
106
|
function downloadIconAsSvg(svgElement, filename, options) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
107
|
+
const svgString = exportIconToSvgString(svgElement, options);
|
|
108
|
+
const blob = new Blob([svgString], { type: "image/svg+xml" });
|
|
109
|
+
const url = URL.createObjectURL(blob);
|
|
110
|
+
const link = document.createElement("a");
|
|
111
|
+
link.href = url;
|
|
112
|
+
link.download = filename.endsWith(".svg") ? filename : `${filename}.svg`;
|
|
113
|
+
document.body.appendChild(link);
|
|
114
|
+
link.click();
|
|
115
|
+
document.body.removeChild(link);
|
|
116
|
+
URL.revokeObjectURL(url);
|
|
194
117
|
}
|
|
195
|
-
/**
|
|
196
|
-
* Download icons as PNG (browser)
|
|
197
|
-
*
|
|
198
|
-
* Renders the SVG to canvas and downloads as PNG.
|
|
199
|
-
*/
|
|
200
118
|
async function downloadIconAsPng(svgElement, filename, options = {}) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
img.onerror = () => reject(new Error('Failed to load SVG image'));
|
|
242
|
-
img.src = imgSrc;
|
|
243
|
-
});
|
|
119
|
+
const { size = 24, scale = 2, backgroundColor } = options;
|
|
120
|
+
const svgString = exportIconToSvgString(svgElement, { size });
|
|
121
|
+
const svg64 = btoa(unescape(encodeURIComponent(svgString)));
|
|
122
|
+
const imgSrc = `data:image/svg+xml;base64,${svg64}`;
|
|
123
|
+
return new Promise((resolve, reject) => {
|
|
124
|
+
const img = new Image();
|
|
125
|
+
img.onload = () => {
|
|
126
|
+
const canvas = document.createElement("canvas");
|
|
127
|
+
const scaledSize = size * scale;
|
|
128
|
+
canvas.width = scaledSize;
|
|
129
|
+
canvas.height = scaledSize;
|
|
130
|
+
const ctx = canvas.getContext("2d");
|
|
131
|
+
if (!ctx) {
|
|
132
|
+
reject(new Error("Could not get canvas context"));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (backgroundColor) {
|
|
136
|
+
ctx.fillStyle = backgroundColor;
|
|
137
|
+
ctx.fillRect(0, 0, scaledSize, scaledSize);
|
|
138
|
+
}
|
|
139
|
+
ctx.drawImage(img, 0, 0, scaledSize, scaledSize);
|
|
140
|
+
canvas.toBlob((blob) => {
|
|
141
|
+
if (!blob) {
|
|
142
|
+
reject(new Error("Could not create blob"));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const url = URL.createObjectURL(blob);
|
|
146
|
+
const link = document.createElement("a");
|
|
147
|
+
link.href = url;
|
|
148
|
+
link.download = filename.endsWith(".png") ? filename : `${filename}.png`;
|
|
149
|
+
document.body.appendChild(link);
|
|
150
|
+
link.click();
|
|
151
|
+
document.body.removeChild(link);
|
|
152
|
+
URL.revokeObjectURL(url);
|
|
153
|
+
resolve();
|
|
154
|
+
}, "image/png");
|
|
155
|
+
};
|
|
156
|
+
img.onerror = () => reject(new Error("Failed to load SVG image"));
|
|
157
|
+
img.src = imgSrc;
|
|
158
|
+
});
|
|
244
159
|
}
|
|
245
|
-
/**
|
|
246
|
-
* Copy icon SVG to clipboard
|
|
247
|
-
*/
|
|
248
160
|
async function copyIconToClipboard(svgElement, options) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
document.execCommand('copy');
|
|
263
|
-
document.body.removeChild(textarea);
|
|
264
|
-
}
|
|
161
|
+
const svgString = exportIconToSvgString(svgElement, options);
|
|
162
|
+
if (navigator.clipboard?.writeText) {
|
|
163
|
+
await navigator.clipboard.writeText(svgString);
|
|
164
|
+
} else {
|
|
165
|
+
const textarea = document.createElement("textarea");
|
|
166
|
+
textarea.value = svgString;
|
|
167
|
+
textarea.style.position = "fixed";
|
|
168
|
+
textarea.style.opacity = "0";
|
|
169
|
+
document.body.appendChild(textarea);
|
|
170
|
+
textarea.select();
|
|
171
|
+
document.execCommand("copy");
|
|
172
|
+
document.body.removeChild(textarea);
|
|
173
|
+
}
|
|
265
174
|
}
|
|
266
|
-
/**
|
|
267
|
-
* Batch export multiple icons
|
|
268
|
-
*/
|
|
269
175
|
function batchExportIcons(svgElements, format, options) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
}
|
|
176
|
+
const result = {};
|
|
177
|
+
for (const { element, name } of svgElements) {
|
|
178
|
+
switch (format) {
|
|
179
|
+
case "svg":
|
|
180
|
+
result[name] = exportIconToSvgString(element, options);
|
|
181
|
+
break;
|
|
182
|
+
case "data-url":
|
|
183
|
+
result[name] = exportIconToDataUrl(element, options);
|
|
184
|
+
break;
|
|
185
|
+
case "json":
|
|
186
|
+
result[name] = JSON.stringify({
|
|
187
|
+
name,
|
|
188
|
+
svg: exportIconToSvgString(element, options)
|
|
189
|
+
});
|
|
190
|
+
break;
|
|
286
191
|
}
|
|
287
|
-
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
288
194
|
}
|
|
289
|
-
|
|
290
|
-
|
|
195
|
+
export {
|
|
196
|
+
batchExportIcons,
|
|
197
|
+
copyIconToClipboard,
|
|
198
|
+
downloadIconAsPng,
|
|
199
|
+
downloadIconAsSvg,
|
|
200
|
+
exportIconToDataUrl,
|
|
201
|
+
exportIconToFigmaNode,
|
|
202
|
+
exportIconToSvgString,
|
|
203
|
+
generateFigmaPluginManifest
|
|
204
|
+
};
|