@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.
Files changed (142) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cjs/NiceDesktopIconExporter.js +688 -599
  3. package/dist/cjs/NiceFaviconGenerator.js +603 -417
  4. package/dist/cjs/NiceIconPicker.js +788 -508
  5. package/dist/cjs/NiceIconPreview.js +246 -188
  6. package/dist/cjs/NiceIconSetCreator.js +683 -552
  7. package/dist/cjs/NiceIconStacker.js +547 -171
  8. package/dist/cjs/NiceIconValue.js +27 -35
  9. package/dist/cjs/NtdIconBadge.js +384 -360
  10. package/dist/cjs/NtdIconMorph.js +419 -354
  11. package/dist/cjs/NtdStateMorph.js +150 -147
  12. package/dist/cjs/advancedIconSearch.js +373 -510
  13. package/dist/cjs/animationControls.js +518 -642
  14. package/dist/cjs/client.js +12 -15
  15. package/dist/cjs/createIcon.js +349 -251
  16. package/dist/cjs/design-tokens.js +324 -390
  17. package/dist/cjs/figmaExport.js +162 -257
  18. package/dist/cjs/figmaSync.js +234 -316
  19. package/dist/cjs/headless-ui.js +240 -368
  20. package/dist/cjs/iconAnalytics.js +337 -393
  21. package/dist/cjs/iconHtml.js +64 -86
  22. package/dist/cjs/iconMetadata.js +392 -472
  23. package/dist/cjs/iconParts.js +120 -90
  24. package/dist/cjs/iconStack.js +136 -155
  25. package/dist/cjs/iconStyles.js +1609 -504
  26. package/dist/cjs/iconValue.js +359 -430
  27. package/dist/cjs/icons/accessibility.js +1119 -134
  28. package/dist/cjs/icons/actions.js +1290 -330
  29. package/dist/cjs/icons/ai.js +1424 -144
  30. package/dist/cjs/icons/brand.js +1344 -172
  31. package/dist/cjs/icons/business.js +903 -193
  32. package/dist/cjs/icons/devtech.js +1656 -227
  33. package/dist/cjs/icons/ecommerce.js +802 -111
  34. package/dist/cjs/icons/education.js +1345 -199
  35. package/dist/cjs/icons/files.js +1597 -328
  36. package/dist/cjs/icons/fintech.js +793 -104
  37. package/dist/cjs/icons/food.js +1507 -153
  38. package/dist/cjs/icons/fun.js +786 -109
  39. package/dist/cjs/icons/gaming.js +916 -170
  40. package/dist/cjs/icons/health.js +623 -112
  41. package/dist/cjs/icons/index.js +34 -35
  42. package/dist/cjs/icons/input.js +282 -83
  43. package/dist/cjs/icons/legal.js +1065 -122
  44. package/dist/cjs/icons/media.js +1061 -267
  45. package/dist/cjs/icons/navigation.js +387 -122
  46. package/dist/cjs/icons/omniverk.js +747 -90
  47. package/dist/cjs/icons/realestate.js +1520 -193
  48. package/dist/cjs/icons/saas.js +867 -98
  49. package/dist/cjs/icons/science.js +1465 -165
  50. package/dist/cjs/icons/shapes.js +1316 -308
  51. package/dist/cjs/icons/smarthome.js +786 -90
  52. package/dist/cjs/icons/social.js +591 -59
  53. package/dist/cjs/icons/sports.js +1225 -133
  54. package/dist/cjs/icons/sustainability.js +1211 -139
  55. package/dist/cjs/icons/travel.js +1470 -148
  56. package/dist/cjs/icons/ui.js +1508 -315
  57. package/dist/cjs/icons/weather.js +1160 -173
  58. package/dist/cjs/index.js +566 -566
  59. package/dist/cjs/lottieIntegration.js +261 -266
  60. package/dist/cjs/nicetodev-icons.css +1 -1
  61. package/dist/cjs/particleEffects.js +270 -251
  62. package/dist/cjs/resolver.js +229 -284
  63. package/dist/cjs/rsc.js +175 -193
  64. package/dist/cjs/sharpen.js +73 -130
  65. package/dist/cjs/smilAnimations.js +371 -165
  66. package/dist/cjs/stacking.js +87 -122
  67. package/dist/cjs/tailwind-plugin.js +280 -320
  68. package/dist/cjs/types.js +46 -72
  69. package/dist/cjs/utilities.js +163 -324
  70. package/dist/cjs/variantProps.js +12 -52
  71. package/dist/esm/NiceDesktopIconExporter.js +671 -598
  72. package/dist/esm/NiceFaviconGenerator.js +583 -416
  73. package/dist/esm/NiceIconPicker.js +789 -507
  74. package/dist/esm/NiceIconPreview.js +247 -187
  75. package/dist/esm/NiceIconSetCreator.js +685 -551
  76. package/dist/esm/NiceIconStacker.js +549 -170
  77. package/dist/esm/NiceIconValue.js +29 -34
  78. package/dist/esm/NtdIconBadge.js +388 -359
  79. package/dist/esm/NtdIconMorph.js +423 -353
  80. package/dist/esm/NtdStateMorph.js +152 -146
  81. package/dist/esm/advancedIconSearch.js +391 -509
  82. package/dist/esm/animationControls.js +527 -641
  83. package/dist/esm/client.js +48 -10
  84. package/dist/esm/createIcon.js +350 -250
  85. package/dist/esm/design-tokens.js +334 -387
  86. package/dist/esm/figmaExport.js +170 -256
  87. package/dist/esm/figmaSync.js +237 -315
  88. package/dist/esm/headless-ui.js +254 -365
  89. package/dist/esm/iconAnalytics.js +342 -392
  90. package/dist/esm/iconHtml.js +67 -85
  91. package/dist/esm/iconMetadata.js +404 -471
  92. package/dist/esm/iconParts.js +125 -89
  93. package/dist/esm/iconStack.js +145 -154
  94. package/dist/esm/iconStyles.js +1620 -503
  95. package/dist/esm/iconValue.js +361 -429
  96. package/dist/esm/icons/accessibility.js +1133 -133
  97. package/dist/esm/icons/actions.js +1320 -329
  98. package/dist/esm/icons/ai.js +1441 -143
  99. package/dist/esm/icons/brand.js +1351 -171
  100. package/dist/esm/icons/business.js +931 -201
  101. package/dist/esm/icons/devtech.js +1687 -226
  102. package/dist/esm/icons/ecommerce.js +816 -110
  103. package/dist/esm/icons/education.js +1364 -198
  104. package/dist/esm/icons/files.js +1628 -327
  105. package/dist/esm/icons/fintech.js +807 -103
  106. package/dist/esm/icons/food.js +1524 -152
  107. package/dist/esm/icons/fun.js +801 -108
  108. package/dist/esm/icons/gaming.js +933 -169
  109. package/dist/esm/icons/health.js +636 -111
  110. package/dist/esm/icons/index.js +596 -32
  111. package/dist/esm/icons/input.js +326 -82
  112. package/dist/esm/icons/legal.js +1079 -121
  113. package/dist/esm/icons/media.js +1086 -266
  114. package/dist/esm/icons/navigation.js +401 -121
  115. package/dist/esm/icons/omniverk.js +759 -89
  116. package/dist/esm/icons/realestate.js +1544 -198
  117. package/dist/esm/icons/saas.js +880 -97
  118. package/dist/esm/icons/science.js +1482 -164
  119. package/dist/esm/icons/shapes.js +1343 -307
  120. package/dist/esm/icons/smarthome.js +799 -89
  121. package/dist/esm/icons/social.js +599 -58
  122. package/dist/esm/icons/sports.js +1240 -132
  123. package/dist/esm/icons/sustainability.js +1226 -138
  124. package/dist/esm/icons/travel.js +1486 -147
  125. package/dist/esm/icons/ui.js +1540 -314
  126. package/dist/esm/icons/weather.js +1181 -172
  127. package/dist/esm/index.js +756 -58
  128. package/dist/esm/lottieIntegration.js +264 -265
  129. package/dist/esm/nicetodev-icons.css +1 -1
  130. package/dist/esm/particleEffects.js +271 -250
  131. package/dist/esm/resolver.js +231 -283
  132. package/dist/esm/rsc.js +182 -192
  133. package/dist/esm/sharpen.js +78 -129
  134. package/dist/esm/smilAnimations.js +376 -164
  135. package/dist/esm/stacking.js +99 -121
  136. package/dist/esm/tailwind-plugin.js +282 -319
  137. package/dist/esm/types.js +50 -71
  138. package/dist/esm/utilities.js +177 -321
  139. package/dist/esm/variantProps.js +23 -52
  140. package/dist/types/icons/index.d.ts +1 -1
  141. package/dist/types/icons/science.d.ts +9 -0
  142. package/package.json +15 -22
@@ -1,473 +1,402 @@
1
- 'use strict';
2
-
3
- var iconHtml = require('./iconHtml.js');
4
- var iconStack = require('./iconStack.js');
5
-
6
- /**
7
- * An icon — or a stack of icons — kept as short text (1.3.10): what NiceIconPicker stores with
8
- * `valueFormat="name"` (the default) or `"json"`, as short as a database value can be and still be
9
- * read by people.
10
- *
11
- * **The code** (`'name'`) — a plain icon is its name (`NtdFolder`); a stack nests like a function
12
- * call, the parent first, each setting behind a sign of its own:
13
- *
14
- * ```
15
- * Folder(Star@tr) a star in the folder's top-right corner
16
- * Bell(Circle@tr'3') a circle with "3" in the bell's corner
17
- * Folder(Star@tr%40^15,Lock@bl) two icons in the folder: 40 %, turned 15°; a lock
18
- * User:o(Circle@br#2a2{count}'5'#fff) an outline user, a green circle bound to `count`
19
- * ```
20
- *
21
- * | sign | meaning | example |
22
- * |---|---|---|
23
- * | `( , )` | what sits in the icon, side by side | `Folder(Star,Lock)` |
24
- * | `:` | variant — `so` solid, `sh` sharp, `o` outline, `w` wireframe, `d` duotone, `c` cutout, `r` rounded, `m` mini, `3d`, `v` vivid | `:o` |
25
- * | `@` | position in the parent — `c t b l r tl tr bl br`, `h…` halfway (`ht`, `hbr`…); the parent's own spot when absent | `@tr` |
26
- * | `%` | size, percent of the parent | `%40` |
27
- * | `^` | turn, degrees clockwise | `^-30` |
28
- * | `~` | nudge right / down, percent of the parent | `~5/-3` |
29
- * | `#` | colours: primary, secondary, accent (`##0f0` — secondary only) | `#2a2` |
30
- * | `'…'` | text; `#` and `%` after it are the text's colour and size | `'3'#fff%60` |
31
- * | `{…}` | the value the text is bound to (the text after it is a sample) | `{count}'5'` |
32
- *
33
- * Names drop `Ntd` inside a stack. A name or colour holding any of the signs goes in backticks
34
- * (`` `fa:home` ``); `\` escapes inside quotes.
35
- *
36
- * **JSON** (`'json'`) — the same tree as JsonML: `["Folder",["Star",{"a":"tr"}]]`, a node being
37
- * `[name, {settings}?, ...nodes, "text"?]` with the settings `v a s r x y p sc ac b tc ts` written
38
- * as in the code; a plain icon is its name as a JSON string.
39
- */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const iconHtml = require("./iconHtml.js");
4
+ const iconStack = require("./iconStack.js");
40
5
  const VARIANT_CODE = {
41
- solid: 'so',
42
- sharp: 'sh',
43
- outline: 'o',
44
- wireframe: 'w',
45
- duotone: 'd',
46
- cutout: 'c',
47
- rounded: 'r',
48
- mini: 'm',
49
- '3d': '3d',
50
- vivid: 'v',
6
+ solid: "so",
7
+ sharp: "sh",
8
+ outline: "o",
9
+ wireframe: "w",
10
+ duotone: "d",
11
+ cutout: "c",
12
+ rounded: "r",
13
+ mini: "m",
14
+ "3d": "3d",
15
+ vivid: "v"
51
16
  };
52
17
  const ALIGN_CODE = {
53
- center: 'c',
54
- top: 't',
55
- bottom: 'b',
56
- left: 'l',
57
- right: 'r',
58
- 'top-left': 'tl',
59
- 'top-right': 'tr',
60
- 'bottom-left': 'bl',
61
- 'bottom-right': 'br',
62
- 'half-top': 'ht',
63
- 'half-bottom': 'hb',
64
- 'half-left': 'hl',
65
- 'half-right': 'hr',
66
- 'half-top-left': 'htl',
67
- 'half-top-right': 'htr',
68
- 'half-bottom-left': 'hbl',
69
- 'half-bottom-right': 'hbr',
18
+ center: "c",
19
+ top: "t",
20
+ bottom: "b",
21
+ left: "l",
22
+ right: "r",
23
+ "top-left": "tl",
24
+ "top-right": "tr",
25
+ "bottom-left": "bl",
26
+ "bottom-right": "br",
27
+ "half-top": "ht",
28
+ "half-bottom": "hb",
29
+ "half-left": "hl",
30
+ "half-right": "hr",
31
+ "half-top-left": "htl",
32
+ "half-top-right": "htr",
33
+ "half-bottom-left": "hbl",
34
+ "half-bottom-right": "hbr"
70
35
  };
71
- /** A code or a full name → the value; an unknown one (a newer writer's) reads as unset. */
72
36
  function reverse(codes) {
73
- const map = new Map();
74
- for (const [full, code] of Object.entries(codes)) {
75
- map.set(code, full);
76
- map.set(full, full);
77
- }
78
- return map;
37
+ const map = /* @__PURE__ */ new Map();
38
+ for (const [full, code] of Object.entries(codes)) {
39
+ map.set(code, full);
40
+ map.set(full, full);
41
+ }
42
+ return map;
79
43
  }
80
44
  const VARIANTS = reverse(VARIANT_CODE);
81
- const ALIGNS = reverse({ ...ALIGN_CODE, perfect: 'p' });
82
- /** The signs of the code; a name or colour holding one of them goes in backticks. */
83
- const SIGNS = new Set(['(', ')', ',', ':', '@', '%', '^', '~', '#', "'", '{', '}', '`', '\\']);
84
- /** A plain icon: one layer and nothing set on it but its name. */
45
+ const ALIGNS = reverse({ ...ALIGN_CODE, perfect: "p" });
46
+ const SIGNS = /* @__PURE__ */ new Set(["(", ")", ",", ":", "@", "%", "^", "~", "#", "'", "{", "}", "`", "\\"]);
85
47
  function isPlain(layers) {
86
- return (layers.length === 1 &&
87
- Object.entries(layers[0]).every(([key, value]) => key === 'id' || key === 'icon' || value === undefined));
48
+ return layers.length === 1 && Object.entries(layers[0]).every(
49
+ ([key, value]) => key === "id" || key === "icon" || value === void 0
50
+ );
88
51
  }
89
52
  function quote(text, mark) {
90
- return mark + text.replace(/[\\`']/g, (c) => (c === mark || c === '\\' ? `\\${c}` : c)) + mark;
53
+ return mark + text.replace(/[\\`']/g, (c) => c === mark || c === "\\" ? `\\${c}` : c) + mark;
91
54
  }
92
55
  function writeName(name) {
93
- const needsQuotes = name === '' ||
94
- name !== name.trim() ||
95
- [...name].some((c) => SIGNS.has(c)) ||
96
- /^["[<]/.test(name);
97
- return needsQuotes ? quote(name, '`') : name;
56
+ const needsQuotes = name === "" || name !== name.trim() || [...name].some((c) => SIGNS.has(c)) || /^["[<]/.test(name);
57
+ return needsQuotes ? quote(name, "`") : name;
98
58
  }
99
59
  function writeNumber(n) {
100
- return String(Math.round(n * 1000) / 1000);
60
+ return String(Math.round(n * 1e3) / 1e3);
101
61
  }
102
- /** `#22aa22` → `2a2`, any other hex as is; another colour (`var(--x)`) in backticks. */
103
62
  function writeColor(color) {
104
- if (!color) {
105
- return '';
106
- }
107
- const hex = /^#([0-9a-f]{3,8})$/i.exec(color);
108
- if (!hex) {
109
- return quote(color, '`');
110
- }
111
- const h = hex[1].toLowerCase();
112
- return h.length === 6 && h[0] === h[1] && h[2] === h[3] && h[4] === h[5] ? h[0] + h[2] + h[4] : h;
63
+ if (!color) {
64
+ return "";
65
+ }
66
+ const hex = /^#([0-9a-f]{3,8})$/i.exec(color);
67
+ if (!hex) {
68
+ return quote(color, "`");
69
+ }
70
+ const h = hex[1].toLowerCase();
71
+ return h.length === 6 && h[0] === h[1] && h[2] === h[3] && h[4] === h[5] ? h[0] + h[2] + h[4] : h;
113
72
  }
114
73
  function writeCode(layers, shortName) {
115
- const write = (layer, isBase) => {
116
- var _a, _b, _c, _d;
117
- let out = writeName(shortName(layer.icon));
118
- if (layer.variant) {
119
- out += `:${(_a = VARIANT_CODE[layer.variant]) !== null && _a !== void 0 ? _a : layer.variant}`;
120
- }
121
- if (!isBase) {
122
- if (layer.align && layer.align !== 'perfect') {
123
- out += `@${(_b = ALIGN_CODE[layer.align]) !== null && _b !== void 0 ? _b : layer.align}`;
124
- }
125
- if (layer.size !== undefined) {
126
- out += `%${writeNumber(layer.size * 100)}`;
127
- }
128
- if (layer.rotation !== undefined) {
129
- out += `^${writeNumber(layer.rotation)}`;
130
- }
131
- if (layer.offsetX || layer.offsetY) {
132
- out += `~${writeNumber((_c = layer.offsetX) !== null && _c !== void 0 ? _c : 0)}`;
133
- if (layer.offsetY) {
134
- out += `/${writeNumber(layer.offsetY)}`;
135
- }
136
- }
137
- }
138
- const colors = [layer.primaryColor, layer.secondaryColor, layer.accentColor];
139
- const lastColor = colors.reduce((last, c, i) => (c ? i : last), -1);
140
- for (let i = 0; i <= lastColor; i++) {
141
- out += `#${writeColor(colors[i])}`;
142
- }
143
- const bound = !!layer.textBinding && /^[A-Za-z_$][\w$]*$/.test(layer.textBinding);
144
- if (bound) {
145
- out += `{${layer.textBinding}}`;
146
- }
147
- // text settings need a text part to follow; an empty text carries them
148
- if (layer.text || (!bound && (layer.textColor || layer.textSize !== undefined))) {
149
- out += quote((_d = layer.text) !== null && _d !== void 0 ? _d : '', "'");
150
- }
151
- if (layer.textColor) {
152
- out += `#${writeColor(layer.textColor)}`;
153
- }
154
- if (layer.textSize !== undefined) {
155
- out += `%${writeNumber(layer.textSize)}`;
156
- }
157
- const inner = iconStack.stackChildrenOf(layers, layer.id);
158
- return inner.length > 0 ? `${out}(${inner.map((l) => write(l, false)).join(',')})` : out;
159
- };
160
- return write(layers[0], true);
74
+ const write = (layer, isBase) => {
75
+ let out = writeName(shortName(layer.icon));
76
+ if (layer.variant) {
77
+ out += `:${VARIANT_CODE[layer.variant] ?? layer.variant}`;
78
+ }
79
+ if (!isBase) {
80
+ if (layer.align && layer.align !== "perfect") {
81
+ out += `@${ALIGN_CODE[layer.align] ?? layer.align}`;
82
+ }
83
+ if (layer.size !== void 0) {
84
+ out += `%${writeNumber(layer.size * 100)}`;
85
+ }
86
+ if (layer.rotation !== void 0) {
87
+ out += `^${writeNumber(layer.rotation)}`;
88
+ }
89
+ if (layer.offsetX || layer.offsetY) {
90
+ out += `~${writeNumber(layer.offsetX ?? 0)}`;
91
+ if (layer.offsetY) {
92
+ out += `/${writeNumber(layer.offsetY)}`;
93
+ }
94
+ }
95
+ }
96
+ const colors = [layer.primaryColor, layer.secondaryColor, layer.accentColor];
97
+ const lastColor = colors.reduce((last, c, i) => c ? i : last, -1);
98
+ for (let i = 0; i <= lastColor; i++) {
99
+ out += `#${writeColor(colors[i])}`;
100
+ }
101
+ const bound = !!layer.textBinding && /^[A-Za-z_$][\w$]*$/.test(layer.textBinding);
102
+ if (bound) {
103
+ out += `{${layer.textBinding}}`;
104
+ }
105
+ if (layer.text || !bound && (layer.textColor || layer.textSize !== void 0)) {
106
+ out += quote(layer.text ?? "", "'");
107
+ }
108
+ if (layer.textColor) {
109
+ out += `#${writeColor(layer.textColor)}`;
110
+ }
111
+ if (layer.textSize !== void 0) {
112
+ out += `%${writeNumber(layer.textSize)}`;
113
+ }
114
+ const inner = iconStack.stackChildrenOf(layers, layer.id);
115
+ return inner.length > 0 ? `${out}(${inner.map((l) => write(l, false)).join(",")})` : out;
116
+ };
117
+ return write(layers[0], true);
161
118
  }
162
119
  function writeJson(layers, shortName) {
163
- const write = (layer, isBase) => {
164
- var _a, _b;
165
- const s = {};
166
- const set = (key, value) => {
167
- if (value !== undefined && value !== '' && value !== 0) {
168
- s[key] = value;
169
- }
170
- };
171
- set('v', layer.variant && ((_a = VARIANT_CODE[layer.variant]) !== null && _a !== void 0 ? _a : layer.variant));
172
- if (!isBase) {
173
- if (layer.align && layer.align !== 'perfect') {
174
- set('a', (_b = ALIGN_CODE[layer.align]) !== null && _b !== void 0 ? _b : layer.align);
175
- }
176
- if (layer.size !== undefined) {
177
- s.s = Math.round(layer.size * 100000) / 1000;
178
- }
179
- if (layer.rotation !== undefined) {
180
- s.r = layer.rotation;
181
- }
182
- set('x', layer.offsetX);
183
- set('y', layer.offsetY);
184
- }
185
- set('p', layer.primaryColor);
186
- set('sc', layer.secondaryColor);
187
- set('ac', layer.accentColor);
188
- set('b', layer.textBinding);
189
- set('tc', layer.textColor);
190
- if (layer.textSize !== undefined) {
191
- s.ts = layer.textSize;
192
- }
193
- const node = [shortName(layer.icon)];
194
- if (Object.keys(s).length > 0) {
195
- node.push(s);
196
- }
197
- for (const child of iconStack.stackChildrenOf(layers, layer.id)) {
198
- node.push(write(child, false));
199
- }
200
- if (layer.text) {
201
- node.push(layer.text);
202
- }
203
- return node;
120
+ const write = (layer, isBase) => {
121
+ const s = {};
122
+ const set = (key, value) => {
123
+ if (value !== void 0 && value !== "" && value !== 0) {
124
+ s[key] = value;
125
+ }
204
126
  };
205
- return write(layers[0], true);
127
+ set("v", layer.variant && (VARIANT_CODE[layer.variant] ?? layer.variant));
128
+ if (!isBase) {
129
+ if (layer.align && layer.align !== "perfect") {
130
+ set("a", ALIGN_CODE[layer.align] ?? layer.align);
131
+ }
132
+ if (layer.size !== void 0) {
133
+ s.s = Math.round(layer.size * 1e5) / 1e3;
134
+ }
135
+ if (layer.rotation !== void 0) {
136
+ s.r = layer.rotation;
137
+ }
138
+ set("x", layer.offsetX);
139
+ set("y", layer.offsetY);
140
+ }
141
+ set("p", layer.primaryColor);
142
+ set("sc", layer.secondaryColor);
143
+ set("ac", layer.accentColor);
144
+ set("b", layer.textBinding);
145
+ set("tc", layer.textColor);
146
+ if (layer.textSize !== void 0) {
147
+ s.ts = layer.textSize;
148
+ }
149
+ const node = [shortName(layer.icon)];
150
+ if (Object.keys(s).length > 0) {
151
+ node.push(s);
152
+ }
153
+ for (const child of iconStack.stackChildrenOf(layers, layer.id)) {
154
+ node.push(write(child, false));
155
+ }
156
+ if (layer.text) {
157
+ node.push(layer.text);
158
+ }
159
+ return node;
160
+ };
161
+ return write(layers[0], true);
206
162
  }
207
- /**
208
- * Writes an icon or a stack as short text (1.3.10): `'name'` — a plain icon's name, a stack's code
209
- * (`Folder(Star@tr)`) — or `'json'` (`["Folder",["Star",{"a":"tr"}]]`). Empty for no layers.
210
- * `parseIconValue` reads it back; the ids of the layers are not kept.
211
- */
212
- function formatIconValue(layers, format = 'name', { shortName = iconStack.iconDisplayName } = {}) {
213
- if (layers.length === 0) {
214
- return '';
215
- }
216
- if (isPlain(layers)) {
217
- return format === 'json' ? JSON.stringify(layers[0].icon) : layers[0].icon;
218
- }
219
- return format === 'json'
220
- ? JSON.stringify(writeJson(layers, shortName))
221
- : writeCode(layers, shortName);
163
+ function formatIconValue(layers, format = "name", { shortName = iconStack.iconDisplayName } = {}) {
164
+ if (layers.length === 0) {
165
+ return "";
166
+ }
167
+ if (isPlain(layers)) {
168
+ return format === "json" ? JSON.stringify(layers[0].icon) : layers[0].icon;
169
+ }
170
+ return format === "json" ? JSON.stringify(writeJson(layers, shortName)) : writeCode(layers, shortName);
222
171
  }
223
- /* ─── Reading ─── */
224
172
  class IconValueError extends Error {
225
173
  }
226
- /** Collects the layers in document order, ids `'1'`, `'2'`…; what sits in the base has no parent. */
227
174
  class LayerSink {
228
- constructor() {
229
- this.layers = [];
230
- }
231
- add(layer, parent, isBase) {
232
- const data = isBase
233
- ? // where a layer sits means nothing for the base
234
- { ...layer, align: undefined, size: undefined, rotation: undefined }
235
- : layer;
236
- if (isBase || !data.offsetX) {
237
- data.offsetX = undefined;
238
- }
239
- if (isBase || !data.offsetY) {
240
- data.offsetY = undefined;
241
- }
242
- if (data.align === 'perfect') {
243
- data.align = undefined;
244
- }
245
- const id = String(this.layers.length + 1);
246
- const clean = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== undefined && v !== ''));
247
- this.layers.push({ id, ...clean, ...(parent && parent !== '1' ? { parent } : {}) });
248
- return id;
175
+ constructor() {
176
+ this.layers = [];
177
+ }
178
+ add(layer, parent, isBase) {
179
+ const data = isBase ? (
180
+ // where a layer sits means nothing for the base
181
+ { ...layer, align: void 0, size: void 0, rotation: void 0 }
182
+ ) : layer;
183
+ if (isBase || !data.offsetX) {
184
+ data.offsetX = void 0;
185
+ }
186
+ if (isBase || !data.offsetY) {
187
+ data.offsetY = void 0;
188
+ }
189
+ if (data.align === "perfect") {
190
+ data.align = void 0;
249
191
  }
192
+ const id = String(this.layers.length + 1);
193
+ const clean = Object.fromEntries(
194
+ Object.entries(data).filter(([, v]) => v !== void 0 && v !== "")
195
+ );
196
+ this.layers.push({ id, ...clean, ...parent && parent !== "1" ? { parent } : {} });
197
+ return id;
198
+ }
250
199
  }
251
200
  function readCode(code) {
252
- const sink = new LayerSink();
253
- let i = 0;
254
- const peek = () => code[i];
255
- const skipSpaces = () => {
256
- while (i < code.length && /\s/.test(code[i])) {
257
- i++;
258
- }
259
- };
260
- const quoted = (mark) => {
201
+ const sink = new LayerSink();
202
+ let i = 0;
203
+ const peek = () => code[i];
204
+ const skipSpaces = () => {
205
+ while (i < code.length && /\s/.test(code[i])) {
206
+ i++;
207
+ }
208
+ };
209
+ const quoted = (mark) => {
210
+ i++;
211
+ let out = "";
212
+ while (i < code.length && code[i] !== mark) {
213
+ if (code[i] === "\\" && i + 1 < code.length) {
261
214
  i++;
262
- let out = '';
263
- while (i < code.length && code[i] !== mark) {
264
- if (code[i] === '\\' && i + 1 < code.length) {
265
- i++;
266
- }
267
- out += code[i];
268
- i++;
269
- }
270
- if (code[i] !== mark) {
271
- throw new IconValueError('unclosed quote');
272
- }
215
+ }
216
+ out += code[i];
217
+ i++;
218
+ }
219
+ if (code[i] !== mark) {
220
+ throw new IconValueError("unclosed quote");
221
+ }
222
+ i++;
223
+ return out;
224
+ };
225
+ const name = () => {
226
+ skipSpaces();
227
+ if (peek() === "`") {
228
+ return quoted("`");
229
+ }
230
+ const start = i;
231
+ while (i < code.length && !SIGNS.has(code[i])) {
232
+ i++;
233
+ }
234
+ const out = code.slice(start, i).trim();
235
+ if (!out) {
236
+ throw new IconValueError("name expected");
237
+ }
238
+ return out;
239
+ };
240
+ const word = () => {
241
+ const hit = /^[A-Za-z0-9-]*/.exec(code.slice(i))?.[0] ?? "";
242
+ i += hit.length;
243
+ return hit;
244
+ };
245
+ const number = () => {
246
+ const hit = /^-?(?:\d+(?:\.\d*)?|\.\d+)/.exec(code.slice(i))?.[0];
247
+ if (!hit) {
248
+ throw new IconValueError("number expected");
249
+ }
250
+ i += hit.length;
251
+ return Number(hit);
252
+ };
253
+ const color = () => {
254
+ if (peek() === "`") {
255
+ return quoted("`");
256
+ }
257
+ const hit = /^[0-9a-fA-F]{0,8}/.exec(code.slice(i))?.[0] ?? "";
258
+ i += hit.length;
259
+ return hit ? `#${hit.toLowerCase()}` : void 0;
260
+ };
261
+ const node = (parent, isBase) => {
262
+ const layer = { icon: name() };
263
+ const colors = [];
264
+ let settings = true;
265
+ while (settings) {
266
+ const sign = peek();
267
+ if (sign === ":" || sign === "@" || sign === "%" || sign === "^" || sign === "~" || sign === "#") {
273
268
  i++;
274
- return out;
275
- };
276
- const name = () => {
277
- skipSpaces();
278
- if (peek() === '`') {
279
- return quoted('`');
280
- }
281
- const start = i;
282
- while (i < code.length && !SIGNS.has(code[i])) {
283
- i++;
284
- }
285
- const out = code.slice(start, i).trim();
286
- if (!out) {
287
- throw new IconValueError('name expected');
288
- }
289
- return out;
290
- };
291
- const word = () => {
292
- var _a, _b;
293
- const hit = (_b = (_a = /^[A-Za-z0-9-]*/.exec(code.slice(i))) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : '';
294
- i += hit.length;
295
- return hit;
296
- };
297
- const number = () => {
298
- var _a;
299
- const hit = (_a = /^-?(?:\d+(?:\.\d*)?|\.\d+)/.exec(code.slice(i))) === null || _a === void 0 ? void 0 : _a[0];
300
- if (!hit) {
301
- throw new IconValueError('number expected');
302
- }
303
- i += hit.length;
304
- return Number(hit);
305
- };
306
- const color = () => {
307
- var _a, _b;
308
- if (peek() === '`') {
309
- return quoted('`');
310
- }
311
- const hit = (_b = (_a = /^[0-9a-fA-F]{0,8}/.exec(code.slice(i))) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : '';
312
- i += hit.length;
313
- return hit ? `#${hit.toLowerCase()}` : undefined;
314
- };
315
- const node = (parent, isBase) => {
316
- const layer = { icon: name() };
317
- const colors = [];
318
- let settings = true;
319
- while (settings) {
320
- const sign = peek();
321
- if (sign === ':' ||
322
- sign === '@' ||
323
- sign === '%' ||
324
- sign === '^' ||
325
- sign === '~' ||
326
- sign === '#') {
327
- i++;
328
- }
329
- if (sign === ':') {
330
- layer.variant = VARIANTS.get(word());
331
- }
332
- else if (sign === '@') {
333
- layer.align = ALIGNS.get(word());
334
- }
335
- else if (sign === '%') {
336
- layer.size = Math.round(number() * 1000) / 100000;
337
- }
338
- else if (sign === '^') {
339
- layer.rotation = number();
340
- }
341
- else if (sign === '~') {
342
- layer.offsetX = number();
343
- if (peek() === '/') {
344
- i++;
345
- layer.offsetY = number();
346
- }
347
- }
348
- else if (sign === '#') {
349
- colors.push(color());
350
- }
351
- else {
352
- settings = false;
353
- }
354
- }
355
- [layer.primaryColor, layer.secondaryColor, layer.accentColor] = colors;
356
- if (peek() === '{') {
357
- const end = code.indexOf('}', i);
358
- if (end < 0) {
359
- throw new IconValueError('unclosed binding');
360
- }
361
- layer.textBinding = code.slice(i + 1, end).trim();
362
- i = end + 1;
363
- }
364
- if (peek() === "'") {
365
- layer.text = quoted("'");
366
- }
367
- if (layer.text !== undefined || layer.textBinding) {
368
- for (let sign = peek(); sign === '#' || sign === '%'; sign = peek()) {
369
- i++;
370
- if (sign === '#') {
371
- layer.textColor = color();
372
- }
373
- else {
374
- layer.textSize = number();
375
- }
376
- }
269
+ }
270
+ if (sign === ":") {
271
+ layer.variant = VARIANTS.get(word());
272
+ } else if (sign === "@") {
273
+ layer.align = ALIGNS.get(word());
274
+ } else if (sign === "%") {
275
+ layer.size = Math.round(number() * 1e3) / 1e5;
276
+ } else if (sign === "^") {
277
+ layer.rotation = number();
278
+ } else if (sign === "~") {
279
+ layer.offsetX = number();
280
+ if (peek() === "/") {
281
+ i++;
282
+ layer.offsetY = number();
283
+ }
284
+ } else if (sign === "#") {
285
+ colors.push(color());
286
+ } else {
287
+ settings = false;
288
+ }
289
+ }
290
+ [layer.primaryColor, layer.secondaryColor, layer.accentColor] = colors;
291
+ if (peek() === "{") {
292
+ const end = code.indexOf("}", i);
293
+ if (end < 0) {
294
+ throw new IconValueError("unclosed binding");
295
+ }
296
+ layer.textBinding = code.slice(i + 1, end).trim();
297
+ i = end + 1;
298
+ }
299
+ if (peek() === "'") {
300
+ layer.text = quoted("'");
301
+ }
302
+ if (layer.text !== void 0 || layer.textBinding) {
303
+ for (let sign = peek(); sign === "#" || sign === "%"; sign = peek()) {
304
+ i++;
305
+ if (sign === "#") {
306
+ layer.textColor = color();
307
+ } else {
308
+ layer.textSize = number();
377
309
  }
378
- const id = sink.add(layer, parent, isBase);
310
+ }
311
+ }
312
+ const id = sink.add(layer, parent, isBase);
313
+ skipSpaces();
314
+ if (peek() === "(") {
315
+ i++;
316
+ let more = true;
317
+ while (more) {
318
+ node(id, false);
379
319
  skipSpaces();
380
- if (peek() === '(') {
381
- i++;
382
- let more = true;
383
- while (more) {
384
- node(id, false);
385
- skipSpaces();
386
- more = peek() === ',';
387
- if (more) {
388
- i++;
389
- }
390
- }
391
- if (peek() !== ')') {
392
- throw new IconValueError(') expected');
393
- }
394
- i++;
395
- skipSpaces();
396
- }
397
- };
398
- node(undefined, true);
399
- if (i < code.length) {
400
- throw new IconValueError('unexpected text');
320
+ more = peek() === ",";
321
+ if (more) {
322
+ i++;
323
+ }
324
+ }
325
+ if (peek() !== ")") {
326
+ throw new IconValueError(") expected");
327
+ }
328
+ i++;
329
+ skipSpaces();
401
330
  }
402
- return sink.layers;
331
+ };
332
+ node(void 0, true);
333
+ if (i < code.length) {
334
+ throw new IconValueError("unexpected text");
335
+ }
336
+ return sink.layers;
403
337
  }
404
338
  function readJson(json) {
405
- const parsed = JSON.parse(json);
406
- if (typeof parsed === 'string') {
407
- return parsed.trim() ? [{ id: '1', icon: parsed }] : null;
408
- }
409
- const sink = new LayerSink();
410
- const str = (v) => (typeof v === 'string' ? v : undefined);
411
- const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : undefined);
412
- const node = (value, parent, isBase) => {
413
- var _a, _b;
414
- if (!Array.isArray(value) || typeof value[0] !== 'string' || !value[0]) {
415
- throw new IconValueError('node expected');
416
- }
417
- const [icon, ...rest] = value;
418
- const first = rest[0];
419
- const s = (first && typeof first === 'object' && !Array.isArray(first) ? rest.shift() : {});
420
- const text = rest.filter((v) => typeof v === 'string').join('');
421
- const size = num(s.s);
422
- const id = sink.add({
423
- icon,
424
- variant: VARIANTS.get((_a = str(s.v)) !== null && _a !== void 0 ? _a : ''),
425
- align: ALIGNS.get((_b = str(s.a)) !== null && _b !== void 0 ? _b : ''),
426
- size: size === undefined ? undefined : Math.round(size * 1000) / 100000,
427
- rotation: num(s.r),
428
- offsetX: num(s.x),
429
- offsetY: num(s.y),
430
- primaryColor: str(s.p),
431
- secondaryColor: str(s.sc),
432
- accentColor: str(s.ac),
433
- text: text || undefined,
434
- textBinding: str(s.b),
435
- textColor: str(s.tc),
436
- textSize: num(s.ts),
437
- }, parent, isBase);
438
- for (const child of rest) {
439
- if (Array.isArray(child)) {
440
- node(child, id, false);
441
- }
442
- }
443
- };
444
- node(parsed, undefined, true);
445
- return sink.layers;
339
+ const parsed = JSON.parse(json);
340
+ if (typeof parsed === "string") {
341
+ return parsed.trim() ? [{ id: "1", icon: parsed }] : null;
342
+ }
343
+ const sink = new LayerSink();
344
+ const str = (v) => typeof v === "string" ? v : void 0;
345
+ const num = (v) => typeof v === "number" && Number.isFinite(v) ? v : void 0;
346
+ const node = (value, parent, isBase) => {
347
+ if (!Array.isArray(value) || typeof value[0] !== "string" || !value[0]) {
348
+ throw new IconValueError("node expected");
349
+ }
350
+ const [icon, ...rest] = value;
351
+ const first = rest[0];
352
+ const s = first && typeof first === "object" && !Array.isArray(first) ? rest.shift() : {};
353
+ const text = rest.filter((v) => typeof v === "string").join("");
354
+ const size = num(s.s);
355
+ const id = sink.add(
356
+ {
357
+ icon,
358
+ variant: VARIANTS.get(str(s.v) ?? ""),
359
+ align: ALIGNS.get(str(s.a) ?? ""),
360
+ size: size === void 0 ? void 0 : Math.round(size * 1e3) / 1e5,
361
+ rotation: num(s.r),
362
+ offsetX: num(s.x),
363
+ offsetY: num(s.y),
364
+ primaryColor: str(s.p),
365
+ secondaryColor: str(s.sc),
366
+ accentColor: str(s.ac),
367
+ text: text || void 0,
368
+ textBinding: str(s.b),
369
+ textColor: str(s.tc),
370
+ textSize: num(s.ts)
371
+ },
372
+ parent,
373
+ isBase
374
+ );
375
+ for (const child of rest) {
376
+ if (Array.isArray(child)) {
377
+ node(child, id, false);
378
+ }
379
+ }
380
+ };
381
+ node(parsed, void 0, true);
382
+ return sink.layers;
446
383
  }
447
- /**
448
- * Reads an icon kept as text (1.3.10) — a name, the code (`Folder(Star@tr)`), JSON or the HTML of
449
- * NiceIconPicker 1.3.9 — into stack layers (ids `'1'`, `'2'`… in document order). `null` for empty
450
- * or unreadable text. Names stay as written: `renderIconStack` resolves `Star` to `NtdStar`.
451
- */
452
384
  function parseIconValue(value) {
453
- var _a, _b;
454
- const text = value === null || value === void 0 ? void 0 : value.trim();
455
- if (!text) {
456
- return null;
457
- }
458
- try {
459
- if (text.startsWith('<')) {
460
- return (_b = (_a = iconHtml.parseIconHtml(text)) === null || _a === void 0 ? void 0 : _a.layers) !== null && _b !== void 0 ? _b : null;
461
- }
462
- if (text.startsWith('[') || text.startsWith('"')) {
463
- return readJson(text);
464
- }
465
- return readCode(text);
385
+ const text = value?.trim();
386
+ if (!text) {
387
+ return null;
388
+ }
389
+ try {
390
+ if (text.startsWith("<")) {
391
+ return iconHtml.parseIconHtml(text)?.layers ?? null;
466
392
  }
467
- catch (_c) {
468
- return null;
393
+ if (text.startsWith("[") || text.startsWith('"')) {
394
+ return readJson(text);
469
395
  }
396
+ return readCode(text);
397
+ } catch {
398
+ return null;
399
+ }
470
400
  }
471
-
472
401
  exports.formatIconValue = formatIconValue;
473
402
  exports.parseIconValue = parseIconValue;