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