@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,392 +1,421 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useNiceTranslation } from '@nice2dev/ui-core';
3
- import { forwardRef, useState, useRef, useEffect } from 'react';
4
- import { SIZE_MAP } from './types.js';
5
-
6
- /** The status in words for the accessible name — English defaults of `ntdIconBadge.statusValue.*`. */
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useNiceTranslation } from "@nice2dev/ui-core";
3
+ import { forwardRef, useState, useRef, useEffect } from "react";
4
+ import { SIZE_MAP } from "./types.js";
7
5
  const STATUS_WORDS = {
8
- online: 'online',
9
- offline: 'offline',
10
- busy: 'busy',
11
- away: 'away',
12
- dnd: 'do not disturb',
13
- invisible: 'invisible',
6
+ online: "online",
7
+ offline: "offline",
8
+ busy: "busy",
9
+ away: "away",
10
+ dnd: "do not disturb",
11
+ invisible: "invisible"
14
12
  };
15
- /* ────────────────────────────────────────────────────────────────────────────
16
- CONSTANTS
17
- ───────────────────────────────────────────────────────────────────────────── */
18
13
  const STATUS_COLORS = {
19
- online: '#22c55e', // green-500
20
- offline: '#6b7280', // gray-500
21
- busy: '#ef4444', // red-500
22
- away: '#f59e0b', // amber-500
23
- dnd: '#ef4444', // red-500
24
- invisible: '#9ca3af', // gray-400
14
+ online: "#22c55e",
15
+ // green-500
16
+ offline: "#6b7280",
17
+ // gray-500
18
+ busy: "#ef4444",
19
+ // red-500
20
+ away: "#f59e0b",
21
+ // amber-500
22
+ dnd: "#ef4444",
23
+ // red-500
24
+ invisible: "#9ca3af"
25
+ // gray-400
25
26
  };
26
27
  const POSITION_STYLES = {
27
- 'top-right': { top: 0, right: 0, transform: 'translate(40%, -40%)' },
28
- 'top-left': { top: 0, left: 0, transform: 'translate(-40%, -40%)' },
29
- 'bottom-right': { bottom: 0, right: 0, transform: 'translate(40%, 40%)' },
30
- 'bottom-left': { bottom: 0, left: 0, transform: 'translate(-40%, 40%)' },
31
- 'top-center': { top: 0, left: '50%', transform: 'translate(-50%, -50%)' },
32
- 'bottom-center': { bottom: 0, left: '50%', transform: 'translate(-50%, 50%)' },
33
- 'center-right': { top: '50%', right: 0, transform: 'translate(50%, -50%)' },
34
- 'center-left': { top: '50%', left: 0, transform: 'translate(-50%, -50%)' },
28
+ "top-right": { top: 0, right: 0, transform: "translate(40%, -40%)" },
29
+ "top-left": { top: 0, left: 0, transform: "translate(-40%, -40%)" },
30
+ "bottom-right": { bottom: 0, right: 0, transform: "translate(40%, 40%)" },
31
+ "bottom-left": { bottom: 0, left: 0, transform: "translate(-40%, 40%)" },
32
+ "top-center": { top: 0, left: "50%", transform: "translate(-50%, -50%)" },
33
+ "bottom-center": { bottom: 0, left: "50%", transform: "translate(-50%, 50%)" },
34
+ "center-right": { top: "50%", right: 0, transform: "translate(50%, -50%)" },
35
+ "center-left": { top: "50%", left: 0, transform: "translate(-50%, -50%)" }
35
36
  };
36
37
  const DOT_SIZES = {
37
- sm: 6,
38
- md: 8,
39
- lg: 10,
38
+ sm: 6,
39
+ md: 8,
40
+ lg: 10
40
41
  };
41
- /* ────────────────────────────────────────────────────────────────────────────
42
- STYLES
43
- ───────────────────────────────────────────────────────────────────────────── */
44
- const badgeStyles = `
45
- .ntd-badge-container {
46
- position: relative;
47
- display: inline-flex;
48
- align-items: center;
49
- justify-content: center;
50
- }
51
-
52
- .ntd-badge {
53
- position: absolute;
54
- display: flex;
55
- align-items: center;
56
- justify-content: center;
57
- font-size: 10px;
58
- font-weight: 600;
59
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
60
- line-height: 1;
61
- white-space: nowrap;
62
- border-radius: 9999px;
63
- z-index: 1;
64
- }
65
-
66
- .ntd-badge--standard {
67
- min-width: 18px;
68
- height: 18px;
69
- padding: 0 5px;
70
- }
71
-
72
- .ntd-badge--dot {
73
- width: 8px;
74
- height: 8px;
75
- padding: 0;
76
- }
77
-
78
- .ntd-badge--pill {
79
- min-width: 20px;
80
- height: 16px;
81
- padding: 0 6px;
82
- font-size: 9px;
83
- }
84
-
85
- .ntd-badge--animated {
86
- transition: transform 0.2s ease, opacity 0.2s ease;
87
- }
88
-
89
- .ntd-badge--enter {
90
- animation: ntd-badge-pop 0.3s ease-out;
91
- }
92
-
93
- @keyframes ntd-badge-pop {
94
- 0% { transform: scale(0); opacity: 0; }
95
- 50% { transform: scale(1.2); }
96
- 100% { transform: scale(1); opacity: 1; }
97
- }
98
-
99
- @keyframes ntd-badge-pulse {
100
- 0%, 100% { transform: scale(1); opacity: 1; }
101
- 50% { transform: scale(1.1); opacity: 0.8; }
102
- }
103
-
104
- .ntd-badge--pulse {
105
- animation: ntd-badge-pulse 1.5s ease-in-out infinite;
106
- }
107
-
108
- .ntd-status-dot {
109
- position: absolute;
110
- border-radius: 50%;
111
- border: 2px solid white;
112
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
113
- z-index: 1;
114
- }
115
-
116
- .ntd-status-dot--animated {
117
- transition: background-color 0.3s ease, transform 0.3s ease;
118
- }
119
-
120
- @keyframes ntd-status-pulse {
121
- 0%, 100% {
122
- box-shadow: 0 0 0 0 currentColor;
123
- }
124
- 50% {
125
- box-shadow: 0 0 0 4px transparent;
126
- }
127
- }
128
-
129
- .ntd-status-dot--pulse {
130
- animation: ntd-status-pulse 2s ease-in-out infinite;
131
- }
132
-
133
- .ntd-icon-overlay {
134
- position: absolute;
135
- display: flex;
136
- align-items: center;
137
- justify-content: center;
138
- z-index: 1;
139
- }
140
-
141
- .ntd-icon-overlay--circular {
142
- border-radius: 50%;
143
- padding: 2px;
144
- }
145
-
146
- @keyframes ntd-count-change {
147
- 0% { transform: scale(1); }
148
- 25% { transform: scale(1.3); }
149
- 50% { transform: scale(0.9); }
150
- 100% { transform: scale(1); }
151
- }
152
-
153
- .ntd-badge--count-change {
154
- animation: ntd-count-change 0.3s ease-out;
155
- }
42
+ const badgeStyles = `
43
+ .ntd-badge-container {
44
+ position: relative;
45
+ display: inline-flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ }
49
+
50
+ .ntd-badge {
51
+ position: absolute;
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ font-size: 10px;
56
+ font-weight: 600;
57
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
58
+ line-height: 1;
59
+ white-space: nowrap;
60
+ border-radius: 9999px;
61
+ z-index: 1;
62
+ }
63
+
64
+ .ntd-badge--standard {
65
+ min-width: 18px;
66
+ height: 18px;
67
+ padding: 0 5px;
68
+ }
69
+
70
+ .ntd-badge--dot {
71
+ width: 8px;
72
+ height: 8px;
73
+ padding: 0;
74
+ }
75
+
76
+ .ntd-badge--pill {
77
+ min-width: 20px;
78
+ height: 16px;
79
+ padding: 0 6px;
80
+ font-size: 9px;
81
+ }
82
+
83
+ .ntd-badge--animated {
84
+ transition: transform 0.2s ease, opacity 0.2s ease;
85
+ }
86
+
87
+ .ntd-badge--enter {
88
+ animation: ntd-badge-pop 0.3s ease-out;
89
+ }
90
+
91
+ @keyframes ntd-badge-pop {
92
+ 0% { transform: scale(0); opacity: 0; }
93
+ 50% { transform: scale(1.2); }
94
+ 100% { transform: scale(1); opacity: 1; }
95
+ }
96
+
97
+ @keyframes ntd-badge-pulse {
98
+ 0%, 100% { transform: scale(1); opacity: 1; }
99
+ 50% { transform: scale(1.1); opacity: 0.8; }
100
+ }
101
+
102
+ .ntd-badge--pulse {
103
+ animation: ntd-badge-pulse 1.5s ease-in-out infinite;
104
+ }
105
+
106
+ .ntd-status-dot {
107
+ position: absolute;
108
+ border-radius: 50%;
109
+ border: 2px solid white;
110
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
111
+ z-index: 1;
112
+ }
113
+
114
+ .ntd-status-dot--animated {
115
+ transition: background-color 0.3s ease, transform 0.3s ease;
116
+ }
117
+
118
+ @keyframes ntd-status-pulse {
119
+ 0%, 100% {
120
+ box-shadow: 0 0 0 0 currentColor;
121
+ }
122
+ 50% {
123
+ box-shadow: 0 0 0 4px transparent;
124
+ }
125
+ }
126
+
127
+ .ntd-status-dot--pulse {
128
+ animation: ntd-status-pulse 2s ease-in-out infinite;
129
+ }
130
+
131
+ .ntd-icon-overlay {
132
+ position: absolute;
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: center;
136
+ z-index: 1;
137
+ }
138
+
139
+ .ntd-icon-overlay--circular {
140
+ border-radius: 50%;
141
+ padding: 2px;
142
+ }
143
+
144
+ @keyframes ntd-count-change {
145
+ 0% { transform: scale(1); }
146
+ 25% { transform: scale(1.3); }
147
+ 50% { transform: scale(0.9); }
148
+ 100% { transform: scale(1); }
149
+ }
150
+
151
+ .ntd-badge--count-change {
152
+ animation: ntd-count-change 0.3s ease-out;
153
+ }
156
154
  `;
157
- // Inject styles
158
155
  let stylesInjected = false;
159
156
  function injectStyles() {
160
- if (stylesInjected || typeof document === 'undefined') {
161
- return;
162
- }
163
- const styleId = 'ntd-badge-styles';
164
- if (!document.getElementById(styleId)) {
165
- const styleEl = document.createElement('style');
166
- styleEl.id = styleId;
167
- styleEl.textContent = badgeStyles;
168
- document.head.appendChild(styleEl);
169
- }
170
- stylesInjected = true;
157
+ if (stylesInjected || typeof document === "undefined") {
158
+ return;
159
+ }
160
+ const styleId = "ntd-badge-styles";
161
+ if (!document.getElementById(styleId)) {
162
+ const styleEl = document.createElement("style");
163
+ styleEl.id = styleId;
164
+ styleEl.textContent = badgeStyles;
165
+ document.head.appendChild(styleEl);
166
+ }
167
+ stylesInjected = true;
171
168
  }
172
- /* ────────────────────────────────────────────────────────────────────────────
173
- NtdBadge COMPONENT
174
- ───────────────────────────────────────────────────────────────────────────── */
175
- /**
176
- * Badge overlay component for icons with notification counts.
177
- *
178
- * @example
179
- * ```tsx
180
- * // Basic notification badge
181
- * <NtdBadge icon={NtdBell} count={3} />
182
- *
183
- * // Large count with max
184
- * <NtdBadge icon={NtdInbox} count={150} maxCount={99} />
185
- *
186
- * // Pulsing badge
187
- * <NtdBadge icon={NtdMessage} count={1} pulse />
188
- *
189
- * // Custom colors
190
- * <NtdBadge
191
- * icon={NtdHeart}
192
- * count={5}
193
- * badgeColor="#e91e63"
194
- * textColor="white"
195
- * />
196
- * ```
197
- */
198
169
  const NtdBadge = /* @__PURE__ */ Object.assign(
199
- /* @__PURE__ */ forwardRef(({ icon: Icon, count = 0, maxCount = 99, showZero = false, position = 'top-right', variant = 'standard', badgeColor = '#ef4444', textColor = '#ffffff', animated = true, pulse = false, iconProps = {}, className, style, 'aria-label': ariaLabel, }, ref) => {
200
- var _a, _b;
201
- const { t } = useNiceTranslation();
202
- const [isEntering, setIsEntering] = useState(false);
203
- const [countChanging, setCountChanging] = useState(false);
204
- const prevCountRef = useRef(count);
205
- useEffect(() => {
170
+ /* @__PURE__ */ forwardRef(
171
+ ({
172
+ icon: Icon,
173
+ count = 0,
174
+ maxCount = 99,
175
+ showZero = false,
176
+ position = "top-right",
177
+ variant = "standard",
178
+ badgeColor = "#ef4444",
179
+ textColor = "#ffffff",
180
+ animated = true,
181
+ pulse = false,
182
+ iconProps = {},
183
+ className,
184
+ style,
185
+ "aria-label": ariaLabel
186
+ }, ref) => {
187
+ const { t } = useNiceTranslation();
188
+ const [isEntering, setIsEntering] = useState(false);
189
+ const [countChanging, setCountChanging] = useState(false);
190
+ const prevCountRef = useRef(count);
191
+ useEffect(() => {
206
192
  injectStyles();
207
- }, []);
208
- // Handle count change animation
209
- useEffect(() => {
193
+ }, []);
194
+ useEffect(() => {
210
195
  if (animated && prevCountRef.current !== count && count > 0) {
211
- setCountChanging(true);
212
- const timer = setTimeout(() => setCountChanging(false), 300);
213
- prevCountRef.current = count;
214
- return () => clearTimeout(timer);
196
+ setCountChanging(true);
197
+ const timer = setTimeout(() => setCountChanging(false), 300);
198
+ prevCountRef.current = count;
199
+ return () => clearTimeout(timer);
215
200
  }
216
201
  prevCountRef.current = count;
217
- }, [count, animated]);
218
- // Handle enter animation
219
- useEffect(() => {
202
+ }, [count, animated]);
203
+ useEffect(() => {
220
204
  if (animated && count > 0) {
221
- setIsEntering(true);
222
- const timer = setTimeout(() => setIsEntering(false), 300);
223
- return () => clearTimeout(timer);
205
+ setIsEntering(true);
206
+ const timer = setTimeout(() => setIsEntering(false), 300);
207
+ return () => clearTimeout(timer);
224
208
  }
225
- // eslint-disable-next-line react-hooks/exhaustive-deps -- the enter animation plays once, when the badge mounts
226
- }, []);
227
- const shouldShowBadge = count > 0 || showZero;
228
- const displayCount = count > maxCount ? `${maxCount}+` : count.toString();
229
- const resolvedSize = typeof iconProps.size === 'number'
230
- ? iconProps.size
231
- : ((_b = SIZE_MAP[(_a = iconProps.size) !== null && _a !== void 0 ? _a : 'md']) !== null && _b !== void 0 ? _b : 24);
232
- const badgeClasses = [
233
- 'ntd-badge',
209
+ }, []);
210
+ const shouldShowBadge = count > 0 || showZero;
211
+ const displayCount = count > maxCount ? `${maxCount}+` : count.toString();
212
+ const resolvedSize = typeof iconProps.size === "number" ? iconProps.size : SIZE_MAP[iconProps.size ?? "md"] ?? 24;
213
+ const badgeClasses = [
214
+ "ntd-badge",
234
215
  `ntd-badge--${variant}`,
235
- animated && 'ntd-badge--animated',
236
- isEntering && 'ntd-badge--enter',
237
- countChanging && 'ntd-badge--count-change',
238
- pulse && 'ntd-badge--pulse',
239
- ]
240
- .filter(Boolean)
241
- .join(' ');
242
- return (jsxs("div", { ref: ref, className: `ntd-badge-container ${className !== null && className !== void 0 ? className : ''}`, style: {
216
+ animated && "ntd-badge--animated",
217
+ isEntering && "ntd-badge--enter",
218
+ countChanging && "ntd-badge--count-change",
219
+ pulse && "ntd-badge--pulse"
220
+ ].filter(Boolean).join(" ");
221
+ return /* @__PURE__ */ jsxs(
222
+ "div",
223
+ {
224
+ ref,
225
+ className: `ntd-badge-container ${className ?? ""}`,
226
+ style: {
243
227
  width: resolvedSize,
244
228
  height: resolvedSize,
245
- ...style,
246
- }, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (shouldShowBadge
247
- ? t('ntdIconBadge.notifications', '{count} notifications').replace('{count}', String(count))
248
- : undefined), children: [jsx(Icon, { ...iconProps }), shouldShowBadge && (jsx("span", { className: badgeClasses, style: {
249
- ...POSITION_STYLES[position],
250
- backgroundColor: badgeColor,
251
- color: textColor,
252
- }, "aria-hidden": "true", children: variant !== 'dot' && displayCount }))] }));
253
- }), { displayName: 'NtdBadge' });
254
- /* ────────────────────────────────────────────────────────────────────────────
255
- NtdStatusDot COMPONENT
256
- ───────────────────────────────────────────────────────────────────────────── */
257
- /**
258
- * Status indicator dot overlay for icons.
259
- *
260
- * @example
261
- * ```tsx
262
- * // Online status
263
- * <NtdStatusDot icon={NtdUser} status="online" />
264
- *
265
- * // Busy with pulse
266
- * <NtdStatusDot icon={NtdUser} status="busy" pulse />
267
- *
268
- * // Custom position
269
- * <NtdStatusDot icon={NtdUser} status="away" position="bottom-right" />
270
- * ```
271
- */
229
+ ...style
230
+ },
231
+ "aria-label": ariaLabel ?? (shouldShowBadge ? t("ntdIconBadge.notifications", "{count} notifications").replace(
232
+ "{count}",
233
+ String(count)
234
+ ) : void 0),
235
+ children: [
236
+ /* @__PURE__ */ jsx(Icon, { ...iconProps }),
237
+ shouldShowBadge && /* @__PURE__ */ jsx(
238
+ "span",
239
+ {
240
+ className: badgeClasses,
241
+ style: {
242
+ ...POSITION_STYLES[position],
243
+ backgroundColor: badgeColor,
244
+ color: textColor
245
+ },
246
+ "aria-hidden": "true",
247
+ children: variant !== "dot" && displayCount
248
+ }
249
+ )
250
+ ]
251
+ }
252
+ );
253
+ }
254
+ ),
255
+ { displayName: "NtdBadge" }
256
+ );
272
257
  const NtdStatusDot = /* @__PURE__ */ Object.assign(
273
- /* @__PURE__ */ forwardRef(({ icon: Icon, status, statusColor, position = 'bottom-right', dotSize = 'md', animated = true, pulse = false, iconProps = {}, className, style, }, ref) => {
274
- var _a, _b, _c;
275
- const { t } = useNiceTranslation();
276
- useEffect(() => {
258
+ /* @__PURE__ */ forwardRef(
259
+ ({
260
+ icon: Icon,
261
+ status,
262
+ statusColor,
263
+ position = "bottom-right",
264
+ dotSize = "md",
265
+ animated = true,
266
+ pulse = false,
267
+ iconProps = {},
268
+ className,
269
+ style
270
+ }, ref) => {
271
+ const { t } = useNiceTranslation();
272
+ useEffect(() => {
277
273
  injectStyles();
278
- }, []);
279
- const resolvedColor = statusColor !== null && statusColor !== void 0 ? statusColor : STATUS_COLORS[status];
280
- const resolvedDotSize = DOT_SIZES[dotSize];
281
- const resolvedIconSize = typeof iconProps.size === 'number'
282
- ? iconProps.size
283
- : ((_b = SIZE_MAP[(_a = iconProps.size) !== null && _a !== void 0 ? _a : 'md']) !== null && _b !== void 0 ? _b : 24);
284
- const dotClasses = [
285
- 'ntd-status-dot',
286
- animated && 'ntd-status-dot--animated',
287
- pulse && status === 'online' && 'ntd-status-dot--pulse',
288
- ]
289
- .filter(Boolean)
290
- .join(' ');
291
- return (jsxs("div", { ref: ref, className: `ntd-badge-container ${className !== null && className !== void 0 ? className : ''}`, style: {
274
+ }, []);
275
+ const resolvedColor = statusColor ?? STATUS_COLORS[status];
276
+ const resolvedDotSize = DOT_SIZES[dotSize];
277
+ const resolvedIconSize = typeof iconProps.size === "number" ? iconProps.size : SIZE_MAP[iconProps.size ?? "md"] ?? 24;
278
+ const dotClasses = [
279
+ "ntd-status-dot",
280
+ animated && "ntd-status-dot--animated",
281
+ pulse && status === "online" && "ntd-status-dot--pulse"
282
+ ].filter(Boolean).join(" ");
283
+ return /* @__PURE__ */ jsxs(
284
+ "div",
285
+ {
286
+ ref,
287
+ className: `ntd-badge-container ${className ?? ""}`,
288
+ style: {
292
289
  width: resolvedIconSize,
293
290
  height: resolvedIconSize,
294
- ...style,
295
- }, role: "status", "aria-label": t('ntdIconBadge.status', 'Status: {status}').replace('{status}', t('ntdIconBadge.statusValue.' + status, (_c = STATUS_WORDS[status]) !== null && _c !== void 0 ? _c : status)), children: [jsx(Icon, { ...iconProps }), jsx("span", { className: dotClasses, style: {
296
- ...POSITION_STYLES[position],
297
- width: resolvedDotSize,
298
- height: resolvedDotSize,
299
- backgroundColor: resolvedColor,
300
- color: resolvedColor,
301
- }, "aria-hidden": "true" })] }));
302
- }), { displayName: 'NtdStatusDot' });
303
- /* ────────────────────────────────────────────────────────────────────────────
304
- NtdIconOverlay COMPONENT
305
- ───────────────────────────────────────────────────────────────────────────── */
306
- /**
307
- * Generic overlay component for composing icons.
308
- *
309
- * @example
310
- * ```tsx
311
- * // Folder with plus
312
- * <NtdIconOverlay
313
- * icon={NtdFolder}
314
- * overlay={<NtdPlus size="xs" />}
315
- * position="bottom-right"
316
- * />
317
- *
318
- * // With circular background
319
- * <NtdIconOverlay
320
- * icon={NtdUser}
321
- * overlay={<NtdCheck size="xs" primaryColor="white" />}
322
- * circularBg
323
- * overlayBg="#22c55e"
324
- * />
325
- * ```
326
- */
291
+ ...style
292
+ },
293
+ role: "status",
294
+ "aria-label": t("ntdIconBadge.status", "Status: {status}").replace(
295
+ "{status}",
296
+ t("ntdIconBadge.statusValue." + status, STATUS_WORDS[status] ?? status)
297
+ ),
298
+ children: [
299
+ /* @__PURE__ */ jsx(Icon, { ...iconProps }),
300
+ /* @__PURE__ */ jsx(
301
+ "span",
302
+ {
303
+ className: dotClasses,
304
+ style: {
305
+ ...POSITION_STYLES[position],
306
+ width: resolvedDotSize,
307
+ height: resolvedDotSize,
308
+ backgroundColor: resolvedColor,
309
+ color: resolvedColor
310
+ },
311
+ "aria-hidden": "true"
312
+ }
313
+ )
314
+ ]
315
+ }
316
+ );
317
+ }
318
+ ),
319
+ { displayName: "NtdStatusDot" }
320
+ );
327
321
  const NtdIconOverlay = /* @__PURE__ */ Object.assign(
328
- /* @__PURE__ */ forwardRef(({ icon: Icon, overlay, position = 'bottom-right', overlayScale = 0.5, overlayBg, circularBg = false, iconProps = {}, className, style, }, ref) => {
329
- var _a, _b;
330
- useEffect(() => {
322
+ /* @__PURE__ */ forwardRef(
323
+ ({
324
+ icon: Icon,
325
+ overlay,
326
+ position = "bottom-right",
327
+ overlayScale = 0.5,
328
+ overlayBg,
329
+ circularBg = false,
330
+ iconProps = {},
331
+ className,
332
+ style
333
+ }, ref) => {
334
+ useEffect(() => {
331
335
  injectStyles();
332
- }, []);
333
- const resolvedIconSize = typeof iconProps.size === 'number'
334
- ? iconProps.size
335
- : ((_b = SIZE_MAP[(_a = iconProps.size) !== null && _a !== void 0 ? _a : 'md']) !== null && _b !== void 0 ? _b : 24);
336
- const overlaySize = resolvedIconSize * overlayScale;
337
- const overlayClasses = ['ntd-icon-overlay', circularBg && 'ntd-icon-overlay--circular']
338
- .filter(Boolean)
339
- .join(' ');
340
- return (jsxs("div", { ref: ref, className: `ntd-badge-container ${className !== null && className !== void 0 ? className : ''}`, style: {
336
+ }, []);
337
+ const resolvedIconSize = typeof iconProps.size === "number" ? iconProps.size : SIZE_MAP[iconProps.size ?? "md"] ?? 24;
338
+ const overlaySize = resolvedIconSize * overlayScale;
339
+ const overlayClasses = ["ntd-icon-overlay", circularBg && "ntd-icon-overlay--circular"].filter(Boolean).join(" ");
340
+ return /* @__PURE__ */ jsxs(
341
+ "div",
342
+ {
343
+ ref,
344
+ className: `ntd-badge-container ${className ?? ""}`,
345
+ style: {
341
346
  width: resolvedIconSize,
342
347
  height: resolvedIconSize,
343
- ...style,
344
- }, children: [jsx(Icon, { ...iconProps }), jsx("div", { className: overlayClasses, style: {
345
- ...POSITION_STYLES[position],
346
- width: overlaySize,
347
- height: overlaySize,
348
- backgroundColor: overlayBg,
349
- }, children: overlay })] }));
350
- }), { displayName: 'NtdIconOverlay' });
351
- /**
352
- * Stack two icons for composite imagery.
353
- *
354
- * @example
355
- * ```tsx
356
- * // Folder with star
357
- * <NtdIconStack
358
- * base={NtdFolder}
359
- * overlay={NtdStar}
360
- * overlayProps={{ primaryColor: '#fbbf24' }}
361
- * />
362
- *
363
- * // Ban overlay (slash through)
364
- * <NtdIconStack
365
- * base={NtdCamera}
366
- * overlay={NtdSlash}
367
- * overlayProps={{ primaryColor: '#ef4444' }}
368
- * position="center"
369
- * />
370
- * ```
371
- */
348
+ ...style
349
+ },
350
+ children: [
351
+ /* @__PURE__ */ jsx(Icon, { ...iconProps }),
352
+ /* @__PURE__ */ jsx(
353
+ "div",
354
+ {
355
+ className: overlayClasses,
356
+ style: {
357
+ ...POSITION_STYLES[position],
358
+ width: overlaySize,
359
+ height: overlaySize,
360
+ backgroundColor: overlayBg
361
+ },
362
+ children: overlay
363
+ }
364
+ )
365
+ ]
366
+ }
367
+ );
368
+ }
369
+ ),
370
+ { displayName: "NtdIconOverlay" }
371
+ );
372
372
  const NtdIconStack = /* @__PURE__ */ Object.assign(
373
- /* @__PURE__ */ forwardRef(({ base: BaseIcon, overlay: OverlayIcon, baseProps = {}, overlayProps = {}, position = 'bottom-right', overlayScale = 0.6, size, className, style, }, ref) => {
374
- var _a, _b, _c;
375
- const resolvedSize = size
376
- ? typeof size === 'number'
377
- ? size
378
- : ((_a = SIZE_MAP[size]) !== null && _a !== void 0 ? _a : 24)
379
- : typeof baseProps.size === 'number'
380
- ? baseProps.size
381
- : ((_c = SIZE_MAP[(_b = baseProps.size) !== null && _b !== void 0 ? _b : 'md']) !== null && _c !== void 0 ? _c : 24);
382
- const overlaySize = Math.round(resolvedSize * overlayScale);
383
- return (jsxs("div", { ref: ref, className: `ntd-badge-container ${className !== null && className !== void 0 ? className : ''}`, style: {
373
+ /* @__PURE__ */ forwardRef(
374
+ ({
375
+ base: BaseIcon,
376
+ overlay: OverlayIcon,
377
+ baseProps = {},
378
+ overlayProps = {},
379
+ position = "bottom-right",
380
+ overlayScale = 0.6,
381
+ size,
382
+ className,
383
+ style
384
+ }, ref) => {
385
+ const resolvedSize = size ? typeof size === "number" ? size : SIZE_MAP[size] ?? 24 : typeof baseProps.size === "number" ? baseProps.size : SIZE_MAP[baseProps.size ?? "md"] ?? 24;
386
+ const overlaySize = Math.round(resolvedSize * overlayScale);
387
+ return /* @__PURE__ */ jsxs(
388
+ "div",
389
+ {
390
+ ref,
391
+ className: `ntd-badge-container ${className ?? ""}`,
392
+ style: {
384
393
  width: resolvedSize,
385
394
  height: resolvedSize,
386
- ...style,
387
- }, children: [jsx(BaseIcon, { ...baseProps, size: resolvedSize }), jsx("div", { className: "ntd-icon-overlay", style: {
388
- ...POSITION_STYLES[position],
389
- }, children: jsx(OverlayIcon, { ...overlayProps, size: overlaySize }) })] }));
390
- }), { displayName: 'NtdIconStack' });
391
-
392
- export { NtdBadge, NtdIconOverlay, NtdIconStack, NtdStatusDot };
395
+ ...style
396
+ },
397
+ children: [
398
+ /* @__PURE__ */ jsx(BaseIcon, { ...baseProps, size: resolvedSize }),
399
+ /* @__PURE__ */ jsx(
400
+ "div",
401
+ {
402
+ className: "ntd-icon-overlay",
403
+ style: {
404
+ ...POSITION_STYLES[position]
405
+ },
406
+ children: /* @__PURE__ */ jsx(OverlayIcon, { ...overlayProps, size: overlaySize })
407
+ }
408
+ )
409
+ ]
410
+ }
411
+ );
412
+ }
413
+ ),
414
+ { displayName: "NtdIconStack" }
415
+ );
416
+ export {
417
+ NtdBadge,
418
+ NtdIconOverlay,
419
+ NtdIconStack,
420
+ NtdStatusDot
421
+ };