@nice2dev/icons 1.3.15 → 1.3.17

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 (153) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +1 -1
  3. package/dist/cjs/NiceDesktopIconExporter.js +688 -599
  4. package/dist/cjs/NiceFaviconGenerator.js +603 -417
  5. package/dist/cjs/NiceIconPicker.js +788 -508
  6. package/dist/cjs/NiceIconPreview.js +246 -188
  7. package/dist/cjs/NiceIconSetCreator.js +683 -552
  8. package/dist/cjs/NiceIconStacker.js +547 -171
  9. package/dist/cjs/NiceIconValue.js +27 -35
  10. package/dist/cjs/NtdIconBadge.js +384 -360
  11. package/dist/cjs/NtdIconMorph.js +419 -354
  12. package/dist/cjs/NtdStateMorph.js +150 -147
  13. package/dist/cjs/advancedIconSearch.js +373 -510
  14. package/dist/cjs/animationControls.js +518 -642
  15. package/dist/cjs/animationSpeed.js +69 -0
  16. package/dist/cjs/client.js +12 -15
  17. package/dist/cjs/createIcon.js +374 -252
  18. package/dist/cjs/design-tokens.js +324 -390
  19. package/dist/cjs/figmaExport.js +162 -257
  20. package/dist/cjs/figmaSync.js +234 -316
  21. package/dist/cjs/headless-ui.js +240 -368
  22. package/dist/cjs/iconAnalytics.js +337 -393
  23. package/dist/cjs/iconHtml.js +64 -86
  24. package/dist/cjs/iconMetadata.js +392 -472
  25. package/dist/cjs/iconParts.js +120 -90
  26. package/dist/cjs/iconStack.js +136 -155
  27. package/dist/cjs/iconStyles.js +1670 -509
  28. package/dist/cjs/iconValue.js +359 -430
  29. package/dist/cjs/icons/accessibility.js +1119 -134
  30. package/dist/cjs/icons/actions.js +1290 -330
  31. package/dist/cjs/icons/ai.js +1424 -144
  32. package/dist/cjs/icons/brand.js +613 -184
  33. package/dist/cjs/icons/business.js +938 -192
  34. package/dist/cjs/icons/devtech.js +1656 -227
  35. package/dist/cjs/icons/ecommerce.js +802 -111
  36. package/dist/cjs/icons/education.js +1345 -199
  37. package/dist/cjs/icons/files.js +1597 -328
  38. package/dist/cjs/icons/fintech.js +793 -104
  39. package/dist/cjs/icons/food.js +1028 -156
  40. package/dist/cjs/icons/fun.js +804 -109
  41. package/dist/cjs/icons/gaming.js +916 -170
  42. package/dist/cjs/icons/health.js +623 -112
  43. package/dist/cjs/icons/index.js +32 -42
  44. package/dist/cjs/icons/input.js +282 -83
  45. package/dist/cjs/icons/legal.js +1065 -122
  46. package/dist/cjs/icons/media.js +1061 -267
  47. package/dist/cjs/icons/navigation.js +407 -123
  48. package/dist/cjs/icons/omniverk.js +523 -93
  49. package/dist/cjs/icons/realestate.js +1520 -193
  50. package/dist/cjs/icons/saas.js +867 -98
  51. package/dist/cjs/icons/science.js +1344 -202
  52. package/dist/cjs/icons/shapes.js +1316 -308
  53. package/dist/cjs/icons/smarthome.js +786 -90
  54. package/dist/cjs/icons/social.js +591 -59
  55. package/dist/cjs/icons/sports.js +1133 -133
  56. package/dist/cjs/icons/sustainability.js +1211 -139
  57. package/dist/cjs/icons/travel.js +1470 -148
  58. package/dist/cjs/icons/ui.js +1508 -315
  59. package/dist/cjs/icons/weather.js +1160 -173
  60. package/dist/cjs/index.js +559 -568
  61. package/dist/cjs/lottieIntegration.js +261 -266
  62. package/dist/cjs/nicetodev-icons.css +1 -1
  63. package/dist/cjs/particleEffects.js +270 -251
  64. package/dist/cjs/resolver.js +229 -284
  65. package/dist/cjs/rsc.js +175 -193
  66. package/dist/cjs/sharpen.js +73 -130
  67. package/dist/cjs/smilAnimations.js +380 -165
  68. package/dist/cjs/stacking.js +87 -122
  69. package/dist/cjs/tailwind-plugin.js +280 -320
  70. package/dist/cjs/types.js +46 -72
  71. package/dist/cjs/utilities.js +163 -324
  72. package/dist/cjs/variantProps.js +12 -52
  73. package/dist/esm/NiceDesktopIconExporter.js +671 -598
  74. package/dist/esm/NiceFaviconGenerator.js +583 -416
  75. package/dist/esm/NiceIconPicker.js +789 -507
  76. package/dist/esm/NiceIconPreview.js +247 -187
  77. package/dist/esm/NiceIconSetCreator.js +685 -551
  78. package/dist/esm/NiceIconStacker.js +549 -170
  79. package/dist/esm/NiceIconValue.js +29 -34
  80. package/dist/esm/NtdIconBadge.js +388 -359
  81. package/dist/esm/NtdIconMorph.js +423 -353
  82. package/dist/esm/NtdStateMorph.js +152 -146
  83. package/dist/esm/advancedIconSearch.js +391 -509
  84. package/dist/esm/animationControls.js +527 -641
  85. package/dist/esm/animationSpeed.js +69 -0
  86. package/dist/esm/client.js +48 -10
  87. package/dist/esm/createIcon.js +375 -251
  88. package/dist/esm/design-tokens.js +334 -387
  89. package/dist/esm/figmaExport.js +170 -256
  90. package/dist/esm/figmaSync.js +237 -315
  91. package/dist/esm/headless-ui.js +254 -365
  92. package/dist/esm/iconAnalytics.js +342 -392
  93. package/dist/esm/iconHtml.js +67 -85
  94. package/dist/esm/iconMetadata.js +404 -471
  95. package/dist/esm/iconParts.js +125 -89
  96. package/dist/esm/iconStack.js +145 -154
  97. package/dist/esm/iconStyles.js +1681 -508
  98. package/dist/esm/iconValue.js +361 -429
  99. package/dist/esm/icons/accessibility.js +1133 -133
  100. package/dist/esm/icons/actions.js +1320 -329
  101. package/dist/esm/icons/ai.js +1441 -143
  102. package/dist/esm/icons/brand.js +616 -179
  103. package/dist/esm/icons/business.js +957 -191
  104. package/dist/esm/icons/devtech.js +1687 -226
  105. package/dist/esm/icons/ecommerce.js +816 -110
  106. package/dist/esm/icons/education.js +1364 -198
  107. package/dist/esm/icons/files.js +1628 -327
  108. package/dist/esm/icons/fintech.js +807 -103
  109. package/dist/esm/icons/food.js +1043 -153
  110. package/dist/esm/icons/fun.js +819 -108
  111. package/dist/esm/icons/gaming.js +933 -169
  112. package/dist/esm/icons/health.js +636 -111
  113. package/dist/esm/icons/index.js +589 -32
  114. package/dist/esm/icons/input.js +326 -82
  115. package/dist/esm/icons/legal.js +1079 -121
  116. package/dist/esm/icons/media.js +1086 -266
  117. package/dist/esm/icons/navigation.js +421 -122
  118. package/dist/esm/icons/omniverk.js +534 -91
  119. package/dist/esm/icons/realestate.js +1544 -198
  120. package/dist/esm/icons/saas.js +880 -97
  121. package/dist/esm/icons/science.js +1370 -208
  122. package/dist/esm/icons/shapes.js +1343 -307
  123. package/dist/esm/icons/smarthome.js +799 -89
  124. package/dist/esm/icons/social.js +599 -58
  125. package/dist/esm/icons/sports.js +1148 -132
  126. package/dist/esm/icons/sustainability.js +1226 -138
  127. package/dist/esm/icons/travel.js +1486 -147
  128. package/dist/esm/icons/ui.js +1540 -314
  129. package/dist/esm/icons/weather.js +1181 -172
  130. package/dist/esm/index.js +749 -58
  131. package/dist/esm/lottieIntegration.js +264 -265
  132. package/dist/esm/nicetodev-icons.css +1 -1
  133. package/dist/esm/particleEffects.js +271 -250
  134. package/dist/esm/resolver.js +231 -283
  135. package/dist/esm/rsc.js +182 -192
  136. package/dist/esm/sharpen.js +78 -129
  137. package/dist/esm/smilAnimations.js +385 -164
  138. package/dist/esm/stacking.js +99 -121
  139. package/dist/esm/tailwind-plugin.js +282 -319
  140. package/dist/esm/types.js +50 -71
  141. package/dist/esm/utilities.js +177 -321
  142. package/dist/esm/variantProps.js +23 -52
  143. package/dist/types/animationSpeed.d.ts +19 -0
  144. package/dist/types/createIcon.d.ts +6 -0
  145. package/dist/types/iconStyles.d.ts +6 -1
  146. package/dist/types/icons/brand.d.ts +0 -4
  147. package/dist/types/icons/food.d.ts +0 -3
  148. package/dist/types/icons/index.d.ts +3 -3
  149. package/dist/types/icons/omniverk.d.ts +0 -3
  150. package/dist/types/icons/science.d.ts +1 -1
  151. package/dist/types/smilAnimations.d.ts +4 -2
  152. package/dist/types/types.d.ts +7 -0
  153. package/package.json +15 -22
@@ -1,83 +1,227 @@
1
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { forwardRef, useId } from 'react';
3
-
4
- // ────────────────── Shared styles ──────────────────
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { forwardRef, useId } from "react";
3
+ import { retimeTree, durationScale } from "./animationSpeed.js";
5
4
  const wrapperBase = {
6
- position: 'relative',
7
- display: 'inline-flex',
8
- alignItems: 'center',
9
- justifyContent: 'center',
5
+ position: "relative",
6
+ display: "inline-flex",
7
+ alignItems: "center",
8
+ justifyContent: "center"
10
9
  };
11
10
  const overlayBase = {
12
- position: 'absolute',
13
- pointerEvents: 'none',
14
- overflow: 'visible',
11
+ position: "absolute",
12
+ pointerEvents: "none",
13
+ overflow: "visible"
15
14
  };
16
- // ══════════════════════════════════════════════════════
17
- // 1. NtdIconFloral 🌸
18
- // Botanical vines, leaves & flowers wrapping the icon
19
- // ══════════════════════════════════════════════════════
20
15
  const NtdIconFloral = /* @__PURE__ */ Object.assign(
21
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', vineColor = '#22c55e', petalColor = '#f472b6', leafColor, className, style, }, ref) => {
22
- const lc = leafColor !== null && leafColor !== void 0 ? leafColor : vineColor;
23
- const dur = `${duration}s`;
24
- const halfDur = `${duration * 0.5}s`;
25
- const bloomAt = `${duration * 0.55}s`;
26
- const flowerAt = `${duration * 0.75}s`;
27
- // Vine paths (viewBox 0 0 100 100, icon occupies ~20-80)
28
- const vine1 = 'M12,88 C6,72 4,52 10,38 C16,24 28,14 42,10';
29
- const vine2 = 'M88,12 C94,28 96,48 90,62 C84,76 72,86 58,90';
30
- const vine3 = 'M18,8 C32,4 52,2 68,8';
31
- const vine4 = 'M82,92 C68,96 48,98 32,92';
32
- const showExtra = intensity !== 'subtle';
33
- // Teardrop leaf
34
- 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';
35
- const baseLeaves = [
16
+ /* @__PURE__ */ forwardRef(
17
+ ({
18
+ children,
19
+ animate = true,
20
+ duration: durationProp,
21
+ animationSpeed,
22
+ intensity = "normal",
23
+ vineColor = "#22c55e",
24
+ petalColor = "#f472b6",
25
+ leafColor,
26
+ className,
27
+ style
28
+ }, ref) => {
29
+ const duration = durationProp ?? 2;
30
+ const lc = leafColor ?? vineColor;
31
+ const dur = `${duration}s`;
32
+ const halfDur = `${duration * 0.5}s`;
33
+ const bloomAt = `${duration * 0.55}s`;
34
+ const flowerAt = `${duration * 0.75}s`;
35
+ const vine1 = "M12,88 C6,72 4,52 10,38 C16,24 28,14 42,10";
36
+ const vine2 = "M88,12 C94,28 96,48 90,62 C84,76 72,86 58,90";
37
+ const vine3 = "M18,8 C32,4 52,2 68,8";
38
+ const vine4 = "M82,92 C68,96 48,98 32,92";
39
+ const showExtra = intensity !== "subtle";
40
+ 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";
41
+ const baseLeaves = [
36
42
  { x: 10, y: 38, a: -50 },
37
43
  { x: 28, y: 14, a: 30 },
38
44
  { x: 90, y: 62, a: 140 },
39
- { x: 72, y: 86, a: -150 },
40
- ];
41
- const denseLeaves = intensity === 'dense'
42
- ? [
43
- { x: 6, y: 60, a: -80 },
44
- { x: 94, y: 40, a: 100 },
45
- { x: 50, y: 4, a: 5 },
46
- { x: 50, y: 96, a: 175 },
47
- ]
48
- : [];
49
- const allLeaves = [...baseLeaves, ...denseLeaves];
50
- // 5-petal flower helper
51
- const petalOffsets = [
45
+ { x: 72, y: 86, a: -150 }
46
+ ];
47
+ const denseLeaves = intensity === "dense" ? [
48
+ { x: 6, y: 60, a: -80 },
49
+ { x: 94, y: 40, a: 100 },
50
+ { x: 50, y: 4, a: 5 },
51
+ { x: 50, y: 96, a: 175 }
52
+ ] : [];
53
+ const allLeaves = [...baseLeaves, ...denseLeaves];
54
+ const petalOffsets = [
52
55
  [0, -1],
53
56
  [0.95, -0.31],
54
57
  [0.59, 0.81],
55
58
  [-0.59, 0.81],
56
- [-0.95, -0.31],
57
- ];
58
- const flowerPositions = [
59
+ [-0.95, -0.31]
60
+ ];
61
+ const flowerPositions = [
59
62
  { x: 42, y: 10, r: 3.5 },
60
- ...(intensity !== 'subtle' ? [{ x: 58, y: 90, r: 3 }] : []),
61
- ...(intensity === 'dense'
62
- ? [
63
- { x: 8, y: 55, r: 2.5 },
64
- { x: 92, y: 45, r: 2.5 },
65
- ]
66
- : []),
67
- ];
68
- const dashLen = 250;
69
- 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 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 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` }))] })] }));
70
- }), { displayName: 'NtdIconFloral' });
71
- // ══════════════════════════════════════════════════════
72
- // 2. NtdIconFestive 🎉
73
- // Confetti burst, stars & sparkles
74
- // ══════════════════════════════════════════════════════
63
+ ...intensity !== "subtle" ? [{ x: 58, y: 90, r: 3 }] : [],
64
+ ...intensity === "dense" ? [
65
+ { x: 8, y: 55, r: 2.5 },
66
+ { x: 92, y: 45, r: 2.5 }
67
+ ] : []
68
+ ];
69
+ const dashLen = 250;
70
+ return retimeTree(
71
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
72
+ children,
73
+ /* @__PURE__ */ jsxs(
74
+ "svg",
75
+ {
76
+ viewBox: "0 0 100 100",
77
+ style: { ...overlayBase, inset: "-30%", width: "160%", height: "160%" },
78
+ "aria-hidden": true,
79
+ children: [
80
+ [vine1, vine2, ...showExtra ? [vine3, vine4] : []].map((d, i) => /* @__PURE__ */ jsx(
81
+ "path",
82
+ {
83
+ d,
84
+ fill: "none",
85
+ stroke: vineColor,
86
+ strokeWidth: i < 2 ? 1.5 : 1,
87
+ strokeLinecap: "round",
88
+ opacity: i < 2 ? 0.85 : 0.55,
89
+ ...animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {},
90
+ children: animate && /* @__PURE__ */ jsx(
91
+ "animate",
92
+ {
93
+ attributeName: "stroke-dashoffset",
94
+ from: `${dashLen}`,
95
+ to: "0",
96
+ dur,
97
+ fill: "freeze",
98
+ begin: i < 2 ? "0s" : `${duration * 0.3}s`
99
+ }
100
+ )
101
+ },
102
+ `v${i}`
103
+ )),
104
+ allLeaves.map((l, i) => /* @__PURE__ */ jsx("g", { transform: `translate(${l.x},${l.y}) rotate(${l.a})`, children: /* @__PURE__ */ jsxs("g", { opacity: animate ? 0 : 0.8, children: [
105
+ /* @__PURE__ */ jsx("path", { d: leafD, fill: lc }),
106
+ /* @__PURE__ */ jsx(
107
+ "line",
108
+ {
109
+ x1: 0,
110
+ y1: -3,
111
+ x2: 0,
112
+ y2: 2.5,
113
+ stroke: lc,
114
+ strokeWidth: "0.4",
115
+ opacity: 0.4
116
+ }
117
+ ),
118
+ animate && /* @__PURE__ */ jsxs(Fragment, { children: [
119
+ /* @__PURE__ */ jsx(
120
+ "animate",
121
+ {
122
+ attributeName: "opacity",
123
+ from: "0",
124
+ to: "0.8",
125
+ dur: halfDur,
126
+ begin: bloomAt,
127
+ fill: "freeze"
128
+ }
129
+ ),
130
+ /* @__PURE__ */ jsx(
131
+ "animateTransform",
132
+ {
133
+ attributeName: "transform",
134
+ type: "scale",
135
+ values: "0 0;1 1",
136
+ keyTimes: "0;1",
137
+ keySplines: "0.34 1 0.64 1",
138
+ calcMode: "spline",
139
+ dur: halfDur,
140
+ begin: bloomAt,
141
+ fill: "freeze"
142
+ }
143
+ )
144
+ ] })
145
+ ] }) }, `l${i}`)),
146
+ flowerPositions.map((f, fi) => /* @__PURE__ */ jsxs("g", { opacity: animate ? 0 : 1, children: [
147
+ petalOffsets.map(([ox, oy], pi) => /* @__PURE__ */ jsx(
148
+ "circle",
149
+ {
150
+ cx: f.x + ox * f.r,
151
+ cy: f.y + oy * f.r,
152
+ r: f.r * 0.5,
153
+ fill: petalColor,
154
+ opacity: 0.85
155
+ },
156
+ pi
157
+ )),
158
+ /* @__PURE__ */ jsx("circle", { cx: f.x, cy: f.y, r: f.r * 0.3, fill: "#fde047" }),
159
+ animate && /* @__PURE__ */ jsxs(Fragment, { children: [
160
+ /* @__PURE__ */ jsx(
161
+ "animate",
162
+ {
163
+ attributeName: "opacity",
164
+ from: "0",
165
+ to: "1",
166
+ dur: halfDur,
167
+ begin: flowerAt,
168
+ fill: "freeze"
169
+ }
170
+ ),
171
+ /* @__PURE__ */ jsx(
172
+ "animateTransform",
173
+ {
174
+ attributeName: "transform",
175
+ type: "scale",
176
+ values: "0.3 0.3;1 1",
177
+ keyTimes: "0;1",
178
+ keySplines: "0.34 1 0.64 1",
179
+ calcMode: "spline",
180
+ dur: halfDur,
181
+ begin: flowerAt,
182
+ fill: "freeze"
183
+ }
184
+ )
185
+ ] })
186
+ ] }, `f${fi}`)),
187
+ animate && /* @__PURE__ */ jsx(
188
+ "animateTransform",
189
+ {
190
+ attributeName: "transform",
191
+ type: "rotate",
192
+ values: "0 50 50;1 50 50;-1 50 50;0 50 50",
193
+ dur: "4s",
194
+ repeatCount: "indefinite",
195
+ begin: `${duration}s`
196
+ }
197
+ )
198
+ ]
199
+ }
200
+ )
201
+ ] }),
202
+ durationScale(durationProp !== void 0, animationSpeed)
203
+ );
204
+ }
205
+ ),
206
+ { displayName: "NtdIconFloral" }
207
+ );
75
208
  const NtdIconFestive = /* @__PURE__ */ Object.assign(
76
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', colors, sparkleColor = '#fbbf24', className, style, }, ref) => {
77
- const cols = colors !== null && colors !== void 0 ? colors : ['#ef4444', '#f59e0b', '#22c55e', '#3b82f6', '#a855f7', '#ec4899'];
78
- const dur = `${duration * 0.6}s`;
79
- // Confetti pieces: position relative to center, rotation, color index
80
- const baseConfetti = [
209
+ /* @__PURE__ */ forwardRef(
210
+ ({
211
+ children,
212
+ animate = true,
213
+ duration: durationProp,
214
+ animationSpeed,
215
+ intensity = "normal",
216
+ colors,
217
+ sparkleColor = "#fbbf24",
218
+ className,
219
+ style
220
+ }, ref) => {
221
+ const duration = durationProp ?? 1.5;
222
+ const cols = colors ?? ["#ef4444", "#f59e0b", "#22c55e", "#3b82f6", "#a855f7", "#ec4899"];
223
+ const dur = `${duration * 0.6}s`;
224
+ const baseConfetti = [
81
225
  { x: 15, y: 15, r: 45, ci: 0 },
82
226
  { x: 80, y: 10, r: -30, ci: 1 },
83
227
  { x: 90, y: 75, r: 60, ci: 2 },
@@ -85,177 +229,539 @@ const NtdIconFestive = /* @__PURE__ */ Object.assign(
85
229
  { x: 50, y: 5, r: 20, ci: 4 },
86
230
  { x: 50, y: 95, r: -15, ci: 5 },
87
231
  { x: 5, y: 50, r: 75, ci: 0 },
88
- { x: 95, y: 50, r: -60, ci: 1 },
89
- ];
90
- const denseConfetti = intensity === 'dense'
91
- ? [
92
- { x: 30, y: 5, r: 35, ci: 2 },
93
- { x: 70, y: 5, r: -25, ci: 3 },
94
- { x: 30, y: 95, r: 50, ci: 4 },
95
- { x: 70, y: 95, r: -40, ci: 5 },
96
- { x: 5, y: 30, r: 65, ci: 0 },
97
- { x: 95, y: 30, r: -55, ci: 1 },
98
- { x: 5, y: 70, r: 40, ci: 2 },
99
- { x: 95, y: 70, r: -35, ci: 3 },
100
- ]
101
- : [];
102
- const allConfetti = [
103
- ...(intensity === 'subtle' ? baseConfetti.slice(0, 4) : baseConfetti),
104
- ...denseConfetti,
105
- ];
106
- // 4-point star path
107
- 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';
108
- const stars = [
232
+ { x: 95, y: 50, r: -60, ci: 1 }
233
+ ];
234
+ const denseConfetti = intensity === "dense" ? [
235
+ { x: 30, y: 5, r: 35, ci: 2 },
236
+ { x: 70, y: 5, r: -25, ci: 3 },
237
+ { x: 30, y: 95, r: 50, ci: 4 },
238
+ { x: 70, y: 95, r: -40, ci: 5 },
239
+ { x: 5, y: 30, r: 65, ci: 0 },
240
+ { x: 95, y: 30, r: -55, ci: 1 },
241
+ { x: 5, y: 70, r: 40, ci: 2 },
242
+ { x: 95, y: 70, r: -35, ci: 3 }
243
+ ] : [];
244
+ const allConfetti = [
245
+ ...intensity === "subtle" ? baseConfetti.slice(0, 4) : baseConfetti,
246
+ ...denseConfetti
247
+ ];
248
+ 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";
249
+ const stars = [
109
250
  { x: 20, y: 8, s: 0.6 },
110
251
  { x: 85, y: 20, s: 0.5 },
111
- ...(intensity !== 'subtle'
112
- ? [
113
- { x: 15, y: 85, s: 0.5 },
114
- { x: 80, y: 88, s: 0.4 },
115
- ]
116
- : []),
117
- ...(intensity === 'dense'
118
- ? [
119
- { x: 50, y: 2, s: 0.7 },
120
- { x: 95, y: 55, s: 0.45 },
121
- ]
122
- : []),
123
- ];
124
- // Sparkle dots
125
- const sparkles = [
252
+ ...intensity !== "subtle" ? [
253
+ { x: 15, y: 85, s: 0.5 },
254
+ { x: 80, y: 88, s: 0.4 }
255
+ ] : [],
256
+ ...intensity === "dense" ? [
257
+ { x: 50, y: 2, s: 0.7 },
258
+ { x: 95, y: 55, s: 0.45 }
259
+ ] : []
260
+ ];
261
+ const sparkles = [
126
262
  { cx: 8, cy: 12, r: 1.5 },
127
263
  { cx: 92, cy: 88, r: 1.2 },
128
264
  { cx: 45, cy: 2, r: 1 },
129
265
  { cx: 55, cy: 98, r: 1 },
130
- ...(intensity !== 'subtle'
131
- ? [
132
- { cx: 3, cy: 55, r: 1.3 },
133
- { cx: 97, cy: 45, r: 1.1 },
134
- ]
135
- : []),
136
- ];
137
- 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) => {
138
- const delay = `${(i * 0.07).toFixed(2)}s`;
139
- const col = cols[c.ci % cols.length];
140
- 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 0.64 1", calcMode: "spline", dur: dur, begin: delay, fill: "freeze" })] }))] }) }, `c${i}`));
141
- }), 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}`)))] })] }));
142
- }), { displayName: 'NtdIconFestive' });
143
- // ══════════════════════════════════════════════════════
144
- // 3. NtdIconNeon 💡
145
- // Multi-layered glow with neon sign flicker
146
- // ══════════════════════════════════════════════════════
266
+ ...intensity !== "subtle" ? [
267
+ { cx: 3, cy: 55, r: 1.3 },
268
+ { cx: 97, cy: 45, r: 1.1 }
269
+ ] : []
270
+ ];
271
+ return retimeTree(
272
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
273
+ children,
274
+ /* @__PURE__ */ jsxs(
275
+ "svg",
276
+ {
277
+ viewBox: "0 0 100 100",
278
+ style: { ...overlayBase, inset: "-30%", width: "160%", height: "160%" },
279
+ "aria-hidden": true,
280
+ children: [
281
+ allConfetti.map((c, i) => {
282
+ const delay = `${(i * 0.07).toFixed(2)}s`;
283
+ const col = cols[c.ci % cols.length];
284
+ return /* @__PURE__ */ jsx("g", { transform: "translate(50,50)", children: /* @__PURE__ */ jsxs("g", { opacity: animate ? 0 : 0.85, children: [
285
+ /* @__PURE__ */ jsx(
286
+ "rect",
287
+ {
288
+ x: c.x - 50 - 1.5,
289
+ y: c.y - 50 - 3,
290
+ width: 3,
291
+ height: 6,
292
+ rx: 0.5,
293
+ fill: col,
294
+ transform: `rotate(${c.r} ${c.x - 50} ${c.y - 50})`
295
+ }
296
+ ),
297
+ animate && /* @__PURE__ */ jsxs(Fragment, { children: [
298
+ /* @__PURE__ */ jsx(
299
+ "animate",
300
+ {
301
+ attributeName: "opacity",
302
+ from: "0",
303
+ to: "0.85",
304
+ dur: "0.4s",
305
+ begin: delay,
306
+ fill: "freeze"
307
+ }
308
+ ),
309
+ /* @__PURE__ */ jsx(
310
+ "animateTransform",
311
+ {
312
+ attributeName: "transform",
313
+ type: "scale",
314
+ values: "0 0;1 1",
315
+ keyTimes: "0;1",
316
+ keySplines: "0.34 1 0.64 1",
317
+ calcMode: "spline",
318
+ dur,
319
+ begin: delay,
320
+ fill: "freeze"
321
+ }
322
+ )
323
+ ] })
324
+ ] }) }, `c${i}`);
325
+ }),
326
+ stars.map((s, i) => /* @__PURE__ */ jsxs("g", { transform: `translate(${s.x},${s.y}) scale(${s.s})`, children: [
327
+ /* @__PURE__ */ jsx("path", { d: starD, fill: sparkleColor, opacity: animate ? 0 : 0.9, children: animate && /* @__PURE__ */ jsx(
328
+ "animate",
329
+ {
330
+ attributeName: "opacity",
331
+ from: "0",
332
+ to: "0.9",
333
+ dur: "0.5s",
334
+ begin: `${(i * 0.15 + 0.3).toFixed(2)}s`,
335
+ fill: "freeze"
336
+ }
337
+ ) }),
338
+ animate && /* @__PURE__ */ jsx(
339
+ "animateTransform",
340
+ {
341
+ attributeName: "transform",
342
+ type: "scale",
343
+ values: `${s.s};${s.s * 1.3};${s.s}`,
344
+ dur: "1.5s",
345
+ repeatCount: "indefinite",
346
+ begin: `${duration + 0.5}s`
347
+ }
348
+ )
349
+ ] }, `s${i}`)),
350
+ sparkles.map((sp, i) => /* @__PURE__ */ jsx(
351
+ "circle",
352
+ {
353
+ cx: sp.cx,
354
+ cy: sp.cy,
355
+ r: sp.r,
356
+ fill: sparkleColor,
357
+ opacity: animate ? 0 : 0.7,
358
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
359
+ /* @__PURE__ */ jsx(
360
+ "animate",
361
+ {
362
+ attributeName: "opacity",
363
+ from: "0",
364
+ to: "0.7",
365
+ dur: "0.3s",
366
+ begin: `${(duration * 0.4 + i * 0.08).toFixed(2)}s`,
367
+ fill: "freeze"
368
+ }
369
+ ),
370
+ /* @__PURE__ */ jsx(
371
+ "animate",
372
+ {
373
+ attributeName: "opacity",
374
+ values: "0.3;0.9;0.3",
375
+ dur: `${1 + i * 0.3}s`,
376
+ repeatCount: "indefinite",
377
+ begin: `${duration}s`
378
+ }
379
+ )
380
+ ] })
381
+ },
382
+ `sp${i}`
383
+ ))
384
+ ]
385
+ }
386
+ )
387
+ ] }),
388
+ durationScale(durationProp !== void 0, animationSpeed)
389
+ );
390
+ }
391
+ ),
392
+ { displayName: "NtdIconFestive" }
393
+ );
147
394
  const NtdIconNeon = /* @__PURE__ */ Object.assign(
148
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 4, intensity = 'normal', glowColor = '#0ff', secondaryGlow, flicker = true, className, style, }, ref) => {
149
- const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
150
- const glow2 = secondaryGlow !== null && secondaryGlow !== void 0 ? secondaryGlow : glowColor;
151
- const blur = intensity === 'dense' ? 8 : intensity === 'subtle' ? 3 : 5;
152
- const spread = intensity === 'dense' ? 20 : intensity === 'subtle' ? 8 : 12;
153
- const filterValue = [
395
+ /* @__PURE__ */ forwardRef(
396
+ ({
397
+ children,
398
+ animate = true,
399
+ duration: durationProp,
400
+ animationSpeed,
401
+ intensity = "normal",
402
+ glowColor = "#0ff",
403
+ secondaryGlow,
404
+ flicker = true,
405
+ className,
406
+ style
407
+ }, ref) => {
408
+ const duration = durationProp ?? 4;
409
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, "_");
410
+ const glow2 = secondaryGlow ?? glowColor;
411
+ const blur = intensity === "dense" ? 8 : intensity === "subtle" ? 3 : 5;
412
+ const spread = intensity === "dense" ? 20 : intensity === "subtle" ? 8 : 12;
413
+ const filterValue = [
154
414
  `drop-shadow(0 0 ${blur * 0.3}px ${glowColor})`,
155
415
  `drop-shadow(0 0 ${blur}px ${glowColor})`,
156
416
  `drop-shadow(0 0 ${spread}px ${glow2}80)`,
157
- intensity === 'dense' ? `drop-shadow(0 0 ${spread * 1.5}px ${glow2}40)` : '',
158
- ]
159
- .filter(Boolean)
160
- .join(' ');
161
- const dimFilter = `drop-shadow(0 0 ${blur * 0.2}px ${glowColor})`;
162
- const animName = `ntd_neon_${uid}`;
163
- return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [animate && flicker && (jsx("style", { children: `
164
- @keyframes ${animName} {
165
- 0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% { opacity: 1; filter: ${filterValue}; }
166
- 20%, 24%, 55% { opacity: 0.5; filter: ${dimFilter}; }
167
- }
168
- ` })), jsx("span", { style: {
169
- display: 'inline-flex',
170
- filter: filterValue,
171
- ...(animate && flicker ? { animation: `${animName} ${duration}s infinite` } : {}),
172
- }, children: children })] }));
173
- }), { displayName: 'NtdIconNeon' });
174
- // ══════════════════════════════════════════════════════
175
- // 4. NtdIconSketch ✏️
176
- // Hand-drawn look with SVG turbulence + scribble overlay
177
- // ══════════════════════════════════════════════════════
417
+ intensity === "dense" ? `drop-shadow(0 0 ${spread * 1.5}px ${glow2}40)` : ""
418
+ ].filter(Boolean).join(" ");
419
+ const dimFilter = `drop-shadow(0 0 ${blur * 0.2}px ${glowColor})`;
420
+ const animName = `ntd_neon_${uid}`;
421
+ return retimeTree(
422
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
423
+ animate && flicker && /* @__PURE__ */ jsx("style", { children: `
424
+ @keyframes ${animName} {
425
+ 0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% { opacity: 1; filter: ${filterValue}; }
426
+ 20%, 24%, 55% { opacity: 0.5; filter: ${dimFilter}; }
427
+ }
428
+ ` }),
429
+ /* @__PURE__ */ jsx(
430
+ "span",
431
+ {
432
+ style: {
433
+ display: "inline-flex",
434
+ filter: filterValue,
435
+ ...animate && flicker ? { animation: `${animName} ${duration}s infinite` } : {}
436
+ },
437
+ children
438
+ }
439
+ )
440
+ ] }),
441
+ durationScale(durationProp !== void 0, animationSpeed)
442
+ );
443
+ }
444
+ ),
445
+ { displayName: "NtdIconNeon" }
446
+ );
178
447
  const NtdIconSketch = /* @__PURE__ */ Object.assign(
179
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 1.5, intensity = 'normal', strokeColor = '#374151', roughness = 2, className, style, }, ref) => {
180
- const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
181
- const filterId = `ntd_sketch_${uid}`;
182
- const dur = `${duration}s`;
183
- const dashLen = 100;
184
- // Scribble paths
185
- const scribbleMain = 'M18,82 C25,80 35,84 50,81 C65,78 75,82 82,80';
186
- const scribbleExtra = ['M20,16 C28,18 38,15 48,17', 'M55,85 C65,83 75,86 82,84'];
187
- // Cross-hatch mark positions
188
- const hatchCount = intensity === 'dense' ? 6 : intensity === 'subtle' ? 2 : 4;
189
- const hatchPositions = [
448
+ /* @__PURE__ */ forwardRef(
449
+ ({
450
+ children,
451
+ animate = true,
452
+ duration: durationProp,
453
+ animationSpeed,
454
+ intensity = "normal",
455
+ strokeColor = "#374151",
456
+ roughness = 2,
457
+ className,
458
+ style
459
+ }, ref) => {
460
+ const duration = durationProp ?? 1.5;
461
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, "_");
462
+ const filterId = `ntd_sketch_${uid}`;
463
+ const dur = `${duration}s`;
464
+ const dashLen = 100;
465
+ const scribbleMain = "M18,82 C25,80 35,84 50,81 C65,78 75,82 82,80";
466
+ const scribbleExtra = ["M20,16 C28,18 38,15 48,17", "M55,85 C65,83 75,86 82,84"];
467
+ const hatchCount = intensity === "dense" ? 6 : intensity === "subtle" ? 2 : 4;
468
+ const hatchPositions = [
190
469
  { x1: 8, y1: 8, x2: 14, y2: 14 },
191
470
  { x1: 86, y1: 8, x2: 92, y2: 14 },
192
471
  { x1: 8, y1: 86, x2: 14, y2: 92 },
193
472
  { x1: 86, y1: 86, x2: 92, y2: 92 },
194
473
  { x1: 10, y1: 12, x2: 16, y2: 10 },
195
- { x1: 84, y1: 12, x2: 90, y2: 10 },
196
- ];
197
- 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' &&
198
- scribbleExtra.slice(0, intensity === 'dense' ? 2 : 1).map((d, i) => (jsx("path", { d: d, fill: "none", stroke: strokeColor, strokeWidth: "0.8", strokeLinecap: "round", opacity: 0.35, ...(animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {}), 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}`)))] })] }));
199
- }), { displayName: 'NtdIconSketch' });
200
- // ══════════════════════════════════════════════════════
201
- // 5. NtdIconWatercolor 🎨
202
- // Soft paint blobs & bleed effect behind the icon
203
- // ══════════════════════════════════════════════════════
474
+ { x1: 84, y1: 12, x2: 90, y2: 10 }
475
+ ];
476
+ return retimeTree(
477
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
478
+ /* @__PURE__ */ jsx("svg", { style: { position: "absolute", width: 0, height: 0 }, "aria-hidden": true, children: /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("filter", { id: filterId, children: [
479
+ /* @__PURE__ */ jsx(
480
+ "feTurbulence",
481
+ {
482
+ type: "turbulence",
483
+ baseFrequency: 0.02 + roughness * 8e-3,
484
+ numOctaves: 3,
485
+ seed: 2,
486
+ result: "noise"
487
+ }
488
+ ),
489
+ /* @__PURE__ */ jsx(
490
+ "feDisplacementMap",
491
+ {
492
+ in: "SourceGraphic",
493
+ in2: "noise",
494
+ scale: roughness,
495
+ xChannelSelector: "R",
496
+ yChannelSelector: "G"
497
+ }
498
+ )
499
+ ] }) }) }),
500
+ /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", filter: `url(#${filterId})` }, children }),
501
+ /* @__PURE__ */ jsxs(
502
+ "svg",
503
+ {
504
+ viewBox: "0 0 100 100",
505
+ style: { ...overlayBase, inset: "-20%", width: "140%", height: "140%" },
506
+ "aria-hidden": true,
507
+ children: [
508
+ /* @__PURE__ */ jsx(
509
+ "path",
510
+ {
511
+ d: scribbleMain,
512
+ fill: "none",
513
+ stroke: strokeColor,
514
+ strokeWidth: "1",
515
+ strokeLinecap: "round",
516
+ opacity: 0.5,
517
+ ...animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {},
518
+ children: animate && /* @__PURE__ */ jsx(
519
+ "animate",
520
+ {
521
+ attributeName: "stroke-dashoffset",
522
+ from: `${dashLen}`,
523
+ to: "0",
524
+ dur,
525
+ fill: "freeze"
526
+ }
527
+ )
528
+ }
529
+ ),
530
+ intensity !== "subtle" && scribbleExtra.slice(0, intensity === "dense" ? 2 : 1).map((d, i) => /* @__PURE__ */ jsx(
531
+ "path",
532
+ {
533
+ d,
534
+ fill: "none",
535
+ stroke: strokeColor,
536
+ strokeWidth: "0.8",
537
+ strokeLinecap: "round",
538
+ opacity: 0.35,
539
+ ...animate ? { strokeDasharray: dashLen, strokeDashoffset: dashLen } : {},
540
+ children: animate && /* @__PURE__ */ jsx(
541
+ "animate",
542
+ {
543
+ attributeName: "stroke-dashoffset",
544
+ from: `${dashLen}`,
545
+ to: "0",
546
+ dur,
547
+ fill: "freeze",
548
+ begin: `${0.3 + i * 0.2}s`
549
+ }
550
+ )
551
+ },
552
+ `se${i}`
553
+ )),
554
+ hatchPositions.slice(0, hatchCount).map((p, i) => /* @__PURE__ */ jsx(
555
+ "line",
556
+ {
557
+ x1: p.x1,
558
+ y1: p.y1,
559
+ x2: p.x2,
560
+ y2: p.y2,
561
+ stroke: strokeColor,
562
+ strokeWidth: "0.6",
563
+ strokeLinecap: "round",
564
+ opacity: animate ? 0 : 0.3,
565
+ children: animate && /* @__PURE__ */ jsx(
566
+ "animate",
567
+ {
568
+ attributeName: "opacity",
569
+ from: "0",
570
+ to: "0.3",
571
+ dur: "0.3s",
572
+ begin: `${duration * 0.7 + i * 0.1}s`,
573
+ fill: "freeze"
574
+ }
575
+ )
576
+ },
577
+ `h${i}`
578
+ ))
579
+ ]
580
+ }
581
+ )
582
+ ] }),
583
+ durationScale(durationProp !== void 0, animationSpeed)
584
+ );
585
+ }
586
+ ),
587
+ { displayName: "NtdIconSketch" }
588
+ );
204
589
  const NtdIconWatercolor = /* @__PURE__ */ Object.assign(
205
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', tintColor = '#818cf8', bleedColor = '#f0abfc', className, style, }, ref) => {
206
- const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
207
- const filterId = `ntd_wc_${uid}`;
208
- const blobFilter = `${filterId}_blob`;
209
- // Paint splotches
210
- const splotches = [
590
+ /* @__PURE__ */ forwardRef(
591
+ ({
592
+ children,
593
+ animate = true,
594
+ duration: durationProp,
595
+ animationSpeed,
596
+ intensity = "normal",
597
+ tintColor = "#818cf8",
598
+ bleedColor = "#f0abfc",
599
+ className,
600
+ style
601
+ }, ref) => {
602
+ const duration = durationProp ?? 2;
603
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, "_");
604
+ const filterId = `ntd_wc_${uid}`;
605
+ const blobFilter = `${filterId}_blob`;
606
+ const splotches = [
211
607
  { cx: 30, cy: 35, r: 18, color: tintColor, op: 0.2 },
212
608
  { cx: 70, cy: 65, r: 15, color: bleedColor, op: 0.18 },
213
609
  { cx: 50, cy: 50, r: 22, color: tintColor, op: 0.12 },
214
- ...(intensity !== 'subtle'
215
- ? [
216
- { cx: 25, cy: 70, r: 12, color: bleedColor, op: 0.15 },
217
- { cx: 75, cy: 30, r: 10, color: tintColor, op: 0.15 },
218
- ]
219
- : []),
220
- ...(intensity === 'dense'
221
- ? [
222
- { cx: 15, cy: 50, r: 14, color: bleedColor, op: 0.12 },
223
- { cx: 85, cy: 50, r: 12, color: tintColor, op: 0.12 },
224
- { cx: 50, cy: 15, r: 10, color: bleedColor, op: 0.1 },
225
- { cx: 50, cy: 85, r: 11, color: tintColor, op: 0.1 },
226
- ]
227
- : []),
228
- ];
229
- // Splatter dots
230
- const splatters = [
610
+ ...intensity !== "subtle" ? [
611
+ { cx: 25, cy: 70, r: 12, color: bleedColor, op: 0.15 },
612
+ { cx: 75, cy: 30, r: 10, color: tintColor, op: 0.15 }
613
+ ] : [],
614
+ ...intensity === "dense" ? [
615
+ { cx: 15, cy: 50, r: 14, color: bleedColor, op: 0.12 },
616
+ { cx: 85, cy: 50, r: 12, color: tintColor, op: 0.12 },
617
+ { cx: 50, cy: 15, r: 10, color: bleedColor, op: 0.1 },
618
+ { cx: 50, cy: 85, r: 11, color: tintColor, op: 0.1 }
619
+ ] : []
620
+ ];
621
+ const splatters = [
231
622
  { cx: 12, cy: 20, r: 2 },
232
623
  { cx: 88, cy: 80, r: 1.5 },
233
624
  { cx: 20, cy: 85, r: 1.8 },
234
625
  { cx: 80, cy: 15, r: 1.3 },
235
- ...(intensity !== 'subtle'
236
- ? [
237
- { cx: 8, cy: 45, r: 1.2 },
238
- { cx: 92, cy: 55, r: 1 },
239
- ]
240
- : []),
241
- ];
242
- 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: {
243
- display: 'inline-flex',
244
- filter: `url(#${filterId})`,
245
- position: 'relative',
246
- zIndex: 1,
247
- }, children: children })] }));
248
- }), { displayName: 'NtdIconWatercolor' });
249
- // ══════════════════════════════════════════════════════
250
- // 6. NtdIconCosmic ✨
251
- // Stars, nebula glow & constellation lines
252
- // ══════════════════════════════════════════════════════
626
+ ...intensity !== "subtle" ? [
627
+ { cx: 8, cy: 45, r: 1.2 },
628
+ { cx: 92, cy: 55, r: 1 }
629
+ ] : []
630
+ ];
631
+ return retimeTree(
632
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
633
+ /* @__PURE__ */ jsx("svg", { style: { position: "absolute", width: 0, height: 0 }, "aria-hidden": true, children: /* @__PURE__ */ jsxs("defs", { children: [
634
+ /* @__PURE__ */ jsxs("filter", { id: filterId, x: "-20%", y: "-20%", width: "140%", height: "140%", children: [
635
+ /* @__PURE__ */ jsx(
636
+ "feTurbulence",
637
+ {
638
+ type: "fractalNoise",
639
+ baseFrequency: "0.04",
640
+ numOctaves: 4,
641
+ seed: 5,
642
+ result: "noise"
643
+ }
644
+ ),
645
+ /* @__PURE__ */ jsx(
646
+ "feDisplacementMap",
647
+ {
648
+ in: "SourceGraphic",
649
+ in2: "noise",
650
+ scale: 3,
651
+ xChannelSelector: "R",
652
+ yChannelSelector: "G",
653
+ result: "displaced"
654
+ }
655
+ ),
656
+ /* @__PURE__ */ jsx("feGaussianBlur", { in: "displaced", stdDeviation: "0.5" })
657
+ ] }),
658
+ /* @__PURE__ */ jsx("filter", { id: blobFilter, children: /* @__PURE__ */ jsx("feGaussianBlur", { stdDeviation: "3" }) })
659
+ ] }) }),
660
+ /* @__PURE__ */ jsxs(
661
+ "svg",
662
+ {
663
+ viewBox: "0 0 100 100",
664
+ style: { ...overlayBase, inset: "-25%", width: "150%", height: "150%", zIndex: 0 },
665
+ "aria-hidden": true,
666
+ children: [
667
+ splotches.map((s, i) => /* @__PURE__ */ jsx(
668
+ "circle",
669
+ {
670
+ cx: s.cx,
671
+ cy: s.cy,
672
+ r: animate ? 0 : s.r,
673
+ fill: s.color,
674
+ opacity: s.op,
675
+ filter: `url(#${blobFilter})`,
676
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
677
+ /* @__PURE__ */ jsx(
678
+ "animate",
679
+ {
680
+ attributeName: "r",
681
+ from: "0",
682
+ to: `${s.r}`,
683
+ dur: `${duration * 0.7}s`,
684
+ begin: `${(i * 0.15).toFixed(2)}s`,
685
+ fill: "freeze"
686
+ }
687
+ ),
688
+ /* @__PURE__ */ jsx(
689
+ "animate",
690
+ {
691
+ attributeName: "opacity",
692
+ values: `${s.op};${s.op * 1.3};${s.op}`,
693
+ dur: "3s",
694
+ begin: `${duration}s`,
695
+ repeatCount: "indefinite"
696
+ }
697
+ )
698
+ ] })
699
+ },
700
+ `sp${i}`
701
+ )),
702
+ splatters.map((d, i) => /* @__PURE__ */ jsx(
703
+ "circle",
704
+ {
705
+ cx: d.cx,
706
+ cy: d.cy,
707
+ r: d.r,
708
+ fill: i % 2 === 0 ? tintColor : bleedColor,
709
+ opacity: animate ? 0 : 0.3,
710
+ filter: `url(#${blobFilter})`,
711
+ children: animate && /* @__PURE__ */ jsx(
712
+ "animate",
713
+ {
714
+ attributeName: "opacity",
715
+ from: "0",
716
+ to: "0.3",
717
+ dur: "0.3s",
718
+ begin: `${(duration * 0.5 + i * 0.1).toFixed(2)}s`,
719
+ fill: "freeze"
720
+ }
721
+ )
722
+ },
723
+ `dot${i}`
724
+ ))
725
+ ]
726
+ }
727
+ ),
728
+ /* @__PURE__ */ jsx(
729
+ "span",
730
+ {
731
+ style: {
732
+ display: "inline-flex",
733
+ filter: `url(#${filterId})`,
734
+ position: "relative",
735
+ zIndex: 1
736
+ },
737
+ children
738
+ }
739
+ )
740
+ ] }),
741
+ durationScale(durationProp !== void 0, animationSpeed)
742
+ );
743
+ }
744
+ ),
745
+ { displayName: "NtdIconWatercolor" }
746
+ );
253
747
  const NtdIconCosmic = /* @__PURE__ */ Object.assign(
254
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', starColor = '#e2e8f0', nebulaColor = '#7c3aed', nebulaColor2 = '#2563eb', className, style, }, ref) => {
255
- const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
256
- const nebulaFilter = `ntd_cosm_${uid}`;
257
- // Stars
258
- const baseStars = [
748
+ /* @__PURE__ */ forwardRef(
749
+ ({
750
+ children,
751
+ animate = true,
752
+ duration: durationProp,
753
+ animationSpeed,
754
+ intensity = "normal",
755
+ starColor = "#e2e8f0",
756
+ nebulaColor = "#7c3aed",
757
+ nebulaColor2 = "#2563eb",
758
+ className,
759
+ style
760
+ }, ref) => {
761
+ const duration = durationProp ?? 2;
762
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, "_");
763
+ const nebulaFilter = `ntd_cosm_${uid}`;
764
+ const baseStars = [
259
765
  { cx: 8, cy: 15, r: 1.2 },
260
766
  { cx: 22, cy: 5, r: 0.9 },
261
767
  { cx: 45, cy: 8, r: 1 },
@@ -266,206 +772,590 @@ const NtdIconCosmic = /* @__PURE__ */ Object.assign(
266
772
  { cx: 12, cy: 82, r: 1.1 },
267
773
  { cx: 35, cy: 92, r: 0.8 },
268
774
  { cx: 72, cy: 88, r: 1 },
269
- { cx: 88, cy: 78, r: 0.7 },
270
- ];
271
- const denseStars = intensity === 'dense'
272
- ? [
273
- { cx: 55, cy: 3, r: 0.6 },
274
- { cx: 3, cy: 65, r: 0.8 },
275
- { cx: 97, cy: 35, r: 0.5 },
276
- { cx: 60, cy: 97, r: 0.7 },
277
- { cx: 15, cy: 35, r: 0.5 },
278
- { cx: 85, cy: 42, r: 0.6 },
279
- ]
280
- : [];
281
- const allStars = [
282
- ...(intensity === 'subtle' ? baseStars.slice(0, 6) : baseStars),
283
- ...denseStars,
284
- ];
285
- // Constellation lines connecting nearby stars
286
- const constellations = [
775
+ { cx: 88, cy: 78, r: 0.7 }
776
+ ];
777
+ const denseStars = intensity === "dense" ? [
778
+ { cx: 55, cy: 3, r: 0.6 },
779
+ { cx: 3, cy: 65, r: 0.8 },
780
+ { cx: 97, cy: 35, r: 0.5 },
781
+ { cx: 60, cy: 97, r: 0.7 },
782
+ { cx: 15, cy: 35, r: 0.5 },
783
+ { cx: 85, cy: 42, r: 0.6 }
784
+ ] : [];
785
+ const allStars = [
786
+ ...intensity === "subtle" ? baseStars.slice(0, 6) : baseStars,
787
+ ...denseStars
788
+ ];
789
+ const constellations = [
287
790
  { from: [8, 15], to: [22, 5] },
288
791
  { from: [22, 5], to: [45, 8] },
289
792
  { from: [78, 12], to: [92, 22] },
290
- ...(intensity !== 'subtle'
291
- ? [
292
- { from: [12, 82], to: [35, 92] },
293
- { from: [72, 88], to: [88, 78] },
294
- ]
295
- : []),
296
- ...(intensity === 'dense'
297
- ? [
298
- { from: [45, 8], to: [78, 12] },
299
- { from: [5, 42], to: [12, 82] },
300
- ]
301
- : []),
302
- ];
303
- // Nebula blobs
304
- const nebulae = [
793
+ ...intensity !== "subtle" ? [
794
+ { from: [12, 82], to: [35, 92] },
795
+ { from: [72, 88], to: [88, 78] }
796
+ ] : [],
797
+ ...intensity === "dense" ? [
798
+ { from: [45, 8], to: [78, 12] },
799
+ { from: [5, 42], to: [12, 82] }
800
+ ] : []
801
+ ];
802
+ const nebulae = [
305
803
  { cx: 25, cy: 25, r: 16, color: nebulaColor, op: 0.12 },
306
804
  { cx: 75, cy: 75, r: 18, color: nebulaColor2, op: 0.1 },
307
- ...(intensity !== 'subtle'
308
- ? [{ cx: 50, cy: 50, r: 14, color: nebulaColor, op: 0.08 }]
309
- : []),
310
- ...(intensity === 'dense'
311
- ? [
312
- { cx: 80, cy: 20, r: 12, color: nebulaColor2, op: 0.09 },
313
- { cx: 20, cy: 80, r: 13, color: nebulaColor, op: 0.09 },
314
- ]
315
- : []),
316
- ];
317
- const lineLen = 80;
318
- 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 ? { strokeDasharray: lineLen, strokeDashoffset: lineLen } : {}), 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" }))] })] }));
319
- }), { displayName: 'NtdIconCosmic' });
320
- // ══════════════════════════════════════════════════════
321
- // 7. NtdIconSteampunk ⚙️
322
- // Rotating gears, copper pipes, brass rivets & steam puffs
323
- // ══════════════════════════════════════════════════════
805
+ ...intensity !== "subtle" ? [{ cx: 50, cy: 50, r: 14, color: nebulaColor, op: 0.08 }] : [],
806
+ ...intensity === "dense" ? [
807
+ { cx: 80, cy: 20, r: 12, color: nebulaColor2, op: 0.09 },
808
+ { cx: 20, cy: 80, r: 13, color: nebulaColor, op: 0.09 }
809
+ ] : []
810
+ ];
811
+ const lineLen = 80;
812
+ return retimeTree(
813
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
814
+ /* @__PURE__ */ jsx("svg", { style: { position: "absolute", width: 0, height: 0 }, "aria-hidden": true, children: /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("filter", { id: nebulaFilter, children: /* @__PURE__ */ jsx("feGaussianBlur", { stdDeviation: "4" }) }) }) }),
815
+ /* @__PURE__ */ jsxs(
816
+ "svg",
817
+ {
818
+ viewBox: "0 0 100 100",
819
+ style: { ...overlayBase, inset: "-30%", width: "160%", height: "160%", zIndex: 0 },
820
+ "aria-hidden": true,
821
+ children: [
822
+ nebulae.map((n, i) => /* @__PURE__ */ jsx(
823
+ "circle",
824
+ {
825
+ cx: n.cx,
826
+ cy: n.cy,
827
+ r: n.r,
828
+ fill: n.color,
829
+ opacity: animate ? 0 : n.op,
830
+ filter: `url(#${nebulaFilter})`,
831
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
832
+ /* @__PURE__ */ jsx(
833
+ "animate",
834
+ {
835
+ attributeName: "opacity",
836
+ from: "0",
837
+ to: `${n.op}`,
838
+ dur: `${duration}s`,
839
+ fill: "freeze"
840
+ }
841
+ ),
842
+ /* @__PURE__ */ jsx(
843
+ "animate",
844
+ {
845
+ attributeName: "opacity",
846
+ values: `${n.op};${n.op * 1.5};${n.op}`,
847
+ dur: "5s",
848
+ repeatCount: "indefinite",
849
+ begin: `${duration}s`
850
+ }
851
+ ),
852
+ /* @__PURE__ */ jsx(
853
+ "animate",
854
+ {
855
+ attributeName: "r",
856
+ values: `${n.r};${n.r * 1.1};${n.r}`,
857
+ dur: "6s",
858
+ repeatCount: "indefinite",
859
+ begin: `${duration}s`
860
+ }
861
+ )
862
+ ] })
863
+ },
864
+ `nb${i}`
865
+ )),
866
+ constellations.map((c, i) => /* @__PURE__ */ jsx(
867
+ "line",
868
+ {
869
+ x1: c.from[0],
870
+ y1: c.from[1],
871
+ x2: c.to[0],
872
+ y2: c.to[1],
873
+ stroke: starColor,
874
+ strokeWidth: "0.3",
875
+ opacity: 0.25,
876
+ ...animate ? { strokeDasharray: lineLen, strokeDashoffset: lineLen } : {},
877
+ children: animate && /* @__PURE__ */ jsx(
878
+ "animate",
879
+ {
880
+ attributeName: "stroke-dashoffset",
881
+ from: `${lineLen}`,
882
+ to: "0",
883
+ dur: `${duration * 0.8}s`,
884
+ begin: `${(i * 0.2).toFixed(1)}s`,
885
+ fill: "freeze"
886
+ }
887
+ )
888
+ },
889
+ `cl${i}`
890
+ ))
891
+ ]
892
+ }
893
+ ),
894
+ /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", position: "relative", zIndex: 1 }, children }),
895
+ /* @__PURE__ */ jsxs(
896
+ "svg",
897
+ {
898
+ viewBox: "0 0 100 100",
899
+ style: { ...overlayBase, inset: "-30%", width: "160%", height: "160%", zIndex: 2 },
900
+ "aria-hidden": true,
901
+ children: [
902
+ allStars.map((s, i) => /* @__PURE__ */ jsx(
903
+ "circle",
904
+ {
905
+ cx: s.cx,
906
+ cy: s.cy,
907
+ r: s.r,
908
+ fill: starColor,
909
+ opacity: animate ? 0 : 0.8,
910
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
911
+ /* @__PURE__ */ jsx(
912
+ "animate",
913
+ {
914
+ attributeName: "opacity",
915
+ from: "0",
916
+ to: "0.8",
917
+ dur: `${duration * 0.5}s`,
918
+ begin: `${(i * 0.1).toFixed(2)}s`,
919
+ fill: "freeze"
920
+ }
921
+ ),
922
+ /* @__PURE__ */ jsx(
923
+ "animate",
924
+ {
925
+ attributeName: "opacity",
926
+ values: "0.4;1;0.4",
927
+ dur: `${1.5 + i % 4 * 0.4}s`,
928
+ repeatCount: "indefinite",
929
+ begin: `${duration}s`
930
+ }
931
+ ),
932
+ /* @__PURE__ */ jsx(
933
+ "animate",
934
+ {
935
+ attributeName: "r",
936
+ values: `${s.r};${s.r * 1.4};${s.r}`,
937
+ dur: `${2 + i % 3 * 0.5}s`,
938
+ repeatCount: "indefinite",
939
+ begin: `${duration}s`
940
+ }
941
+ )
942
+ ] })
943
+ },
944
+ `st${i}`
945
+ )),
946
+ animate && /* @__PURE__ */ jsx(
947
+ "animateTransform",
948
+ {
949
+ attributeName: "transform",
950
+ type: "rotate",
951
+ from: "0 50 50",
952
+ to: "360 50 50",
953
+ dur: "120s",
954
+ repeatCount: "indefinite"
955
+ }
956
+ )
957
+ ]
958
+ }
959
+ )
960
+ ] }),
961
+ durationScale(durationProp !== void 0, animationSpeed)
962
+ );
963
+ }
964
+ ),
965
+ { displayName: "NtdIconCosmic" }
966
+ );
324
967
  const NtdIconSteampunk = /* @__PURE__ */ Object.assign(
325
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', brassColor = '#b45309', pipeColor = '#78350f', steamColor = '#d1d5db', className, style, }, ref) => {
326
- // Build toothed gear path from a center point, radius and tooth count
327
- const makeGear = (cx, cy, r, teeth) => {
968
+ /* @__PURE__ */ forwardRef(
969
+ ({
970
+ children,
971
+ animate = true,
972
+ duration: durationProp,
973
+ animationSpeed,
974
+ intensity = "normal",
975
+ brassColor = "#b45309",
976
+ pipeColor = "#78350f",
977
+ steamColor = "#d1d5db",
978
+ className,
979
+ style
980
+ }, ref) => {
981
+ const duration = durationProp ?? 3;
982
+ const makeGear = (cx, cy, r, teeth) => {
328
983
  const inner = r * 0.68;
329
- const step = (Math.PI * 2) / teeth;
984
+ const step = Math.PI * 2 / teeth;
330
985
  const pt = (radius, angle) => `${(cx + radius * Math.cos(angle)).toFixed(2)},${(cy + radius * Math.sin(angle)).toFixed(2)}`;
331
- let d = '';
986
+ let d = "";
332
987
  for (let i = 0; i < teeth; i++) {
333
- const a0 = i * step;
334
- d +=
335
- `${i === 0 ? 'M' : 'L'}${pt(inner, a0)} ` +
336
- `L${pt(r, a0 + step * 0.3)} L${pt(r, a0 + step * 0.7)} ` +
337
- `L${pt(inner, a0 + step)} `;
988
+ const a0 = i * step;
989
+ d += `${i === 0 ? "M" : "L"}${pt(inner, a0)} L${pt(r, a0 + step * 0.3)} L${pt(r, a0 + step * 0.7)} L${pt(inner, a0 + step)} `;
338
990
  }
339
- return d + 'Z';
340
- };
341
- const gears = [
991
+ return d + "Z";
992
+ };
993
+ const gears = [
342
994
  { cx: 15, cy: 15, r: 11, teeth: 8, dir: 1, dm: 1 },
343
995
  { cx: 85, cy: 85, r: 9, teeth: 7, dir: -1, dm: 0.8 },
344
- ...(intensity !== 'subtle'
345
- ? [
346
- { cx: 85, cy: 15, r: 7, teeth: 6, dir: 1, dm: 1.1 },
347
- { cx: 15, cy: 85, r: 6, teeth: 5, dir: -1, dm: 0.9 },
348
- ]
349
- : []),
350
- ...(intensity === 'dense' ? [{ cx: 50, cy: 3, r: 5, teeth: 5, dir: 1, dm: 1.3 }] : []),
351
- ];
352
- const pipes = [
353
- { d: 'M27,15 H48', w: 3.5 },
354
- { d: 'M85,28 V48', w: 3.5 },
355
- ...(intensity !== 'subtle'
356
- ? [
357
- { d: 'M52,85 H73', w: 3.5 },
358
- { d: 'M15,52 V73', w: 3.5 },
359
- ]
360
- : []),
361
- ];
362
- const rivets = intensity === 'subtle'
363
- ? [
364
- { cx: 50, cy: 2 },
365
- { cx: 50, cy: 98 },
366
- ]
367
- : intensity === 'dense'
368
- ? [
369
- { cx: 50, cy: 2 },
370
- { cx: 50, cy: 98 },
371
- { cx: 2, cy: 50 },
372
- { cx: 98, cy: 50 },
373
- { cx: 25, cy: 2 },
374
- { cx: 75, cy: 2 },
375
- { cx: 25, cy: 98 },
376
- { cx: 75, cy: 98 },
377
- ]
378
- : [
379
- { cx: 50, cy: 2 },
380
- { cx: 50, cy: 98 },
381
- { cx: 2, cy: 50 },
382
- { cx: 98, cy: 50 },
383
- ];
384
- const steamPuffs = [
996
+ ...intensity !== "subtle" ? [
997
+ { cx: 85, cy: 15, r: 7, teeth: 6, dir: 1, dm: 1.1 },
998
+ { cx: 15, cy: 85, r: 6, teeth: 5, dir: -1, dm: 0.9 }
999
+ ] : [],
1000
+ ...intensity === "dense" ? [{ cx: 50, cy: 3, r: 5, teeth: 5, dir: 1, dm: 1.3 }] : []
1001
+ ];
1002
+ const pipes = [
1003
+ { d: "M27,15 H48", w: 3.5 },
1004
+ { d: "M85,28 V48", w: 3.5 },
1005
+ ...intensity !== "subtle" ? [
1006
+ { d: "M52,85 H73", w: 3.5 },
1007
+ { d: "M15,52 V73", w: 3.5 }
1008
+ ] : []
1009
+ ];
1010
+ const rivets = intensity === "subtle" ? [
1011
+ { cx: 50, cy: 2 },
1012
+ { cx: 50, cy: 98 }
1013
+ ] : intensity === "dense" ? [
1014
+ { cx: 50, cy: 2 },
1015
+ { cx: 50, cy: 98 },
1016
+ { cx: 2, cy: 50 },
1017
+ { cx: 98, cy: 50 },
1018
+ { cx: 25, cy: 2 },
1019
+ { cx: 75, cy: 2 },
1020
+ { cx: 25, cy: 98 },
1021
+ { cx: 75, cy: 98 }
1022
+ ] : [
1023
+ { cx: 50, cy: 2 },
1024
+ { cx: 50, cy: 98 },
1025
+ { cx: 2, cy: 50 },
1026
+ { cx: 98, cy: 50 }
1027
+ ];
1028
+ const steamPuffs = [
385
1029
  { cx: 50, cy: 3, r: 3 },
386
1030
  { cx: 55, cy: -4, r: 2.2 },
387
- { cx: 47, cy: -10, r: 1.6 },
388
- ];
389
- 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 &&
390
- 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}`)))] })] }));
391
- }), { displayName: 'NtdIconSteampunk' });
392
- // ══════════════════════════════════════════════════════
393
- // 8. NtdIconFrost ❄️
394
- // Hexagonal snowflake crystals, sparkles & frozen glow
395
- // ══════════════════════════════════════════════════════
1031
+ { cx: 47, cy: -10, r: 1.6 }
1032
+ ];
1033
+ return retimeTree(
1034
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
1035
+ /* @__PURE__ */ jsxs(
1036
+ "svg",
1037
+ {
1038
+ viewBox: "0 0 100 100",
1039
+ style: { ...overlayBase, inset: "-20%", width: "140%", height: "140%", zIndex: 0 },
1040
+ "aria-hidden": true,
1041
+ children: [
1042
+ pipes.map((p, i) => /* @__PURE__ */ jsx(
1043
+ "path",
1044
+ {
1045
+ d: p.d,
1046
+ stroke: pipeColor,
1047
+ strokeWidth: p.w,
1048
+ fill: "none",
1049
+ strokeLinecap: "round",
1050
+ opacity: 0.55
1051
+ },
1052
+ `pipe${i}`
1053
+ )),
1054
+ rivets.map((rv, i) => /* @__PURE__ */ jsx(
1055
+ "circle",
1056
+ {
1057
+ cx: rv.cx,
1058
+ cy: rv.cy,
1059
+ r: 1.5,
1060
+ fill: brassColor,
1061
+ opacity: 0.7
1062
+ },
1063
+ `rv${i}`
1064
+ ))
1065
+ ]
1066
+ }
1067
+ ),
1068
+ /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", position: "relative", zIndex: 1 }, children }),
1069
+ /* @__PURE__ */ jsxs(
1070
+ "svg",
1071
+ {
1072
+ viewBox: "0 0 100 100",
1073
+ style: { ...overlayBase, inset: "-20%", width: "140%", height: "140%", zIndex: 2 },
1074
+ "aria-hidden": true,
1075
+ children: [
1076
+ gears.map((g, i) => /* @__PURE__ */ jsxs("g", { children: [
1077
+ /* @__PURE__ */ jsx("path", { d: makeGear(g.cx, g.cy, g.r, g.teeth), fill: brassColor, opacity: 0.78, children: animate && /* @__PURE__ */ jsx(
1078
+ "animateTransform",
1079
+ {
1080
+ attributeName: "transform",
1081
+ type: "rotate",
1082
+ from: `0 ${g.cx} ${g.cy}`,
1083
+ to: `${g.dir * 360} ${g.cx} ${g.cy}`,
1084
+ dur: `${duration * g.dm}s`,
1085
+ repeatCount: "indefinite"
1086
+ }
1087
+ ) }),
1088
+ /* @__PURE__ */ jsx("circle", { cx: g.cx, cy: g.cy, r: g.r * 0.3, fill: pipeColor, opacity: 0.85 }),
1089
+ /* @__PURE__ */ jsx("circle", { cx: g.cx, cy: g.cy, r: g.r * 0.12, fill: brassColor, opacity: 0.6 })
1090
+ ] }, `gear${i}`)),
1091
+ animate && steamPuffs.map((sp, i) => /* @__PURE__ */ jsxs(
1092
+ "circle",
1093
+ {
1094
+ cx: sp.cx,
1095
+ cy: sp.cy,
1096
+ r: sp.r,
1097
+ fill: steamColor,
1098
+ opacity: 0,
1099
+ children: [
1100
+ /* @__PURE__ */ jsx(
1101
+ "animate",
1102
+ {
1103
+ attributeName: "opacity",
1104
+ values: "0;0.45;0",
1105
+ dur: "2.4s",
1106
+ begin: `${i * 0.7}s`,
1107
+ repeatCount: "indefinite"
1108
+ }
1109
+ ),
1110
+ /* @__PURE__ */ jsx(
1111
+ "animate",
1112
+ {
1113
+ attributeName: "cy",
1114
+ values: `${sp.cy};${sp.cy - 12}`,
1115
+ dur: "2.4s",
1116
+ begin: `${i * 0.7}s`,
1117
+ repeatCount: "indefinite"
1118
+ }
1119
+ ),
1120
+ /* @__PURE__ */ jsx(
1121
+ "animate",
1122
+ {
1123
+ attributeName: "r",
1124
+ values: `${sp.r};${sp.r * 2.2}`,
1125
+ dur: "2.4s",
1126
+ begin: `${i * 0.7}s`,
1127
+ repeatCount: "indefinite"
1128
+ }
1129
+ )
1130
+ ]
1131
+ },
1132
+ `stm${i}`
1133
+ ))
1134
+ ]
1135
+ }
1136
+ )
1137
+ ] }),
1138
+ durationScale(durationProp !== void 0, animationSpeed)
1139
+ );
1140
+ }
1141
+ ),
1142
+ { displayName: "NtdIconSteampunk" }
1143
+ );
396
1144
  const NtdIconFrost = /* @__PURE__ */ Object.assign(
397
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 2, intensity = 'normal', crystalColor = '#bae6fd', glowColor = '#38bdf8', className, style, }, ref) => {
398
- const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
399
- const glowFilterId = `ntd_frost_${uid}`;
400
- const crystalDefs = [
1145
+ /* @__PURE__ */ forwardRef(
1146
+ ({
1147
+ children,
1148
+ animate = true,
1149
+ duration: durationProp,
1150
+ animationSpeed,
1151
+ intensity = "normal",
1152
+ crystalColor = "#bae6fd",
1153
+ glowColor = "#38bdf8",
1154
+ className,
1155
+ style
1156
+ }, ref) => {
1157
+ const duration = durationProp ?? 2;
1158
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, "_");
1159
+ const glowFilterId = `ntd_frost_${uid}`;
1160
+ const crystalDefs = [
401
1161
  { cx: 8, cy: 8, len: 7, pi: 0 },
402
1162
  { cx: 92, cy: 8, len: 6, pi: 1 },
403
1163
  { cx: 8, cy: 92, len: 6, pi: 2 },
404
1164
  { cx: 92, cy: 92, len: 7, pi: 3 },
405
- ...(intensity !== 'subtle'
406
- ? [
407
- { cx: 50, cy: 2, len: 5, pi: 4 },
408
- { cx: 50, cy: 98, len: 5, pi: 5 },
409
- { cx: 2, cy: 50, len: 5, pi: 6 },
410
- { cx: 98, cy: 50, len: 5, pi: 7 },
411
- ]
412
- : []),
413
- ...(intensity === 'dense'
414
- ? [
415
- { cx: 28, cy: 4, len: 4, pi: 8 },
416
- { cx: 72, cy: 4, len: 4, pi: 9 },
417
- ]
418
- : []),
419
- ];
420
- // Each snowflake = 6 arms radiating from center
421
- const allArms = crystalDefs.flatMap(({ cx, cy, len, pi }) => Array.from({ length: 6 }, (_, ai) => {
422
- const angle = (ai * 60 * Math.PI) / 180;
423
- return {
1165
+ ...intensity !== "subtle" ? [
1166
+ { cx: 50, cy: 2, len: 5, pi: 4 },
1167
+ { cx: 50, cy: 98, len: 5, pi: 5 },
1168
+ { cx: 2, cy: 50, len: 5, pi: 6 },
1169
+ { cx: 98, cy: 50, len: 5, pi: 7 }
1170
+ ] : [],
1171
+ ...intensity === "dense" ? [
1172
+ { cx: 28, cy: 4, len: 4, pi: 8 },
1173
+ { cx: 72, cy: 4, len: 4, pi: 9 }
1174
+ ] : []
1175
+ ];
1176
+ const allArms = crystalDefs.flatMap(
1177
+ ({ cx, cy, len, pi }) => Array.from({ length: 6 }, (_, ai) => {
1178
+ const angle = ai * 60 * Math.PI / 180;
1179
+ return {
424
1180
  x1: cx,
425
1181
  y1: cy,
426
1182
  x2: cx + len * Math.cos(angle),
427
1183
  y2: cy + len * Math.sin(angle),
428
- delay: pi * 0.12 + ai * 0.02,
429
- };
430
- }));
431
- // Small perpendicular tick marks at midpoint of each arm
432
- const allTicks = crystalDefs.flatMap(({ cx, cy, len }, ci) => Array.from({ length: 6 }, (_, ai) => {
433
- const angle = (ai * 60 * Math.PI) / 180;
434
- const mx = cx + len * 0.55 * Math.cos(angle);
435
- const my = cy + len * 0.55 * Math.sin(angle);
436
- const p = angle + Math.PI / 2;
437
- const tl = len * 0.22;
438
- return {
1184
+ delay: pi * 0.12 + ai * 0.02
1185
+ };
1186
+ })
1187
+ );
1188
+ const allTicks = crystalDefs.flatMap(
1189
+ ({ cx, cy, len }, ci) => Array.from({ length: 6 }, (_, ai) => {
1190
+ const angle = ai * 60 * Math.PI / 180;
1191
+ const mx = cx + len * 0.55 * Math.cos(angle);
1192
+ const my = cy + len * 0.55 * Math.sin(angle);
1193
+ const p = angle + Math.PI / 2;
1194
+ const tl = len * 0.22;
1195
+ return {
439
1196
  x1: mx - tl * Math.cos(p),
440
1197
  y1: my - tl * Math.sin(p),
441
1198
  x2: mx + tl * Math.cos(p),
442
1199
  y2: my + tl * Math.sin(p),
443
- delay: ci * 0.12 + duration * 0.5,
444
- };
445
- }));
446
- const sparkles = [
1200
+ delay: ci * 0.12 + duration * 0.5
1201
+ };
1202
+ })
1203
+ );
1204
+ const sparkles = [
447
1205
  { cx: 14, cy: 4, r: 1.1 },
448
1206
  { cx: 86, cy: 4, r: 0.9 },
449
1207
  { cx: 4, cy: 14, r: 0.8 },
450
- { cx: 96, cy: 14, r: 1.0 },
1208
+ { cx: 96, cy: 14, r: 1 },
451
1209
  { cx: 4, cy: 86, r: 0.9 },
452
1210
  { cx: 96, cy: 86, r: 0.8 },
453
- { cx: 14, cy: 96, r: 1.0 },
454
- { cx: 86, cy: 96, r: 1.1 },
455
- ];
456
- 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 })] }));
457
- }), { displayName: 'NtdIconFrost' });
458
- // ══════════════════════════════════════════════════════
459
- // 9. NtdIconPixel 👾
460
- // Retro pixel corners, scanline scroll & glitch animation
461
- // ══════════════════════════════════════════════════════
1211
+ { cx: 14, cy: 96, r: 1 },
1212
+ { cx: 86, cy: 96, r: 1.1 }
1213
+ ];
1214
+ return retimeTree(
1215
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
1216
+ /* @__PURE__ */ jsx("svg", { style: { position: "absolute", width: 0, height: 0 }, "aria-hidden": true, children: /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("filter", { id: glowFilterId, children: /* @__PURE__ */ jsx("feGaussianBlur", { stdDeviation: "6" }) }) }) }),
1217
+ /* @__PURE__ */ jsxs(
1218
+ "svg",
1219
+ {
1220
+ viewBox: "0 0 100 100",
1221
+ style: { ...overlayBase, inset: "-25%", width: "150%", height: "150%", zIndex: 0 },
1222
+ "aria-hidden": true,
1223
+ children: [
1224
+ /* @__PURE__ */ jsx(
1225
+ "circle",
1226
+ {
1227
+ cx: "50",
1228
+ cy: "50",
1229
+ r: "30",
1230
+ fill: glowColor,
1231
+ opacity: 0.07,
1232
+ filter: `url(#${glowFilterId})`,
1233
+ children: animate && /* @__PURE__ */ jsx(
1234
+ "animate",
1235
+ {
1236
+ attributeName: "opacity",
1237
+ values: "0.04;0.11;0.04",
1238
+ dur: "4s",
1239
+ repeatCount: "indefinite"
1240
+ }
1241
+ )
1242
+ }
1243
+ ),
1244
+ allArms.map((arm, i) => /* @__PURE__ */ jsx(
1245
+ "line",
1246
+ {
1247
+ x1: arm.x1,
1248
+ y1: arm.y1,
1249
+ x2: arm.x2,
1250
+ y2: arm.y2,
1251
+ stroke: crystalColor,
1252
+ strokeWidth: "0.9",
1253
+ strokeLinecap: "round",
1254
+ opacity: animate ? 0 : 0.7,
1255
+ children: animate && /* @__PURE__ */ jsx(
1256
+ "animate",
1257
+ {
1258
+ attributeName: "opacity",
1259
+ from: "0",
1260
+ to: "0.7",
1261
+ dur: `${duration * 0.4}s`,
1262
+ begin: `${arm.delay.toFixed(2)}s`,
1263
+ fill: "freeze"
1264
+ }
1265
+ )
1266
+ },
1267
+ `arm${i}`
1268
+ )),
1269
+ allTicks.map((tick, i) => /* @__PURE__ */ jsx(
1270
+ "line",
1271
+ {
1272
+ x1: tick.x1,
1273
+ y1: tick.y1,
1274
+ x2: tick.x2,
1275
+ y2: tick.y2,
1276
+ stroke: crystalColor,
1277
+ strokeWidth: "0.6",
1278
+ strokeLinecap: "round",
1279
+ opacity: animate ? 0 : 0.45,
1280
+ children: animate && /* @__PURE__ */ jsx(
1281
+ "animate",
1282
+ {
1283
+ attributeName: "opacity",
1284
+ from: "0",
1285
+ to: "0.45",
1286
+ dur: `${duration * 0.3}s`,
1287
+ begin: `${tick.delay.toFixed(2)}s`,
1288
+ fill: "freeze"
1289
+ }
1290
+ )
1291
+ },
1292
+ `tick${i}`
1293
+ )),
1294
+ sparkles.slice(0, intensity === "subtle" ? 4 : 8).map((sp, i) => /* @__PURE__ */ jsx(
1295
+ "circle",
1296
+ {
1297
+ cx: sp.cx,
1298
+ cy: sp.cy,
1299
+ r: sp.r,
1300
+ fill: glowColor,
1301
+ opacity: animate ? 0 : 0.8,
1302
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
1303
+ /* @__PURE__ */ jsx(
1304
+ "animate",
1305
+ {
1306
+ attributeName: "opacity",
1307
+ from: "0",
1308
+ to: "0.8",
1309
+ dur: "0.35s",
1310
+ begin: `${(duration * 0.65 + i * 0.08).toFixed(2)}s`,
1311
+ fill: "freeze"
1312
+ }
1313
+ ),
1314
+ /* @__PURE__ */ jsx(
1315
+ "animate",
1316
+ {
1317
+ attributeName: "opacity",
1318
+ values: "0.3;1;0.3",
1319
+ dur: `${1 + i * 0.2}s`,
1320
+ repeatCount: "indefinite",
1321
+ begin: `${duration}s`
1322
+ }
1323
+ )
1324
+ ] })
1325
+ },
1326
+ `fsp${i}`
1327
+ ))
1328
+ ]
1329
+ }
1330
+ ),
1331
+ /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", position: "relative", zIndex: 1 }, children })
1332
+ ] }),
1333
+ durationScale(durationProp !== void 0, animationSpeed)
1334
+ );
1335
+ }
1336
+ ),
1337
+ { displayName: "NtdIconFrost" }
1338
+ );
462
1339
  const NtdIconPixel = /* @__PURE__ */ Object.assign(
463
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 0.5, intensity = 'normal', pixelColor = '#22d3ee', scanlineColor = '#000000', glitchEffect = true, className, style, }, ref) => {
464
- const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
465
- const scanAnimName = `ntd_pixel_scan_${uid}`;
466
- const glitchAnimName = `ntd_pixel_glitch_${uid}`;
467
- const SZ = 4; // pixel block size (SVG units out of 100)
468
- const basePixels = [
1340
+ /* @__PURE__ */ forwardRef(
1341
+ ({
1342
+ children,
1343
+ animate = true,
1344
+ duration: durationProp,
1345
+ animationSpeed,
1346
+ intensity = "normal",
1347
+ pixelColor = "#22d3ee",
1348
+ scanlineColor = "#000000",
1349
+ glitchEffect = true,
1350
+ className,
1351
+ style
1352
+ }, ref) => {
1353
+ const duration = durationProp ?? 0.5;
1354
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, "_");
1355
+ const scanAnimName = `ntd_pixel_scan_${uid}`;
1356
+ const glitchAnimName = `ntd_pixel_glitch_${uid}`;
1357
+ const SZ = 4;
1358
+ const basePixels = [
469
1359
  // top-left bracket
470
1360
  { x: 0, y: 0 },
471
1361
  { x: SZ, y: 0 },
@@ -489,146 +1379,429 @@ const NtdIconPixel = /* @__PURE__ */ Object.assign(
489
1379
  { x: 100 - SZ * 2, y: 100 - SZ },
490
1380
  { x: 100 - SZ, y: 100 - SZ },
491
1381
  { x: 100 - SZ, y: 100 - SZ * 2 },
492
- { x: 100 - SZ, y: 100 - SZ * 3 },
493
- ];
494
- const extraPixels = intensity === 'dense'
495
- ? [
496
- { x: 48, y: 0 },
497
- { x: 0, y: 48 },
498
- { x: 96, y: 48 },
499
- { x: 48, y: 96 },
500
- ]
501
- : [];
502
- const allPixels = intensity === 'subtle'
503
- ? basePixels.filter((_, i) => i % 2 === 0)
504
- : [...basePixels, ...extraPixels];
505
- return (jsxs("span", { ref: ref, className: className, style: { ...wrapperBase, ...style }, children: [animate && (jsx("style", { children: `
506
- @keyframes ${scanAnimName} {
507
- from { transform: translateY(-100%); }
508
- to { transform: translateY(200%); }
509
- }
510
- @keyframes ${glitchAnimName} {
511
- 0%, 90%, 100% { transform: translate(0); filter: none; }
512
- 92% { transform: translate(-3px, 1px); filter: hue-rotate(90deg); }
513
- 94% { transform: translate(3px, -1px); clip-path: inset(25% 0 25% 0); }
514
- 96% { transform: translate(-1px, 2px); clip-path: none; }
515
- }
516
- ` })), 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: {
517
- display: 'inline-flex',
518
- position: 'relative',
519
- zIndex: 1,
520
- ...(animate && glitchEffect ? { animation: `${glitchAnimName} 4s infinite` } : {}),
521
- }, children: children }), animate && (jsx("span", { style: {
522
- position: 'absolute',
523
- inset: 0,
524
- overflow: 'hidden',
525
- pointerEvents: 'none',
526
- zIndex: 3,
527
- background: `repeating-linear-gradient(0deg, transparent, transparent 3px, ${scanlineColor}1a 3px, ${scanlineColor}1a 4px)`,
528
- }, children: jsx("span", { style: {
529
- display: 'block',
530
- width: '100%',
531
- height: '30%',
532
- background: `linear-gradient(transparent, ${pixelColor}20, transparent)`,
533
- animation: `${scanAnimName} ${duration + 2}s linear infinite`,
534
- } }) }))] }));
535
- }), { displayName: 'NtdIconPixel' });
536
- // ══════════════════════════════════════════════════════
537
- // 10. NtdIconOrganic 🦠
538
- // Pulsing cell blobs, membrane rings & floating bubbles
539
- // ══════════════════════════════════════════════════════
1382
+ { x: 100 - SZ, y: 100 - SZ * 3 }
1383
+ ];
1384
+ const extraPixels = intensity === "dense" ? [
1385
+ { x: 48, y: 0 },
1386
+ { x: 0, y: 48 },
1387
+ { x: 96, y: 48 },
1388
+ { x: 48, y: 96 }
1389
+ ] : [];
1390
+ const allPixels = intensity === "subtle" ? basePixels.filter((_, i) => i % 2 === 0) : [...basePixels, ...extraPixels];
1391
+ return retimeTree(
1392
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
1393
+ animate && /* @__PURE__ */ jsx("style", { children: `
1394
+ @keyframes ${scanAnimName} {
1395
+ from { transform: translateY(-100%); }
1396
+ to { transform: translateY(200%); }
1397
+ }
1398
+ @keyframes ${glitchAnimName} {
1399
+ 0%, 90%, 100% { transform: translate(0); filter: none; }
1400
+ 92% { transform: translate(-3px, 1px); filter: hue-rotate(90deg); }
1401
+ 94% { transform: translate(3px, -1px); clip-path: inset(25% 0 25% 0); }
1402
+ 96% { transform: translate(-1px, 2px); clip-path: none; }
1403
+ }
1404
+ ` }),
1405
+ /* @__PURE__ */ jsx(
1406
+ "svg",
1407
+ {
1408
+ viewBox: "0 0 100 100",
1409
+ style: { ...overlayBase, inset: "-5%", width: "110%", height: "110%", zIndex: 2 },
1410
+ "aria-hidden": true,
1411
+ children: allPixels.map((p, i) => /* @__PURE__ */ jsx(
1412
+ "rect",
1413
+ {
1414
+ x: p.x,
1415
+ y: p.y,
1416
+ width: SZ - 0.5,
1417
+ height: SZ - 0.5,
1418
+ fill: pixelColor,
1419
+ opacity: 0.75,
1420
+ children: animate && /* @__PURE__ */ jsx(
1421
+ "animate",
1422
+ {
1423
+ attributeName: "opacity",
1424
+ values: "0.3;1;0.3",
1425
+ dur: `${0.7 + i % 5 * 0.17}s`,
1426
+ repeatCount: "indefinite",
1427
+ begin: `${(i * 0.06 % 1).toFixed(2)}s`
1428
+ }
1429
+ )
1430
+ },
1431
+ `px${i}`
1432
+ ))
1433
+ }
1434
+ ),
1435
+ /* @__PURE__ */ jsx(
1436
+ "span",
1437
+ {
1438
+ style: {
1439
+ display: "inline-flex",
1440
+ position: "relative",
1441
+ zIndex: 1,
1442
+ ...animate && glitchEffect ? { animation: `${glitchAnimName} 4s infinite` } : {}
1443
+ },
1444
+ children
1445
+ }
1446
+ ),
1447
+ animate && /* @__PURE__ */ jsx(
1448
+ "span",
1449
+ {
1450
+ style: {
1451
+ position: "absolute",
1452
+ inset: 0,
1453
+ overflow: "hidden",
1454
+ pointerEvents: "none",
1455
+ zIndex: 3,
1456
+ background: `repeating-linear-gradient(0deg, transparent, transparent 3px, ${scanlineColor}1a 3px, ${scanlineColor}1a 4px)`
1457
+ },
1458
+ children: /* @__PURE__ */ jsx(
1459
+ "span",
1460
+ {
1461
+ style: {
1462
+ display: "block",
1463
+ width: "100%",
1464
+ height: "30%",
1465
+ background: `linear-gradient(transparent, ${pixelColor}20, transparent)`,
1466
+ animation: `${scanAnimName} ${duration + 2}s linear infinite`
1467
+ }
1468
+ }
1469
+ )
1470
+ }
1471
+ )
1472
+ ] }),
1473
+ durationScale(durationProp !== void 0, animationSpeed)
1474
+ );
1475
+ }
1476
+ ),
1477
+ { displayName: "NtdIconPixel" }
1478
+ );
540
1479
  const NtdIconOrganic = /* @__PURE__ */ Object.assign(
541
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 3, intensity = 'normal', cellColor = '#86efac', membraneColor = '#4ade80', nucleusColor = '#fbbf24', className, style, }, ref) => {
542
- const uid = useId().replace(/[^a-zA-Z0-9]/g, '_');
543
- const blobFilterId = `ntd_org_${uid}`;
544
- const cells = [
545
- { cx: 8, cy: 8, r: 9, color: cellColor, op: 0.18, pd: '4.2s' },
546
- { cx: 92, cy: 8, r: 8, color: membraneColor, op: 0.15, pd: '3.8s' },
547
- { cx: 8, cy: 92, r: 8, color: membraneColor, op: 0.16, pd: '4.5s' },
548
- { cx: 92, cy: 92, r: 9, color: cellColor, op: 0.18, pd: '3.5s' },
549
- ...(intensity !== 'subtle'
550
- ? [
551
- { cx: 50, cy: 2, r: 6, color: cellColor, op: 0.12, pd: '5.1s' },
552
- { cx: 50, cy: 98, r: 6, color: membraneColor, op: 0.12, pd: '4.8s' },
553
- { cx: 2, cy: 50, r: 6, color: cellColor, op: 0.12, pd: '4.3s' },
554
- { cx: 98, cy: 50, r: 6, color: membraneColor, op: 0.12, pd: '5.2s' },
555
- ]
556
- : []),
557
- ...(intensity === 'dense'
558
- ? [
559
- { cx: 25, cy: 5, r: 5, color: nucleusColor, op: 0.09, pd: '3.9s' },
560
- { cx: 75, cy: 5, r: 5, color: cellColor, op: 0.09, pd: '4.4s' },
561
- { cx: 5, cy: 25, r: 5, color: membraneColor, op: 0.09, pd: '4.6s' },
562
- { cx: 5, cy: 75, r: 5, color: cellColor, op: 0.09, pd: '3.7s' },
563
- ]
564
- : []),
565
- ];
566
- const bubbles = [
1480
+ /* @__PURE__ */ forwardRef(
1481
+ ({
1482
+ children,
1483
+ animate = true,
1484
+ duration: durationProp,
1485
+ animationSpeed,
1486
+ intensity = "normal",
1487
+ cellColor = "#86efac",
1488
+ membraneColor = "#4ade80",
1489
+ nucleusColor = "#fbbf24",
1490
+ className,
1491
+ style
1492
+ }, ref) => {
1493
+ const duration = durationProp ?? 3;
1494
+ const uid = useId().replace(/[^a-zA-Z0-9]/g, "_");
1495
+ const blobFilterId = `ntd_org_${uid}`;
1496
+ const cells = [
1497
+ { cx: 8, cy: 8, r: 9, color: cellColor, op: 0.18, pd: "4.2s" },
1498
+ { cx: 92, cy: 8, r: 8, color: membraneColor, op: 0.15, pd: "3.8s" },
1499
+ { cx: 8, cy: 92, r: 8, color: membraneColor, op: 0.16, pd: "4.5s" },
1500
+ { cx: 92, cy: 92, r: 9, color: cellColor, op: 0.18, pd: "3.5s" },
1501
+ ...intensity !== "subtle" ? [
1502
+ { cx: 50, cy: 2, r: 6, color: cellColor, op: 0.12, pd: "5.1s" },
1503
+ { cx: 50, cy: 98, r: 6, color: membraneColor, op: 0.12, pd: "4.8s" },
1504
+ { cx: 2, cy: 50, r: 6, color: cellColor, op: 0.12, pd: "4.3s" },
1505
+ { cx: 98, cy: 50, r: 6, color: membraneColor, op: 0.12, pd: "5.2s" }
1506
+ ] : [],
1507
+ ...intensity === "dense" ? [
1508
+ { cx: 25, cy: 5, r: 5, color: nucleusColor, op: 0.09, pd: "3.9s" },
1509
+ { cx: 75, cy: 5, r: 5, color: cellColor, op: 0.09, pd: "4.4s" },
1510
+ { cx: 5, cy: 25, r: 5, color: membraneColor, op: 0.09, pd: "4.6s" },
1511
+ { cx: 5, cy: 75, r: 5, color: cellColor, op: 0.09, pd: "3.7s" }
1512
+ ] : []
1513
+ ];
1514
+ const bubbles = [
567
1515
  { cx: 15, cy: 18, r: 2 },
568
1516
  { cx: 85, cy: 18, r: 1.8 },
569
1517
  { cx: 12, cy: 78, r: 1.5 },
570
1518
  { cx: 88, cy: 82, r: 2 },
571
1519
  { cx: 40, cy: 5, r: 1.5 },
572
- { cx: 60, cy: 95, r: 1.5 },
573
- ];
574
- const bubbleCount = intensity === 'subtle' ? 2 : intensity === 'dense' ? 6 : 4;
575
- 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' &&
576
- [
577
- { cx: 8, cy: 8, r: 10 },
578
- { cx: 92, cy: 92, r: 10 },
579
- ].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 })] }));
580
- }), { displayName: 'NtdIconOrganic' });
581
- // ══════════════════════════════════════════════════════
582
- // 11. NtdIconGeometric 🔷
583
- // Sacred geometry: concentric rings, Star of David
584
- // triangles & slowly rotating corner diamonds
585
- // ══════════════════════════════════════════════════════
1520
+ { cx: 60, cy: 95, r: 1.5 }
1521
+ ];
1522
+ const bubbleCount = intensity === "subtle" ? 2 : intensity === "dense" ? 6 : 4;
1523
+ return retimeTree(
1524
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
1525
+ /* @__PURE__ */ jsx("svg", { style: { position: "absolute", width: 0, height: 0 }, "aria-hidden": true, children: /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("filter", { id: blobFilterId, children: /* @__PURE__ */ jsx("feGaussianBlur", { stdDeviation: "4" }) }) }) }),
1526
+ /* @__PURE__ */ jsxs(
1527
+ "svg",
1528
+ {
1529
+ viewBox: "0 0 100 100",
1530
+ style: { ...overlayBase, inset: "-25%", width: "150%", height: "150%", zIndex: 0 },
1531
+ "aria-hidden": true,
1532
+ children: [
1533
+ cells.map((c, i) => /* @__PURE__ */ jsx(
1534
+ "circle",
1535
+ {
1536
+ cx: c.cx,
1537
+ cy: c.cy,
1538
+ r: c.r,
1539
+ fill: c.color,
1540
+ opacity: animate ? 0 : c.op,
1541
+ filter: `url(#${blobFilterId})`,
1542
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
1543
+ /* @__PURE__ */ jsx(
1544
+ "animate",
1545
+ {
1546
+ attributeName: "opacity",
1547
+ from: "0",
1548
+ to: `${c.op}`,
1549
+ dur: `${duration * 0.55}s`,
1550
+ begin: `${(i * 0.2).toFixed(2)}s`,
1551
+ fill: "freeze"
1552
+ }
1553
+ ),
1554
+ /* @__PURE__ */ jsx(
1555
+ "animate",
1556
+ {
1557
+ attributeName: "r",
1558
+ values: `${c.r};${c.r * 1.3};${c.r}`,
1559
+ dur: c.pd,
1560
+ repeatCount: "indefinite",
1561
+ begin: `${duration}s`
1562
+ }
1563
+ ),
1564
+ /* @__PURE__ */ jsx(
1565
+ "animate",
1566
+ {
1567
+ attributeName: "opacity",
1568
+ values: `${c.op};${c.op * 1.7};${c.op}`,
1569
+ dur: c.pd,
1570
+ repeatCount: "indefinite",
1571
+ begin: `${duration}s`
1572
+ }
1573
+ )
1574
+ ] })
1575
+ },
1576
+ `oc${i}`
1577
+ )),
1578
+ intensity !== "subtle" && [
1579
+ { cx: 8, cy: 8, r: 10 },
1580
+ { cx: 92, cy: 92, r: 10 }
1581
+ ].map((ring, i) => /* @__PURE__ */ jsx(
1582
+ "circle",
1583
+ {
1584
+ cx: ring.cx,
1585
+ cy: ring.cy,
1586
+ r: ring.r,
1587
+ fill: "none",
1588
+ stroke: membraneColor,
1589
+ strokeWidth: "0.7",
1590
+ opacity: animate ? 0 : 0.35,
1591
+ children: animate && /* @__PURE__ */ jsx(
1592
+ "animate",
1593
+ {
1594
+ attributeName: "opacity",
1595
+ from: "0",
1596
+ to: "0.35",
1597
+ dur: `${duration * 0.7}s`,
1598
+ fill: "freeze"
1599
+ }
1600
+ )
1601
+ },
1602
+ `ring${i}`
1603
+ )),
1604
+ bubbles.slice(0, bubbleCount).map((b, i) => /* @__PURE__ */ jsx(
1605
+ "circle",
1606
+ {
1607
+ cx: b.cx,
1608
+ cy: b.cy,
1609
+ r: b.r,
1610
+ fill: nucleusColor,
1611
+ opacity: animate ? 0 : 0.28,
1612
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
1613
+ /* @__PURE__ */ jsx(
1614
+ "animate",
1615
+ {
1616
+ attributeName: "opacity",
1617
+ from: "0",
1618
+ to: "0.28",
1619
+ dur: "0.5s",
1620
+ begin: `${(duration * 0.65 + i * 0.18).toFixed(2)}s`,
1621
+ fill: "freeze"
1622
+ }
1623
+ ),
1624
+ /* @__PURE__ */ jsx(
1625
+ "animate",
1626
+ {
1627
+ attributeName: "cy",
1628
+ values: `${b.cy};${b.cy - 5};${b.cy}`,
1629
+ dur: `${2.2 + i * 0.45}s`,
1630
+ repeatCount: "indefinite",
1631
+ begin: `${duration}s`
1632
+ }
1633
+ )
1634
+ ] })
1635
+ },
1636
+ `ob${i}`
1637
+ ))
1638
+ ]
1639
+ }
1640
+ ),
1641
+ /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", position: "relative", zIndex: 1 }, children })
1642
+ ] }),
1643
+ durationScale(durationProp !== void 0, animationSpeed)
1644
+ );
1645
+ }
1646
+ ),
1647
+ { displayName: "NtdIconOrganic" }
1648
+ );
586
1649
  const NtdIconGeometric = /* @__PURE__ */ Object.assign(
587
- /* @__PURE__ */ forwardRef(({ children, animate = true, duration = 8, intensity = 'normal', primaryColor = '#6366f1', secondaryColor = '#8b5cf6', accentColor = '#a78bfa', className, style, }, ref) => {
588
- const makeTriangle = (cx, cy, r, rotDeg) => Array.from({ length: 3 }, (_, i) => {
589
- const a = ((i * 120 - 90 + rotDeg) * Math.PI) / 180;
1650
+ /* @__PURE__ */ forwardRef(
1651
+ ({
1652
+ children,
1653
+ animate = true,
1654
+ duration: durationProp,
1655
+ animationSpeed,
1656
+ intensity = "normal",
1657
+ primaryColor = "#6366f1",
1658
+ secondaryColor = "#8b5cf6",
1659
+ accentColor = "#a78bfa",
1660
+ className,
1661
+ style
1662
+ }, ref) => {
1663
+ const duration = durationProp ?? 8;
1664
+ const makeTriangle = (cx, cy, r, rotDeg) => Array.from({ length: 3 }, (_, i) => {
1665
+ const a = (i * 120 - 90 + rotDeg) * Math.PI / 180;
590
1666
  return `${(cx + r * Math.cos(a)).toFixed(2)},${(cy + r * Math.sin(a)).toFixed(2)}`;
591
- }).join(' ');
592
- const rings = [
593
- { r: 45, dash: '4 6', color: primaryColor, dir: 1, dur: duration, op: 0.22 },
594
- { r: 38, dash: '2 4', color: secondaryColor, dir: -1, dur: duration * 0.75, op: 0.18 },
595
- ...(intensity !== 'subtle'
596
- ? [{ r: 41, dash: '1 9', color: accentColor, dir: 1, dur: duration * 1.4, op: 0.12 }]
597
- : []),
598
- ...(intensity === 'dense'
599
- ? [{ r: 48, dash: '0.5 4', color: primaryColor, dir: -1, dur: duration * 1.8, op: 0.08 }]
600
- : []),
601
- ];
602
- const triangles = [
1667
+ }).join(" ");
1668
+ const rings = [
1669
+ { r: 45, dash: "4 6", color: primaryColor, dir: 1, dur: duration, op: 0.22 },
1670
+ { r: 38, dash: "2 4", color: secondaryColor, dir: -1, dur: duration * 0.75, op: 0.18 },
1671
+ ...intensity !== "subtle" ? [{ r: 41, dash: "1 9", color: accentColor, dir: 1, dur: duration * 1.4, op: 0.12 }] : [],
1672
+ ...intensity === "dense" ? [{ r: 48, dash: "0.5 4", color: primaryColor, dir: -1, dur: duration * 1.8, op: 0.08 }] : []
1673
+ ];
1674
+ const triangles = [
603
1675
  { r: 34, rot: 0, color: primaryColor, op: 0.14, dur: duration * 2, dir: 1 },
604
1676
  { r: 34, rot: 60, color: accentColor, op: 0.1, dur: duration * 1.6, dir: -1 },
605
- ...(intensity !== 'subtle'
606
- ? [{ r: 24, rot: 15, color: secondaryColor, op: 0.12, dur: duration * 1.9, dir: 1 }]
607
- : []),
608
- ...(intensity === 'dense'
609
- ? [{ r: 44, rot: 30, color: accentColor, op: 0.07, dur: duration * 2.2, dir: -1 }]
610
- : []),
611
- ];
612
- const diamonds = [
1677
+ ...intensity !== "subtle" ? [{ r: 24, rot: 15, color: secondaryColor, op: 0.12, dur: duration * 1.9, dir: 1 }] : [],
1678
+ ...intensity === "dense" ? [{ r: 44, rot: 30, color: accentColor, op: 0.07, dur: duration * 2.2, dir: -1 }] : []
1679
+ ];
1680
+ const diamonds = [
613
1681
  { cx: 8, cy: 8 },
614
1682
  { cx: 92, cy: 8 },
615
1683
  { cx: 8, cy: 92 },
616
1684
  { cx: 92, cy: 92 },
617
- ...(intensity !== 'subtle'
618
- ? [
619
- { cx: 50, cy: 2 },
620
- { cx: 50, cy: 98 },
621
- ]
622
- : []),
623
- ...(intensity === 'dense'
624
- ? [
625
- { cx: 2, cy: 50 },
626
- { cx: 98, cy: 50 },
627
- ]
628
- : []),
629
- ];
630
- const diamondPath = (cx, cy, s = 3) => `M${cx},${cy - s} L${cx + s},${cy} L${cx},${cy + s} L${cx - s},${cy}Z`;
631
- 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 })] }));
632
- }), { displayName: 'NtdIconGeometric' });
633
-
634
- export { NtdIconCosmic, NtdIconFestive, NtdIconFloral, NtdIconFrost, NtdIconGeometric, NtdIconNeon, NtdIconOrganic, NtdIconPixel, NtdIconSketch, NtdIconSteampunk, NtdIconWatercolor };
1685
+ ...intensity !== "subtle" ? [
1686
+ { cx: 50, cy: 2 },
1687
+ { cx: 50, cy: 98 }
1688
+ ] : [],
1689
+ ...intensity === "dense" ? [
1690
+ { cx: 2, cy: 50 },
1691
+ { cx: 98, cy: 50 }
1692
+ ] : []
1693
+ ];
1694
+ const diamondPath = (cx, cy, s = 3) => `M${cx},${cy - s} L${cx + s},${cy} L${cx},${cy + s} L${cx - s},${cy}Z`;
1695
+ return retimeTree(
1696
+ /* @__PURE__ */ jsxs("span", { ref, className, style: { ...wrapperBase, ...style }, children: [
1697
+ /* @__PURE__ */ jsxs(
1698
+ "svg",
1699
+ {
1700
+ viewBox: "0 0 100 100",
1701
+ style: { ...overlayBase, inset: "-30%", width: "160%", height: "160%", zIndex: 0 },
1702
+ "aria-hidden": true,
1703
+ children: [
1704
+ rings.map((ring, i) => /* @__PURE__ */ jsx(
1705
+ "circle",
1706
+ {
1707
+ cx: "50",
1708
+ cy: "50",
1709
+ r: ring.r,
1710
+ fill: "none",
1711
+ stroke: ring.color,
1712
+ strokeWidth: "0.6",
1713
+ strokeDasharray: ring.dash,
1714
+ opacity: ring.op,
1715
+ children: animate && /* @__PURE__ */ jsx(
1716
+ "animateTransform",
1717
+ {
1718
+ attributeName: "transform",
1719
+ type: "rotate",
1720
+ from: "0 50 50",
1721
+ to: `${ring.dir * 360} 50 50`,
1722
+ dur: `${ring.dur}s`,
1723
+ repeatCount: "indefinite"
1724
+ }
1725
+ )
1726
+ },
1727
+ `rng${i}`
1728
+ )),
1729
+ triangles.map((t, i) => /* @__PURE__ */ jsx(
1730
+ "polygon",
1731
+ {
1732
+ points: makeTriangle(50, 50, t.r, t.rot),
1733
+ fill: "none",
1734
+ stroke: t.color,
1735
+ strokeWidth: "0.5",
1736
+ opacity: t.op,
1737
+ children: animate && /* @__PURE__ */ jsx(
1738
+ "animateTransform",
1739
+ {
1740
+ attributeName: "transform",
1741
+ type: "rotate",
1742
+ from: "0 50 50",
1743
+ to: `${t.dir * 360} 50 50`,
1744
+ dur: `${t.dur}s`,
1745
+ repeatCount: "indefinite"
1746
+ }
1747
+ )
1748
+ },
1749
+ `tri${i}`
1750
+ )),
1751
+ diamonds.map((d, i) => /* @__PURE__ */ jsx(
1752
+ "path",
1753
+ {
1754
+ d: diamondPath(d.cx, d.cy),
1755
+ fill: accentColor,
1756
+ opacity: animate ? 0 : 0.5,
1757
+ children: animate && /* @__PURE__ */ jsxs(Fragment, { children: [
1758
+ /* @__PURE__ */ jsx(
1759
+ "animate",
1760
+ {
1761
+ attributeName: "opacity",
1762
+ from: "0",
1763
+ to: "0.5",
1764
+ dur: `${duration * 0.25}s`,
1765
+ begin: `${(i * 0.09).toFixed(2)}s`,
1766
+ fill: "freeze"
1767
+ }
1768
+ ),
1769
+ /* @__PURE__ */ jsx(
1770
+ "animateTransform",
1771
+ {
1772
+ attributeName: "transform",
1773
+ type: "rotate",
1774
+ from: `0 ${d.cx} ${d.cy}`,
1775
+ to: `360 ${d.cx} ${d.cy}`,
1776
+ dur: `${3 + i * 0.6}s`,
1777
+ repeatCount: "indefinite"
1778
+ }
1779
+ )
1780
+ ] })
1781
+ },
1782
+ `dm${i}`
1783
+ ))
1784
+ ]
1785
+ }
1786
+ ),
1787
+ /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", position: "relative", zIndex: 1 }, children })
1788
+ ] }),
1789
+ durationScale(durationProp !== void 0, animationSpeed)
1790
+ );
1791
+ }
1792
+ ),
1793
+ { displayName: "NtdIconGeometric" }
1794
+ );
1795
+ export {
1796
+ NtdIconCosmic,
1797
+ NtdIconFestive,
1798
+ NtdIconFloral,
1799
+ NtdIconFrost,
1800
+ NtdIconGeometric,
1801
+ NtdIconNeon,
1802
+ NtdIconOrganic,
1803
+ NtdIconPixel,
1804
+ NtdIconSketch,
1805
+ NtdIconSteampunk,
1806
+ NtdIconWatercolor
1807
+ };