@nice2dev/icons 1.0.0 → 1.0.3

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 (152) hide show
  1. package/CHANGELOG.md +169 -7
  2. package/README.md +247 -2
  3. package/bin/ntd-icons.mjs +732 -0
  4. package/dist/cjs/NtdIconBadge.js +375 -0
  5. package/dist/cjs/NtdIconBadge.js.map +1 -0
  6. package/dist/cjs/NtdIconMorph.js +386 -0
  7. package/dist/cjs/NtdIconMorph.js.map +1 -0
  8. package/dist/cjs/NtdStateMorph.js +177 -0
  9. package/dist/cjs/NtdStateMorph.js.map +1 -0
  10. package/dist/cjs/createIcon.js +51 -4
  11. package/dist/cjs/createIcon.js.map +1 -1
  12. package/dist/cjs/figmaSync.js +308 -0
  13. package/dist/cjs/figmaSync.js.map +1 -0
  14. package/dist/cjs/iconAnalytics.js +189 -0
  15. package/dist/cjs/iconAnalytics.js.map +1 -0
  16. package/dist/cjs/iconMetadata.js +523 -0
  17. package/dist/cjs/iconMetadata.js.map +1 -0
  18. package/dist/cjs/iconStyles.js +597 -0
  19. package/dist/cjs/iconStyles.js.map +1 -0
  20. package/dist/cjs/icons/accessibility.js +168 -0
  21. package/dist/cjs/icons/accessibility.js.map +1 -0
  22. package/dist/cjs/icons/ai.js +191 -0
  23. package/dist/cjs/icons/ai.js.map +1 -0
  24. package/dist/cjs/icons/brand.js +70 -0
  25. package/dist/cjs/icons/brand.js.map +1 -1
  26. package/dist/cjs/icons/education.js +212 -0
  27. package/dist/cjs/icons/education.js.map +1 -0
  28. package/dist/cjs/icons/food.js +198 -0
  29. package/dist/cjs/icons/food.js.map +1 -0
  30. package/dist/cjs/icons/gaming.js +191 -0
  31. package/dist/cjs/icons/gaming.js.map +1 -0
  32. package/dist/cjs/icons/index.js +520 -0
  33. package/dist/cjs/icons/index.js.map +1 -0
  34. package/dist/cjs/icons/legal.js +168 -0
  35. package/dist/cjs/icons/legal.js.map +1 -0
  36. package/dist/cjs/icons/realestate.js +212 -0
  37. package/dist/cjs/icons/realestate.js.map +1 -0
  38. package/dist/cjs/icons/science.js +201 -0
  39. package/dist/cjs/icons/science.js.map +1 -0
  40. package/dist/cjs/icons/sports.js +176 -0
  41. package/dist/cjs/icons/sports.js.map +1 -0
  42. package/dist/cjs/icons/sustainability.js +193 -0
  43. package/dist/cjs/icons/sustainability.js.map +1 -0
  44. package/dist/cjs/icons/travel.js +184 -0
  45. package/dist/cjs/icons/travel.js.map +1 -0
  46. package/dist/cjs/index.js +265 -2
  47. package/dist/cjs/index.js.map +1 -1
  48. package/dist/cjs/lottieIntegration.js +286 -0
  49. package/dist/cjs/lottieIntegration.js.map +1 -0
  50. package/dist/cjs/nicetodev-icons.css +1 -1
  51. package/dist/cjs/particleEffects.js +259 -0
  52. package/dist/cjs/particleEffects.js.map +1 -0
  53. package/dist/cjs/resolver.js +224 -0
  54. package/dist/cjs/resolver.js.map +1 -0
  55. package/dist/cjs/tailwind-plugin.js +340 -0
  56. package/dist/cjs/tailwind-plugin.js.map +1 -0
  57. package/dist/cjs/types.js +38 -0
  58. package/dist/cjs/types.js.map +1 -1
  59. package/dist/cjs/variantProps.js +78 -0
  60. package/dist/cjs/variantProps.js.map +1 -0
  61. package/dist/esm/NtdIconBadge.js +370 -0
  62. package/dist/esm/NtdIconBadge.js.map +1 -0
  63. package/dist/esm/NtdIconMorph.js +381 -0
  64. package/dist/esm/NtdIconMorph.js.map +1 -0
  65. package/dist/esm/NtdStateMorph.js +174 -0
  66. package/dist/esm/NtdStateMorph.js.map +1 -0
  67. package/dist/esm/createIcon.js +53 -6
  68. package/dist/esm/createIcon.js.map +1 -1
  69. package/dist/esm/figmaSync.js +304 -0
  70. package/dist/esm/figmaSync.js.map +1 -0
  71. package/dist/esm/iconAnalytics.js +185 -0
  72. package/dist/esm/iconAnalytics.js.map +1 -0
  73. package/dist/esm/iconMetadata.js +510 -0
  74. package/dist/esm/iconMetadata.js.map +1 -0
  75. package/dist/esm/iconStyles.js +585 -0
  76. package/dist/esm/iconStyles.js.map +1 -0
  77. package/dist/esm/icons/accessibility.js +153 -0
  78. package/dist/esm/icons/accessibility.js.map +1 -0
  79. package/dist/esm/icons/ai.js +174 -0
  80. package/dist/esm/icons/ai.js.map +1 -0
  81. package/dist/esm/icons/brand.js +67 -1
  82. package/dist/esm/icons/brand.js.map +1 -1
  83. package/dist/esm/icons/education.js +193 -0
  84. package/dist/esm/icons/education.js.map +1 -0
  85. package/dist/esm/icons/food.js +180 -0
  86. package/dist/esm/icons/food.js.map +1 -0
  87. package/dist/esm/icons/gaming.js +174 -0
  88. package/dist/esm/icons/gaming.js.map +1 -0
  89. package/dist/esm/icons/index.js +31 -0
  90. package/dist/esm/icons/index.js.map +1 -0
  91. package/dist/esm/icons/legal.js +153 -0
  92. package/dist/esm/icons/legal.js.map +1 -0
  93. package/dist/esm/icons/realestate.js +193 -0
  94. package/dist/esm/icons/realestate.js.map +1 -0
  95. package/dist/esm/icons/science.js +183 -0
  96. package/dist/esm/icons/science.js.map +1 -0
  97. package/dist/esm/icons/sports.js +160 -0
  98. package/dist/esm/icons/sports.js.map +1 -0
  99. package/dist/esm/icons/sustainability.js +176 -0
  100. package/dist/esm/icons/sustainability.js.map +1 -0
  101. package/dist/esm/icons/travel.js +167 -0
  102. package/dist/esm/icons/travel.js.map +1 -0
  103. package/dist/esm/index.js +27 -5
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/esm/lottieIntegration.js +282 -0
  106. package/dist/esm/lottieIntegration.js.map +1 -0
  107. package/dist/esm/nicetodev-icons.css +1 -1
  108. package/dist/esm/particleEffects.js +257 -0
  109. package/dist/esm/particleEffects.js.map +1 -0
  110. package/dist/esm/resolver.js +221 -0
  111. package/dist/esm/resolver.js.map +1 -0
  112. package/dist/esm/tailwind-plugin.js +337 -0
  113. package/dist/esm/tailwind-plugin.js.map +1 -0
  114. package/dist/esm/types.js +37 -1
  115. package/dist/esm/types.js.map +1 -1
  116. package/dist/esm/variantProps.js +68 -0
  117. package/dist/esm/variantProps.js.map +1 -0
  118. package/dist/types/NtdIconBadge.d.ts +209 -0
  119. package/dist/types/NtdIconMorph.d.ts +183 -0
  120. package/dist/types/NtdStateMorph.d.ts +100 -0
  121. package/dist/types/client.d.ts +27 -0
  122. package/dist/types/design-tokens.d.ts +281 -0
  123. package/dist/types/figmaSync.d.ts +135 -0
  124. package/dist/types/headless-ui.d.ts +462 -0
  125. package/dist/types/iconAnalytics.d.ts +131 -0
  126. package/dist/types/iconMetadata.d.ts +123 -0
  127. package/dist/types/iconStyles.d.ts +104 -0
  128. package/dist/types/icons/accessibility.d.ts +39 -0
  129. package/dist/types/icons/ai.d.ts +43 -0
  130. package/dist/types/icons/brand.d.ts +4 -0
  131. package/dist/types/icons/education.d.ts +47 -0
  132. package/dist/types/icons/food.d.ts +45 -0
  133. package/dist/types/icons/gaming.d.ts +42 -0
  134. package/dist/types/icons/index.d.ts +12 -1
  135. package/dist/types/icons/legal.d.ts +39 -0
  136. package/dist/types/icons/realestate.d.ts +47 -0
  137. package/dist/types/icons/science.d.ts +45 -0
  138. package/dist/types/icons/sports.d.ts +41 -0
  139. package/dist/types/icons/sustainability.d.ts +43 -0
  140. package/dist/types/icons/travel.d.ts +43 -0
  141. package/dist/types/index.d.ts +28 -6
  142. package/dist/types/lottieIntegration.d.ts +173 -0
  143. package/dist/types/micro-interactions.d.ts +146 -0
  144. package/dist/types/microInteractions.d.ts +174 -0
  145. package/dist/types/particleEffects.d.ts +69 -0
  146. package/dist/types/resolver.d.ts +58 -0
  147. package/dist/types/rsc.d.ts +159 -0
  148. package/dist/types/tailwind-plugin.d.ts +100 -0
  149. package/dist/types/types.d.ts +100 -0
  150. package/dist/types/utilities.d.ts +221 -0
  151. package/dist/types/variantProps.d.ts +122 -0
  152. package/package.json +58 -5
@@ -0,0 +1,585 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { forwardRef, useId } from 'react';
3
+
4
+ // ────────────────── Shared styles ──────────────────
5
+ const wrapperBase = {
6
+ position: 'relative',
7
+ display: 'inline-flex',
8
+ alignItems: 'center',
9
+ justifyContent: 'center',
10
+ };
11
+ const overlayBase = {
12
+ position: 'absolute',
13
+ pointerEvents: 'none',
14
+ overflow: 'visible',
15
+ };
16
+ // ══════════════════════════════════════════════════════
17
+ // 1. NtdIconFloral 🌸
18
+ // Botanical vines, leaves & flowers wrapping the icon
19
+ // ══════════════════════════════════════════════════════
20
+ const NtdIconFloral = forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', vineColor = '#22c55e', petalColor = '#f472b6', leafColor, className, style, }, ref) => {
21
+ const lc = leafColor !== null && leafColor !== void 0 ? leafColor : vineColor;
22
+ const dur = `${duration}s`;
23
+ const halfDur = `${duration * 0.5}s`;
24
+ const bloomAt = `${duration * 0.55}s`;
25
+ const flowerAt = `${duration * 0.75}s`;
26
+ // Vine paths (viewBox 0 0 100 100, icon occupies ~20-80)
27
+ const vine1 = 'M12,88 C6,72 4,52 10,38 C16,24 28,14 42,10';
28
+ const vine2 = 'M88,12 C94,28 96,48 90,62 C84,76 72,86 58,90';
29
+ const vine3 = 'M18,8 C32,4 52,2 68,8';
30
+ const vine4 = 'M82,92 C68,96 48,98 32,92';
31
+ const showExtra = intensity !== 'subtle';
32
+ // Teardrop leaf
33
+ const leafD = 'M0,-4 C2.5,-3.5 4.5,-1 4.5,1 C4.5,3 2,5 0,3 C-1.5,1.5 -1.5,-2.5 0,-4Z';
34
+ const baseLeaves = [
35
+ { x: 10, y: 38, a: -50 },
36
+ { x: 28, y: 14, a: 30 },
37
+ { x: 90, y: 62, a: 140 },
38
+ { x: 72, y: 86, a: -150 },
39
+ ];
40
+ const denseLeaves = intensity === 'dense'
41
+ ? [
42
+ { x: 6, y: 60, a: -80 },
43
+ { x: 94, y: 40, a: 100 },
44
+ { x: 50, y: 4, a: 5 },
45
+ { x: 50, y: 96, a: 175 },
46
+ ]
47
+ : [];
48
+ const allLeaves = [...baseLeaves, ...denseLeaves];
49
+ // 5-petal flower helper
50
+ const petalOffsets = [
51
+ [0, -1],
52
+ [0.95, -0.31],
53
+ [0.59, 0.81],
54
+ [-0.59, 0.81],
55
+ [-0.95, -0.31],
56
+ ];
57
+ const flowerPositions = [
58
+ { x: 42, y: 10, r: 3.5 },
59
+ ...(intensity !== 'subtle' ? [{ x: 58, y: 90, r: 3 }] : []),
60
+ ...(intensity === 'dense'
61
+ ? [
62
+ { x: 8, y: 55, r: 2.5 },
63
+ { x: 92, y: 45, r: 2.5 },
64
+ ]
65
+ : []),
66
+ ];
67
+ const dashLen = 250;
68
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [children, 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) => (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 && (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) => (jsx("g", { transform: `translate(${l.x},${l.y}) rotate(${l.a})`, children: jsxs("g", { opacity: animate ? 0 : 0.8, children: [jsx("path", { d: leafD, fill: lc }), jsx("line", { x1: 0, y1: -3, x2: 0, y2: 2.5, stroke: lc, strokeWidth: "0.4", opacity: 0.4 }), animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "0.8", dur: halfDur, begin: bloomAt, fill: "freeze" }), jsx("animateTransform", { attributeName: "transform", type: "scale", values: "0 0;1 1", keyTimes: "0;1", keySplines: "0.34 1.56 0.64 1", calcMode: "spline", dur: halfDur, begin: bloomAt, fill: "freeze" })] }))] }) }, `l${i}`))), flowerPositions.map((f, fi) => (jsxs("g", { opacity: animate ? 0 : 1, children: [petalOffsets.map(([ox, oy], pi) => (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))), jsx("circle", { cx: f.x, cy: f.y, r: f.r * 0.3, fill: "#fde047" }), animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: halfDur, begin: flowerAt, fill: "freeze" }), jsx("animateTransform", { attributeName: "transform", type: "scale", values: "0.3 0.3;1 1", keyTimes: "0;1", keySplines: "0.34 1.56 0.64 1", calcMode: "spline", dur: halfDur, begin: flowerAt, fill: "freeze" })] }))] }, `f${fi}`))), animate && (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` }))] })] }));
69
+ });
70
+ NtdIconFloral.displayName = 'NtdIconFloral';
71
+ // ══════════════════════════════════════════════════════
72
+ // 2. NtdIconFestive 🎉
73
+ // Confetti burst, stars & sparkles
74
+ // ══════════════════════════════════════════════════════
75
+ const NtdIconFestive = forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', colors, sparkleColor = '#fbbf24', className, style, }, ref) => {
76
+ const cols = colors !== null && colors !== void 0 ? colors : ['#ef4444', '#f59e0b', '#22c55e', '#3b82f6', '#a855f7', '#ec4899'];
77
+ const dur = `${duration * 0.6}s`;
78
+ // Confetti pieces: position relative to center, rotation, color index
79
+ const baseConfetti = [
80
+ { x: 15, y: 15, r: 45, ci: 0 },
81
+ { x: 80, y: 10, r: -30, ci: 1 },
82
+ { x: 90, y: 75, r: 60, ci: 2 },
83
+ { x: 10, y: 80, r: -45, ci: 3 },
84
+ { x: 50, y: 5, r: 20, ci: 4 },
85
+ { x: 50, y: 95, r: -15, ci: 5 },
86
+ { x: 5, y: 50, r: 75, ci: 0 },
87
+ { x: 95, y: 50, r: -60, ci: 1 },
88
+ ];
89
+ const denseConfetti = intensity === 'dense'
90
+ ? [
91
+ { x: 30, y: 5, r: 35, ci: 2 },
92
+ { x: 70, y: 5, r: -25, ci: 3 },
93
+ { x: 30, y: 95, r: 50, ci: 4 },
94
+ { x: 70, y: 95, r: -40, ci: 5 },
95
+ { x: 5, y: 30, r: 65, ci: 0 },
96
+ { x: 95, y: 30, r: -55, ci: 1 },
97
+ { x: 5, y: 70, r: 40, ci: 2 },
98
+ { x: 95, y: 70, r: -35, ci: 3 },
99
+ ]
100
+ : [];
101
+ const allConfetti = [
102
+ ...(intensity === 'subtle' ? baseConfetti.slice(0, 4) : baseConfetti),
103
+ ...denseConfetti,
104
+ ];
105
+ // 4-point star path
106
+ const starD = 'M0,-5 L1.2,-1.2 L5,0 L1.2,1.2 L0,5 L-1.2,1.2 L-5,0 L-1.2,-1.2Z';
107
+ const stars = [
108
+ { x: 20, y: 8, s: 0.6 },
109
+ { x: 85, y: 20, s: 0.5 },
110
+ ...(intensity !== 'subtle'
111
+ ? [
112
+ { x: 15, y: 85, s: 0.5 },
113
+ { x: 80, y: 88, s: 0.4 },
114
+ ]
115
+ : []),
116
+ ...(intensity === 'dense'
117
+ ? [
118
+ { x: 50, y: 2, s: 0.7 },
119
+ { x: 95, y: 55, s: 0.45 },
120
+ ]
121
+ : []),
122
+ ];
123
+ // Sparkle dots
124
+ const sparkles = [
125
+ { cx: 8, cy: 12, r: 1.5 },
126
+ { cx: 92, cy: 88, r: 1.2 },
127
+ { cx: 45, cy: 2, r: 1 },
128
+ { cx: 55, cy: 98, r: 1 },
129
+ ...(intensity !== 'subtle'
130
+ ? [
131
+ { cx: 3, cy: 55, r: 1.3 },
132
+ { cx: 97, cy: 45, r: 1.1 },
133
+ ]
134
+ : []),
135
+ ];
136
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [children, jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-30%', width: '160%', height: '160%' }, "aria-hidden": true, children: [allConfetti.map((c, i) => {
137
+ const delay = `${(i * 0.07).toFixed(2)}s`;
138
+ const col = cols[c.ci % cols.length];
139
+ return (jsx("g", { transform: "translate(50,50)", children: jsxs("g", { opacity: animate ? 0 : 0.85, children: [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 && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "0.85", dur: "0.4s", begin: delay, fill: "freeze" }), jsx("animateTransform", { attributeName: "transform", type: "scale", values: "0 0;1 1", keyTimes: "0;1", keySplines: "0.34 1.56 0.64 1", calcMode: "spline", dur: dur, begin: delay, fill: "freeze" })] }))] }) }, `c${i}`));
140
+ }), stars.map((s, i) => (jsxs("g", { transform: `translate(${s.x},${s.y}) scale(${s.s})`, children: [jsx("path", { d: starD, fill: sparkleColor, opacity: animate ? 0 : 0.9, children: animate && (jsx("animate", { attributeName: "opacity", from: "0", to: "0.9", dur: "0.5s", begin: `${(i * 0.15 + 0.3).toFixed(2)}s`, fill: "freeze" })) }), animate && (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) => (jsx("circle", { cx: sp.cx, cy: sp.cy, r: sp.r, fill: sparkleColor, opacity: animate ? 0 : 0.7, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "0.7", dur: "0.3s", begin: `${(duration * 0.4 + i * 0.08).toFixed(2)}s`, fill: "freeze" }), jsx("animate", { attributeName: "opacity", values: "0.3;0.9;0.3", dur: `${1 + i * 0.3}s`, repeatCount: "indefinite", begin: `${duration}s` })] })) }, `sp${i}`)))] })] }));
141
+ });
142
+ NtdIconFestive.displayName = 'NtdIconFestive';
143
+ // ══════════════════════════════════════════════════════
144
+ // 3. NtdIconNeon 💡
145
+ // Multi-layered glow with neon sign flicker
146
+ // ══════════════════════════════════════════════════════
147
+ const NtdIconNeon = forwardRef(({ children, animate = true, duration = 4, intensity = 'normal', glowColor = '#0ff', secondaryGlow, flicker = true, className, style, }, ref) => {
148
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
149
+ const glow2 = secondaryGlow !== null && secondaryGlow !== void 0 ? secondaryGlow : glowColor;
150
+ const blur = intensity === 'dense' ? 8 : intensity === 'subtle' ? 3 : 5;
151
+ const spread = intensity === 'dense' ? 20 : intensity === 'subtle' ? 8 : 12;
152
+ const filterValue = [
153
+ `drop-shadow(0 0 ${blur * 0.3}px ${glowColor})`,
154
+ `drop-shadow(0 0 ${blur}px ${glowColor})`,
155
+ `drop-shadow(0 0 ${spread}px ${glow2}80)`,
156
+ intensity === 'dense' ? `drop-shadow(0 0 ${spread * 1.5}px ${glow2}40)` : '',
157
+ ]
158
+ .filter(Boolean)
159
+ .join(' ');
160
+ const dimFilter = `drop-shadow(0 0 ${blur * 0.2}px ${glowColor})`;
161
+ const animName = `ntd_neon_${uid}`;
162
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [animate && flicker && (jsx("style", { children: `
163
+ @keyframes ${animName} {
164
+ 0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% { opacity: 1; filter: ${filterValue}; }
165
+ 20%, 24%, 55% { opacity: 0.5; filter: ${dimFilter}; }
166
+ }
167
+ ` })), jsx("span", { style: {
168
+ display: 'inline-flex',
169
+ filter: filterValue,
170
+ ...(animate && flicker
171
+ ? { animation: `${animName} ${duration}s infinite` }
172
+ : {}),
173
+ }, children: children })] }));
174
+ });
175
+ NtdIconNeon.displayName = 'NtdIconNeon';
176
+ // ══════════════════════════════════════════════════════
177
+ // 4. NtdIconSketch ✏️
178
+ // Hand-drawn look with SVG turbulence + scribble overlay
179
+ // ══════════════════════════════════════════════════════
180
+ const NtdIconSketch = forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', strokeColor = '#374151', roughness = 2, className, style, }, ref) => {
181
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
182
+ const filterId = `ntd_sketch_${uid}`;
183
+ const dur = `${duration}s`;
184
+ const dashLen = 100;
185
+ // Scribble paths
186
+ const scribbleMain = 'M18,82 C25,80 35,84 50,81 C65,78 75,82 82,80';
187
+ const scribbleExtra = [
188
+ 'M20,16 C28,18 38,15 48,17',
189
+ 'M55,85 C65,83 75,86 82,84',
190
+ ];
191
+ // Cross-hatch mark positions
192
+ const hatchCount = intensity === 'dense' ? 6 : intensity === 'subtle' ? 2 : 4;
193
+ const hatchPositions = [
194
+ { x1: 8, y1: 8, x2: 14, y2: 14 },
195
+ { x1: 86, y1: 8, x2: 92, y2: 14 },
196
+ { x1: 8, y1: 86, x2: 14, y2: 92 },
197
+ { x1: 86, y1: 86, x2: 92, y2: 92 },
198
+ { x1: 10, y1: 12, x2: 16, y2: 10 },
199
+ { x1: 84, y1: 12, x2: 90, y2: 10 },
200
+ ];
201
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsx("defs", { children: jsxs("filter", { id: filterId, children: [jsx("feTurbulence", { type: "turbulence", baseFrequency: 0.02 + roughness * 0.008, numOctaves: 3, seed: 2, result: "noise" }), jsx("feDisplacementMap", { in: "SourceGraphic", in2: "noise", scale: roughness, xChannelSelector: "R", yChannelSelector: "G" })] }) }) }), jsx("span", { style: { display: 'inline-flex', filter: `url(#${filterId})` }, children: children }), jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-20%', width: '140%', height: '140%' }, "aria-hidden": true, children: [jsx("path", { d: scribbleMain, fill: "none", stroke: strokeColor, strokeWidth: "1", strokeLinecap: "round", opacity: 0.5, ...(animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {}), children: animate && (jsx("animate", { attributeName: "stroke-dashoffset", from: `${dashLen}`, to: "0", dur: dur, fill: "freeze" })) }), intensity !== 'subtle' &&
202
+ scribbleExtra
203
+ .slice(0, intensity === 'dense' ? 2 : 1)
204
+ .map((d, i) => (jsx("path", { d: d, fill: "none", stroke: strokeColor, strokeWidth: "0.8", strokeLinecap: "round", opacity: 0.35, ...(animate
205
+ ? { strokeDasharray: dashLen, strokeDashoffset: dashLen }
206
+ : {}), children: animate && (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) => (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 && (jsx("animate", { attributeName: "opacity", from: "0", to: "0.3", dur: "0.3s", begin: `${duration * 0.7 + i * 0.1}s`, fill: "freeze" })) }, `h${i}`)))] })] }));
207
+ });
208
+ NtdIconSketch.displayName = 'NtdIconSketch';
209
+ // ══════════════════════════════════════════════════════
210
+ // 5. NtdIconWatercolor 🎨
211
+ // Soft paint blobs & bleed effect behind the icon
212
+ // ══════════════════════════════════════════════════════
213
+ const NtdIconWatercolor = forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', tintColor = '#818cf8', bleedColor = '#f0abfc', className, style, }, ref) => {
214
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
215
+ const filterId = `ntd_wc_${uid}`;
216
+ const blobFilter = `${filterId}_blob`;
217
+ // Paint splotches
218
+ const splotches = [
219
+ { cx: 30, cy: 35, r: 18, color: tintColor, op: 0.2 },
220
+ { cx: 70, cy: 65, r: 15, color: bleedColor, op: 0.18 },
221
+ { cx: 50, cy: 50, r: 22, color: tintColor, op: 0.12 },
222
+ ...(intensity !== 'subtle'
223
+ ? [
224
+ { cx: 25, cy: 70, r: 12, color: bleedColor, op: 0.15 },
225
+ { cx: 75, cy: 30, r: 10, color: tintColor, op: 0.15 },
226
+ ]
227
+ : []),
228
+ ...(intensity === 'dense'
229
+ ? [
230
+ { cx: 15, cy: 50, r: 14, color: bleedColor, op: 0.12 },
231
+ { cx: 85, cy: 50, r: 12, color: tintColor, op: 0.12 },
232
+ { cx: 50, cy: 15, r: 10, color: bleedColor, op: 0.1 },
233
+ { cx: 50, cy: 85, r: 11, color: tintColor, op: 0.1 },
234
+ ]
235
+ : []),
236
+ ];
237
+ // Splatter dots
238
+ const splatters = [
239
+ { cx: 12, cy: 20, r: 2 },
240
+ { cx: 88, cy: 80, r: 1.5 },
241
+ { cx: 20, cy: 85, r: 1.8 },
242
+ { cx: 80, cy: 15, r: 1.3 },
243
+ ...(intensity !== 'subtle'
244
+ ? [
245
+ { cx: 8, cy: 45, r: 1.2 },
246
+ { cx: 92, cy: 55, r: 1 },
247
+ ]
248
+ : []),
249
+ ];
250
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsxs("defs", { children: [jsxs("filter", { id: filterId, x: "-20%", y: "-20%", width: "140%", height: "140%", children: [jsx("feTurbulence", { type: "fractalNoise", baseFrequency: "0.04", numOctaves: 4, seed: 5, result: "noise" }), jsx("feDisplacementMap", { in: "SourceGraphic", in2: "noise", scale: 3, xChannelSelector: "R", yChannelSelector: "G", result: "displaced" }), jsx("feGaussianBlur", { in: "displaced", stdDeviation: "0.5" })] }), jsx("filter", { id: blobFilter, children: jsx("feGaussianBlur", { stdDeviation: "3" }) })] }) }), jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-25%', width: '150%', height: '150%', zIndex: 0 }, "aria-hidden": true, children: [splotches.map((s, i) => (jsx("circle", { cx: s.cx, cy: s.cy, r: animate ? 0 : s.r, fill: s.color, opacity: s.op, filter: `url(#${blobFilter})`, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "r", from: "0", to: `${s.r}`, dur: `${duration * 0.7}s`, begin: `${(i * 0.15).toFixed(2)}s`, fill: "freeze" }), jsx("animate", { attributeName: "opacity", values: `${s.op};${s.op * 1.3};${s.op}`, dur: "3s", begin: `${duration}s`, repeatCount: "indefinite" })] })) }, `sp${i}`))), splatters.map((d, i) => (jsx("circle", { cx: d.cx, cy: d.cy, r: d.r, fill: i % 2 === 0 ? tintColor : bleedColor, opacity: animate ? 0 : 0.3, filter: `url(#${blobFilter})`, children: animate && (jsx("animate", { attributeName: "opacity", from: "0", to: "0.3", dur: "0.3s", begin: `${(duration * 0.5 + i * 0.1).toFixed(2)}s`, fill: "freeze" })) }, `dot${i}`)))] }), jsx("span", { style: {
251
+ display: 'inline-flex',
252
+ filter: `url(#${filterId})`,
253
+ position: 'relative',
254
+ zIndex: 1,
255
+ }, children: children })] }));
256
+ });
257
+ NtdIconWatercolor.displayName = 'NtdIconWatercolor';
258
+ // ══════════════════════════════════════════════════════
259
+ // 6. NtdIconCosmic ✨
260
+ // Stars, nebula glow & constellation lines
261
+ // ══════════════════════════════════════════════════════
262
+ const NtdIconCosmic = forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', starColor = '#e2e8f0', nebulaColor = '#7c3aed', nebulaColor2 = '#2563eb', className, style, }, ref) => {
263
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
264
+ const nebulaFilter = `ntd_cosm_${uid}`;
265
+ // Stars
266
+ const baseStars = [
267
+ { cx: 8, cy: 15, r: 1.2 },
268
+ { cx: 22, cy: 5, r: 0.9 },
269
+ { cx: 45, cy: 8, r: 1 },
270
+ { cx: 78, cy: 12, r: 1.3 },
271
+ { cx: 92, cy: 22, r: 0.8 },
272
+ { cx: 5, cy: 42, r: 0.7 },
273
+ { cx: 95, cy: 55, r: 0.9 },
274
+ { cx: 12, cy: 82, r: 1.1 },
275
+ { cx: 35, cy: 92, r: 0.8 },
276
+ { cx: 72, cy: 88, r: 1 },
277
+ { cx: 88, cy: 78, r: 0.7 },
278
+ ];
279
+ const denseStars = intensity === 'dense'
280
+ ? [
281
+ { cx: 55, cy: 3, r: 0.6 },
282
+ { cx: 3, cy: 65, r: 0.8 },
283
+ { cx: 97, cy: 35, r: 0.5 },
284
+ { cx: 60, cy: 97, r: 0.7 },
285
+ { cx: 15, cy: 35, r: 0.5 },
286
+ { cx: 85, cy: 42, r: 0.6 },
287
+ ]
288
+ : [];
289
+ const allStars = [
290
+ ...(intensity === 'subtle' ? baseStars.slice(0, 6) : baseStars),
291
+ ...denseStars,
292
+ ];
293
+ // Constellation lines connecting nearby stars
294
+ const constellations = [
295
+ { from: [8, 15], to: [22, 5] },
296
+ { from: [22, 5], to: [45, 8] },
297
+ { from: [78, 12], to: [92, 22] },
298
+ ...(intensity !== 'subtle'
299
+ ? [
300
+ { from: [12, 82], to: [35, 92] },
301
+ { from: [72, 88], to: [88, 78] },
302
+ ]
303
+ : []),
304
+ ...(intensity === 'dense'
305
+ ? [
306
+ { from: [45, 8], to: [78, 12] },
307
+ { from: [5, 42], to: [12, 82] },
308
+ ]
309
+ : []),
310
+ ];
311
+ // Nebula blobs
312
+ const nebulae = [
313
+ { cx: 25, cy: 25, r: 16, color: nebulaColor, op: 0.12 },
314
+ { cx: 75, cy: 75, r: 18, color: nebulaColor2, op: 0.1 },
315
+ ...(intensity !== 'subtle'
316
+ ? [{ cx: 50, cy: 50, r: 14, color: nebulaColor, op: 0.08 }]
317
+ : []),
318
+ ...(intensity === 'dense'
319
+ ? [
320
+ { cx: 80, cy: 20, r: 12, color: nebulaColor2, op: 0.09 },
321
+ { cx: 20, cy: 80, r: 13, color: nebulaColor, op: 0.09 },
322
+ ]
323
+ : []),
324
+ ];
325
+ const lineLen = 80;
326
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsx("defs", { children: jsx("filter", { id: nebulaFilter, children: jsx("feGaussianBlur", { stdDeviation: "4" }) }) }) }), 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) => (jsx("circle", { cx: n.cx, cy: n.cy, r: n.r, fill: n.color, opacity: animate ? 0 : n.op, filter: `url(#${nebulaFilter})`, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: `${n.op}`, dur: `${duration}s`, fill: "freeze" }), jsx("animate", { attributeName: "opacity", values: `${n.op};${n.op * 1.5};${n.op}`, dur: "5s", repeatCount: "indefinite", begin: `${duration}s` }), 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) => (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
327
+ ? { strokeDasharray: lineLen, strokeDashoffset: lineLen }
328
+ : {}), children: animate && (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}`)))] }), jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children }), 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) => (jsx("circle", { cx: s.cx, cy: s.cy, r: s.r, fill: starColor, opacity: animate ? 0 : 0.8, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "0.8", dur: `${duration * 0.5}s`, begin: `${(i * 0.1).toFixed(2)}s`, fill: "freeze" }), jsx("animate", { attributeName: "opacity", values: "0.4;1;0.4", dur: `${1.5 + (i % 4) * 0.4}s`, repeatCount: "indefinite", begin: `${duration}s` }), 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 && (jsx("animateTransform", { attributeName: "transform", type: "rotate", from: "0 50 50", to: "360 50 50", dur: "120s", repeatCount: "indefinite" }))] })] }));
329
+ });
330
+ NtdIconCosmic.displayName = 'NtdIconCosmic';
331
+ // ══════════════════════════════════════════════════════
332
+ // 7. NtdIconSteampunk ⚙️
333
+ // Rotating gears, copper pipes, brass rivets & steam puffs
334
+ // ══════════════════════════════════════════════════════
335
+ const NtdIconSteampunk = forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', brassColor = '#b45309', pipeColor = '#78350f', steamColor = '#d1d5db', className, style, }, ref) => {
336
+ // Build toothed gear path from a center point, radius and tooth count
337
+ const makeGear = (cx, cy, r, teeth) => {
338
+ const inner = r * 0.68;
339
+ const step = (Math.PI * 2) / teeth;
340
+ const pt = (radius, angle) => `${(cx + radius * Math.cos(angle)).toFixed(2)},${(cy + radius * Math.sin(angle)).toFixed(2)}`;
341
+ let d = '';
342
+ for (let i = 0; i < teeth; i++) {
343
+ const a0 = i * step;
344
+ d +=
345
+ `${i === 0 ? 'M' : 'L'}${pt(inner, a0)} ` +
346
+ `L${pt(r, a0 + step * 0.3)} L${pt(r, a0 + step * 0.7)} ` +
347
+ `L${pt(inner, a0 + step)} `;
348
+ }
349
+ return d + 'Z';
350
+ };
351
+ const gears = [
352
+ { cx: 15, cy: 15, r: 11, teeth: 8, dir: 1, dm: 1 },
353
+ { cx: 85, cy: 85, r: 9, teeth: 7, dir: -1, dm: 0.8 },
354
+ ...(intensity !== 'subtle'
355
+ ? [
356
+ { cx: 85, cy: 15, r: 7, teeth: 6, dir: 1, dm: 1.1 },
357
+ { cx: 15, cy: 85, r: 6, teeth: 5, dir: -1, dm: 0.9 },
358
+ ]
359
+ : []),
360
+ ...(intensity === 'dense' ? [{ cx: 50, cy: 3, r: 5, teeth: 5, dir: 1, dm: 1.3 }] : []),
361
+ ];
362
+ const pipes = [
363
+ { d: 'M27,15 H48', w: 3.5 },
364
+ { d: 'M85,28 V48', w: 3.5 },
365
+ ...(intensity !== 'subtle'
366
+ ? [{ d: 'M52,85 H73', w: 3.5 }, { d: 'M15,52 V73', w: 3.5 }]
367
+ : []),
368
+ ];
369
+ const rivets = intensity === 'subtle'
370
+ ? [{ cx: 50, cy: 2 }, { cx: 50, cy: 98 }]
371
+ : intensity === 'dense'
372
+ ? [
373
+ { cx: 50, cy: 2 }, { cx: 50, cy: 98 },
374
+ { cx: 2, cy: 50 }, { cx: 98, cy: 50 },
375
+ { cx: 25, cy: 2 }, { cx: 75, cy: 2 },
376
+ { cx: 25, cy: 98 }, { cx: 75, cy: 98 },
377
+ ]
378
+ : [{ cx: 50, cy: 2 }, { cx: 50, cy: 98 }, { cx: 2, cy: 50 }, { cx: 98, cy: 50 }];
379
+ const steamPuffs = [
380
+ { cx: 50, cy: 3, r: 3 },
381
+ { cx: 55, cy: -4, r: 2.2 },
382
+ { cx: 47, cy: -10, r: 1.6 },
383
+ ];
384
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [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) => (jsx("path", { d: p.d, stroke: pipeColor, strokeWidth: p.w, fill: "none", strokeLinecap: "round", opacity: 0.55 }, `pipe${i}`))), rivets.map((rv, i) => (jsx("circle", { cx: rv.cx, cy: rv.cy, r: 1.5, fill: brassColor, opacity: 0.7 }, `rv${i}`)))] }), jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children }), 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) => (jsxs("g", { children: [jsx("path", { d: makeGear(g.cx, g.cy, g.r, g.teeth), fill: brassColor, opacity: 0.78, children: animate && (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" })) }), jsx("circle", { cx: g.cx, cy: g.cy, r: g.r * 0.3, fill: pipeColor, opacity: 0.85 }), jsx("circle", { cx: g.cx, cy: g.cy, r: g.r * 0.12, fill: brassColor, opacity: 0.6 })] }, `gear${i}`))), animate &&
385
+ steamPuffs.map((sp, i) => (jsxs("circle", { cx: sp.cx, cy: sp.cy, r: sp.r, fill: steamColor, opacity: 0, children: [jsx("animate", { attributeName: "opacity", values: "0;0.45;0", dur: "2.4s", begin: `${i * 0.7}s`, repeatCount: "indefinite" }), jsx("animate", { attributeName: "cy", values: `${sp.cy};${sp.cy - 12}`, dur: "2.4s", begin: `${i * 0.7}s`, repeatCount: "indefinite" }), jsx("animate", { attributeName: "r", values: `${sp.r};${sp.r * 2.2}`, dur: "2.4s", begin: `${i * 0.7}s`, repeatCount: "indefinite" })] }, `stm${i}`)))] })] }));
386
+ });
387
+ NtdIconSteampunk.displayName = 'NtdIconSteampunk';
388
+ // ══════════════════════════════════════════════════════
389
+ // 8. NtdIconFrost ❄️
390
+ // Hexagonal snowflake crystals, sparkles & frozen glow
391
+ // ══════════════════════════════════════════════════════
392
+ const NtdIconFrost = forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', crystalColor = '#bae6fd', glowColor = '#38bdf8', className, style, }, ref) => {
393
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
394
+ const glowFilterId = `ntd_frost_${uid}`;
395
+ const crystalDefs = [
396
+ { cx: 8, cy: 8, len: 7, pi: 0 },
397
+ { cx: 92, cy: 8, len: 6, pi: 1 },
398
+ { cx: 8, cy: 92, len: 6, pi: 2 },
399
+ { cx: 92, cy: 92, len: 7, pi: 3 },
400
+ ...(intensity !== 'subtle'
401
+ ? [
402
+ { cx: 50, cy: 2, len: 5, pi: 4 },
403
+ { cx: 50, cy: 98, len: 5, pi: 5 },
404
+ { cx: 2, cy: 50, len: 5, pi: 6 },
405
+ { cx: 98, cy: 50, len: 5, pi: 7 },
406
+ ]
407
+ : []),
408
+ ...(intensity === 'dense'
409
+ ? [{ cx: 28, cy: 4, len: 4, pi: 8 }, { cx: 72, cy: 4, len: 4, pi: 9 }]
410
+ : []),
411
+ ];
412
+ // Each snowflake = 6 arms radiating from center
413
+ const allArms = crystalDefs.flatMap(({ cx, cy, len, pi }) => Array.from({ length: 6 }, (_, ai) => {
414
+ const angle = (ai * 60 * Math.PI) / 180;
415
+ return {
416
+ x1: cx, y1: cy,
417
+ x2: cx + len * Math.cos(angle),
418
+ y2: cy + len * Math.sin(angle),
419
+ delay: pi * 0.12 + ai * 0.02,
420
+ };
421
+ }));
422
+ // Small perpendicular tick marks at midpoint of each arm
423
+ const allTicks = crystalDefs.flatMap(({ cx, cy, len }, ci) => Array.from({ length: 6 }, (_, ai) => {
424
+ const angle = (ai * 60 * Math.PI) / 180;
425
+ const mx = cx + len * 0.55 * Math.cos(angle);
426
+ const my = cy + len * 0.55 * Math.sin(angle);
427
+ const p = angle + Math.PI / 2;
428
+ const tl = len * 0.22;
429
+ return {
430
+ x1: mx - tl * Math.cos(p), y1: my - tl * Math.sin(p),
431
+ x2: mx + tl * Math.cos(p), y2: my + tl * Math.sin(p),
432
+ delay: ci * 0.12 + duration * 0.5,
433
+ };
434
+ }));
435
+ const sparkles = [
436
+ { cx: 14, cy: 4, r: 1.1 }, { cx: 86, cy: 4, r: 0.9 },
437
+ { cx: 4, cy: 14, r: 0.8 }, { cx: 96, cy: 14, r: 1.0 },
438
+ { cx: 4, cy: 86, r: 0.9 }, { cx: 96, cy: 86, r: 0.8 },
439
+ { cx: 14, cy: 96, r: 1.0 }, { cx: 86, cy: 96, r: 1.1 },
440
+ ];
441
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsx("defs", { children: jsx("filter", { id: glowFilterId, children: jsx("feGaussianBlur", { stdDeviation: "6" }) }) }) }), jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-25%', width: '150%', height: '150%', zIndex: 0 }, "aria-hidden": true, children: [jsx("circle", { cx: "50", cy: "50", r: "30", fill: glowColor, opacity: 0.07, filter: `url(#${glowFilterId})`, children: animate && (jsx("animate", { attributeName: "opacity", values: "0.04;0.11;0.04", dur: "4s", repeatCount: "indefinite" })) }), allArms.map((arm, i) => (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 && (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) => (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 && (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) => (jsx("circle", { cx: sp.cx, cy: sp.cy, r: sp.r, fill: glowColor, opacity: animate ? 0 : 0.8, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "0.8", dur: "0.35s", begin: `${(duration * 0.65 + i * 0.08).toFixed(2)}s`, fill: "freeze" }), jsx("animate", { attributeName: "opacity", values: "0.3;1;0.3", dur: `${1 + i * 0.2}s`, repeatCount: "indefinite", begin: `${duration}s` })] })) }, `fsp${i}`)))] }), jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children })] }));
442
+ });
443
+ NtdIconFrost.displayName = 'NtdIconFrost';
444
+ // ══════════════════════════════════════════════════════
445
+ // 9. NtdIconPixel 👾
446
+ // Retro pixel corners, scanline scroll & glitch animation
447
+ // ══════════════════════════════════════════════════════
448
+ const NtdIconPixel = forwardRef(({ children, animate = true, duration = 0.5, intensity = 'normal', pixelColor = '#22d3ee', scanlineColor = '#000000', glitchEffect = true, className, style, }, ref) => {
449
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
450
+ const scanAnimName = `ntd_pixel_scan_${uid}`;
451
+ const glitchAnimName = `ntd_pixel_glitch_${uid}`;
452
+ const SZ = 4; // pixel block size (SVG units out of 100)
453
+ const basePixels = [
454
+ // top-left bracket
455
+ { x: 0, y: 0 }, { x: SZ, y: 0 }, { x: SZ * 2, y: 0 },
456
+ { x: 0, y: SZ }, { x: 0, y: SZ * 2 },
457
+ // top-right bracket
458
+ { x: 100 - SZ * 3, y: 0 }, { x: 100 - SZ * 2, y: 0 }, { x: 100 - SZ, y: 0 },
459
+ { x: 100 - SZ, y: SZ }, { x: 100 - SZ, y: SZ * 2 },
460
+ // bottom-left bracket
461
+ { x: 0, y: 100 - SZ }, { x: SZ, y: 100 - SZ }, { x: SZ * 2, y: 100 - SZ },
462
+ { x: 0, y: 100 - SZ * 2 }, { x: 0, y: 100 - SZ * 3 },
463
+ // bottom-right bracket
464
+ { x: 100 - SZ * 3, y: 100 - SZ }, { x: 100 - SZ * 2, y: 100 - SZ }, { x: 100 - SZ, y: 100 - SZ },
465
+ { x: 100 - SZ, y: 100 - SZ * 2 }, { x: 100 - SZ, y: 100 - SZ * 3 },
466
+ ];
467
+ const extraPixels = intensity === 'dense'
468
+ ? [{ x: 48, y: 0 }, { x: 0, y: 48 }, { x: 96, y: 48 }, { x: 48, y: 96 }]
469
+ : [];
470
+ const allPixels = intensity === 'subtle'
471
+ ? basePixels.filter((_, i) => i % 2 === 0)
472
+ : [...basePixels, ...extraPixels];
473
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [animate && (jsx("style", { children: `
474
+ @keyframes ${scanAnimName} {
475
+ from { transform: translateY(-100%); }
476
+ to { transform: translateY(200%); }
477
+ }
478
+ @keyframes ${glitchAnimName} {
479
+ 0%, 90%, 100% { transform: translate(0); filter: none; }
480
+ 92% { transform: translate(-3px, 1px); filter: hue-rotate(90deg); }
481
+ 94% { transform: translate(3px, -1px); clip-path: inset(25% 0 25% 0); }
482
+ 96% { transform: translate(-1px, 2px); clip-path: none; }
483
+ }
484
+ ` })), jsx("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-5%', width: '110%', height: '110%', zIndex: 2 }, "aria-hidden": true, children: allPixels.map((p, i) => (jsx("rect", { x: p.x, y: p.y, width: SZ - 0.5, height: SZ - 0.5, fill: pixelColor, opacity: 0.75, children: animate && (jsx("animate", { attributeName: "opacity", values: "0.3;1;0.3", dur: `${0.7 + (i % 5) * 0.17}s`, repeatCount: "indefinite", begin: `${((i * 0.06) % 1).toFixed(2)}s` })) }, `px${i}`))) }), jsx("span", { style: {
485
+ display: 'inline-flex',
486
+ position: 'relative',
487
+ zIndex: 1,
488
+ ...(animate && glitchEffect ? { animation: `${glitchAnimName} 4s infinite` } : {}),
489
+ }, children: children }), animate && (jsx("span", { style: {
490
+ position: 'absolute',
491
+ inset: 0,
492
+ overflow: 'hidden',
493
+ pointerEvents: 'none',
494
+ zIndex: 3,
495
+ background: `repeating-linear-gradient(0deg, transparent, transparent 3px, ${scanlineColor}1a 3px, ${scanlineColor}1a 4px)`,
496
+ }, children: jsx("span", { style: {
497
+ display: 'block',
498
+ width: '100%',
499
+ height: '30%',
500
+ background: `linear-gradient(transparent, ${pixelColor}20, transparent)`,
501
+ animation: `${scanAnimName} ${duration + 2}s linear infinite`,
502
+ } }) }))] }));
503
+ });
504
+ NtdIconPixel.displayName = 'NtdIconPixel';
505
+ // ══════════════════════════════════════════════════════
506
+ // 10. NtdIconOrganic 🦠
507
+ // Pulsing cell blobs, membrane rings & floating bubbles
508
+ // ══════════════════════════════════════════════════════
509
+ const NtdIconOrganic = forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', cellColor = '#86efac', membraneColor = '#4ade80', nucleusColor = '#fbbf24', className, style, }, ref) => {
510
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
511
+ const blobFilterId = `ntd_org_${uid}`;
512
+ const cells = [
513
+ { cx: 8, cy: 8, r: 9, color: cellColor, op: 0.18, pd: '4.2s' },
514
+ { cx: 92, cy: 8, r: 8, color: membraneColor, op: 0.15, pd: '3.8s' },
515
+ { cx: 8, cy: 92, r: 8, color: membraneColor, op: 0.16, pd: '4.5s' },
516
+ { cx: 92, cy: 92, r: 9, color: cellColor, op: 0.18, pd: '3.5s' },
517
+ ...(intensity !== 'subtle'
518
+ ? [
519
+ { cx: 50, cy: 2, r: 6, color: cellColor, op: 0.12, pd: '5.1s' },
520
+ { cx: 50, cy: 98, r: 6, color: membraneColor, op: 0.12, pd: '4.8s' },
521
+ { cx: 2, cy: 50, r: 6, color: cellColor, op: 0.12, pd: '4.3s' },
522
+ { cx: 98, cy: 50, r: 6, color: membraneColor, op: 0.12, pd: '5.2s' },
523
+ ]
524
+ : []),
525
+ ...(intensity === 'dense'
526
+ ? [
527
+ { cx: 25, cy: 5, r: 5, color: nucleusColor, op: 0.09, pd: '3.9s' },
528
+ { cx: 75, cy: 5, r: 5, color: cellColor, op: 0.09, pd: '4.4s' },
529
+ { cx: 5, cy: 25, r: 5, color: membraneColor, op: 0.09, pd: '4.6s' },
530
+ { cx: 5, cy: 75, r: 5, color: cellColor, op: 0.09, pd: '3.7s' },
531
+ ]
532
+ : []),
533
+ ];
534
+ const bubbles = [
535
+ { cx: 15, cy: 18, r: 2 }, { cx: 85, cy: 18, r: 1.8 },
536
+ { cx: 12, cy: 78, r: 1.5 }, { cx: 88, cy: 82, r: 2 },
537
+ { cx: 40, cy: 5, r: 1.5 }, { cx: 60, cy: 95, r: 1.5 },
538
+ ];
539
+ const bubbleCount = intensity === 'subtle' ? 2 : intensity === 'dense' ? 6 : 4;
540
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [jsx("svg", { style: { position: 'absolute', width: 0, height: 0 }, "aria-hidden": true, children: jsx("defs", { children: jsx("filter", { id: blobFilterId, children: jsx("feGaussianBlur", { stdDeviation: "4" }) }) }) }), jsxs("svg", { viewBox: "0 0 100 100", style: { ...overlayBase, inset: '-25%', width: '150%', height: '150%', zIndex: 0 }, "aria-hidden": true, children: [cells.map((c, i) => (jsx("circle", { cx: c.cx, cy: c.cy, r: c.r, fill: c.color, opacity: animate ? 0 : c.op, filter: `url(#${blobFilterId})`, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: `${c.op}`, dur: `${duration * 0.55}s`, begin: `${(i * 0.2).toFixed(2)}s`, fill: "freeze" }), jsx("animate", { attributeName: "r", values: `${c.r};${c.r * 1.3};${c.r}`, dur: c.pd, repeatCount: "indefinite", begin: `${duration}s` }), jsx("animate", { attributeName: "opacity", values: `${c.op};${c.op * 1.7};${c.op}`, dur: c.pd, repeatCount: "indefinite", begin: `${duration}s` })] })) }, `oc${i}`))), intensity !== 'subtle' &&
541
+ [{ cx: 8, cy: 8, r: 10 }, { cx: 92, cy: 92, r: 10 }].map((ring, i) => (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 && (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) => (jsx("circle", { cx: b.cx, cy: b.cy, r: b.r, fill: nucleusColor, opacity: animate ? 0 : 0.28, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "0.28", dur: "0.5s", begin: `${(duration * 0.65 + i * 0.18).toFixed(2)}s`, fill: "freeze" }), 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}`)))] }), jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children })] }));
542
+ });
543
+ NtdIconOrganic.displayName = 'NtdIconOrganic';
544
+ // ══════════════════════════════════════════════════════
545
+ // 11. NtdIconGeometric 🔷
546
+ // Sacred geometry: concentric rings, Star of David
547
+ // triangles & slowly rotating corner diamonds
548
+ // ══════════════════════════════════════════════════════
549
+ const NtdIconGeometric = forwardRef(({ children, animate = true, duration = 8, intensity = 'normal', primaryColor = '#6366f1', secondaryColor = '#8b5cf6', accentColor = '#a78bfa', className, style, }, ref) => {
550
+ const makeTriangle = (cx, cy, r, rotDeg) => Array.from({ length: 3 }, (_, i) => {
551
+ const a = ((i * 120 - 90 + rotDeg) * Math.PI) / 180;
552
+ return `${(cx + r * Math.cos(a)).toFixed(2)},${(cy + r * Math.sin(a)).toFixed(2)}`;
553
+ }).join(' ');
554
+ const rings = [
555
+ { r: 45, dash: '4 6', color: primaryColor, dir: 1, dur: duration, op: 0.22 },
556
+ { r: 38, dash: '2 4', color: secondaryColor, dir: -1, dur: duration * 0.75, op: 0.18 },
557
+ ...(intensity !== 'subtle'
558
+ ? [{ r: 41, dash: '1 9', color: accentColor, dir: 1, dur: duration * 1.4, op: 0.12 }]
559
+ : []),
560
+ ...(intensity === 'dense'
561
+ ? [{ r: 48, dash: '0.5 4', color: primaryColor, dir: -1, dur: duration * 1.8, op: 0.08 }]
562
+ : []),
563
+ ];
564
+ const triangles = [
565
+ { r: 34, rot: 0, color: primaryColor, op: 0.14, dur: duration * 2, dir: 1 },
566
+ { r: 34, rot: 60, color: accentColor, op: 0.10, dur: duration * 1.6, dir: -1 },
567
+ ...(intensity !== 'subtle'
568
+ ? [{ r: 24, rot: 15, color: secondaryColor, op: 0.12, dur: duration * 1.9, dir: 1 }]
569
+ : []),
570
+ ...(intensity === 'dense'
571
+ ? [{ r: 44, rot: 30, color: accentColor, op: 0.07, dur: duration * 2.2, dir: -1 }]
572
+ : []),
573
+ ];
574
+ const diamonds = [
575
+ { cx: 8, cy: 8 }, { cx: 92, cy: 8 }, { cx: 8, cy: 92 }, { cx: 92, cy: 92 },
576
+ ...(intensity !== 'subtle' ? [{ cx: 50, cy: 2 }, { cx: 50, cy: 98 }] : []),
577
+ ...(intensity === 'dense' ? [{ cx: 2, cy: 50 }, { cx: 98, cy: 50 }] : []),
578
+ ];
579
+ const diamondPath = (cx, cy, s = 3) => `M${cx},${cy - s} L${cx + s},${cy} L${cx},${cy + s} L${cx - s},${cy}Z`;
580
+ return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [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) => (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 && (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) => (jsx("polygon", { points: makeTriangle(50, 50, t.r, t.rot), fill: "none", stroke: t.color, strokeWidth: "0.5", opacity: t.op, children: animate && (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) => (jsx("path", { d: diamondPath(d.cx, d.cy), fill: accentColor, opacity: animate ? 0 : 0.5, children: animate && (jsxs(Fragment, { children: [jsx("animate", { attributeName: "opacity", from: "0", to: "0.5", dur: `${duration * 0.25}s`, begin: `${(i * 0.09).toFixed(2)}s`, fill: "freeze" }), 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}`)))] }), jsx("span", { style: { display: 'inline-flex', position: 'relative', zIndex: 1 }, children: children })] }));
581
+ });
582
+ NtdIconGeometric.displayName = 'NtdIconGeometric';
583
+
584
+ export { NtdIconCosmic, NtdIconFestive, NtdIconFloral, NtdIconFrost, NtdIconGeometric, NtdIconNeon, NtdIconOrganic, NtdIconPixel, NtdIconSketch, NtdIconSteampunk, NtdIconWatercolor };
585
+ //# sourceMappingURL=iconStyles.js.map