@nice2dev/icons 1.2.0 → 1.2.2

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 (117) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/dist/cjs/NiceDesktopIconExporter.js +7 -7
  3. package/dist/cjs/NiceFaviconGenerator.js +7 -2
  4. package/dist/cjs/NiceIconPicker.js +32 -27
  5. package/dist/cjs/NiceIconPreview.js +3 -1
  6. package/dist/cjs/NiceIconSetCreator.js +12 -30
  7. package/dist/cjs/NtdIconBadge.js +30 -15
  8. package/dist/cjs/NtdIconMorph.js +24 -12
  9. package/dist/cjs/NtdStateMorph.js +3 -3
  10. package/dist/cjs/animationControls.js +10 -3
  11. package/dist/cjs/createIcon.js +5 -2
  12. package/dist/cjs/design-tokens.js +2 -0
  13. package/dist/cjs/headless-ui.js +3 -3
  14. package/dist/cjs/iconMetadata.js +4 -0
  15. package/dist/cjs/iconStyles.js +36 -34
  16. package/dist/cjs/icons/accessibility.js +13 -13
  17. package/dist/cjs/icons/actions.js +59 -25
  18. package/dist/cjs/icons/ai.js +15 -15
  19. package/dist/cjs/icons/brand.js +7 -7
  20. package/dist/cjs/icons/business.js +18 -81
  21. package/dist/cjs/icons/devtech.js +31 -103
  22. package/dist/cjs/icons/ecommerce.js +16 -16
  23. package/dist/cjs/icons/education.js +17 -17
  24. package/dist/cjs/icons/files.js +31 -31
  25. package/dist/cjs/icons/fintech.js +14 -14
  26. package/dist/cjs/icons/food.js +16 -16
  27. package/dist/cjs/icons/fun.js +13 -13
  28. package/dist/cjs/icons/gaming.js +15 -15
  29. package/dist/cjs/icons/health.js +13 -22
  30. package/dist/cjs/icons/index.js +12 -0
  31. package/dist/cjs/icons/legal.js +13 -13
  32. package/dist/cjs/icons/media.js +46 -23
  33. package/dist/cjs/icons/navigation.js +14 -14
  34. package/dist/cjs/icons/omniverk.js +10 -10
  35. package/dist/cjs/icons/realestate.js +17 -17
  36. package/dist/cjs/icons/saas.js +13 -13
  37. package/dist/cjs/icons/science.js +16 -16
  38. package/dist/cjs/icons/shapes.js +89 -22
  39. package/dist/cjs/icons/smarthome.js +13 -13
  40. package/dist/cjs/icons/social.js +8 -98
  41. package/dist/cjs/icons/sports.js +14 -14
  42. package/dist/cjs/icons/sustainability.js +15 -15
  43. package/dist/cjs/icons/travel.js +15 -15
  44. package/dist/cjs/icons/ui.js +39 -28
  45. package/dist/cjs/icons/weather.js +20 -20
  46. package/dist/cjs/index.js +12 -0
  47. package/dist/cjs/lottieIntegration.js +3 -3
  48. package/dist/cjs/nicetodev-icons.css +1 -1
  49. package/dist/cjs/particleEffects.js +11 -4
  50. package/dist/cjs/resolver.js +13 -0
  51. package/dist/cjs/utilities.js +4 -2
  52. package/dist/esm/NiceDesktopIconExporter.js +7 -7
  53. package/dist/esm/NiceFaviconGenerator.js +7 -2
  54. package/dist/esm/NiceIconPicker.js +33 -28
  55. package/dist/esm/NiceIconPreview.js +3 -1
  56. package/dist/esm/NiceIconSetCreator.js +12 -30
  57. package/dist/esm/NtdIconBadge.js +30 -15
  58. package/dist/esm/NtdIconMorph.js +24 -12
  59. package/dist/esm/NtdStateMorph.js +3 -3
  60. package/dist/esm/animationControls.js +11 -4
  61. package/dist/esm/createIcon.js +6 -3
  62. package/dist/esm/design-tokens.js +2 -0
  63. package/dist/esm/headless-ui.js +3 -3
  64. package/dist/esm/iconMetadata.js +4 -0
  65. package/dist/esm/iconStyles.js +36 -34
  66. package/dist/esm/icons/accessibility.js +13 -13
  67. package/dist/esm/icons/actions.js +57 -26
  68. package/dist/esm/icons/ai.js +15 -15
  69. package/dist/esm/icons/brand.js +7 -7
  70. package/dist/esm/icons/business.js +18 -81
  71. package/dist/esm/icons/devtech.js +31 -103
  72. package/dist/esm/icons/ecommerce.js +16 -16
  73. package/dist/esm/icons/education.js +17 -17
  74. package/dist/esm/icons/files.js +31 -31
  75. package/dist/esm/icons/fintech.js +14 -14
  76. package/dist/esm/icons/food.js +16 -16
  77. package/dist/esm/icons/fun.js +13 -13
  78. package/dist/esm/icons/gaming.js +15 -15
  79. package/dist/esm/icons/health.js +13 -22
  80. package/dist/esm/icons/index.js +4 -4
  81. package/dist/esm/icons/legal.js +13 -13
  82. package/dist/esm/icons/media.js +45 -24
  83. package/dist/esm/icons/navigation.js +14 -14
  84. package/dist/esm/icons/omniverk.js +10 -10
  85. package/dist/esm/icons/realestate.js +17 -17
  86. package/dist/esm/icons/saas.js +13 -13
  87. package/dist/esm/icons/science.js +16 -16
  88. package/dist/esm/icons/shapes.js +84 -23
  89. package/dist/esm/icons/smarthome.js +13 -13
  90. package/dist/esm/icons/social.js +8 -98
  91. package/dist/esm/icons/sports.js +14 -14
  92. package/dist/esm/icons/sustainability.js +15 -15
  93. package/dist/esm/icons/travel.js +15 -15
  94. package/dist/esm/icons/ui.js +39 -29
  95. package/dist/esm/icons/weather.js +20 -20
  96. package/dist/esm/index.js +4 -4
  97. package/dist/esm/lottieIntegration.js +3 -3
  98. package/dist/esm/nicetodev-icons.css +1 -1
  99. package/dist/esm/particleEffects.js +11 -4
  100. package/dist/esm/resolver.js +13 -0
  101. package/dist/esm/smilAnimations.js +1 -1
  102. package/dist/esm/utilities.js +4 -2
  103. package/dist/types/NiceDesktopIconExporter.d.ts +1 -0
  104. package/dist/types/NtdIconBadge.d.ts +12 -4
  105. package/dist/types/NtdIconMorph.d.ts +9 -3
  106. package/dist/types/NtdStateMorph.d.ts +3 -1
  107. package/dist/types/design-tokens.d.ts +2 -0
  108. package/dist/types/headless-ui.d.ts +6 -2
  109. package/dist/types/iconStyles.d.ts +33 -11
  110. package/dist/types/icons/actions.d.ts +3 -0
  111. package/dist/types/icons/index.d.ts +4 -4
  112. package/dist/types/icons/media.d.ts +3 -0
  113. package/dist/types/icons/shapes.d.ts +6 -0
  114. package/dist/types/icons/ui.d.ts +2 -0
  115. package/dist/types/lottieIntegration.d.ts +3 -1
  116. package/dist/types/particleEffects.d.ts +3 -1
  117. package/package.json +3 -1
@@ -1,9 +1,19 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var uiCore = require('@nice2dev/ui-core');
4
5
  var React = require('react');
5
6
  var types = require('./types.js');
6
7
 
8
+ /** The status in words for the accessible name — English defaults of `ntdIconBadge.statusValue.*`. */
9
+ const STATUS_WORDS = {
10
+ online: 'online',
11
+ offline: 'offline',
12
+ busy: 'busy',
13
+ away: 'away',
14
+ dnd: 'do not disturb',
15
+ invisible: 'invisible',
16
+ };
7
17
  /* ────────────────────────────────────────────────────────────────────────────
8
18
  CONSTANTS
9
19
  ───────────────────────────────────────────────────────────────────────────── */
@@ -187,8 +197,10 @@ function injectStyles() {
187
197
  * />
188
198
  * ```
189
199
  */
190
- const NtdBadge = React.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
+ const NtdBadge = /* @__PURE__ */ Object.assign(
201
+ /* @__PURE__ */ React.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) => {
191
202
  var _a, _b;
203
+ const { t } = uiCore.useNiceTranslation();
192
204
  const [isEntering, setIsEntering] = React.useState(false);
193
205
  const [countChanging, setCountChanging] = React.useState(false);
194
206
  const prevCountRef = React.useRef(count);
@@ -212,6 +224,7 @@ const NtdBadge = React.forwardRef(({ icon: Icon, count = 0, maxCount = 99, showZ
212
224
  const timer = setTimeout(() => setIsEntering(false), 300);
213
225
  return () => clearTimeout(timer);
214
226
  }
227
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- the enter animation plays once, when the badge mounts
215
228
  }, []);
216
229
  const shouldShowBadge = count > 0 || showZero;
217
230
  const displayCount = count > maxCount ? `${maxCount}+` : count.toString();
@@ -232,13 +245,14 @@ const NtdBadge = React.forwardRef(({ icon: Icon, count = 0, maxCount = 99, showZ
232
245
  width: resolvedSize,
233
246
  height: resolvedSize,
234
247
  ...style,
235
- }, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (shouldShowBadge ? `${count} notifications` : undefined), children: [jsxRuntime.jsx(Icon, { ...iconProps }), shouldShowBadge && (jsxRuntime.jsx("span", { className: badgeClasses, style: {
248
+ }, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (shouldShowBadge
249
+ ? t('ntdIconBadge.notifications', '{count} notifications').replace('{count}', String(count))
250
+ : undefined), children: [jsxRuntime.jsx(Icon, { ...iconProps }), shouldShowBadge && (jsxRuntime.jsx("span", { className: badgeClasses, style: {
236
251
  ...POSITION_STYLES[position],
237
252
  backgroundColor: badgeColor,
238
253
  color: textColor,
239
254
  }, "aria-hidden": "true", children: variant !== 'dot' && displayCount }))] }));
240
- });
241
- NtdBadge.displayName = 'NtdBadge';
255
+ }), { displayName: 'NtdBadge' });
242
256
  /* ────────────────────────────────────────────────────────────────────────────
243
257
  NtdStatusDot COMPONENT
244
258
  ───────────────────────────────────────────────────────────────────────────── */
@@ -257,8 +271,10 @@ NtdBadge.displayName = 'NtdBadge';
257
271
  * <NtdStatusDot icon={NtdUser} status="away" position="bottom-right" />
258
272
  * ```
259
273
  */
260
- const NtdStatusDot = React.forwardRef(({ icon: Icon, status, statusColor, position = 'bottom-right', dotSize = 'md', animated = true, pulse = false, iconProps = {}, className, style, }, ref) => {
261
- var _a, _b;
274
+ const NtdStatusDot = /* @__PURE__ */ Object.assign(
275
+ /* @__PURE__ */ React.forwardRef(({ icon: Icon, status, statusColor, position = 'bottom-right', dotSize = 'md', animated = true, pulse = false, iconProps = {}, className, style, }, ref) => {
276
+ var _a, _b, _c;
277
+ const { t } = uiCore.useNiceTranslation();
262
278
  React.useEffect(() => {
263
279
  injectStyles();
264
280
  }, []);
@@ -278,15 +294,14 @@ const NtdStatusDot = React.forwardRef(({ icon: Icon, status, statusColor, positi
278
294
  width: resolvedIconSize,
279
295
  height: resolvedIconSize,
280
296
  ...style,
281
- }, role: "status", "aria-label": `Status: ${status}`, children: [jsxRuntime.jsx(Icon, { ...iconProps }), jsxRuntime.jsx("span", { className: dotClasses, style: {
297
+ }, 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: [jsxRuntime.jsx(Icon, { ...iconProps }), jsxRuntime.jsx("span", { className: dotClasses, style: {
282
298
  ...POSITION_STYLES[position],
283
299
  width: resolvedDotSize,
284
300
  height: resolvedDotSize,
285
301
  backgroundColor: resolvedColor,
286
302
  color: resolvedColor,
287
303
  }, "aria-hidden": "true" })] }));
288
- });
289
- NtdStatusDot.displayName = 'NtdStatusDot';
304
+ }), { displayName: 'NtdStatusDot' });
290
305
  /* ────────────────────────────────────────────────────────────────────────────
291
306
  NtdIconOverlay COMPONENT
292
307
  ───────────────────────────────────────────────────────────────────────────── */
@@ -311,7 +326,8 @@ NtdStatusDot.displayName = 'NtdStatusDot';
311
326
  * />
312
327
  * ```
313
328
  */
314
- const NtdIconOverlay = React.forwardRef(({ icon: Icon, overlay, position = 'bottom-right', overlayScale = 0.5, overlayBg, circularBg = false, iconProps = {}, className, style, }, ref) => {
329
+ const NtdIconOverlay = /* @__PURE__ */ Object.assign(
330
+ /* @__PURE__ */ React.forwardRef(({ icon: Icon, overlay, position = 'bottom-right', overlayScale = 0.5, overlayBg, circularBg = false, iconProps = {}, className, style, }, ref) => {
315
331
  var _a, _b;
316
332
  React.useEffect(() => {
317
333
  injectStyles();
@@ -333,8 +349,7 @@ const NtdIconOverlay = React.forwardRef(({ icon: Icon, overlay, position = 'bott
333
349
  height: overlaySize,
334
350
  backgroundColor: overlayBg,
335
351
  }, children: overlay })] }));
336
- });
337
- NtdIconOverlay.displayName = 'NtdIconOverlay';
352
+ }), { displayName: 'NtdIconOverlay' });
338
353
  /**
339
354
  * Stack two icons for composite imagery.
340
355
  *
@@ -356,7 +371,8 @@ NtdIconOverlay.displayName = 'NtdIconOverlay';
356
371
  * />
357
372
  * ```
358
373
  */
359
- const NtdIconStack = React.forwardRef(({ base: BaseIcon, overlay: OverlayIcon, baseProps = {}, overlayProps = {}, position = 'bottom-right', overlayScale = 0.6, size, className, style, }, ref) => {
374
+ const NtdIconStack = /* @__PURE__ */ Object.assign(
375
+ /* @__PURE__ */ React.forwardRef(({ base: BaseIcon, overlay: OverlayIcon, baseProps = {}, overlayProps = {}, position = 'bottom-right', overlayScale = 0.6, size, className, style, }, ref) => {
360
376
  var _a, _b, _c;
361
377
  const resolvedSize = size
362
378
  ? typeof size === 'number'
@@ -373,8 +389,7 @@ const NtdIconStack = React.forwardRef(({ base: BaseIcon, overlay: OverlayIcon, b
373
389
  }, children: [jsxRuntime.jsx(BaseIcon, { ...baseProps, size: resolvedSize }), jsxRuntime.jsx("div", { className: "ntd-icon-overlay", style: {
374
390
  ...POSITION_STYLES[position],
375
391
  }, children: jsxRuntime.jsx(OverlayIcon, { ...overlayProps, size: overlaySize }) })] }));
376
- });
377
- NtdIconStack.displayName = 'NtdIconStack';
392
+ }), { displayName: 'NtdIconStack' });
378
393
 
379
394
  exports.NtdBadge = NtdBadge;
380
395
  exports.NtdIconOverlay = NtdIconOverlay;
@@ -1,12 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var uiCore = require('@nice2dev/ui-core');
4
5
  var React = require('react');
5
- var types = require('./types.js');
6
6
  var actions = require('./icons/actions.js');
7
7
  var media = require('./icons/media.js');
8
8
  var navigation = require('./icons/navigation.js');
9
9
  var ui = require('./icons/ui.js');
10
+ var types = require('./types.js');
10
11
 
11
12
  /* ────────────────────────────────────────────────────────────────────────────
12
13
  EASING FUNCTIONS
@@ -147,7 +148,8 @@ const morphStyles = `
147
148
  * />
148
149
  * ```
149
150
  */
150
- const NtdIconMorph = React.forwardRef(({ from: FromIcon, to: ToIcon, morphed: controlledMorphed, trigger = 'none', duration = 300, easing = 'ease-in-out', size = 'md', variant = 'solid', primaryColor = 'currentColor', secondaryColor, onMorphStart, onMorphEnd, className, style, 'aria-label': ariaLabel, }, ref) => {
151
+ const NtdIconMorph = /* @__PURE__ */ Object.assign(
152
+ /* @__PURE__ */ React.forwardRef(({ from: FromIcon, to: ToIcon, morphed: controlledMorphed, trigger = 'none', duration = 300, easing = 'ease-in-out', size = 'md', variant = 'solid', primaryColor = 'currentColor', secondaryColor, onMorphStart, onMorphEnd, className, style, 'aria-label': ariaLabel, }, ref) => {
151
153
  var _a, _b;
152
154
  // Internal state for self-managed triggers
153
155
  const [internalMorphed, setInternalMorphed] = React.useState(false);
@@ -239,9 +241,13 @@ const NtdIconMorph = React.forwardRef(({ from: FromIcon, to: ToIcon, morphed: co
239
241
  height: resolvedSize,
240
242
  cursor: trigger !== 'none' ? 'pointer' : undefined,
241
243
  ...style,
242
- }, onClick: handleClick, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onFocus: handleFocus, onBlur: handleBlur, tabIndex: trigger === 'focus' ? 0 : undefined, role: trigger !== 'none' ? 'button' : undefined, "aria-label": ariaLabel, "aria-pressed": trigger !== 'none' ? morphed : undefined, children: [jsxRuntime.jsx("div", { className: `ntd-morph-icon ${morphed ? 'ntd-morph-icon--inactive' : 'ntd-morph-icon--active'}`, style: transitionStyle, "aria-hidden": morphed, children: jsxRuntime.jsx(FromIcon, { ...iconProps }) }), jsxRuntime.jsx("div", { className: `ntd-morph-icon ${morphed ? 'ntd-morph-icon--active' : 'ntd-morph-icon--inactive'}`, style: transitionStyle, "aria-hidden": !morphed, children: jsxRuntime.jsx(ToIcon, { ...iconProps }) })] }));
243
- });
244
- NtdIconMorph.displayName = 'NtdIconMorph';
244
+ }, onClick: handleClick, onKeyDown: (e) => {
245
+ if (trigger === 'click' && (e.key === 'Enter' || e.key === ' ')) {
246
+ e.preventDefault();
247
+ handleClick();
248
+ }
249
+ }, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onFocus: handleFocus, onBlur: handleBlur, tabIndex: trigger === 'focus' || trigger === 'click' ? 0 : undefined, role: trigger !== 'none' ? 'button' : undefined, "aria-label": ariaLabel, "aria-pressed": trigger !== 'none' ? morphed : undefined, children: [jsxRuntime.jsx("div", { className: `ntd-morph-icon ${morphed ? 'ntd-morph-icon--inactive' : 'ntd-morph-icon--active'}`, style: transitionStyle, "aria-hidden": morphed, children: jsxRuntime.jsx(FromIcon, { ...iconProps }) }), jsxRuntime.jsx("div", { className: `ntd-morph-icon ${morphed ? 'ntd-morph-icon--active' : 'ntd-morph-icon--inactive'}`, style: transitionStyle, "aria-hidden": !morphed, children: jsxRuntime.jsx(ToIcon, { ...iconProps }) })] }));
250
+ }), { displayName: 'NtdIconMorph' });
245
251
  /**
246
252
  * Path-based morphing using CSS transitions on SVG path data.
247
253
  * Requires browser support for CSS `d` property transitions (modern browsers).
@@ -256,8 +262,10 @@ NtdIconMorph.displayName = 'NtdIconMorph';
256
262
  * />
257
263
  * ```
258
264
  */
259
- const NtdPathMorph = React.forwardRef(({ pair, morphed: controlledMorphed, trigger = 'none', duration = 300, easing = 'ease-in-out', size = 'md', color = 'currentColor', strokeWidth = 2, filled = false, onMorphStart, onMorphEnd, className, style, 'aria-label': ariaLabel, }, ref) => {
265
+ const NtdPathMorph = /* @__PURE__ */ Object.assign(
266
+ /* @__PURE__ */ React.forwardRef(({ pair, morphed: controlledMorphed, trigger = 'none', duration = 300, easing = 'ease-in-out', size = 'md', color = 'currentColor', strokeWidth = 2, filled = false, onMorphStart, onMorphEnd, className, style, 'aria-label': ariaLabel, }, ref) => {
260
267
  var _a, _b;
268
+ const { t } = uiCore.useNiceTranslation();
261
269
  const [internalMorphed, setInternalMorphed] = React.useState(false);
262
270
  const morphed = controlledMorphed !== null && controlledMorphed !== void 0 ? controlledMorphed : internalMorphed;
263
271
  const [isAnimating, setIsAnimating] = React.useState(false);
@@ -309,11 +317,15 @@ const NtdPathMorph = React.forwardRef(({ pair, morphed: controlledMorphed, trigg
309
317
  return (jsxRuntime.jsx("svg", { ref: ref, xmlns: "http://www.w3.org/2000/svg", viewBox: pathData.viewBox, width: resolvedSize, height: resolvedSize, className: `ntd-path-morph ${className !== null && className !== void 0 ? className : ''}`, style: {
310
318
  cursor: trigger !== 'none' ? 'pointer' : undefined,
311
319
  ...style,
312
- }, onClick: handleClick, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, role: trigger !== 'none' ? 'button' : 'img', "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : `${pair} icon`, "aria-pressed": trigger !== 'none' ? morphed : undefined, children: jsxRuntime.jsx("path", { d: currentPath, fill: filled ? color : 'none', stroke: filled ? 'none' : color, strokeWidth: filled ? 0 : strokeWidth, strokeLinecap: "round", strokeLinejoin: "round", style: {
320
+ }, onClick: handleClick, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, role: trigger !== 'none' ? 'button' : 'img', "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : t('ntdIconMorph.icon', '{pair} icon').replace('{pair}', String(pair)), "aria-pressed": trigger !== 'none' ? morphed : undefined, children: jsxRuntime.jsx("path", { d: currentPath, fill: filled ? color : 'none', stroke: filled ? 'none' : color, strokeWidth: filled ? 0 : strokeWidth, strokeLinecap: "round", strokeLinejoin: "round", style: {
313
321
  transition: `d ${duration}ms ${resolvedEasing}, fill ${duration}ms ${resolvedEasing}, stroke ${duration}ms ${resolvedEasing}`,
314
322
  } }) }));
315
- });
316
- NtdPathMorph.displayName = 'NtdPathMorph';
323
+ }), { displayName: 'NtdPathMorph' });
324
+ /* ────────────────────────────────────────────────────────────────────────────
325
+ PREDEFINED MORPH PAIR COMPONENT
326
+ Convenience wrapper for common morphing patterns
327
+ ───────────────────────────────────────────────────────────────────────────── */
328
+ // Import icons lazily for predefined pairs
317
329
  const ICON_PAIRS = {
318
330
  'menu-close': { from: navigation.NtdMenu, to: navigation.NtdClose },
319
331
  'play-pause': { from: media.NtdPlay, to: media.NtdPause },
@@ -337,15 +349,15 @@ const ICON_PAIRS = {
337
349
  * <NtdMorphPair pair="sun-moon" trigger="click" />
338
350
  * ```
339
351
  */
340
- const NtdMorphPair = React.forwardRef(({ pair, ...props }, ref) => {
352
+ const NtdMorphPair = /* @__PURE__ */ Object.assign(
353
+ /* @__PURE__ */ React.forwardRef(({ pair, ...props }, ref) => {
341
354
  const iconPair = ICON_PAIRS[pair];
342
355
  if (!iconPair) {
343
356
  console.warn(`NtdMorphPair: Unknown pair "${pair}"`);
344
357
  return null;
345
358
  }
346
359
  return jsxRuntime.jsx(NtdIconMorph, { ref: ref, from: iconPair.from, to: iconPair.to, ...props });
347
- });
348
- NtdMorphPair.displayName = 'NtdMorphPair';
360
+ }), { displayName: 'NtdMorphPair' });
349
361
  /**
350
362
  * Hook for managing morph state with animation awareness.
351
363
  *
@@ -43,7 +43,8 @@ function interpolateSegments(from, to, t) {
43
43
  /* ────────────────────────────────────────────────────────────────────────────
44
44
  COMPONENT
45
45
  ───────────────────────────────────────────────────────────────────────────── */
46
- const NtdStateMorph = React.forwardRef(({ states, currentState, fills, strokes, strokeWidth = 2, duration = 300, easing: _easing = 'ease-in-out', size = 'md', viewBox = '0 0 24 24', className, style, 'aria-label': ariaLabel, onTransitionEnd, }, ref) => {
46
+ const NtdStateMorph = /* @__PURE__ */ Object.assign(
47
+ /* @__PURE__ */ React.forwardRef(({ states, currentState, fills, strokes, strokeWidth = 2, duration = 300, easing: _easing = 'ease-in-out', size = 'md', viewBox = '0 0 24 24', className, style, 'aria-label': ariaLabel, onTransitionEnd, }, ref) => {
47
48
  var _a;
48
49
  const svgRef = React.useRef(null);
49
50
  const animRef = React.useRef(0);
@@ -111,8 +112,7 @@ const NtdStateMorph = React.forwardRef(({ states, currentState, fills, strokes,
111
112
  getSvgElement: () => svgRef.current,
112
113
  }));
113
114
  return (jsxRuntime.jsx("svg", { ref: svgRef, xmlns: "http://www.w3.org/2000/svg", viewBox: viewBox, width: resolvedSize, height: resolvedSize, fill: "none", className: className, style: style, "aria-label": ariaLabel, role: ariaLabel ? 'img' : undefined, children: jsxRuntime.jsx("path", { d: currentPath, fill: currentFill, stroke: currentStroke, strokeWidth: strokeWidth, strokeLinecap: "round", strokeLinejoin: "round" }) }));
114
- });
115
- NtdStateMorph.displayName = 'NtdStateMorph';
115
+ }), { displayName: 'NtdStateMorph' });
116
116
  /* ────────────────────────────────────────────────────────────────────────────
117
117
  COLOR INTERPOLATION
118
118
  ───────────────────────────────────────────────────────────────────────────── */
@@ -239,7 +239,7 @@ function useAnimationSequence(config) {
239
239
  * </AnimationController>
240
240
  * ```
241
241
  */
242
- const AnimationController = React.forwardRef(function AnimationController(props, ref) {
242
+ const AnimationController = /* @__PURE__ */ React.forwardRef(function AnimationController(props, ref) {
243
243
  const { children, animation, autoPlay = false, playState: externalPlayState, onStart, onEnd, onStepChange, onPause, onResume, className, style, } = props;
244
244
  // Determine if sequence or single animation
245
245
  const isSequence = isSequenceConfig(animation);
@@ -424,7 +424,7 @@ const AnimationController = React.forwardRef(function AnimationController(props,
424
424
  * </InteractiveIcon>
425
425
  * ```
426
426
  */
427
- const InteractiveIcon = React.forwardRef(function InteractiveIcon(props, ref) {
427
+ const InteractiveIcon = /* @__PURE__ */ React.forwardRef(function InteractiveIcon(props, ref) {
428
428
  const { children, config, disabled = false, onInteractionStart, onInteractionEnd, className, style, } = props;
429
429
  const [isActive, setIsActive] = React.useState(false);
430
430
  const [isLeaving, setIsLeaving] = React.useState(false);
@@ -538,7 +538,14 @@ const InteractiveIcon = React.forwardRef(function InteractiveIcon(props, ref) {
538
538
  display: 'inline-flex',
539
539
  cursor: disabled ? 'default' : config.trigger === 'click' ? 'pointer' : undefined,
540
540
  ...style,
541
- }, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onClick: handleClick, onFocus: handleFocus, onBlur: handleBlur, tabIndex: config.trigger === 'focus' ? 0 : undefined, role: config.trigger === 'click' ? 'button' : undefined, children: animatedChild }));
541
+ }, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onClick: handleClick, onKeyDown: handleClick
542
+ ? (e) => {
543
+ if (e.key === 'Enter' || e.key === ' ') {
544
+ e.preventDefault();
545
+ handleClick();
546
+ }
547
+ }
548
+ : undefined, onFocus: handleFocus, onBlur: handleBlur, tabIndex: config.trigger === 'focus' || config.trigger === 'click' ? 0 : undefined, role: config.trigger === 'click' ? 'button' : undefined, children: animatedChild }));
542
549
  });
543
550
  /* ────────────────────────────────────────────────────────────────────────────
544
551
  6. UTILITY FUNCTIONS
@@ -7,14 +7,17 @@ var smilAnimations = require('./smilAnimations.js');
7
7
  var types = require('./types.js');
8
8
 
9
9
  /* ── Dark mode detection hook ───────────────────────── */
10
+ // No `matchMedia` (jsdom without a polyfill, some embedded webviews): light, and nothing to
11
+ // subscribe to — an icon must not throw where a page renders.
12
+ const hasMatchMedia = () => typeof window !== 'undefined' && typeof window.matchMedia === 'function';
10
13
  function getColorScheme() {
11
- if (typeof window === 'undefined') {
14
+ if (!hasMatchMedia()) {
12
15
  return 'light';
13
16
  }
14
17
  return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
15
18
  }
16
19
  function subscribeColorScheme(callback) {
17
- if (typeof window === 'undefined') {
20
+ if (!hasMatchMedia()) {
18
21
  return () => { };
19
22
  }
20
23
  const mq = window.matchMedia('(prefers-color-scheme: dark)');
@@ -29,6 +29,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
29
29
  * @version 1.0.0
30
30
  * @since 2026-03
31
31
  * @license MIT
32
+ *
33
+ * audit-allow: i18n-file — token descriptions written into Style Dictionary output, not UI copy.
32
34
  */
33
35
  /* ────────────────────────────────────────────────────────────────────────────
34
36
  DEFAULT TOKEN VALUES
@@ -38,7 +38,8 @@ var React = require('react');
38
38
  * Simple Slot implementation for asChild pattern.
39
39
  * Compatible with Radix UI's Slot component behavior.
40
40
  */
41
- const Slot = React.forwardRef(({ children, ...props }, forwardedRef) => {
41
+ const Slot = /* @__PURE__ */ Object.assign(
42
+ /* @__PURE__ */ React.forwardRef(({ children, ...props }, forwardedRef) => {
42
43
  if (!React.isValidElement(children)) {
43
44
  return null;
44
45
  }
@@ -47,8 +48,7 @@ const Slot = React.forwardRef(({ children, ...props }, forwardedRef) => {
47
48
  ...children.props,
48
49
  ref: forwardedRef,
49
50
  });
50
- });
51
- Slot.displayName = 'Slot';
51
+ }), { displayName: 'Slot' });
52
52
  /* ────────────────────────────────────────────────────────────────────────────
53
53
  FORWARD REF WRAPPER
54
54
  ───────────────────────────────────────────────────────────────────────────── */
@@ -17,6 +17,8 @@
17
17
  /* ────────────────────────────────────────────────────────────────────────────
18
18
  CATEGORY METADATA
19
19
  ───────────────────────────────────────────────────────────────────────────── */
20
+ // audit-allow: i18n — English data for the host's icon browser and searchIcons(); no control of
21
+ // this package shows it.
20
22
  const CATEGORY_INFO = {
21
23
  actions: {
22
24
  label: 'Actions',
@@ -364,6 +366,7 @@ function getSearchSuggestions(partialQuery, limit = 5) {
364
366
  This will be populated when icons are imported
365
367
  ───────────────────────────────────────────────────────────────────────────── */
366
368
  // Example metadata definitions (actual ones will be in icon files)
369
+ // audit-allow: i18n — English search metadata: searchIcons() matches these words.
367
370
  const UI_ICON_METADATA = {
368
371
  NtdHome: {
369
372
  category: 'ui',
@@ -430,6 +433,7 @@ const UI_ICON_METADATA = {
430
433
  related: ['NtdBellOff', 'NtdAlarm'],
431
434
  },
432
435
  };
436
+ // audit-allow: i18n — English search metadata: searchIcons() matches these words.
433
437
  const ACTION_ICON_METADATA = {
434
438
  NtdPlay: {
435
439
  category: 'actions',
@@ -19,7 +19,8 @@ const overlayBase = {
19
19
  // 1. NtdIconFloral 🌸
20
20
  // Botanical vines, leaves & flowers wrapping the icon
21
21
  // ══════════════════════════════════════════════════════
22
- const NtdIconFloral = React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', vineColor = '#22c55e', petalColor = '#f472b6', leafColor, className, style, }, ref) => {
22
+ const NtdIconFloral = /* @__PURE__ */ Object.assign(
23
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', vineColor = '#22c55e', petalColor = '#f472b6', leafColor, className, style, }, ref) => {
23
24
  const lc = leafColor !== null && leafColor !== void 0 ? leafColor : vineColor;
24
25
  const dur = `${duration}s`;
25
26
  const halfDur = `${duration * 0.5}s`;
@@ -68,13 +69,13 @@ const NtdIconFloral = React.forwardRef(({ children, animate = true, duration = 2
68
69
  ];
69
70
  const dashLen = 250;
70
71
  return (jsxRuntime.jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [children, jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-30%', width: '160%', height: '160%' }, "aria-hidden": true, children: [[vine1, vine2, ...(showExtra ? [vine3, vine4] : [])].map((d, i) => (jsxRuntime.jsx("path", { d: d, fill: "none", stroke: vineColor, strokeWidth: i < 2 ? 1.5 : 1, strokeLinecap: "round", opacity: i < 2 ? 0.85 : 0.55, ...(animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {}), children: animate && (jsxRuntime.jsx("animate", { attributeName: "stroke-dashoffset", from: `${dashLen}`, to: "0", dur: dur, fill: "freeze", begin: i < 2 ? '0s' : `${duration * 0.3}s` })) }, `v${i}`))), allLeaves.map((l, i) => (jsxRuntime.jsx("g", { transform: `translate(${l.x},${l.y}) rotate(${l.a})`, children: jsxRuntime.jsxs("g", { opacity: animate ? 0 : 0.8, children: [jsxRuntime.jsx("path", { d: leafD, fill: lc }), jsxRuntime.jsx("line", { x1: 0, y1: -3, x2: 0, y2: 2.5, stroke: lc, strokeWidth: "0.4", opacity: 0.4 }), animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.8", dur: halfDur, begin: bloomAt, fill: "freeze" }), jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "scale", values: "0 0;1 1", keyTimes: "0;1", keySplines: "0.34 1 0.64 1", calcMode: "spline", dur: halfDur, begin: bloomAt, fill: "freeze" })] }))] }) }, `l${i}`))), flowerPositions.map((f, fi) => (jsxRuntime.jsxs("g", { opacity: animate ? 0 : 1, children: [petalOffsets.map(([ox, oy], pi) => (jsxRuntime.jsx("circle", { cx: f.x + ox * f.r, cy: f.y + oy * f.r, r: f.r * 0.5, fill: petalColor, opacity: 0.85 }, pi))), jsxRuntime.jsx("circle", { cx: f.x, cy: f.y, r: f.r * 0.3, fill: "#fde047" }), animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: halfDur, begin: flowerAt, fill: "freeze" }), jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "scale", values: "0.3 0.3;1 1", keyTimes: "0;1", keySplines: "0.34 1 0.64 1", calcMode: "spline", dur: halfDur, begin: flowerAt, fill: "freeze" })] }))] }, `f${fi}`))), animate && (jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "rotate", values: "0 50 50;1 50 50;-1 50 50;0 50 50", dur: "4s", repeatCount: "indefinite", begin: `${duration}s` }))] })] }));
71
- });
72
- NtdIconFloral.displayName = 'NtdIconFloral';
72
+ }), { displayName: 'NtdIconFloral' });
73
73
  // ══════════════════════════════════════════════════════
74
74
  // 2. NtdIconFestive 🎉
75
75
  // Confetti burst, stars & sparkles
76
76
  // ══════════════════════════════════════════════════════
77
- const NtdIconFestive = React.forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', colors, sparkleColor = '#fbbf24', className, style, }, ref) => {
77
+ const NtdIconFestive = /* @__PURE__ */ Object.assign(
78
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', colors, sparkleColor = '#fbbf24', className, style, }, ref) => {
78
79
  const cols = colors !== null && colors !== void 0 ? colors : ['#ef4444', '#f59e0b', '#22c55e', '#3b82f6', '#a855f7', '#ec4899'];
79
80
  const dur = `${duration * 0.6}s`;
80
81
  // Confetti pieces: position relative to center, rotation, color index
@@ -140,13 +141,13 @@ const NtdIconFestive = React.forwardRef(({ children, animate = true, duration =
140
141
  const col = cols[c.ci % cols.length];
141
142
  return (jsxRuntime.jsx("g", { transform: "translate(50,50)", children: jsxRuntime.jsxs("g", { opacity: animate ? 0 : 0.85, children: [jsxRuntime.jsx("rect", { x: c.x - 50 - 1.5, y: c.y - 50 - 3, width: 3, height: 6, rx: 0.5, fill: col, transform: `rotate(${c.r} ${c.x - 50} ${c.y - 50})` }), animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.85", dur: "0.4s", begin: delay, fill: "freeze" }), jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "scale", values: "0 0;1 1", keyTimes: "0;1", keySplines: "0.34 1 0.64 1", calcMode: "spline", dur: dur, begin: delay, fill: "freeze" })] }))] }) }, `c${i}`));
142
143
  }), stars.map((s, i) => (jsxRuntime.jsxs("g", { transform: `translate(${s.x},${s.y}) scale(${s.s})`, children: [jsxRuntime.jsx("path", { d: starD, fill: sparkleColor, opacity: animate ? 0 : 0.9, children: animate && (jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.9", dur: "0.5s", begin: `${(i * 0.15 + 0.3).toFixed(2)}s`, fill: "freeze" })) }), animate && (jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "scale", values: `${s.s};${s.s * 1.3};${s.s}`, dur: "1.5s", repeatCount: "indefinite", begin: `${duration + 0.5}s` }))] }, `s${i}`))), sparkles.map((sp, i) => (jsxRuntime.jsx("circle", { cx: sp.cx, cy: sp.cy, r: sp.r, fill: sparkleColor, opacity: animate ? 0 : 0.7, children: animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.7", dur: "0.3s", begin: `${(duration * 0.4 + i * 0.08).toFixed(2)}s`, fill: "freeze" }), jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0.3;0.9;0.3", dur: `${1 + i * 0.3}s`, repeatCount: "indefinite", begin: `${duration}s` })] })) }, `sp${i}`)))] })] }));
143
- });
144
- NtdIconFestive.displayName = 'NtdIconFestive';
144
+ }), { displayName: 'NtdIconFestive' });
145
145
  // ══════════════════════════════════════════════════════
146
146
  // 3. NtdIconNeon 💡
147
147
  // Multi-layered glow with neon sign flicker
148
148
  // ══════════════════════════════════════════════════════
149
- const NtdIconNeon = React.forwardRef(({ children, animate = true, duration = 4, intensity = 'normal', glowColor = '#0ff', secondaryGlow, flicker = true, className, style, }, ref) => {
149
+ const NtdIconNeon = /* @__PURE__ */ Object.assign(
150
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 4, intensity = 'normal', glowColor = '#0ff', secondaryGlow, flicker = true, className, style, }, ref) => {
150
151
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '_');
151
152
  const glow2 = secondaryGlow !== null && secondaryGlow !== void 0 ? secondaryGlow : glowColor;
152
153
  const blur = intensity === 'dense' ? 8 : intensity === 'subtle' ? 3 : 5;
@@ -171,13 +172,13 @@ const NtdIconNeon = React.forwardRef(({ children, animate = true, duration = 4,
171
172
  filter: filterValue,
172
173
  ...(animate && flicker ? { animation: `${animName} ${duration}s infinite` } : {}),
173
174
  }, children: children })] }));
174
- });
175
- NtdIconNeon.displayName = 'NtdIconNeon';
175
+ }), { displayName: 'NtdIconNeon' });
176
176
  // ══════════════════════════════════════════════════════
177
177
  // 4. NtdIconSketch ✏️
178
178
  // Hand-drawn look with SVG turbulence + scribble overlay
179
179
  // ══════════════════════════════════════════════════════
180
- const NtdIconSketch = React.forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', strokeColor = '#374151', roughness = 2, className, style, }, ref) => {
180
+ const NtdIconSketch = /* @__PURE__ */ Object.assign(
181
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', strokeColor = '#374151', roughness = 2, className, style, }, ref) => {
181
182
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '_');
182
183
  const filterId = `ntd_sketch_${uid}`;
183
184
  const dur = `${duration}s`;
@@ -197,13 +198,13 @@ const NtdIconSketch = React.forwardRef(({ children, animate = true, duration = 1
197
198
  ];
198
199
  return (jsxRuntime.jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsxRuntime.jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsxRuntime.jsx("defs", { children: jsxRuntime.jsxs("filter", { id: filterId, children: [jsxRuntime.jsx("feTurbulence", { type: "turbulence", baseFrequency: 0.02 + roughness * 0.008, numOctaves: 3, seed: 2, result: "noise" }), jsxRuntime.jsx("feDisplacementMap", { in: "SourceGraphic", in2: "noise", scale: roughness, xChannelSelector: "R", yChannelSelector: "G" })] }) }) }), jsxRuntime.jsx("span", { style: { display: 'inline-flex', filter: `url(#${filterId})` }, children: children }), jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-20%', width: '140%', height: '140%' }, "aria-hidden": true, children: [jsxRuntime.jsx("path", { d: scribbleMain, fill: "none", stroke: strokeColor, strokeWidth: "1", strokeLinecap: "round", opacity: 0.5, ...(animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {}), children: animate && (jsxRuntime.jsx("animate", { attributeName: "stroke-dashoffset", from: `${dashLen}`, to: "0", dur: dur, fill: "freeze" })) }), intensity !== 'subtle' &&
199
200
  scribbleExtra.slice(0, intensity === 'dense' ? 2 : 1).map((d, i) => (jsxRuntime.jsx("path", { d: d, fill: "none", stroke: strokeColor, strokeWidth: "0.8", strokeLinecap: "round", opacity: 0.35, ...(animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {}), children: animate && (jsxRuntime.jsx("animate", { attributeName: "stroke-dashoffset", from: `${dashLen}`, to: "0", dur: dur, fill: "freeze", begin: `${0.3 + i * 0.2}s` })) }, `se${i}`))), hatchPositions.slice(0, hatchCount).map((p, i) => (jsxRuntime.jsx("line", { x1: p.x1, y1: p.y1, x2: p.x2, y2: p.y2, stroke: strokeColor, strokeWidth: "0.6", strokeLinecap: "round", opacity: animate ? 0 : 0.3, children: animate && (jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.3", dur: "0.3s", begin: `${duration * 0.7 + i * 0.1}s`, fill: "freeze" })) }, `h${i}`)))] })] }));
200
- });
201
- NtdIconSketch.displayName = 'NtdIconSketch';
201
+ }), { displayName: 'NtdIconSketch' });
202
202
  // ══════════════════════════════════════════════════════
203
203
  // 5. NtdIconWatercolor 🎨
204
204
  // Soft paint blobs & bleed effect behind the icon
205
205
  // ══════════════════════════════════════════════════════
206
- const NtdIconWatercolor = React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', tintColor = '#818cf8', bleedColor = '#f0abfc', className, style, }, ref) => {
206
+ const NtdIconWatercolor = /* @__PURE__ */ Object.assign(
207
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', tintColor = '#818cf8', bleedColor = '#f0abfc', className, style, }, ref) => {
207
208
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '_');
208
209
  const filterId = `ntd_wc_${uid}`;
209
210
  const blobFilter = `${filterId}_blob`;
@@ -246,13 +247,13 @@ const NtdIconWatercolor = React.forwardRef(({ children, animate = true, duration
246
247
  position: 'relative',
247
248
  zIndex: 1,
248
249
  }, children: children })] }));
249
- });
250
- NtdIconWatercolor.displayName = 'NtdIconWatercolor';
250
+ }), { displayName: 'NtdIconWatercolor' });
251
251
  // ══════════════════════════════════════════════════════
252
252
  // 6. NtdIconCosmic ✨
253
253
  // Stars, nebula glow & constellation lines
254
254
  // ══════════════════════════════════════════════════════
255
- const NtdIconCosmic = React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', starColor = '#e2e8f0', nebulaColor = '#7c3aed', nebulaColor2 = '#2563eb', className, style, }, ref) => {
255
+ const NtdIconCosmic = /* @__PURE__ */ Object.assign(
256
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', starColor = '#e2e8f0', nebulaColor = '#7c3aed', nebulaColor2 = '#2563eb', className, style, }, ref) => {
256
257
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '_');
257
258
  const nebulaFilter = `ntd_cosm_${uid}`;
258
259
  // Stars
@@ -305,7 +306,9 @@ const NtdIconCosmic = React.forwardRef(({ children, animate = true, duration = 2
305
306
  const nebulae = [
306
307
  { cx: 25, cy: 25, r: 16, color: nebulaColor, op: 0.12 },
307
308
  { cx: 75, cy: 75, r: 18, color: nebulaColor2, op: 0.1 },
308
- ...(intensity !== 'subtle' ? [{ cx: 50, cy: 50, r: 14, color: nebulaColor, op: 0.08 }] : []),
309
+ ...(intensity !== 'subtle'
310
+ ? [{ cx: 50, cy: 50, r: 14, color: nebulaColor, op: 0.08 }]
311
+ : []),
309
312
  ...(intensity === 'dense'
310
313
  ? [
311
314
  { cx: 80, cy: 20, r: 12, color: nebulaColor2, op: 0.09 },
@@ -315,13 +318,13 @@ const NtdIconCosmic = React.forwardRef(({ children, animate = true, duration = 2
315
318
  ];
316
319
  const lineLen = 80;
317
320
  return (jsxRuntime.jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsxRuntime.jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsxRuntime.jsx("defs", { children: jsxRuntime.jsx("filter", { id: nebulaFilter, children: jsxRuntime.jsx("feGaussianBlur", { stdDeviation: "4" }) }) }) }), jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-30%', width: '160%', height: '160%', zIndex: 0 }, "aria-hidden": true, children: [nebulae.map((n, i) => (jsxRuntime.jsx("circle", { cx: n.cx, cy: n.cy, r: n.r, fill: n.color, opacity: animate ? 0 : n.op, filter: `url(#${nebulaFilter})`, children: animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: `${n.op}`, dur: `${duration}s`, fill: "freeze" }), jsxRuntime.jsx("animate", { attributeName: "opacity", values: `${n.op};${n.op * 1.5};${n.op}`, dur: "5s", repeatCount: "indefinite", begin: `${duration}s` }), jsxRuntime.jsx("animate", { attributeName: "r", values: `${n.r};${n.r * 1.1};${n.r}`, dur: "6s", repeatCount: "indefinite", begin: `${duration}s` })] })) }, `nb${i}`))), constellations.map((c, i) => (jsxRuntime.jsx("line", { x1: c.from[0], y1: c.from[1], x2: c.to[0], y2: c.to[1], stroke: starColor, strokeWidth: "0.3", opacity: 0.25, ...(animate ? { strokeDasharray: lineLen, strokeDashoffset: lineLen } : {}), children: animate && (jsxRuntime.jsx("animate", { attributeName: "stroke-dashoffset", from: `${lineLen}`, to: "0", dur: `${duration * 0.8}s`, begin: `${(i * 0.2).toFixed(1)}s`, fill: "freeze" })) }, `cl${i}`)))] }), jsxRuntime.jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children }), jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-30%', width: '160%', height: '160%', zIndex: 2 }, "aria-hidden": true, children: [allStars.map((s, i) => (jsxRuntime.jsx("circle", { cx: s.cx, cy: s.cy, r: s.r, fill: starColor, opacity: animate ? 0 : 0.8, children: animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.8", dur: `${duration * 0.5}s`, begin: `${(i * 0.1).toFixed(2)}s`, fill: "freeze" }), jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0.4;1;0.4", dur: `${1.5 + (i % 4) * 0.4}s`, repeatCount: "indefinite", begin: `${duration}s` }), jsxRuntime.jsx("animate", { attributeName: "r", values: `${s.r};${s.r * 1.4};${s.r}`, dur: `${2 + (i % 3) * 0.5}s`, repeatCount: "indefinite", begin: `${duration}s` })] })) }, `st${i}`))), animate && (jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "rotate", from: "0 50 50", to: "360 50 50", dur: "120s", repeatCount: "indefinite" }))] })] }));
318
- });
319
- NtdIconCosmic.displayName = 'NtdIconCosmic';
321
+ }), { displayName: 'NtdIconCosmic' });
320
322
  // ══════════════════════════════════════════════════════
321
323
  // 7. NtdIconSteampunk ⚙️
322
324
  // Rotating gears, copper pipes, brass rivets & steam puffs
323
325
  // ══════════════════════════════════════════════════════
324
- const NtdIconSteampunk = React.forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', brassColor = '#b45309', pipeColor = '#78350f', steamColor = '#d1d5db', className, style, }, ref) => {
326
+ const NtdIconSteampunk = /* @__PURE__ */ Object.assign(
327
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', brassColor = '#b45309', pipeColor = '#78350f', steamColor = '#d1d5db', className, style, }, ref) => {
325
328
  // Build toothed gear path from a center point, radius and tooth count
326
329
  const makeGear = (cx, cy, r, teeth) => {
327
330
  const inner = r * 0.68;
@@ -387,13 +390,13 @@ const NtdIconSteampunk = React.forwardRef(({ children, animate = true, duration
387
390
  ];
388
391
  return (jsxRuntime.jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-20%', width: '140%', height: '140%', zIndex: 0 }, "aria-hidden": true, children: [pipes.map((p, i) => (jsxRuntime.jsx("path", { d: p.d, stroke: pipeColor, strokeWidth: p.w, fill: "none", strokeLinecap: "round", opacity: 0.55 }, `pipe${i}`))), rivets.map((rv, i) => (jsxRuntime.jsx("circle", { cx: rv.cx, cy: rv.cy, r: 1.5, fill: brassColor, opacity: 0.7 }, `rv${i}`)))] }), jsxRuntime.jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children }), jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-20%', width: '140%', height: '140%', zIndex: 2 }, "aria-hidden": true, children: [gears.map((g, i) => (jsxRuntime.jsxs("g", { children: [jsxRuntime.jsx("path", { d: makeGear(g.cx, g.cy, g.r, g.teeth), fill: brassColor, opacity: 0.78, children: animate && (jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "rotate", from: `0 ${g.cx} ${g.cy}`, to: `${g.dir * 360} ${g.cx} ${g.cy}`, dur: `${duration * g.dm}s`, repeatCount: "indefinite" })) }), jsxRuntime.jsx("circle", { cx: g.cx, cy: g.cy, r: g.r * 0.3, fill: pipeColor, opacity: 0.85 }), jsxRuntime.jsx("circle", { cx: g.cx, cy: g.cy, r: g.r * 0.12, fill: brassColor, opacity: 0.6 })] }, `gear${i}`))), animate &&
389
392
  steamPuffs.map((sp, i) => (jsxRuntime.jsxs("circle", { cx: sp.cx, cy: sp.cy, r: sp.r, fill: steamColor, opacity: 0, children: [jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0;0.45;0", dur: "2.4s", begin: `${i * 0.7}s`, repeatCount: "indefinite" }), jsxRuntime.jsx("animate", { attributeName: "cy", values: `${sp.cy};${sp.cy - 12}`, dur: "2.4s", begin: `${i * 0.7}s`, repeatCount: "indefinite" }), jsxRuntime.jsx("animate", { attributeName: "r", values: `${sp.r};${sp.r * 2.2}`, dur: "2.4s", begin: `${i * 0.7}s`, repeatCount: "indefinite" })] }, `stm${i}`)))] })] }));
390
- });
391
- NtdIconSteampunk.displayName = 'NtdIconSteampunk';
393
+ }), { displayName: 'NtdIconSteampunk' });
392
394
  // ══════════════════════════════════════════════════════
393
395
  // 8. NtdIconFrost ❄️
394
396
  // Hexagonal snowflake crystals, sparkles & frozen glow
395
397
  // ══════════════════════════════════════════════════════
396
- const NtdIconFrost = React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', crystalColor = '#bae6fd', glowColor = '#38bdf8', className, style, }, ref) => {
398
+ const NtdIconFrost = /* @__PURE__ */ Object.assign(
399
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', crystalColor = '#bae6fd', glowColor = '#38bdf8', className, style, }, ref) => {
397
400
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '_');
398
401
  const glowFilterId = `ntd_frost_${uid}`;
399
402
  const crystalDefs = [
@@ -453,13 +456,13 @@ const NtdIconFrost = React.forwardRef(({ children, animate = true, duration = 2,
453
456
  { cx: 86, cy: 96, r: 1.1 },
454
457
  ];
455
458
  return (jsxRuntime.jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsxRuntime.jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsxRuntime.jsx("defs", { children: jsxRuntime.jsx("filter", { id: glowFilterId, children: jsxRuntime.jsx("feGaussianBlur", { stdDeviation: "6" }) }) }) }), jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-25%', width: '150%', height: '150%', zIndex: 0 }, "aria-hidden": true, children: [jsxRuntime.jsx("circle", { cx: "50", cy: "50", r: "30", fill: glowColor, opacity: 0.07, filter: `url(#${glowFilterId})`, children: animate && (jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0.04;0.11;0.04", dur: "4s", repeatCount: "indefinite" })) }), allArms.map((arm, i) => (jsxRuntime.jsx("line", { x1: arm.x1, y1: arm.y1, x2: arm.x2, y2: arm.y2, stroke: crystalColor, strokeWidth: "0.9", strokeLinecap: "round", opacity: animate ? 0 : 0.7, children: animate && (jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.7", dur: `${duration * 0.4}s`, begin: `${arm.delay.toFixed(2)}s`, fill: "freeze" })) }, `arm${i}`))), allTicks.map((tick, i) => (jsxRuntime.jsx("line", { x1: tick.x1, y1: tick.y1, x2: tick.x2, y2: tick.y2, stroke: crystalColor, strokeWidth: "0.6", strokeLinecap: "round", opacity: animate ? 0 : 0.45, children: animate && (jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.45", dur: `${duration * 0.3}s`, begin: `${tick.delay.toFixed(2)}s`, fill: "freeze" })) }, `tick${i}`))), sparkles.slice(0, intensity === 'subtle' ? 4 : 8).map((sp, i) => (jsxRuntime.jsx("circle", { cx: sp.cx, cy: sp.cy, r: sp.r, fill: glowColor, opacity: animate ? 0 : 0.8, children: animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.8", dur: "0.35s", begin: `${(duration * 0.65 + i * 0.08).toFixed(2)}s`, fill: "freeze" }), jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0.3;1;0.3", dur: `${1 + i * 0.2}s`, repeatCount: "indefinite", begin: `${duration}s` })] })) }, `fsp${i}`)))] }), jsxRuntime.jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children })] }));
456
- });
457
- NtdIconFrost.displayName = 'NtdIconFrost';
459
+ }), { displayName: 'NtdIconFrost' });
458
460
  // ══════════════════════════════════════════════════════
459
461
  // 9. NtdIconPixel 👾
460
462
  // Retro pixel corners, scanline scroll & glitch animation
461
463
  // ══════════════════════════════════════════════════════
462
- const NtdIconPixel = React.forwardRef(({ children, animate = true, duration = 0.5, intensity = 'normal', pixelColor = '#22d3ee', scanlineColor = '#000000', glitchEffect = true, className, style, }, ref) => {
464
+ const NtdIconPixel = /* @__PURE__ */ Object.assign(
465
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 0.5, intensity = 'normal', pixelColor = '#22d3ee', scanlineColor = '#000000', glitchEffect = true, className, style, }, ref) => {
463
466
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '_');
464
467
  const scanAnimName = `ntd_pixel_scan_${uid}`;
465
468
  const glitchAnimName = `ntd_pixel_glitch_${uid}`;
@@ -531,13 +534,13 @@ const NtdIconPixel = React.forwardRef(({ children, animate = true, duration = 0.
531
534
  background: `linear-gradient(transparent, ${pixelColor}20, transparent)`,
532
535
  animation: `${scanAnimName} ${duration + 2}s linear infinite`,
533
536
  } }) }))] }));
534
- });
535
- NtdIconPixel.displayName = 'NtdIconPixel';
537
+ }), { displayName: 'NtdIconPixel' });
536
538
  // ══════════════════════════════════════════════════════
537
539
  // 10. NtdIconOrganic 🦠
538
540
  // Pulsing cell blobs, membrane rings & floating bubbles
539
541
  // ══════════════════════════════════════════════════════
540
- const NtdIconOrganic = React.forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', cellColor = '#86efac', membraneColor = '#4ade80', nucleusColor = '#fbbf24', className, style, }, ref) => {
542
+ const NtdIconOrganic = /* @__PURE__ */ Object.assign(
543
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', cellColor = '#86efac', membraneColor = '#4ade80', nucleusColor = '#fbbf24', className, style, }, ref) => {
541
544
  const uid = React.useId().replace(/[^a-zA-Z0-9]/g, '_');
542
545
  const blobFilterId = `ntd_org_${uid}`;
543
546
  const cells = [
@@ -576,14 +579,14 @@ const NtdIconOrganic = React.forwardRef(({ children, animate = true, duration =
576
579
  { cx: 8, cy: 8, r: 10 },
577
580
  { cx: 92, cy: 92, r: 10 },
578
581
  ].map((ring, i) => (jsxRuntime.jsx("circle", { cx: ring.cx, cy: ring.cy, r: ring.r, fill: "none", stroke: membraneColor, strokeWidth: "0.7", opacity: animate ? 0 : 0.35, children: animate && (jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.35", dur: `${duration * 0.7}s`, fill: "freeze" })) }, `ring${i}`))), bubbles.slice(0, bubbleCount).map((b, i) => (jsxRuntime.jsx("circle", { cx: b.cx, cy: b.cy, r: b.r, fill: nucleusColor, opacity: animate ? 0 : 0.28, children: animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.28", dur: "0.5s", begin: `${(duration * 0.65 + i * 0.18).toFixed(2)}s`, fill: "freeze" }), jsxRuntime.jsx("animate", { attributeName: "cy", values: `${b.cy};${b.cy - 5};${b.cy}`, dur: `${2.2 + i * 0.45}s`, repeatCount: "indefinite", begin: `${duration}s` })] })) }, `ob${i}`)))] }), jsxRuntime.jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children })] }));
579
- });
580
- NtdIconOrganic.displayName = 'NtdIconOrganic';
582
+ }), { displayName: 'NtdIconOrganic' });
581
583
  // ══════════════════════════════════════════════════════
582
584
  // 11. NtdIconGeometric 🔷
583
585
  // Sacred geometry: concentric rings, Star of David
584
586
  // triangles & slowly rotating corner diamonds
585
587
  // ══════════════════════════════════════════════════════
586
- const NtdIconGeometric = React.forwardRef(({ children, animate = true, duration = 8, intensity = 'normal', primaryColor = '#6366f1', secondaryColor = '#8b5cf6', accentColor = '#a78bfa', className, style, }, ref) => {
588
+ const NtdIconGeometric = /* @__PURE__ */ Object.assign(
589
+ /* @__PURE__ */ React.forwardRef(({ children, animate = true, duration = 8, intensity = 'normal', primaryColor = '#6366f1', secondaryColor = '#8b5cf6', accentColor = '#a78bfa', className, style, }, ref) => {
587
590
  const makeTriangle = (cx, cy, r, rotDeg) => Array.from({ length: 3 }, (_, i) => {
588
591
  const a = ((i * 120 - 90 + rotDeg) * Math.PI) / 180;
589
592
  return `${(cx + r * Math.cos(a)).toFixed(2)},${(cy + r * Math.sin(a)).toFixed(2)}`;
@@ -628,8 +631,7 @@ const NtdIconGeometric = React.forwardRef(({ children, animate = true, duration
628
631
  ];
629
632
  const diamondPath = (cx, cy, s = 3) => `M${cx},${cy - s} L${cx + s},${cy} L${cx},${cy + s} L${cx - s},${cy}Z`;
630
633
  return (jsxRuntime.jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsxRuntime.jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-30%', width: '160%', height: '160%', zIndex: 0 }, "aria-hidden": true, children: [rings.map((ring, i) => (jsxRuntime.jsx("circle", { cx: "50", cy: "50", r: ring.r, fill: "none", stroke: ring.color, strokeWidth: "0.6", strokeDasharray: ring.dash, opacity: ring.op, children: animate && (jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "rotate", from: "0 50 50", to: `${ring.dir * 360} 50 50`, dur: `${ring.dur}s`, repeatCount: "indefinite" })) }, `rng${i}`))), triangles.map((t, i) => (jsxRuntime.jsx("polygon", { points: makeTriangle(50, 50, t.r, t.rot), fill: "none", stroke: t.color, strokeWidth: "0.5", opacity: t.op, children: animate && (jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "rotate", from: "0 50 50", to: `${t.dir * 360} 50 50`, dur: `${t.dur}s`, repeatCount: "indefinite" })) }, `tri${i}`))), diamonds.map((d, i) => (jsxRuntime.jsx("path", { d: diamondPath(d.cx, d.cy), fill: accentColor, opacity: animate ? 0 : 0.5, children: animate && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("animate", { attributeName: "opacity", from: "0", to: "0.5", dur: `${duration * 0.25}s`, begin: `${(i * 0.09).toFixed(2)}s`, fill: "freeze" }), jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "rotate", from: `0 ${d.cx} ${d.cy}`, to: `360 ${d.cx} ${d.cy}`, dur: `${3 + i * 0.6}s`, repeatCount: "indefinite" })] })) }, `dm${i}`)))] }), jsxRuntime.jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children })] }));
631
- });
632
- NtdIconGeometric.displayName = 'NtdIconGeometric';
634
+ }), { displayName: 'NtdIconGeometric' });
633
635
 
634
636
  exports.NtdIconCosmic = NtdIconCosmic;
635
637
  exports.NtdIconFestive = NtdIconFestive;