@nice2dev/icons 1.3.15 → 1.3.17

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 (153) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +1 -1
  3. package/dist/cjs/NiceDesktopIconExporter.js +688 -599
  4. package/dist/cjs/NiceFaviconGenerator.js +603 -417
  5. package/dist/cjs/NiceIconPicker.js +788 -508
  6. package/dist/cjs/NiceIconPreview.js +246 -188
  7. package/dist/cjs/NiceIconSetCreator.js +683 -552
  8. package/dist/cjs/NiceIconStacker.js +547 -171
  9. package/dist/cjs/NiceIconValue.js +27 -35
  10. package/dist/cjs/NtdIconBadge.js +384 -360
  11. package/dist/cjs/NtdIconMorph.js +419 -354
  12. package/dist/cjs/NtdStateMorph.js +150 -147
  13. package/dist/cjs/advancedIconSearch.js +373 -510
  14. package/dist/cjs/animationControls.js +518 -642
  15. package/dist/cjs/animationSpeed.js +69 -0
  16. package/dist/cjs/client.js +12 -15
  17. package/dist/cjs/createIcon.js +374 -252
  18. package/dist/cjs/design-tokens.js +324 -390
  19. package/dist/cjs/figmaExport.js +162 -257
  20. package/dist/cjs/figmaSync.js +234 -316
  21. package/dist/cjs/headless-ui.js +240 -368
  22. package/dist/cjs/iconAnalytics.js +337 -393
  23. package/dist/cjs/iconHtml.js +64 -86
  24. package/dist/cjs/iconMetadata.js +392 -472
  25. package/dist/cjs/iconParts.js +120 -90
  26. package/dist/cjs/iconStack.js +136 -155
  27. package/dist/cjs/iconStyles.js +1670 -509
  28. package/dist/cjs/iconValue.js +359 -430
  29. package/dist/cjs/icons/accessibility.js +1119 -134
  30. package/dist/cjs/icons/actions.js +1290 -330
  31. package/dist/cjs/icons/ai.js +1424 -144
  32. package/dist/cjs/icons/brand.js +613 -184
  33. package/dist/cjs/icons/business.js +938 -192
  34. package/dist/cjs/icons/devtech.js +1656 -227
  35. package/dist/cjs/icons/ecommerce.js +802 -111
  36. package/dist/cjs/icons/education.js +1345 -199
  37. package/dist/cjs/icons/files.js +1597 -328
  38. package/dist/cjs/icons/fintech.js +793 -104
  39. package/dist/cjs/icons/food.js +1028 -156
  40. package/dist/cjs/icons/fun.js +804 -109
  41. package/dist/cjs/icons/gaming.js +916 -170
  42. package/dist/cjs/icons/health.js +623 -112
  43. package/dist/cjs/icons/index.js +32 -42
  44. package/dist/cjs/icons/input.js +282 -83
  45. package/dist/cjs/icons/legal.js +1065 -122
  46. package/dist/cjs/icons/media.js +1061 -267
  47. package/dist/cjs/icons/navigation.js +407 -123
  48. package/dist/cjs/icons/omniverk.js +523 -93
  49. package/dist/cjs/icons/realestate.js +1520 -193
  50. package/dist/cjs/icons/saas.js +867 -98
  51. package/dist/cjs/icons/science.js +1344 -202
  52. package/dist/cjs/icons/shapes.js +1316 -308
  53. package/dist/cjs/icons/smarthome.js +786 -90
  54. package/dist/cjs/icons/social.js +591 -59
  55. package/dist/cjs/icons/sports.js +1133 -133
  56. package/dist/cjs/icons/sustainability.js +1211 -139
  57. package/dist/cjs/icons/travel.js +1470 -148
  58. package/dist/cjs/icons/ui.js +1508 -315
  59. package/dist/cjs/icons/weather.js +1160 -173
  60. package/dist/cjs/index.js +559 -568
  61. package/dist/cjs/lottieIntegration.js +261 -266
  62. package/dist/cjs/nicetodev-icons.css +1 -1
  63. package/dist/cjs/particleEffects.js +270 -251
  64. package/dist/cjs/resolver.js +229 -284
  65. package/dist/cjs/rsc.js +175 -193
  66. package/dist/cjs/sharpen.js +73 -130
  67. package/dist/cjs/smilAnimations.js +380 -165
  68. package/dist/cjs/stacking.js +87 -122
  69. package/dist/cjs/tailwind-plugin.js +280 -320
  70. package/dist/cjs/types.js +46 -72
  71. package/dist/cjs/utilities.js +163 -324
  72. package/dist/cjs/variantProps.js +12 -52
  73. package/dist/esm/NiceDesktopIconExporter.js +671 -598
  74. package/dist/esm/NiceFaviconGenerator.js +583 -416
  75. package/dist/esm/NiceIconPicker.js +789 -507
  76. package/dist/esm/NiceIconPreview.js +247 -187
  77. package/dist/esm/NiceIconSetCreator.js +685 -551
  78. package/dist/esm/NiceIconStacker.js +549 -170
  79. package/dist/esm/NiceIconValue.js +29 -34
  80. package/dist/esm/NtdIconBadge.js +388 -359
  81. package/dist/esm/NtdIconMorph.js +423 -353
  82. package/dist/esm/NtdStateMorph.js +152 -146
  83. package/dist/esm/advancedIconSearch.js +391 -509
  84. package/dist/esm/animationControls.js +527 -641
  85. package/dist/esm/animationSpeed.js +69 -0
  86. package/dist/esm/client.js +48 -10
  87. package/dist/esm/createIcon.js +375 -251
  88. package/dist/esm/design-tokens.js +334 -387
  89. package/dist/esm/figmaExport.js +170 -256
  90. package/dist/esm/figmaSync.js +237 -315
  91. package/dist/esm/headless-ui.js +254 -365
  92. package/dist/esm/iconAnalytics.js +342 -392
  93. package/dist/esm/iconHtml.js +67 -85
  94. package/dist/esm/iconMetadata.js +404 -471
  95. package/dist/esm/iconParts.js +125 -89
  96. package/dist/esm/iconStack.js +145 -154
  97. package/dist/esm/iconStyles.js +1681 -508
  98. package/dist/esm/iconValue.js +361 -429
  99. package/dist/esm/icons/accessibility.js +1133 -133
  100. package/dist/esm/icons/actions.js +1320 -329
  101. package/dist/esm/icons/ai.js +1441 -143
  102. package/dist/esm/icons/brand.js +616 -179
  103. package/dist/esm/icons/business.js +957 -191
  104. package/dist/esm/icons/devtech.js +1687 -226
  105. package/dist/esm/icons/ecommerce.js +816 -110
  106. package/dist/esm/icons/education.js +1364 -198
  107. package/dist/esm/icons/files.js +1628 -327
  108. package/dist/esm/icons/fintech.js +807 -103
  109. package/dist/esm/icons/food.js +1043 -153
  110. package/dist/esm/icons/fun.js +819 -108
  111. package/dist/esm/icons/gaming.js +933 -169
  112. package/dist/esm/icons/health.js +636 -111
  113. package/dist/esm/icons/index.js +589 -32
  114. package/dist/esm/icons/input.js +326 -82
  115. package/dist/esm/icons/legal.js +1079 -121
  116. package/dist/esm/icons/media.js +1086 -266
  117. package/dist/esm/icons/navigation.js +421 -122
  118. package/dist/esm/icons/omniverk.js +534 -91
  119. package/dist/esm/icons/realestate.js +1544 -198
  120. package/dist/esm/icons/saas.js +880 -97
  121. package/dist/esm/icons/science.js +1370 -208
  122. package/dist/esm/icons/shapes.js +1343 -307
  123. package/dist/esm/icons/smarthome.js +799 -89
  124. package/dist/esm/icons/social.js +599 -58
  125. package/dist/esm/icons/sports.js +1148 -132
  126. package/dist/esm/icons/sustainability.js +1226 -138
  127. package/dist/esm/icons/travel.js +1486 -147
  128. package/dist/esm/icons/ui.js +1540 -314
  129. package/dist/esm/icons/weather.js +1181 -172
  130. package/dist/esm/index.js +749 -58
  131. package/dist/esm/lottieIntegration.js +264 -265
  132. package/dist/esm/nicetodev-icons.css +1 -1
  133. package/dist/esm/particleEffects.js +271 -250
  134. package/dist/esm/resolver.js +231 -283
  135. package/dist/esm/rsc.js +182 -192
  136. package/dist/esm/sharpen.js +78 -129
  137. package/dist/esm/smilAnimations.js +385 -164
  138. package/dist/esm/stacking.js +99 -121
  139. package/dist/esm/tailwind-plugin.js +282 -319
  140. package/dist/esm/types.js +50 -71
  141. package/dist/esm/utilities.js +177 -321
  142. package/dist/esm/variantProps.js +23 -52
  143. package/dist/types/animationSpeed.d.ts +19 -0
  144. package/dist/types/createIcon.d.ts +6 -0
  145. package/dist/types/iconStyles.d.ts +6 -1
  146. package/dist/types/icons/brand.d.ts +0 -4
  147. package/dist/types/icons/food.d.ts +0 -3
  148. package/dist/types/icons/index.d.ts +3 -3
  149. package/dist/types/icons/omniverk.d.ts +0 -3
  150. package/dist/types/icons/science.d.ts +1 -1
  151. package/dist/types/smilAnimations.d.ts +4 -2
  152. package/dist/types/types.d.ts +7 -0
  153. package/package.json +15 -22
@@ -1,102 +1,132 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var createIcon = require('./createIcon.js');
5
-
6
- /**
7
- * The colour of a detail drawn in secondary on a filled shape (a floppy's label, a ribbon): the
8
- * secondary colour, but the accent colour in the cutout's mask — there secondary is cut out with
9
- * the shape and the detail would vanish, while the accent draws in the cut.
10
- */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const createIcon = require("./createIcon.js");
11
5
  function detailColor({ variant, secondaryColor, accentColor }) {
12
- return variant === 'cutout' ? accentColor : secondaryColor;
6
+ return variant === "cutout" ? accentColor : secondaryColor;
13
7
  }
14
- /**
15
- * A duotone renderer with its two colours swapped, at full strength (1.3.8) — for a duotone that
16
- * drew its larger area in secondary (a pale body under a primary outline): the body turns
17
- * primary, the outline and the details secondary.
18
- */
19
8
  function swapDuotone(render) {
20
- return (props) => render({
21
- ...props,
22
- primaryColor: props.secondaryColor,
23
- secondaryColor: props.primaryColor,
24
- secondaryOpacity: 1,
25
- });
9
+ return (props) => render({
10
+ ...props,
11
+ primaryColor: props.secondaryColor,
12
+ secondaryColor: props.primaryColor,
13
+ secondaryOpacity: 1
14
+ });
26
15
  }
27
- /**
28
- * `content` drawn only inside `shape` — for accent lines that read as a cut through a shape (a
29
- * pencil's band, a calendar's header line, an envelope's flap): clipped, they meet the shape's
30
- * edges flush in every variant, where their round caps used to stick out of it (and `sharp` /
31
- * `rounded` re-cap every stroke, so caps alone cannot do it).
32
- *
33
- * `uid` is the icon's `IconRenderProps.uid`; `name` tells the clips of one icon apart. Without a
34
- * `uid` — a renderer called outside createIcon — the content is drawn as it is.
35
- */
36
16
  function within(uid, name, shape, content) {
37
- if (!uid) {
38
- return content;
39
- }
40
- const id = `${uid}${name}`;
41
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("clipPath", { id: id, children: shape }), jsxRuntime.jsx("g", { clipPath: `url(#${id})`, children: content })] }));
17
+ if (!uid) {
18
+ return content;
19
+ }
20
+ const id = `${uid}${name}`;
21
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
22
+ /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id, children: shape }),
23
+ /* @__PURE__ */ jsxRuntime.jsx("g", { clipPath: `url(#${id})`, children: content })
24
+ ] });
42
25
  }
43
- const BELL = 'M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9z';
44
- /** The clapper: a half disc r 3 under the bell (it was a thin arc). */
45
- const BELL_CLAPPER = 'M9 18.5h6a3 3 0 01-6 0z';
46
- const BELL_CLAPPER_LINE = 'M9 19a3 3 0 006 0';
47
- /** NtdBellRing's ring marks, either side of the crown. */
48
- const BELL_RINGS = 'M2 4l1.5 1.5M22 4l-1.5 1.5';
49
- /**
50
- * NtdBell and NtdBellRing, so the two share one bell; `ringing` adds the ring marks. Duotone and
51
- * vivid are fills only: the bell primary, the clapper secondary. The marks are primary on the solid
52
- * bell, secondary in duotone and in the accent colour in vivid.
53
- */
26
+ const BELL = "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9z";
27
+ const BELL_CLAPPER = "M9 18.5h6a3 3 0 01-6 0z";
28
+ const BELL_CLAPPER_LINE = "M9 19a3 3 0 006 0";
29
+ const BELL_RINGS = "M2 4l1.5 1.5M22 4l-1.5 1.5";
54
30
  function bellIcon(displayName, ringing) {
55
- const parts = ({ primaryColor, strokeWidth }, detail, rings, ringsOpacity = 1) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: BELL, fill: primaryColor }), jsxRuntime.jsx("path", { d: BELL_CLAPPER, fill: detail }), ringing && (jsxRuntime.jsx("path", { d: BELL_RINGS, stroke: rings, strokeWidth: strokeWidth, opacity: ringsOpacity }))] }));
56
- return createIcon.createIcon({
57
- displayName,
58
- // stacked icons and text go into the bell's body, above the clapper (1.3.8)
59
- perfectStackX: 12,
60
- perfectStackY: 10.5,
61
- perfectStackSize: 0.4,
62
- paths: {
63
- solid: (props) => parts(props, props.primaryColor, props.primaryColor),
64
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: `${BELL}${BELL_CLAPPER_LINE}${ringing ? BELL_RINGS : ''}`, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
65
- duotone: (props) => parts(props, props.secondaryColor, props.secondaryColor),
66
- vivid: (props) => parts(props, props.secondaryColor, props.accentColor, props.accentOpacity),
67
- },
68
- });
31
+ const parts = ({ primaryColor, strokeWidth }, detail, rings, ringsOpacity = 1) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
32
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: BELL, fill: primaryColor }),
33
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: BELL_CLAPPER, fill: detail }),
34
+ ringing && /* @__PURE__ */ jsxRuntime.jsx("path", { d: BELL_RINGS, stroke: rings, strokeWidth, opacity: ringsOpacity })
35
+ ] });
36
+ return createIcon.createIcon({
37
+ displayName,
38
+ // stacked icons and text go into the bell's body, above the clapper (1.3.8)
39
+ perfectStackX: 12,
40
+ perfectStackY: 10.5,
41
+ perfectStackSize: 0.4,
42
+ paths: {
43
+ solid: (props) => parts(props, props.primaryColor, props.primaryColor),
44
+ outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsx(
45
+ "path",
46
+ {
47
+ d: `${BELL}${BELL_CLAPPER_LINE}${ringing ? BELL_RINGS : ""}`,
48
+ stroke: primaryColor,
49
+ strokeWidth,
50
+ fill: "none"
51
+ }
52
+ ),
53
+ duotone: (props) => parts(props, props.secondaryColor, props.secondaryColor),
54
+ vivid: (props) => parts(props, props.secondaryColor, props.accentColor, props.accentOpacity)
55
+ }
56
+ });
69
57
  }
70
- /** The page of every paper icon: 16 × 20, its top-right corner folded over 8. */
71
- const PAPER = 'M12 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V10z';
72
- const PAPER_FOLD = 'M12 2v6a2 2 0 002 2h6z';
73
- const PAPER_FOLD_LINE = 'M12 2v8h8';
74
- const PAPER_SHARP = 'M12 2H4v20h16V10z';
75
- const PAPER_FOLD_SHARP = 'M12 2v8h8z';
76
- /**
77
- * A paper icon — NtdFile, and every document drawn on the same page (NtdFileText, NtdInvoice,
78
- * NtdContract, …), so their pages and folds match. The fold is secondary when the page is filled;
79
- * `text` is the document's writing, a path of strokes kept below the fold (y ≥ 11, x 7–17),
80
- * drawn in the accent colour on a filled page (secondary in duotone) and in primary on a stroked one.
81
- */
82
- function paperIcon(displayName, text = '') {
83
- return createIcon.createIcon({
84
- displayName,
85
- // stacked icons and text go onto the page below the fold (1.3.8), the same on every paper
86
- perfectStackX: 12,
87
- perfectStackY: 14,
88
- perfectStackSize: 0.5,
89
- paths: {
90
- solid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: PAPER, fill: primaryColor }), jsxRuntime.jsx("path", { d: PAPER_FOLD, fill: secondaryColor }), text && (jsxRuntime.jsx("path", { d: text, stroke: accentColor, strokeOpacity: accentOpacity, strokeWidth: "1.5", strokeLinecap: "round", fill: "none" }))] })),
91
- // square at every corner, the fold included — the derived `sharp` keeps a path's arcs round
92
- sharp: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: PAPER_SHARP, fill: primaryColor }), jsxRuntime.jsx("path", { d: PAPER_FOLD_SHARP, fill: secondaryColor }), text && (jsxRuntime.jsx("path", { d: text, stroke: accentColor, strokeOpacity: accentOpacity, strokeWidth: "1.5", fill: "none" }))] })),
93
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: `${PAPER}${PAPER_FOLD_LINE}${text}`, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
94
- // duotone (1.3.8): createIcon's default — the solid page, its writing in secondary like the fold
95
- vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: PAPER, fill: primaryColor }), jsxRuntime.jsx("path", { d: PAPER, fill: "white", opacity: "0.1" }), jsxRuntime.jsx("path", { d: PAPER_FOLD, fill: secondaryColor }), text && (jsxRuntime.jsx("path", { d: text, stroke: "white", strokeOpacity: "0.9", strokeWidth: "1.5", strokeLinecap: "round", fill: "none" }))] })),
96
- },
97
- });
58
+ const PAPER = "M12 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V10z";
59
+ const PAPER_FOLD = "M12 2v6a2 2 0 002 2h6z";
60
+ const PAPER_FOLD_LINE = "M12 2v8h8";
61
+ const PAPER_SHARP = "M12 2H4v20h16V10z";
62
+ const PAPER_FOLD_SHARP = "M12 2v8h8z";
63
+ function paperIcon(displayName, text = "") {
64
+ return createIcon.createIcon({
65
+ displayName,
66
+ // stacked icons and text go onto the page below the fold (1.3.8), the same on every paper
67
+ perfectStackX: 12,
68
+ perfectStackY: 14,
69
+ perfectStackSize: 0.5,
70
+ paths: {
71
+ solid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
72
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAPER, fill: primaryColor }),
73
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAPER_FOLD, fill: secondaryColor }),
74
+ text && /* @__PURE__ */ jsxRuntime.jsx(
75
+ "path",
76
+ {
77
+ d: text,
78
+ stroke: accentColor,
79
+ strokeOpacity: accentOpacity,
80
+ strokeWidth: "1.5",
81
+ strokeLinecap: "round",
82
+ fill: "none"
83
+ }
84
+ )
85
+ ] }),
86
+ // square at every corner, the fold included — the derived `sharp` keeps a path's arcs round
87
+ sharp: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAPER_SHARP, fill: primaryColor }),
89
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAPER_FOLD_SHARP, fill: secondaryColor }),
90
+ text && /* @__PURE__ */ jsxRuntime.jsx(
91
+ "path",
92
+ {
93
+ d: text,
94
+ stroke: accentColor,
95
+ strokeOpacity: accentOpacity,
96
+ strokeWidth: "1.5",
97
+ fill: "none"
98
+ }
99
+ )
100
+ ] }),
101
+ outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsx(
102
+ "path",
103
+ {
104
+ d: `${PAPER}${PAPER_FOLD_LINE}${text}`,
105
+ stroke: primaryColor,
106
+ strokeWidth,
107
+ fill: "none"
108
+ }
109
+ ),
110
+ // duotone (1.3.8): createIcon's default — the solid page, its writing in secondary like the fold
111
+ vivid: ({ primaryColor, secondaryColor }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
112
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAPER, fill: primaryColor }),
113
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAPER, fill: "white", opacity: "0.1" }),
114
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAPER_FOLD, fill: secondaryColor }),
115
+ text && /* @__PURE__ */ jsxRuntime.jsx(
116
+ "path",
117
+ {
118
+ d: text,
119
+ stroke: "white",
120
+ strokeOpacity: "0.9",
121
+ strokeWidth: "1.5",
122
+ strokeLinecap: "round",
123
+ fill: "none"
124
+ }
125
+ )
126
+ ] })
127
+ }
128
+ });
98
129
  }
99
-
100
130
  exports.bellIcon = bellIcon;
101
131
  exports.detailColor = detailColor;
102
132
  exports.paperIcon = paperIcon;
@@ -1,180 +1,161 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var React = require('react');
5
-
6
- /** A name `textBinding` can take: a JavaScript identifier. */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const React = require("react");
7
5
  function isValidTextBinding(name) {
8
- return !!name && /^[A-Za-z_$][\w$]*$/.test(name);
6
+ return !!name && /^[A-Za-z_$][\w$]*$/.test(name);
9
7
  }
10
- /** The id of the layer `layer` sits in, `undefined` for the base. */
11
8
  function stackParentId(layers, layer) {
12
- var _a, _b;
13
- return layer === layers[0] ? undefined : ((_a = layer.parent) !== null && _a !== void 0 ? _a : (_b = layers[0]) === null || _b === void 0 ? void 0 : _b.id);
9
+ return layer === layers[0] ? void 0 : layer.parent ?? layers[0]?.id;
14
10
  }
15
- /** The layers that sit directly in layer `id`, in order. */
16
11
  function stackChildrenOf(layers, id) {
17
- return layers.filter((l) => l !== layers[0] && stackParentId(layers, l) === id);
12
+ return layers.filter((l) => l !== layers[0] && stackParentId(layers, l) === id);
18
13
  }
19
- /** An icon's name as people read it: the export name without `Ntd` — `NtdAlertBell` → `AlertBell`. */
20
14
  function iconDisplayName(name) {
21
- return name.replace(/^Ntd(?=[A-Z0-9])/, '');
15
+ return name.replace(/^Ntd(?=[A-Z0-9])/, "");
22
16
  }
23
- /** A short id no layer of the stack has yet: `'1'`, `'2'`… (1.3.9 — it was the icon name and a timestamp). */
24
17
  function nextStackLayerId(layers) {
25
- const taken = new Set(layers.map((l) => l.id));
26
- let n = layers.length + 1;
27
- while (taken.has(String(n))) {
28
- n += 1;
29
- }
30
- return String(n);
18
+ const taken = new Set(layers.map((l) => l.id));
19
+ let n = layers.length + 1;
20
+ while (taken.has(String(n))) {
21
+ n += 1;
22
+ }
23
+ return String(n);
31
24
  }
32
- /**
33
- * Puts an icon on the stack (1.3.9): into layer `into` (the base when absent or unknown), or as the
34
- * base of an empty stack. Returns the new layers and the new layer's id.
35
- */
36
25
  function addStackLayer(layers, icon, into) {
37
- const id = nextStackLayerId(layers);
38
- const parent = layers.find((l) => l.id === into);
39
- const layer = {
40
- id,
41
- icon: icon.icon,
42
- ...(icon.variant ? { variant: icon.variant } : {}),
43
- ...(parent && parent !== layers[0] ? { parent: parent.id } : {}),
44
- };
45
- return { layers: [...layers, layer], id };
26
+ const id = nextStackLayerId(layers);
27
+ const parent = layers.find((l) => l.id === into);
28
+ const layer = {
29
+ id,
30
+ icon: icon.icon,
31
+ ...icon.variant ? { variant: icon.variant } : {},
32
+ ...parent && parent !== layers[0] ? { parent: parent.id } : {}
33
+ };
34
+ return { layers: [...layers, layer], id };
46
35
  }
47
- /**
48
- * Takes a layer off the stack (1.3.9; NiceIconStacker's own until then): what sat in it moves up
49
- * into its parent, and a removed base hands over to its first child.
50
- */
51
36
  function removeStackLayer(layers, id) {
52
- const base = layers[0];
53
- if (!base) {
54
- return [];
55
- }
56
- if (id !== base.id) {
57
- const gone = layers.find((l) => l.id === id);
58
- const up = gone ? stackParentId(layers, gone) : undefined;
59
- return layers
60
- .filter((l) => l.id !== id)
61
- .map((l) => (l.parent === id ? { ...l, parent: up === base.id ? undefined : up } : l));
62
- }
63
- const [heir, ...siblings] = stackChildrenOf(layers, base.id);
64
- if (!heir) {
65
- return [];
66
- }
67
- const newBase = {
68
- ...heir,
69
- parent: undefined,
70
- align: undefined,
71
- size: undefined,
72
- rotation: undefined,
73
- offsetX: undefined,
74
- offsetY: undefined,
75
- };
76
- return [
77
- newBase,
78
- ...layers
79
- .filter((l) => l.id !== base.id && l.id !== heir.id)
80
- .map((l) => siblings.includes(l)
81
- ? { ...l, parent: heir.id }
82
- : l.parent === heir.id
83
- ? { ...l, parent: undefined }
84
- : l),
85
- ];
37
+ const base = layers[0];
38
+ if (!base) {
39
+ return [];
40
+ }
41
+ if (id !== base.id) {
42
+ const gone = layers.find((l) => l.id === id);
43
+ const up = gone ? stackParentId(layers, gone) : void 0;
44
+ return layers.filter((l) => l.id !== id).map((l) => l.parent === id ? { ...l, parent: up === base.id ? void 0 : up } : l);
45
+ }
46
+ const [heir, ...siblings] = stackChildrenOf(layers, base.id);
47
+ if (!heir) {
48
+ return [];
49
+ }
50
+ const newBase = {
51
+ ...heir,
52
+ parent: void 0,
53
+ align: void 0,
54
+ size: void 0,
55
+ rotation: void 0,
56
+ offsetX: void 0,
57
+ offsetY: void 0
58
+ };
59
+ return [
60
+ newBase,
61
+ ...layers.filter((l) => l.id !== base.id && l.id !== heir.id).map(
62
+ (l) => siblings.includes(l) ? { ...l, parent: heir.id } : l.parent === heir.id ? { ...l, parent: void 0 } : l
63
+ )
64
+ ];
86
65
  }
87
- const COLOR_PROPS = ['primaryColor', 'secondaryColor', 'accentColor', 'textColor'];
88
- /** The stack as JSX: every layer wrapping the layers that sit in it, text innermost. */
66
+ const COLOR_PROPS = ["primaryColor", "secondaryColor", "accentColor", "textColor"];
89
67
  function niceIconStackCode(layers) {
90
- const base = layers[0];
91
- if (!base) {
92
- return '';
68
+ const base = layers[0];
69
+ if (!base) {
70
+ return "";
71
+ }
72
+ const bound = layers.filter((l) => isValidTextBinding(l.textBinding));
73
+ const write = (layer, parent, indent) => {
74
+ const attrs = [
75
+ // the parent's own spot is the default (1.3.8), so only another position is written
76
+ parent && layer.align && layer.align !== "perfect" ? `stackAlign="${layer.align}"` : "",
77
+ parent && layer.size !== void 0 ? `stackSize={${layer.size}}` : "",
78
+ parent && layer.rotation !== void 0 ? `stackRotation={${layer.rotation}}` : "",
79
+ parent && layer.offsetX ? `stackOffsetX={${layer.offsetX}}` : "",
80
+ parent && layer.offsetY ? `stackOffsetY={${layer.offsetY}}` : "",
81
+ layer.variant && layer.variant !== parent?.variant ? `variant="${layer.variant}"` : "",
82
+ ...COLOR_PROPS.map((p) => layer[p] ? `${p}="${layer[p]}"` : ""),
83
+ layer.textSize !== void 0 ? `textSize={${layer.textSize}}` : ""
84
+ ].filter(Boolean).join(" ");
85
+ const open = `${layer.icon}${attrs ? ` ${attrs}` : ""}`;
86
+ const text = isValidTextBinding(layer.textBinding) ? `{${layer.textBinding}}` : layer.text;
87
+ const inner = stackChildrenOf(layers, layer.id);
88
+ if (inner.length === 0) {
89
+ return text ? `${indent}<${open}>${text}</${layer.icon}>` : `${indent}<${open} />`;
93
90
  }
94
- const bound = layers.filter((l) => isValidTextBinding(l.textBinding));
95
- const write = (layer, parent, indent) => {
96
- const attrs = [
97
- // the parent's own spot is the default (1.3.8), so only another position is written
98
- parent && layer.align && layer.align !== 'perfect' ? `stackAlign="${layer.align}"` : '',
99
- parent && layer.size !== undefined ? `stackSize={${layer.size}}` : '',
100
- parent && layer.rotation !== undefined ? `stackRotation={${layer.rotation}}` : '',
101
- parent && layer.offsetX ? `stackOffsetX={${layer.offsetX}}` : '',
102
- parent && layer.offsetY ? `stackOffsetY={${layer.offsetY}}` : '',
103
- layer.variant && layer.variant !== (parent === null || parent === void 0 ? void 0 : parent.variant) ? `variant="${layer.variant}"` : '',
104
- ...COLOR_PROPS.map((p) => (layer[p] ? `${p}="${layer[p]}"` : '')),
105
- layer.textSize !== undefined ? `textSize={${layer.textSize}}` : '',
106
- ]
107
- .filter(Boolean)
108
- .join(' ');
109
- const open = `${layer.icon}${attrs ? ` ${attrs}` : ''}`;
110
- const text = isValidTextBinding(layer.textBinding) ? `{${layer.textBinding}}` : layer.text;
111
- const inner = stackChildrenOf(layers, layer.id);
112
- if (inner.length === 0) {
113
- return text ? `${indent}<${open}>${text}</${layer.icon}>` : `${indent}<${open} />`;
114
- }
115
- return [
116
- `${indent}<${open}>`,
117
- ...(text ? [`${indent} ${text}`] : []),
118
- ...inner.map((child) => write(child, layer, `${indent} `)),
119
- `${indent}</${layer.icon}>`,
120
- ].join('\n');
121
- };
122
- const notes = bound.map((l) => `// {${l.textBinding}}: bound text${l.text ? `, e.g. "${l.text}"` : ''}`);
123
- return [...notes, write(base, undefined, '')].join('\n');
91
+ return [
92
+ `${indent}<${open}>`,
93
+ ...text ? [`${indent} ${text}`] : [],
94
+ ...inner.map((child) => write(child, layer, `${indent} `)),
95
+ `${indent}</${layer.icon}>`
96
+ ].join("\n");
97
+ };
98
+ const notes = bound.map(
99
+ (l) => `// {${l.textBinding}}: bound text${l.text ? `, e.g. "${l.text}"` : ""}`
100
+ );
101
+ return [...notes, write(base, void 0, "")].join("\n");
124
102
  }
125
- /**
126
- * The stack drawn as icons — the base wrapping the layers that sit in it, text innermost (1.3.6).
127
- * One SVG, as nesting the icons by hand would give.
128
- */
129
103
  function renderIconStack(layers, icons, { baseProps, values } = {}) {
130
- const lookup = (name) => (typeof icons === 'function' ? icons(name) : icons[name]);
131
- // a stack kept as text names its icons without `Ntd` (1.3.10)
132
- const resolve = (name) => { var _a; return (_a = lookup(name)) !== null && _a !== void 0 ? _a : lookup(`Ntd${name}`); };
133
- const draw = (layer, parent) => {
134
- var _a;
135
- const Icon = resolve(layer.icon);
136
- if (!Icon) {
137
- return null;
138
- }
139
- const bound = isValidTextBinding(layer.textBinding) ? values === null || values === void 0 ? void 0 : values[layer.textBinding] : undefined;
140
- const text = bound !== null && bound !== void 0 ? bound : layer.text;
141
- const own = {
142
- primaryColor: layer.primaryColor,
143
- secondaryColor: layer.secondaryColor,
144
- accentColor: layer.accentColor,
145
- textColor: layer.textColor,
146
- textSize: layer.textSize,
147
- };
148
- const inner = stackChildrenOf(layers, layer.id).map((child) => draw(child, layer));
149
- if (!parent) {
150
- const props = { ...baseProps };
151
- for (const [k, v] of Object.entries(own)) {
152
- if (v !== undefined) {
153
- props[k] = v;
154
- }
155
- }
156
- return (React.createElement(Icon, { ...props, key: layer.id, variant: (_a = layer.variant) !== null && _a !== void 0 ? _a : baseProps === null || baseProps === void 0 ? void 0 : baseProps.variant },
157
- inner,
158
- text));
159
- }
160
- return (React.createElement(Icon, { ...own, key: layer.id, stackAlign: layer.align, stackSize: layer.size, stackRotation: layer.rotation, stackOffsetX: layer.offsetX, stackOffsetY: layer.offsetY, variant: layer.variant !== parent.variant ? layer.variant : undefined },
161
- inner,
162
- text));
104
+ const lookup = (name) => typeof icons === "function" ? icons(name) : icons[name];
105
+ const resolve = (name) => lookup(name) ?? lookup(`Ntd${name}`);
106
+ const draw = (layer, parent) => {
107
+ const Icon = resolve(layer.icon);
108
+ if (!Icon) {
109
+ return null;
110
+ }
111
+ const bound = isValidTextBinding(layer.textBinding) ? values?.[layer.textBinding] : void 0;
112
+ const text = bound ?? layer.text;
113
+ const own = {
114
+ primaryColor: layer.primaryColor,
115
+ secondaryColor: layer.secondaryColor,
116
+ accentColor: layer.accentColor,
117
+ textColor: layer.textColor,
118
+ textSize: layer.textSize
163
119
  };
164
- return layers[0] ? draw(layers[0], undefined) : null;
120
+ const inner = stackChildrenOf(layers, layer.id).map((child) => draw(child, layer));
121
+ if (!parent) {
122
+ const props = { ...baseProps };
123
+ for (const [k, v] of Object.entries(own)) {
124
+ if (v !== void 0) {
125
+ props[k] = v;
126
+ }
127
+ }
128
+ return /* @__PURE__ */ React.createElement(Icon, { ...props, key: layer.id, variant: layer.variant ?? baseProps?.variant }, inner, text);
129
+ }
130
+ return /* @__PURE__ */ React.createElement(
131
+ Icon,
132
+ {
133
+ ...own,
134
+ key: layer.id,
135
+ stackAlign: layer.align,
136
+ stackSize: layer.size,
137
+ stackRotation: layer.rotation,
138
+ stackOffsetX: layer.offsetX,
139
+ stackOffsetY: layer.offsetY,
140
+ variant: layer.variant !== parent.variant ? layer.variant : void 0
141
+ },
142
+ inner,
143
+ text
144
+ );
145
+ };
146
+ return layers[0] ? draw(layers[0], void 0) : null;
165
147
  }
166
- /**
167
- * NiceIconStack (1.3.6) — draws a stack kept as data (NiceIconStacker's layers) as one icon, its
168
- * bound text filled from `values`: `<NiceIconStack layers={stack} icons={icons} values={{ count }} />`.
169
- * The rest of the props go to the base icon.
170
- */
171
- function NiceIconStack({ layers, icons, values, ...baseProps }) {
172
- return jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderIconStack(layers, icons, { baseProps, values }) });
148
+ function NiceIconStack({
149
+ layers,
150
+ icons,
151
+ values,
152
+ ...baseProps
153
+ }) {
154
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderIconStack(layers, icons, { baseProps, values }) });
173
155
  }
174
- if (process.env.NODE_ENV !== 'production') {
175
- NiceIconStack.displayName = 'NiceIconStack';
156
+ if (process.env.NODE_ENV !== "production") {
157
+ NiceIconStack.displayName = "NiceIconStack";
176
158
  }
177
-
178
159
  exports.NiceIconStack = NiceIconStack;
179
160
  exports.addStackLayer = addStackLayer;
180
161
  exports.iconDisplayName = iconDisplayName;