@nice2dev/icons 1.0.0

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 (132) hide show
  1. package/CHANGELOG.md +124 -0
  2. package/LICENSE +21 -0
  3. package/README.md +581 -0
  4. package/dist/cjs/NiceIconPicker.js +387 -0
  5. package/dist/cjs/NiceIconPicker.js.map +1 -0
  6. package/dist/cjs/NiceVectorEditor.js +675 -0
  7. package/dist/cjs/NiceVectorEditor.js.map +1 -0
  8. package/dist/cjs/animationControls.js +690 -0
  9. package/dist/cjs/animationControls.js.map +1 -0
  10. package/dist/cjs/createIcon.js +142 -0
  11. package/dist/cjs/createIcon.js.map +1 -0
  12. package/dist/cjs/figmaExport.js +288 -0
  13. package/dist/cjs/figmaExport.js.map +1 -0
  14. package/dist/cjs/icons/actions.js +257 -0
  15. package/dist/cjs/icons/actions.js.map +1 -0
  16. package/dist/cjs/icons/brand.js +128 -0
  17. package/dist/cjs/icons/brand.js.map +1 -0
  18. package/dist/cjs/icons/business.js +228 -0
  19. package/dist/cjs/icons/business.js.map +1 -0
  20. package/dist/cjs/icons/devtech.js +374 -0
  21. package/dist/cjs/icons/devtech.js.map +1 -0
  22. package/dist/cjs/icons/ecommerce.js +171 -0
  23. package/dist/cjs/icons/ecommerce.js.map +1 -0
  24. package/dist/cjs/icons/files.js +286 -0
  25. package/dist/cjs/icons/files.js.map +1 -0
  26. package/dist/cjs/icons/fintech.js +151 -0
  27. package/dist/cjs/icons/fintech.js.map +1 -0
  28. package/dist/cjs/icons/fun.js +124 -0
  29. package/dist/cjs/icons/fun.js.map +1 -0
  30. package/dist/cjs/icons/health.js +132 -0
  31. package/dist/cjs/icons/health.js.map +1 -0
  32. package/dist/cjs/icons/media.js +219 -0
  33. package/dist/cjs/icons/media.js.map +1 -0
  34. package/dist/cjs/icons/navigation.js +147 -0
  35. package/dist/cjs/icons/navigation.js.map +1 -0
  36. package/dist/cjs/icons/saas.js +141 -0
  37. package/dist/cjs/icons/saas.js.map +1 -0
  38. package/dist/cjs/icons/shapes.js +205 -0
  39. package/dist/cjs/icons/shapes.js.map +1 -0
  40. package/dist/cjs/icons/smarthome.js +141 -0
  41. package/dist/cjs/icons/smarthome.js.map +1 -0
  42. package/dist/cjs/icons/social.js +159 -0
  43. package/dist/cjs/icons/social.js.map +1 -0
  44. package/dist/cjs/icons/ui.js +262 -0
  45. package/dist/cjs/icons/ui.js.map +1 -0
  46. package/dist/cjs/icons/weather.js +187 -0
  47. package/dist/cjs/icons/weather.js.map +1 -0
  48. package/dist/cjs/index.js +362 -0
  49. package/dist/cjs/index.js.map +1 -0
  50. package/dist/cjs/nicetodev-icons.css +1 -0
  51. package/dist/cjs/smilAnimations.js +182 -0
  52. package/dist/cjs/smilAnimations.js.map +1 -0
  53. package/dist/cjs/types.js +47 -0
  54. package/dist/cjs/types.js.map +1 -0
  55. package/dist/esm/NiceIconPicker.js +385 -0
  56. package/dist/esm/NiceIconPicker.js.map +1 -0
  57. package/dist/esm/NiceVectorEditor.js +673 -0
  58. package/dist/esm/NiceVectorEditor.js.map +1 -0
  59. package/dist/esm/animationControls.js +680 -0
  60. package/dist/esm/animationControls.js.map +1 -0
  61. package/dist/esm/createIcon.js +140 -0
  62. package/dist/esm/createIcon.js.map +1 -0
  63. package/dist/esm/figmaExport.js +279 -0
  64. package/dist/esm/figmaExport.js.map +1 -0
  65. package/dist/esm/icons/actions.js +231 -0
  66. package/dist/esm/icons/actions.js.map +1 -0
  67. package/dist/esm/icons/brand.js +124 -0
  68. package/dist/esm/icons/brand.js.map +1 -0
  69. package/dist/esm/icons/business.js +209 -0
  70. package/dist/esm/icons/business.js.map +1 -0
  71. package/dist/esm/icons/devtech.js +342 -0
  72. package/dist/esm/icons/devtech.js.map +1 -0
  73. package/dist/esm/icons/ecommerce.js +154 -0
  74. package/dist/esm/icons/ecommerce.js.map +1 -0
  75. package/dist/esm/icons/files.js +254 -0
  76. package/dist/esm/icons/files.js.map +1 -0
  77. package/dist/esm/icons/fintech.js +136 -0
  78. package/dist/esm/icons/fintech.js.map +1 -0
  79. package/dist/esm/icons/fun.js +110 -0
  80. package/dist/esm/icons/fun.js.map +1 -0
  81. package/dist/esm/icons/health.js +118 -0
  82. package/dist/esm/icons/health.js.map +1 -0
  83. package/dist/esm/icons/media.js +195 -0
  84. package/dist/esm/icons/media.js.map +1 -0
  85. package/dist/esm/icons/navigation.js +132 -0
  86. package/dist/esm/icons/navigation.js.map +1 -0
  87. package/dist/esm/icons/saas.js +127 -0
  88. package/dist/esm/icons/saas.js.map +1 -0
  89. package/dist/esm/icons/shapes.js +182 -0
  90. package/dist/esm/icons/shapes.js.map +1 -0
  91. package/dist/esm/icons/smarthome.js +127 -0
  92. package/dist/esm/icons/smarthome.js.map +1 -0
  93. package/dist/esm/icons/social.js +150 -0
  94. package/dist/esm/icons/social.js.map +1 -0
  95. package/dist/esm/icons/ui.js +233 -0
  96. package/dist/esm/icons/ui.js.map +1 -0
  97. package/dist/esm/icons/weather.js +166 -0
  98. package/dist/esm/icons/weather.js.map +1 -0
  99. package/dist/esm/index.js +25 -0
  100. package/dist/esm/index.js.map +1 -0
  101. package/dist/esm/nicetodev-icons.css +1 -0
  102. package/dist/esm/smilAnimations.js +176 -0
  103. package/dist/esm/smilAnimations.js.map +1 -0
  104. package/dist/esm/types.js +44 -0
  105. package/dist/esm/types.js.map +1 -0
  106. package/dist/types/NiceIconPicker.d.ts +149 -0
  107. package/dist/types/NiceVectorEditor.d.ts +75 -0
  108. package/dist/types/animationControls.d.ts +307 -0
  109. package/dist/types/createIcon.d.ts +76 -0
  110. package/dist/types/figmaExport.d.ts +243 -0
  111. package/dist/types/icons/actions.d.ts +25 -0
  112. package/dist/types/icons/brand.d.ts +3 -0
  113. package/dist/types/icons/business.d.ts +25 -0
  114. package/dist/types/icons/devtech.d.ts +39 -0
  115. package/dist/types/icons/ecommerce.d.ts +16 -0
  116. package/dist/types/icons/files.d.ts +31 -0
  117. package/dist/types/icons/fintech.d.ts +14 -0
  118. package/dist/types/icons/fun.d.ts +13 -0
  119. package/dist/types/icons/health.d.ts +14 -0
  120. package/dist/types/icons/index.d.ts +17 -0
  121. package/dist/types/icons/media.d.ts +23 -0
  122. package/dist/types/icons/navigation.d.ts +14 -0
  123. package/dist/types/icons/saas.d.ts +13 -0
  124. package/dist/types/icons/shapes.d.ts +22 -0
  125. package/dist/types/icons/smarthome.d.ts +13 -0
  126. package/dist/types/icons/social.d.ts +18 -0
  127. package/dist/types/icons/ui.d.ts +28 -0
  128. package/dist/types/icons/weather.d.ts +20 -0
  129. package/dist/types/index.d.ts +69 -0
  130. package/dist/types/smilAnimations.d.ts +102 -0
  131. package/dist/types/types.d.ts +179 -0
  132. package/package.json +86 -0
@@ -0,0 +1,176 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * Default animation configurations.
5
+ */
6
+ const DEFAULT_CONFIG = {
7
+ duration: 1,
8
+ repeatCount: 'indefinite',
9
+ easing: 'ease-in-out',
10
+ delay: 0,
11
+ fill: 'freeze',
12
+ };
13
+ /**
14
+ * Maps easing names to SMIL calcMode and keySplines.
15
+ */
16
+ const EASING_MAP = {
17
+ linear: { calcMode: 'linear' },
18
+ ease: { calcMode: 'spline', keySplines: '0.25 0.1 0.25 1' },
19
+ 'ease-in': { calcMode: 'spline', keySplines: '0.42 0 1 1' },
20
+ 'ease-out': { calcMode: 'spline', keySplines: '0 0 0.58 1' },
21
+ 'ease-in-out': { calcMode: 'spline', keySplines: '0.42 0 0.58 1' },
22
+ };
23
+ /**
24
+ * Generates SMIL animation elements for a given animation type.
25
+ *
26
+ * @param config - Animation configuration
27
+ * @param center - Center point for transforms (default: 12, 12 for 24x24 viewBox)
28
+ * @returns React elements to be placed inside an SVG `<g>` or at root level
29
+ */
30
+ function generateSmilAnimation(config, center = { x: 12, y: 12 }) {
31
+ const { type, duration = DEFAULT_CONFIG.duration, repeatCount = DEFAULT_CONFIG.repeatCount, easing = DEFAULT_CONFIG.easing, delay = DEFAULT_CONFIG.delay, fill = DEFAULT_CONFIG.fill, targetColor, } = config;
32
+ const dur = `${duration}s`;
33
+ const begin = delay > 0 ? `${delay}s` : '0s';
34
+ const rep = repeatCount === 'indefinite' ? 'indefinite' : String(repeatCount);
35
+ const { calcMode, keySplines } = EASING_MAP[easing] || EASING_MAP.linear;
36
+ const baseProps = {
37
+ dur,
38
+ begin,
39
+ repeatCount: rep,
40
+ fill,
41
+ calcMode,
42
+ ...(keySplines && calcMode === 'spline' ? { keySplines, keyTimes: '0;1' } : {}),
43
+ };
44
+ switch (type) {
45
+ case 'spin':
46
+ return (jsx("animateTransform", { attributeName: "transform", type: "rotate", from: `0 ${center.x} ${center.y}`, to: `360 ${center.x} ${center.y}`, ...baseProps, calcMode: "linear" }));
47
+ case 'spin-reverse':
48
+ return (jsx("animateTransform", { attributeName: "transform", type: "rotate", from: `360 ${center.x} ${center.y}`, to: `0 ${center.x} ${center.y}`, ...baseProps, calcMode: "linear" }));
49
+ case 'pulse':
50
+ return (jsx("animate", { attributeName: "opacity", values: "1;0.4;1", keyTimes: "0;0.5;1", ...baseProps }));
51
+ case 'bounce':
52
+ return (jsx("animateTransform", { attributeName: "transform", type: "translate", values: "0,0;0,-4;0,0", keyTimes: "0;0.5;1", ...baseProps }));
53
+ case 'shake':
54
+ return (jsx("animateTransform", { attributeName: "transform", type: "translate", values: "0,0;-2,0;2,0;-2,0;2,0;0,0", keyTimes: "0;0.1;0.3;0.5;0.7;1", ...baseProps, keySplines: undefined, calcMode: "linear" }));
55
+ case 'float':
56
+ return (jsx("animateTransform", { attributeName: "transform", type: "translate", values: "0,0;0,-3;0,0", keyTimes: "0;0.5;1", dur: `${duration * 2}s`, begin: begin, repeatCount: rep, fill: fill, calcMode: "spline", keySplines: "0.42 0 0.58 1;0.42 0 0.58 1" }));
57
+ case 'flip':
58
+ return (jsx("animateTransform", { attributeName: "transform", type: "rotate", values: `0 ${center.x} ${center.y};180 ${center.x} ${center.y};360 ${center.x} ${center.y}`, keyTimes: "0;0.5;1", ...baseProps }));
59
+ case 'wiggle':
60
+ return (jsx("animateTransform", { attributeName: "transform", type: "rotate", values: `0 ${center.x} ${center.y};-10 ${center.x} ${center.y};10 ${center.x} ${center.y};0 ${center.x} ${center.y}`, keyTimes: "0;0.25;0.75;1", ...baseProps }));
61
+ case 'swing':
62
+ return (jsx("animateTransform", { attributeName: "transform", type: "rotate", values: `0 ${center.x} 0;15 ${center.x} 0;-10 ${center.x} 0;5 ${center.x} 0;0 ${center.x} 0`, keyTimes: "0;0.2;0.4;0.6;1", ...baseProps }));
63
+ case 'heartbeat':
64
+ return (jsx("animateTransform", { attributeName: "transform", type: "scale", values: "1;1.15;1;1.15;1", keyTimes: "0;0.14;0.28;0.42;1", ...baseProps, additive: "sum" }));
65
+ case 'scale-pulse':
66
+ return (jsx("animateTransform", { attributeName: "transform", type: "scale", values: "1;1.1;1", keyTimes: "0;0.5;1", ...baseProps, additive: "sum" }));
67
+ case 'grow':
68
+ return (jsx("animateTransform", { attributeName: "transform", type: "scale", from: "0", to: "1", ...baseProps, repeatCount: "1" }));
69
+ case 'shrink':
70
+ return (jsx("animateTransform", { attributeName: "transform", type: "scale", from: "1", to: "0", ...baseProps, repeatCount: "1" }));
71
+ case 'rubber':
72
+ return (jsx(Fragment, { children: jsx("animateTransform", { attributeName: "transform", type: "scale", values: "1,1;1.25,0.75;0.75,1.25;1.15,0.85;1,1", keyTimes: "0;0.3;0.5;0.7;1", ...baseProps, additive: "sum" }) }));
73
+ case 'pop':
74
+ return (jsx("animateTransform", { attributeName: "transform", type: "scale", values: "0;1.2;1", keyTimes: "0;0.6;1", ...baseProps, repeatCount: "1", additive: "sum" }));
75
+ case 'fade':
76
+ return (jsx("animate", { attributeName: "opacity", values: "0;1;0", keyTimes: "0;0.5;1", ...baseProps }));
77
+ case 'blink':
78
+ return (jsx("animate", { attributeName: "opacity", values: "1;0;1", keyTimes: "0;0.5;1", dur: `${duration * 0.5}s`, begin: begin, repeatCount: rep, fill: fill, calcMode: "discrete" }));
79
+ case 'glow':
80
+ return (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", values: "0.6;1;0.6", keyTimes: "0;0.5;1", ...baseProps }), jsx("animate", { attributeName: "filter", values: "drop-shadow(0 0 2px currentColor);drop-shadow(0 0 8px currentColor);drop-shadow(0 0 2px currentColor)", keyTimes: "0;0.5;1", ...baseProps })] }));
81
+ case 'slide-x':
82
+ return (jsx("animateTransform", { attributeName: "transform", type: "translate", values: "-24,0;0,0;24,0", keyTimes: "0;0.5;1", ...baseProps }));
83
+ case 'slide-y':
84
+ return (jsx("animateTransform", { attributeName: "transform", type: "translate", values: "0,-24;0,0;0,24", keyTimes: "0;0.5;1", ...baseProps }));
85
+ case 'orbit':
86
+ return (jsx("animateTransform", { attributeName: "transform", type: "rotate", from: `0 ${center.x} ${center.y}`, to: `360 ${center.x} ${center.y}`, ...baseProps, calcMode: "linear" }));
87
+ case 'wave':
88
+ return (jsx("animateTransform", { attributeName: "transform", type: "translate", values: "0,0;0,-2;0,2;0,-2;0,0", keyTimes: "0;0.25;0.5;0.75;1", dur: `${duration * 0.5}s`, begin: begin, repeatCount: rep, fill: fill, calcMode: "spline", keySplines: "0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1" }));
89
+ case 'draw':
90
+ return (jsxs(Fragment, { children: [jsx("animate", { attributeName: "stroke-dashoffset", from: "100", to: "0", ...baseProps }), jsx("set", { attributeName: "stroke-dasharray", to: "100" })] }));
91
+ case 'draw-reverse':
92
+ return (jsxs(Fragment, { children: [jsx("animate", { attributeName: "stroke-dashoffset", from: "0", to: "100", ...baseProps }), jsx("set", { attributeName: "stroke-dasharray", to: "100" })] }));
93
+ case 'color-shift':
94
+ return (jsx("animate", { attributeName: "fill", values: `currentColor;${targetColor || '#ff6b6b'};currentColor`, keyTimes: "0;0.5;1", ...baseProps }));
95
+ default:
96
+ return null;
97
+ }
98
+ }
99
+ /**
100
+ * Wraps icon content in a `<g>` element with SMIL animations applied.
101
+ *
102
+ * @example
103
+ * ```tsx
104
+ * <svg viewBox="0 0 24 24">
105
+ * <SmilAnimationWrapper animation="spin" duration={2}>
106
+ * <path d="M12 2l3 7h7l-5.5 4 2 7L12 16l-6.5 4 2-7L2 9h7z" />
107
+ * </SmilAnimationWrapper>
108
+ * </svg>
109
+ * ```
110
+ */
111
+ function SmilAnimationWrapper({ animation, duration = 1, repeatCount = 'indefinite', easing = 'ease-in-out', delay = 0, center = { x: 12, y: 12 }, children, }) {
112
+ const animationElements = generateSmilAnimation({ type: animation, duration, repeatCount, easing, delay }, center);
113
+ // For scale animations, we need to translate to origin, scale, then translate back
114
+ const needsOriginTransform = [
115
+ 'heartbeat',
116
+ 'scale-pulse',
117
+ 'grow',
118
+ 'shrink',
119
+ 'rubber',
120
+ 'pop',
121
+ ].includes(animation);
122
+ if (needsOriginTransform) {
123
+ return (jsxs("g", { transform: `translate(${center.x}, ${center.y})`, children: [jsx("g", { transform: `translate(-${center.x}, -${center.y})`, children: children }), animationElements] }));
124
+ }
125
+ return (jsxs("g", { children: [children, animationElements] }));
126
+ }
127
+ /**
128
+ * Creates a SMIL animation definition that can be referenced by id.
129
+ * Useful for applying the same animation to multiple elements.
130
+ */
131
+ function createSmilAnimationDef(id, config) {
132
+ return (jsx("defs", { children: jsx("g", { id: id, children: generateSmilAnimation(config) }) }));
133
+ }
134
+ /**
135
+ * Utility to check if SMIL animations are supported in the current environment.
136
+ */
137
+ function isSmilSupported() {
138
+ if (typeof document === 'undefined')
139
+ return false;
140
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
141
+ return typeof svg.animate === 'function' || 'animateTransform' in document.createElementNS('http://www.w3.org/2000/svg', 'animateTransform');
142
+ }
143
+ /**
144
+ * All available SMIL animation types as an array.
145
+ * Useful for documentation and UI components like NiceIconPicker.
146
+ */
147
+ const SMIL_ANIMATION_TYPES = [
148
+ 'spin',
149
+ 'spin-reverse',
150
+ 'pulse',
151
+ 'bounce',
152
+ 'shake',
153
+ 'float',
154
+ 'flip',
155
+ 'wiggle',
156
+ 'swing',
157
+ 'heartbeat',
158
+ 'scale-pulse',
159
+ 'grow',
160
+ 'shrink',
161
+ 'rubber',
162
+ 'pop',
163
+ 'fade',
164
+ 'blink',
165
+ 'glow',
166
+ 'slide-x',
167
+ 'slide-y',
168
+ 'orbit',
169
+ 'wave',
170
+ 'draw',
171
+ 'draw-reverse',
172
+ 'color-shift',
173
+ ];
174
+
175
+ export { SMIL_ANIMATION_TYPES, SmilAnimationWrapper, createSmilAnimationDef, generateSmilAnimation, isSmilSupported };
176
+ //# sourceMappingURL=smilAnimations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smilAnimations.js","sources":["../../src/smilAnimations.tsx"],"sourcesContent":[null],"names":["_jsx","_Fragment","_jsxs"],"mappings":";;AA6EA;;AAEG;AACH,MAAM,cAAc,GAAiC;AACnD,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,WAAW,EAAE,YAAY;AACzB,IAAA,MAAM,EAAE,aAAa;AACrB,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE,QAAQ;CACf;AAED;;AAEG;AACH,MAAM,UAAU,GAA8D;AAC5E,IAAA,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC9B,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE;IAC3D,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE;IAC3D,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE;IAC5D,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE;CACnE;AAED;;;;;;AAMG;AACG,SAAU,qBAAqB,CACnC,MAA2B,EAC3B,MAAA,GAAmC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAA;AAEnD,IAAA,MAAM,EACJ,IAAI,EACJ,QAAQ,GAAG,cAAc,CAAC,QAAS,EACnC,WAAW,GAAG,cAAc,CAAC,WAAY,EACzC,MAAM,GAAG,cAAc,CAAC,MAAO,EAC/B,KAAK,GAAG,cAAc,CAAC,KAAM,EAC7B,IAAI,GAAG,cAAc,CAAC,IAAK,EAC3B,WAAW,GACZ,GAAG,MAAM;AAEV,IAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,GAAG;AAC1B,IAAA,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,GAAG,IAAI;AAC5C,IAAA,MAAM,GAAG,GAAG,WAAW,KAAK,YAAY,GAAG,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;AAC7E,IAAA,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM;AAExE,IAAA,MAAM,SAAS,GAAG;QAChB,GAAG;QACH,KAAK;AACL,QAAA,WAAW,EAAE,GAAG;QAChB,IAAI;QACJ,QAAQ;QACR,IAAI,UAAU,IAAI,QAAQ,KAAK,QAAQ,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;KAChF;IAED,QAAQ,IAAI;AACV,QAAA,KAAK,MAAM;AACT,YAAA,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EACjC,EAAE,EAAE,CAAA,IAAA,EAAO,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EAAA,GAC7B,SAAS,EACb,QAAQ,EAAC,QAAQ,EAAA,CACjB;AAGN,QAAA,KAAK,cAAc;AACjB,YAAA,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,CAAA,IAAA,EAAO,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EACnC,EAAE,EAAE,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EAAA,GAC3B,SAAS,EACb,QAAQ,EAAC,QAAQ,EAAA,CACjB;AAGN,QAAA,KAAK,OAAO;AACV,YAAA,QACEA,GAAA,CAAA,SAAA,EAAA,EACE,aAAa,EAAC,SAAS,EACvB,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAC,SAAS,KACd,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,QAAQ;YACX,QACEA,0BACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAC,cAAc,EACrB,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,OAAO;AACV,YAAA,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAC,2BAA2B,EAClC,QAAQ,EAAC,qBAAqB,EAAA,GAC1B,SAAS,EACb,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAC,QAAQ,EAAA,CACjB;AAGN,QAAA,KAAK,OAAO;YACV,QACEA,0BACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAC,cAAc,EACrB,QAAQ,EAAC,SAAS,EAClB,GAAG,EAAE,CAAA,EAAG,QAAQ,GAAG,CAAC,CAAA,CAAA,CAAG,EACvB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,GAAG,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAC,QAAQ,EACjB,UAAU,EAAC,6BAA6B,EAAA,CACxC;AAGN,QAAA,KAAK,MAAM;YACT,QACEA,0BACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,QAAQ,EACb,MAAM,EAAE,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAA,KAAA,EAAQ,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EAC3F,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,QAAQ;YACX,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,QAAQ,EACb,MAAM,EAAE,KAAK,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,KAAA,EAAQ,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,IAAA,EAAO,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,GAAA,EAAM,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EACpH,QAAQ,EAAC,eAAe,EAAA,GACpB,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,OAAO;AACV,YAAA,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,QAAQ,EACb,MAAM,EAAE,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,CAAA,MAAA,EAAS,MAAM,CAAC,CAAC,CAAA,OAAA,EAAU,MAAM,CAAC,CAAC,CAAA,KAAA,EAAQ,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAA,EAAA,CAAI,EAC5F,QAAQ,EAAC,iBAAiB,KACtB,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,WAAW;YACd,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,OAAO,EACZ,MAAM,EAAC,iBAAiB,EACxB,QAAQ,EAAC,oBAAoB,EAAA,GACzB,SAAS,EACb,QAAQ,EAAC,KAAK,EAAA,CACd;AAGN,QAAA,KAAK,aAAa;YAChB,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,OAAO,EACZ,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EACb,QAAQ,EAAC,KAAK,EAAA,CACd;AAGN,QAAA,KAAK,MAAM;YACT,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EAAA,GACF,SAAS,EACb,WAAW,EAAC,GAAG,EAAA,CACf;AAGN,QAAA,KAAK,QAAQ;YACX,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,GAAG,EAAA,GACF,SAAS,EACb,WAAW,EAAC,GAAG,EAAA,CACf;AAGN,QAAA,KAAK,QAAQ;YACX,QACEA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EACED,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,OAAO,EACZ,MAAM,EAAC,uCAAuC,EAC9C,QAAQ,EAAC,iBAAiB,EAAA,GACtB,SAAS,EACb,QAAQ,EAAC,KAAK,EAAA,CACd,EAAA,CACD;AAGP,QAAA,KAAK,KAAK;AACR,YAAA,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,OAAO,EACZ,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EACb,WAAW,EAAC,GAAG,EACf,QAAQ,EAAC,KAAK,EAAA,CACd;AAGN,QAAA,KAAK,MAAM;AACT,YAAA,QACEA,GAAA,CAAA,SAAA,EAAA,EACE,aAAa,EAAC,SAAS,EACvB,MAAM,EAAC,OAAO,EACd,QAAQ,EAAC,SAAS,KACd,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,OAAO;AACV,YAAA,QACEA,GAAA,CAAA,SAAA,EAAA,EACE,aAAa,EAAC,SAAS,EACvB,MAAM,EAAC,OAAO,EACd,QAAQ,EAAC,SAAS,EAClB,GAAG,EAAE,GAAG,QAAQ,GAAG,GAAG,CAAA,CAAA,CAAG,EACzB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,GAAG,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAC,UAAU,EAAA,CACnB;AAGN,QAAA,KAAK,MAAM;AACT,YAAA,QACEE,IAAA,CAAAD,QAAA,EAAA,EAAA,QAAA,EAAA,CACED,GAAA,CAAA,SAAA,EAAA,EACE,aAAa,EAAC,SAAS,EACvB,MAAM,EAAC,WAAW,EAClB,QAAQ,EAAC,SAAS,KACd,SAAS,EAAA,CACb,EACFA,GAAA,CAAA,SAAA,EAAA,EACE,aAAa,EAAC,QAAQ,EACtB,MAAM,EAAC,uGAAuG,EAC9G,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EAAA,CACb,CAAA,EAAA,CACD;AAGP,QAAA,KAAK,SAAS;YACZ,QACEA,0BACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAC,gBAAgB,EACvB,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,SAAS;YACZ,QACEA,0BACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAC,gBAAgB,EACvB,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EAAA,CACb;AAGN,QAAA,KAAK,OAAO;AACV,YAAA,QACEA,GAAA,CAAA,kBAAA,EAAA,EACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EACjC,EAAE,EAAE,CAAA,IAAA,EAAO,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAA,CAAE,EAAA,GAC7B,SAAS,EACb,QAAQ,EAAC,QAAQ,EAAA,CACjB;AAGN,QAAA,KAAK,MAAM;YACT,QACEA,0BACE,aAAa,EAAC,WAAW,EACzB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAC,uBAAuB,EAC9B,QAAQ,EAAC,mBAAmB,EAC5B,GAAG,EAAE,CAAA,EAAG,QAAQ,GAAG,GAAG,CAAA,CAAA,CAAG,EACzB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,GAAG,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAC,QAAQ,EACjB,UAAU,EAAC,yDAAyD,EAAA,CACpE;AAGN,QAAA,KAAK,MAAM;AACT,YAAA,QACEE,IAAA,CAAAD,QAAA,EAAA,EAAA,QAAA,EAAA,CACED,GAAA,CAAA,SAAA,EAAA,EACE,aAAa,EAAC,mBAAmB,EACjC,IAAI,EAAC,KAAK,EACV,EAAE,EAAC,GAAG,EAAA,GACF,SAAS,EAAA,CACb,EACFA,GAAA,CAAA,KAAA,EAAA,EAAK,aAAa,EAAC,kBAAkB,EAAC,EAAE,EAAC,KAAK,EAAA,CAAG,CAAA,EAAA,CAChD;AAGP,QAAA,KAAK,cAAc;AACjB,YAAA,QACEE,IAAA,CAAAD,QAAA,EAAA,EAAA,QAAA,EAAA,CACED,GAAA,CAAA,SAAA,EAAA,EACE,aAAa,EAAC,mBAAmB,EACjC,IAAI,EAAC,GAAG,EACR,EAAE,EAAC,KAAK,EAAA,GACJ,SAAS,EAAA,CACb,EACFA,GAAA,CAAA,KAAA,EAAA,EAAK,aAAa,EAAC,kBAAkB,EAAC,EAAE,EAAC,KAAK,EAAA,CAAG,CAAA,EAAA,CAChD;AAGP,QAAA,KAAK,aAAa;YAChB,QACEA,iBACE,aAAa,EAAC,MAAM,EACpB,MAAM,EAAE,CAAA,aAAA,EAAgB,WAAW,IAAI,SAAS,CAAA,aAAA,CAAe,EAC/D,QAAQ,EAAC,SAAS,EAAA,GACd,SAAS,EAAA,CACb;AAGN,QAAA;AACE,YAAA,OAAO,IAAI;;AAEjB;AAsBA;;;;;;;;;;;AAWG;AACG,SAAU,oBAAoB,CAAC,EACnC,SAAS,EACT,QAAQ,GAAG,CAAC,EACZ,WAAW,GAAG,YAAY,EAC1B,MAAM,GAAG,aAAa,EACtB,KAAK,GAAG,CAAC,EACT,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EACzB,QAAQ,GACkB,EAAA;IAC1B,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,EACzD,MAAM,CACP;;AAGD,IAAA,MAAM,oBAAoB,GAAG;QAC3B,WAAW;QACX,aAAa;QACb,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,KAAK;AACN,KAAA,CAAC,QAAQ,CAAC,SAAS,CAAC;IAErB,IAAI,oBAAoB,EAAE;AACxB,QAAA,QACEE,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,aAAa,MAAM,CAAC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,CAAA,CAAA,CAAG,aACjDF,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,CAAA,WAAA,EAAc,MAAM,CAAC,CAAC,CAAA,GAAA,EAAM,MAAM,CAAC,CAAC,CAAA,CAAA,CAAG,EAAA,QAAA,EAClD,QAAQ,EAAA,CACP,EACH,iBAAiB,CAAA,EAAA,CAChB;IAER;AAEA,IAAA,QACEE,IAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,CACG,QAAQ,EACR,iBAAiB,CAAA,EAAA,CAChB;AAER;AAEA;;;AAGG;AACG,SAAU,sBAAsB,CACpC,EAAU,EACV,MAA2B,EAAA;AAE3B,IAAA,QACEF,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EACEA,GAAA,CAAA,GAAA,EAAA,EAAG,EAAE,EAAE,EAAE,EAAA,QAAA,EACN,qBAAqB,CAAC,MAAM,CAAC,EAAA,CAC5B,EAAA,CACC;AAEX;AAEA;;AAEG;SACa,eAAe,GAAA;IAC7B,IAAI,OAAO,QAAQ,KAAK,WAAW;AAAE,QAAA,OAAO,KAAK;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,KAAK,CAAC;AACzE,IAAA,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU,IAAI,kBAAkB,IAAI,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,kBAAkB,CAAC;AAC9I;AAEA;;;AAGG;AACI,MAAM,oBAAoB,GAAwB;IACvD,MAAM;IACN,cAAc;IACd,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,OAAO;IACP,WAAW;IACX,aAAa;IACb,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,cAAc;IACd,aAAa;;;;;"}
@@ -0,0 +1,44 @@
1
+ /** Gradient preset color stops. */
2
+ const GRADIENT_PRESETS = {
3
+ sunset: ['#ff6b6b', '#feca57', '#ff9ff3'],
4
+ ocean: ['#0652DD', '#1B9CFC', '#38ada9'],
5
+ forest: ['#0a3d0a', '#1e8449', '#58D68D'],
6
+ fire: ['#e74c3c', '#f39c12', '#f1c40f'],
7
+ ice: ['#74b9ff', '#a29bfe', '#dfe6e9'],
8
+ neon: ['#6c5ce7', '#fd79a8', '#00cec9'],
9
+ gold: ['#f9ca24', '#f0932b', '#e17055'],
10
+ 'purple-haze': ['#6c5ce7', '#a55eea', '#e056a0'],
11
+ aurora: ['#00b894', '#00cec9', '#0984e3', '#6c5ce7'],
12
+ midnight: ['#0c0c1d', '#1e3a5f', '#2c3e50'],
13
+ candy: ['#ff6b81', '#ffa502', '#2ed573'],
14
+ steel: ['#636e72', '#b2bec3', '#dfe6e9'],
15
+ };
16
+ /**
17
+ * Map of named size presets to their pixel values.
18
+ *
19
+ * Used internally by {@link createIcon} to resolve `IconSize` strings to numbers.
20
+ *
21
+ * | Key | Value |
22
+ * |--------|-------|
23
+ * | `xs` | 12 |
24
+ * | `sm` | 16 |
25
+ * | `md` | 24 |
26
+ * | `lg` | 32 |
27
+ * | `xl` | 48 |
28
+ * | `2xl` | 64 |
29
+ * | `xxl` | 96 |
30
+ * | `xxxl` | 128 |
31
+ */
32
+ const SIZE_MAP = {
33
+ xs: 12,
34
+ sm: 16,
35
+ md: 24,
36
+ lg: 32,
37
+ xl: 48,
38
+ '2xl': 64,
39
+ xxl: 96,
40
+ xxxl: 128,
41
+ };
42
+
43
+ export { GRADIENT_PRESETS, SIZE_MAP };
44
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../src/types.ts"],"sourcesContent":[null],"names":[],"mappings":"AA2LA;AACO,MAAM,gBAAgB,GAA8C;AACzE,IAAA,MAAM,EAAS,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,KAAK,EAAU,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,MAAM,EAAS,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,IAAI,EAAW,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,GAAG,EAAY,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,IAAI,EAAW,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,IAAI,EAAW,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAChD,MAAM,EAAS,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAC3D,IAAA,QAAQ,EAAO,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,KAAK,EAAU,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAChD,IAAA,KAAK,EAAU,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;;AAgGlD;;;;;;;;;;;;;;;AAeG;AACI,MAAM,QAAQ,GAA2B;AAC9C,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,GAAG,EAAE,EAAE;AACP,IAAA,IAAI,EAAE,GAAG;;;;;"}
@@ -0,0 +1,149 @@
1
+ import React from 'react';
2
+ import type { NtdIconProps, IconVariant, IconSize } from './types';
3
+ import './NiceIconPicker.css';
4
+ /**
5
+ * Describes a single icon entry for use with {@link NiceIconPicker}.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const entry: IconPickerEntry = {
10
+ * name: 'NtdHome',
11
+ * Component: NtdHome,
12
+ * category: 'Navigation',
13
+ * };
14
+ * ```
15
+ */
16
+ export interface IconPickerEntry {
17
+ /** Unique icon name (e.g. `'NtdHome'`). Used as the selection value. */
18
+ name: string;
19
+ /** The React icon component created by {@link createIcon}. */
20
+ Component: React.ForwardRefExoticComponent<NtdIconProps & React.RefAttributes<SVGSVGElement>>;
21
+ /** Category label for grouping (e.g. `'Navigation'`). */
22
+ category: string;
23
+ }
24
+ /**
25
+ * Props for the {@link NiceIconPicker} component.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * <NiceIconPicker
30
+ * icons={allIcons}
31
+ * value={selectedIcon}
32
+ * onChange={(name) => setSelectedIcon(name)}
33
+ * variant="solid"
34
+ * placeholder="Choose an icon..."
35
+ * clearable
36
+ * />
37
+ * ```
38
+ */
39
+ export interface NiceIconPickerProps {
40
+ /** Full icon registry — array of { name, Component, category } */
41
+ icons: IconPickerEntry[];
42
+ /** Currently selected icon name (controlled) — single selection mode */
43
+ value?: string | null;
44
+ /** Currently selected icon names (controlled) — multi-select mode */
45
+ values?: string[];
46
+ /** Callback when an icon is selected (single mode) */
47
+ onChange?: (name: string | null, entry: IconPickerEntry | null) => void;
48
+ /** Callback when icons are selected (multi-select mode) */
49
+ onChangeMulti?: (names: string[], entries: IconPickerEntry[]) => void;
50
+ /** Enable multi-select mode */
51
+ multiSelect?: boolean;
52
+ /** Maximum number of icons that can be selected in multi-select mode */
53
+ maxSelections?: number;
54
+ /** Placeholder text when nothing is selected */
55
+ placeholder?: string;
56
+ /** Icon variant for preview rendering */
57
+ variant?: IconVariant;
58
+ /** Icon size for grid preview */
59
+ gridIconSize?: IconSize | number;
60
+ /** Icon size in the trigger button */
61
+ triggerIconSize?: IconSize | number;
62
+ /** Ordered list of category names to show as tabs. Defaults to auto-detected */
63
+ categories?: string[];
64
+ /** Additional className for root element */
65
+ className?: string;
66
+ /** Whether the picker is disabled */
67
+ disabled?: boolean;
68
+ /** Allow clearing selection */
69
+ clearable?: boolean;
70
+ /** Enable virtualization for large icon sets (recommended for 500+ icons) */
71
+ virtualized?: boolean;
72
+ /** Number of items to render in viewport when virtualized (default: 100) */
73
+ virtualizedItemCount?: number;
74
+ /** Show recently used icons section */
75
+ showHistory?: boolean;
76
+ /** Show favorites section with localStorage persistence */
77
+ showFavorites?: boolean;
78
+ /** Custom localStorage key prefix for favorites/history (default: 'ntd-icon-picker') */
79
+ storageKeyPrefix?: string;
80
+ /** Enable drag & drop of icons to other applications */
81
+ enableDragAndDrop?: boolean;
82
+ /** Callback when drag starts */
83
+ onDragStart?: (entry: IconPickerEntry, event: React.DragEvent) => void;
84
+ /** Callback when drag ends */
85
+ onDragEnd?: (entry: IconPickerEntry, event: React.DragEvent) => void;
86
+ }
87
+ /**
88
+ * Imperative handle exposed via `React.forwardRef` on {@link NiceIconPicker}.
89
+ *
90
+ * Allows parent components to programmatically open, close, or toggle the picker dropdown,
91
+ * as well as manage favorites and history.
92
+ *
93
+ * @example
94
+ * ```tsx
95
+ * const pickerRef = useRef<NiceIconPickerHandle>(null);
96
+ * // ...
97
+ * <button onClick={() => pickerRef.current?.open()}>Open picker</button>
98
+ * <NiceIconPicker ref={pickerRef} icons={icons} />
99
+ * ```
100
+ */
101
+ export interface NiceIconPickerHandle {
102
+ open: () => void;
103
+ close: () => void;
104
+ toggle: () => void;
105
+ /** Get list of favorite icon names */
106
+ getFavorites: () => string[];
107
+ /** Add an icon to favorites */
108
+ addFavorite: (name: string) => void;
109
+ /** Remove an icon from favorites */
110
+ removeFavorite: (name: string) => void;
111
+ /** Toggle favorite status */
112
+ toggleFavorite: (name: string) => void;
113
+ /** Clear all favorites */
114
+ clearFavorites: () => void;
115
+ /** Get recent icon history */
116
+ getHistory: () => string[];
117
+ /** Clear history */
118
+ clearHistory: () => void;
119
+ }
120
+ /**
121
+ * A fully-featured icon picker dropdown component.
122
+ *
123
+ * Provides a trigger button that opens a searchable, categorized icon grid.
124
+ * Supports controlled selection, keyboard navigation (Escape to close),
125
+ * click-outside dismissal, and an imperative handle for programmatic control.
126
+ *
127
+ * **Styling:** Uses CSS variables for theming (see `NiceIconPicker.css`).
128
+ * Override `--ntd-picker-bg`, `--ntd-picker-accent`, etc. on a parent element.
129
+ *
130
+ * @example
131
+ * ```tsx
132
+ * import { NiceIconPicker } from '@nicetodev/icons';
133
+ *
134
+ * function IconSelectField({ icons }) {
135
+ * const [selected, setSelected] = useState<string | null>(null);
136
+ *
137
+ * return (
138
+ * <NiceIconPicker
139
+ * icons={icons}
140
+ * value={selected}
141
+ * onChange={(name) => setSelected(name)}
142
+ * variant="solid"
143
+ * placeholder="Pick icon..."
144
+ * />
145
+ * );
146
+ * }
147
+ * ```
148
+ */
149
+ export declare const NiceIconPicker: React.ForwardRefExoticComponent<NiceIconPickerProps & React.RefAttributes<NiceIconPickerHandle>>;
@@ -0,0 +1,75 @@
1
+ import React from 'react';
2
+ import type { IconVariant, IconAnimation } from './types';
3
+ import './NiceVectorEditor.css';
4
+ /** Universal library entry — works with NiceToDev icons or any custom components. */
5
+ export interface VectorLibraryEntry {
6
+ name: string;
7
+ category?: string;
8
+ Component: React.ComponentType<Record<string, unknown>>;
9
+ }
10
+ /** Available drawing / interaction tools. */
11
+ export type VectorTool = 'select' | 'rect' | 'circle' | 'line' | 'text' | 'pan';
12
+ /** Supported layer element types. */
13
+ export type VectorLayerType = 'rect' | 'circle' | 'line' | 'text' | 'icon';
14
+ /** A single layer in the vector editor canvas. */
15
+ export interface VectorEditorLayer {
16
+ id: string;
17
+ name: string;
18
+ type: VectorLayerType;
19
+ visible: boolean;
20
+ locked: boolean;
21
+ fill: string;
22
+ fillOpacity: number;
23
+ stroke: string;
24
+ strokeOpacity: number;
25
+ strokeWidth: number;
26
+ opacity: number;
27
+ blendMode: NonNullable<React.CSSProperties['mixBlendMode']>;
28
+ rotate: number;
29
+ scaleX: number;
30
+ scaleY: number;
31
+ x: number;
32
+ y: number;
33
+ width: number;
34
+ height: number;
35
+ rx: number;
36
+ cx: number;
37
+ cy: number;
38
+ r: number;
39
+ x1: number;
40
+ y1: number;
41
+ x2: number;
42
+ y2: number;
43
+ text: string;
44
+ fontSize: number;
45
+ fontFamily: string;
46
+ iconName: string;
47
+ iconSize: number;
48
+ iconVariant: IconVariant;
49
+ iconPrimaryColor: string;
50
+ iconSecondaryColor: string;
51
+ iconAccentColor: string;
52
+ iconAnimation: IconAnimation | 'none';
53
+ }
54
+ /** Props for the {@link NiceVectorEditor} component. */
55
+ export interface NiceVectorEditorProps {
56
+ /** Browsable library items (icons, shapes, images). */
57
+ library?: VectorLibraryEntry[];
58
+ /** Canvas width in SVG units. @defaultValue 800 */
59
+ width?: number;
60
+ /** Canvas height in SVG units. @defaultValue 600 */
61
+ height?: number;
62
+ /** Layers to load on mount. */
63
+ initialLayers?: VectorEditorLayer[];
64
+ /** Fires whenever layers change. */
65
+ onChange?: (layers: VectorEditorLayer[]) => void;
66
+ /** Additional CSS class on the root element. */
67
+ className?: string;
68
+ }
69
+ /** Imperative handle exposed via `ref`. */
70
+ export interface NiceVectorEditorHandle {
71
+ getLayers(): VectorEditorLayer[];
72
+ exportSvg(): string;
73
+ exportJson(): string;
74
+ }
75
+ export declare const NiceVectorEditor: React.ForwardRefExoticComponent<NiceVectorEditorProps & React.RefAttributes<NiceVectorEditorHandle>>;