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