@ehfuse/react-vfx 1.0.0

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 (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/VfxDiv.backup.d.ts +28 -0
  4. package/dist/VfxDiv.backup.d.ts.map +1 -0
  5. package/dist/VfxDiv.d.ts +9 -0
  6. package/dist/VfxDiv.d.ts.map +1 -0
  7. package/dist/VfxParticle.d.ts +8 -0
  8. package/dist/VfxParticle.d.ts.map +1 -0
  9. package/dist/VfxSlide.d.ts +9 -0
  10. package/dist/VfxSlide.d.ts.map +1 -0
  11. package/dist/VfxSlideItem.d.ts +27 -0
  12. package/dist/VfxSlideItem.d.ts.map +1 -0
  13. package/dist/VfxText.backup.d.ts +28 -0
  14. package/dist/VfxText.backup.d.ts.map +1 -0
  15. package/dist/VfxText.d.ts +9 -0
  16. package/dist/VfxText.d.ts.map +1 -0
  17. package/dist/border-effects/dash-flow.d.ts +11 -0
  18. package/dist/border-effects/dash-flow.d.ts.map +1 -0
  19. package/dist/border-effects/dash-rotate.d.ts +12 -0
  20. package/dist/border-effects/dash-rotate.d.ts.map +1 -0
  21. package/dist/border-effects/index.d.ts +16 -0
  22. package/dist/border-effects/index.d.ts.map +1 -0
  23. package/dist/border-effects/pulse.d.ts +11 -0
  24. package/dist/border-effects/pulse.d.ts.map +1 -0
  25. package/dist/border-effects/sparkle.d.ts +12 -0
  26. package/dist/border-effects/sparkle.d.ts.map +1 -0
  27. package/dist/border-effects/special.d.ts +8 -0
  28. package/dist/border-effects/special.d.ts.map +1 -0
  29. package/dist/border-effects/types.d.ts +25 -0
  30. package/dist/border-effects/types.d.ts.map +1 -0
  31. package/dist/effects/borders/dash-flow.d.ts +11 -0
  32. package/dist/effects/borders/dash-flow.d.ts.map +1 -0
  33. package/dist/effects/borders/dash-rotate.d.ts +12 -0
  34. package/dist/effects/borders/dash-rotate.d.ts.map +1 -0
  35. package/dist/effects/borders/index.d.ts +16 -0
  36. package/dist/effects/borders/index.d.ts.map +1 -0
  37. package/dist/effects/borders/pulse.d.ts +11 -0
  38. package/dist/effects/borders/pulse.d.ts.map +1 -0
  39. package/dist/effects/borders/sparkle.d.ts +12 -0
  40. package/dist/effects/borders/sparkle.d.ts.map +1 -0
  41. package/dist/effects/borders/special.d.ts +8 -0
  42. package/dist/effects/borders/special.d.ts.map +1 -0
  43. package/dist/effects/borders/types.d.ts +25 -0
  44. package/dist/effects/borders/types.d.ts.map +1 -0
  45. package/dist/effects/particles/balloons.d.ts +6 -0
  46. package/dist/effects/particles/balloons.d.ts.map +1 -0
  47. package/dist/effects/particles/bubbles.d.ts +7 -0
  48. package/dist/effects/particles/bubbles.d.ts.map +1 -0
  49. package/dist/effects/particles/coins.d.ts +6 -0
  50. package/dist/effects/particles/coins.d.ts.map +1 -0
  51. package/dist/effects/particles/confetti.d.ts +6 -0
  52. package/dist/effects/particles/confetti.d.ts.map +1 -0
  53. package/dist/effects/particles/dust.d.ts +6 -0
  54. package/dist/effects/particles/dust.d.ts.map +1 -0
  55. package/dist/effects/particles/electric.d.ts +6 -0
  56. package/dist/effects/particles/electric.d.ts.map +1 -0
  57. package/dist/effects/particles/explosion.d.ts +6 -0
  58. package/dist/effects/particles/explosion.d.ts.map +1 -0
  59. package/dist/effects/particles/firefly.d.ts +6 -0
  60. package/dist/effects/particles/firefly.d.ts.map +1 -0
  61. package/dist/effects/particles/fireworks.d.ts +6 -0
  62. package/dist/effects/particles/fireworks.d.ts.map +1 -0
  63. package/dist/effects/particles/fog.d.ts +6 -0
  64. package/dist/effects/particles/fog.d.ts.map +1 -0
  65. package/dist/effects/particles/hearts.d.ts +9 -0
  66. package/dist/effects/particles/hearts.d.ts.map +1 -0
  67. package/dist/effects/particles/index.d.ts +30 -0
  68. package/dist/effects/particles/index.d.ts.map +1 -0
  69. package/dist/effects/particles/leaves.d.ts +6 -0
  70. package/dist/effects/particles/leaves.d.ts.map +1 -0
  71. package/dist/effects/particles/lightning.d.ts +6 -0
  72. package/dist/effects/particles/lightning.d.ts.map +1 -0
  73. package/dist/effects/particles/magic.d.ts +6 -0
  74. package/dist/effects/particles/magic.d.ts.map +1 -0
  75. package/dist/effects/particles/matrix.d.ts +6 -0
  76. package/dist/effects/particles/matrix.d.ts.map +1 -0
  77. package/dist/effects/particles/portal.d.ts +6 -0
  78. package/dist/effects/particles/portal.d.ts.map +1 -0
  79. package/dist/effects/particles/rain.d.ts +6 -0
  80. package/dist/effects/particles/rain.d.ts.map +1 -0
  81. package/dist/effects/particles/sakura.d.ts +6 -0
  82. package/dist/effects/particles/sakura.d.ts.map +1 -0
  83. package/dist/effects/particles/smoke.d.ts +6 -0
  84. package/dist/effects/particles/smoke.d.ts.map +1 -0
  85. package/dist/effects/particles/snow.d.ts +6 -0
  86. package/dist/effects/particles/snow.d.ts.map +1 -0
  87. package/dist/effects/particles/sparkle.d.ts +6 -0
  88. package/dist/effects/particles/sparkle.d.ts.map +1 -0
  89. package/dist/effects/particles/stars.d.ts +7 -0
  90. package/dist/effects/particles/stars.d.ts.map +1 -0
  91. package/dist/effects/particles/types.d.ts +40 -0
  92. package/dist/effects/particles/types.d.ts.map +1 -0
  93. package/dist/effects/slides/drift.d.ts +12 -0
  94. package/dist/effects/slides/drift.d.ts.map +1 -0
  95. package/dist/effects/slides/fade.d.ts +10 -0
  96. package/dist/effects/slides/fade.d.ts.map +1 -0
  97. package/dist/effects/slides/flip.d.ts +8 -0
  98. package/dist/effects/slides/flip.d.ts.map +1 -0
  99. package/dist/effects/slides/index.d.ts +28 -0
  100. package/dist/effects/slides/index.d.ts.map +1 -0
  101. package/dist/effects/slides/rotate.d.ts +9 -0
  102. package/dist/effects/slides/rotate.d.ts.map +1 -0
  103. package/dist/effects/slides/slide.d.ts +9 -0
  104. package/dist/effects/slides/slide.d.ts.map +1 -0
  105. package/dist/effects/slides/special.d.ts +10 -0
  106. package/dist/effects/slides/special.d.ts.map +1 -0
  107. package/dist/effects/slides/types.d.ts +20 -0
  108. package/dist/effects/slides/types.d.ts.map +1 -0
  109. package/dist/effects/slides/zoom.d.ts +11 -0
  110. package/dist/effects/slides/zoom.d.ts.map +1 -0
  111. package/dist/effects/texts/blink.d.ts +6 -0
  112. package/dist/effects/texts/blink.d.ts.map +1 -0
  113. package/dist/effects/texts/blur.d.ts +6 -0
  114. package/dist/effects/texts/blur.d.ts.map +1 -0
  115. package/dist/effects/texts/bounce.d.ts +6 -0
  116. package/dist/effects/texts/bounce.d.ts.map +1 -0
  117. package/dist/effects/texts/fade.d.ts +6 -0
  118. package/dist/effects/texts/fade.d.ts.map +1 -0
  119. package/dist/effects/texts/flowing.d.ts +6 -0
  120. package/dist/effects/texts/flowing.d.ts.map +1 -0
  121. package/dist/effects/texts/fly-in.d.ts +6 -0
  122. package/dist/effects/texts/fly-in.d.ts.map +1 -0
  123. package/dist/effects/texts/glitch.d.ts +6 -0
  124. package/dist/effects/texts/glitch.d.ts.map +1 -0
  125. package/dist/effects/texts/index.d.ts +28 -0
  126. package/dist/effects/texts/index.d.ts.map +1 -0
  127. package/dist/effects/texts/jitter.d.ts +6 -0
  128. package/dist/effects/texts/jitter.d.ts.map +1 -0
  129. package/dist/effects/texts/neon.d.ts +6 -0
  130. package/dist/effects/texts/neon.d.ts.map +1 -0
  131. package/dist/effects/texts/pulse.d.ts +11 -0
  132. package/dist/effects/texts/pulse.d.ts.map +1 -0
  133. package/dist/effects/texts/rainbow.d.ts +6 -0
  134. package/dist/effects/texts/rainbow.d.ts.map +1 -0
  135. package/dist/effects/texts/shake.d.ts +6 -0
  136. package/dist/effects/texts/shake.d.ts.map +1 -0
  137. package/dist/effects/texts/spin.d.ts +8 -0
  138. package/dist/effects/texts/spin.d.ts.map +1 -0
  139. package/dist/effects/texts/swing.d.ts +7 -0
  140. package/dist/effects/texts/swing.d.ts.map +1 -0
  141. package/dist/effects/texts/types.d.ts +22 -0
  142. package/dist/effects/texts/types.d.ts.map +1 -0
  143. package/dist/effects/texts/wave.d.ts +6 -0
  144. package/dist/effects/texts/wave.d.ts.map +1 -0
  145. package/dist/effects/texts/zoom.d.ts +6 -0
  146. package/dist/effects/texts/zoom.d.ts.map +1 -0
  147. package/dist/hooks/useTextEffect.d.ts +21 -0
  148. package/dist/hooks/useTextEffect.d.ts.map +1 -0
  149. package/dist/index.d.ts +9 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.esm.js +2049 -0
  152. package/dist/index.esm.js.map +7 -0
  153. package/dist/index.js +2049 -0
  154. package/dist/index.js.map +7 -0
  155. package/dist/particles/balloons.d.ts +6 -0
  156. package/dist/particles/balloons.d.ts.map +1 -0
  157. package/dist/particles/bubbles.d.ts +7 -0
  158. package/dist/particles/bubbles.d.ts.map +1 -0
  159. package/dist/particles/coins.d.ts +6 -0
  160. package/dist/particles/coins.d.ts.map +1 -0
  161. package/dist/particles/confetti.d.ts +6 -0
  162. package/dist/particles/confetti.d.ts.map +1 -0
  163. package/dist/particles/dust.d.ts +6 -0
  164. package/dist/particles/dust.d.ts.map +1 -0
  165. package/dist/particles/electric.d.ts +6 -0
  166. package/dist/particles/electric.d.ts.map +1 -0
  167. package/dist/particles/explosion.d.ts +6 -0
  168. package/dist/particles/explosion.d.ts.map +1 -0
  169. package/dist/particles/firefly.d.ts +6 -0
  170. package/dist/particles/firefly.d.ts.map +1 -0
  171. package/dist/particles/fireworks.d.ts +6 -0
  172. package/dist/particles/fireworks.d.ts.map +1 -0
  173. package/dist/particles/fog.d.ts +6 -0
  174. package/dist/particles/fog.d.ts.map +1 -0
  175. package/dist/particles/hearts.d.ts +9 -0
  176. package/dist/particles/hearts.d.ts.map +1 -0
  177. package/dist/particles/index.d.ts +30 -0
  178. package/dist/particles/index.d.ts.map +1 -0
  179. package/dist/particles/leaves.d.ts +6 -0
  180. package/dist/particles/leaves.d.ts.map +1 -0
  181. package/dist/particles/lightning.d.ts +6 -0
  182. package/dist/particles/lightning.d.ts.map +1 -0
  183. package/dist/particles/magic.d.ts +6 -0
  184. package/dist/particles/magic.d.ts.map +1 -0
  185. package/dist/particles/matrix.d.ts +6 -0
  186. package/dist/particles/matrix.d.ts.map +1 -0
  187. package/dist/particles/portal.d.ts +6 -0
  188. package/dist/particles/portal.d.ts.map +1 -0
  189. package/dist/particles/rain.d.ts +6 -0
  190. package/dist/particles/rain.d.ts.map +1 -0
  191. package/dist/particles/sakura.d.ts +6 -0
  192. package/dist/particles/sakura.d.ts.map +1 -0
  193. package/dist/particles/smoke.d.ts +6 -0
  194. package/dist/particles/smoke.d.ts.map +1 -0
  195. package/dist/particles/snow.d.ts +6 -0
  196. package/dist/particles/snow.d.ts.map +1 -0
  197. package/dist/particles/sparkle.d.ts +6 -0
  198. package/dist/particles/sparkle.d.ts.map +1 -0
  199. package/dist/particles/stars.d.ts +7 -0
  200. package/dist/particles/stars.d.ts.map +1 -0
  201. package/dist/particles/types.d.ts +40 -0
  202. package/dist/particles/types.d.ts.map +1 -0
  203. package/dist/slide-effects/drift.d.ts +12 -0
  204. package/dist/slide-effects/drift.d.ts.map +1 -0
  205. package/dist/slide-effects/fade.d.ts +10 -0
  206. package/dist/slide-effects/fade.d.ts.map +1 -0
  207. package/dist/slide-effects/flip.d.ts +8 -0
  208. package/dist/slide-effects/flip.d.ts.map +1 -0
  209. package/dist/slide-effects/index.d.ts +28 -0
  210. package/dist/slide-effects/index.d.ts.map +1 -0
  211. package/dist/slide-effects/rotate.d.ts +9 -0
  212. package/dist/slide-effects/rotate.d.ts.map +1 -0
  213. package/dist/slide-effects/slide.d.ts +9 -0
  214. package/dist/slide-effects/slide.d.ts.map +1 -0
  215. package/dist/slide-effects/special.d.ts +10 -0
  216. package/dist/slide-effects/special.d.ts.map +1 -0
  217. package/dist/slide-effects/types.d.ts +25 -0
  218. package/dist/slide-effects/types.d.ts.map +1 -0
  219. package/dist/slide-effects/zoom.d.ts +11 -0
  220. package/dist/slide-effects/zoom.d.ts.map +1 -0
  221. package/dist/text-effects/blink.d.ts +6 -0
  222. package/dist/text-effects/blink.d.ts.map +1 -0
  223. package/dist/text-effects/blur.d.ts +6 -0
  224. package/dist/text-effects/blur.d.ts.map +1 -0
  225. package/dist/text-effects/bounce.d.ts +6 -0
  226. package/dist/text-effects/bounce.d.ts.map +1 -0
  227. package/dist/text-effects/fade.d.ts +6 -0
  228. package/dist/text-effects/fade.d.ts.map +1 -0
  229. package/dist/text-effects/flowing.d.ts +6 -0
  230. package/dist/text-effects/flowing.d.ts.map +1 -0
  231. package/dist/text-effects/fly-in.d.ts +6 -0
  232. package/dist/text-effects/fly-in.d.ts.map +1 -0
  233. package/dist/text-effects/glitch.d.ts +6 -0
  234. package/dist/text-effects/glitch.d.ts.map +1 -0
  235. package/dist/text-effects/index.d.ts +28 -0
  236. package/dist/text-effects/index.d.ts.map +1 -0
  237. package/dist/text-effects/jitter.d.ts +6 -0
  238. package/dist/text-effects/jitter.d.ts.map +1 -0
  239. package/dist/text-effects/neon.d.ts +6 -0
  240. package/dist/text-effects/neon.d.ts.map +1 -0
  241. package/dist/text-effects/pulse.d.ts +11 -0
  242. package/dist/text-effects/pulse.d.ts.map +1 -0
  243. package/dist/text-effects/rainbow.d.ts +6 -0
  244. package/dist/text-effects/rainbow.d.ts.map +1 -0
  245. package/dist/text-effects/shake.d.ts +6 -0
  246. package/dist/text-effects/shake.d.ts.map +1 -0
  247. package/dist/text-effects/spin.d.ts +8 -0
  248. package/dist/text-effects/spin.d.ts.map +1 -0
  249. package/dist/text-effects/swing.d.ts +7 -0
  250. package/dist/text-effects/swing.d.ts.map +1 -0
  251. package/dist/text-effects/types.d.ts +22 -0
  252. package/dist/text-effects/types.d.ts.map +1 -0
  253. package/dist/text-effects/wave.d.ts +6 -0
  254. package/dist/text-effects/wave.d.ts.map +1 -0
  255. package/dist/text-effects/zoom.d.ts +6 -0
  256. package/dist/text-effects/zoom.d.ts.map +1 -0
  257. package/dist/types.d.ts +75 -0
  258. package/dist/types.d.ts.map +1 -0
  259. package/package.json +52 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/hooks/useTextEffect.ts", "../src/effects/texts/fade.ts", "../src/effects/texts/flowing.ts", "../src/effects/texts/pulse.ts", "../src/effects/texts/blink.ts", "../src/effects/texts/spin.ts", "../src/effects/texts/swing.ts", "../src/effects/texts/shake.ts", "../src/effects/texts/bounce.ts", "../src/effects/texts/wave.ts", "../src/effects/texts/glitch.ts", "../src/effects/texts/neon.ts", "../src/effects/texts/zoom.ts", "../src/effects/texts/blur.ts", "../src/effects/texts/rainbow.ts", "../src/effects/texts/jitter.ts", "../src/effects/texts/fly-in.ts", "../src/effects/texts/index.ts", "../src/VfxText.tsx", "../src/VfxDiv.tsx", "../src/effects/borders/types.ts", "../src/effects/borders/pulse.ts", "../src/effects/borders/sparkle.ts", "../src/effects/borders/dash-flow.ts", "../src/effects/borders/dash-rotate.ts", "../src/effects/borders/special.ts", "../src/effects/borders/index.ts", "../src/VfxParticle.tsx", "../src/effects/particles/sparkle.ts", "../src/effects/particles/confetti.ts", "../src/effects/particles/snow.ts", "../src/effects/particles/firefly.ts", "../src/effects/particles/bubbles.ts", "../src/effects/particles/stars.ts", "../src/effects/particles/rain.ts", "../src/effects/particles/leaves.ts", "../src/effects/particles/sakura.ts", "../src/effects/particles/smoke.ts", "../src/effects/particles/dust.ts", "../src/effects/particles/fireworks.ts", "../src/effects/particles/hearts.ts", "../src/effects/particles/coins.ts", "../src/effects/particles/balloons.ts", "../src/effects/particles/magic.ts", "../src/effects/particles/portal.ts", "../src/effects/particles/explosion.ts", "../src/effects/particles/matrix.ts", "../src/effects/particles/fog.ts", "../src/effects/particles/electric.ts", "../src/effects/particles/lightning.ts", "../src/effects/particles/index.ts", "../src/VfxSlide.tsx", "../src/effects/slides/fade.ts", "../src/effects/slides/slide.ts", "../src/effects/slides/rotate.ts", "../src/effects/slides/flip.ts", "../src/effects/slides/zoom.ts", "../src/effects/slides/special.ts", "../src/effects/slides/drift.ts", "../src/effects/slides/index.ts", "../src/VfxSlideItem.tsx"],
4
+ "sourcesContent": ["export { VfxText, addTextEffectStyles } from \"./VfxText\";\nexport { VfxDiv, addBorderEffectStyles } from \"./VfxDiv\";\nexport { VfxParticle } from \"./VfxParticle\";\nexport { default as VfxSlide } from \"./VfxSlide\";\nexport { default as VfxSlideItem } from \"./VfxSlideItem\";\nexport { useTextEffect } from \"./hooks/useTextEffect\";\nexport type {\n TextEffectType,\n BorderEffectType,\n VfxTextProps,\n VfxDivProps,\n ParticleEffectType,\n ParticleOptions,\n VfxParticleProps,\n SlideEffectType,\n DriftEffectType,\n VfxSlideItemProps,\n VfxSlideProps,\n} from \"./types\";\nexport { slideEffectRegistry, driftEffectRegistry } from \"./effects/slides\";\n", "/**\n * useTextEffect.ts\n * IMPORTANT NOTICE (\uC911\uC694 \uACF5\uC9C0):\n * This code is the intellectual property of \uAE40\uC601\uC9C4 (Kim Young Jin).\n * All rights reserved. Unauthorized copying, modification, distribution,\n * or use of this code is strictly prohibited without prior written\n * permission from the copyright holder.\n * \uC774 \uCF54\uB4DC\uB294 \uAE40\uC601\uC9C4\uC758 \uC9C0\uC801\uC7AC\uC0B0\uAD8C\uC785\uB2C8\uB2E4.\n * \uBAA8\uB4E0 \uAD8C\uB9AC\uAC00 \uBCF4\uD638\uB429\uB2C8\uB2E4. \uC800\uC791\uAD8C\uC790\uC758 \uC0AC\uC804 \uC11C\uBA74 \uD5C8\uAC00 \uC5C6\uC774\n * \uBB34\uB2E8 \uBCF5\uC0AC, \uC218\uC815, \uBC30\uD3EC \uB610\uB294 \uC0AC\uC6A9\uC744 \uC5C4\uACA9\uD788 \uAE08\uC9C0\uD569\uB2C8\uB2E4.\n * For licensing inquiries, please contact (\uB77C\uC774\uC120\uC2A4 \uBB38\uC758):\n * Email: ehfuse@gmail.com\n */\n\nimport { TextEffectType } from \"../types\";\nimport { useState, useEffect } from \"react\";\n\nexport const useTextEffect = (\n text: string,\n effect: TextEffectType | undefined,\n isActive: boolean\n) => {\n const [displayedText, setDisplayedText] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(0);\n\n // \uCD08\uAE30\uD654: typing\uC774 \uC788\uC73C\uBA74 \uCC98\uC74C\uBD80\uD130 \uBE48 \uD14D\uC2A4\uD2B8\uB85C \uC2DC\uC791\n useEffect(() => {\n if (effect === \"typing\") {\n setDisplayedText(\"\");\n setCurrentIndex(0);\n } else {\n setDisplayedText(text);\n }\n }, [effect, text, isActive]);\n\n // \uD0C0\uC774\uD551 \uD6A8\uACFC (\uBC18\uBCF5)\n useEffect(() => {\n if (effect === \"typing\" && isActive && text) {\n let typingInterval: ReturnType<typeof setInterval>;\n let restartTimeout: ReturnType<typeof setTimeout>;\n\n const startTyping = () => {\n setDisplayedText(\"\");\n setCurrentIndex(0);\n let index = 0;\n\n typingInterval = setInterval(() => {\n if (index < text.length) {\n setDisplayedText(text.slice(0, index + 1));\n setCurrentIndex(index + 1);\n index++;\n } else {\n clearInterval(typingInterval);\n // 2\uCD08 \uD6C4 \uB2E4\uC2DC \uC2DC\uC791\n restartTimeout = setTimeout(() => {\n startTyping();\n }, 2000);\n }\n }, 100); // 100ms\uB9C8\uB2E4 \uD55C \uAE00\uC790\uC529\n };\n\n startTyping();\n\n return () => {\n clearInterval(typingInterval);\n clearTimeout(restartTimeout);\n };\n } else if (effect === \"typing\" && !isActive) {\n // \uBE44\uD65C\uC131\uD654 \uC0C1\uD0DC\uC5D0\uC11C\uB294 \uBE48 \uD14D\uC2A4\uD2B8 \uC720\uC9C0\n setDisplayedText(\"\");\n setCurrentIndex(0);\n }\n }, [effect, isActive, text]);\n\n // \uD6A8\uACFC\uBCC4 \uC2A4\uD0C0\uC77C \uC801\uC6A9\n const getEffectStyle = (): React.CSSProperties => {\n if (!isActive) return { opacity: 0 };\n return {};\n };\n\n const textToShow = effect === \"typing\" ? displayedText : text;\n\n return {\n textToShow,\n currentIndex,\n getEffectStyle,\n isTypingComplete: currentIndex >= text.length,\n };\n};\n", "/**\n * fade.ts - \uD398\uC774\uB4DC \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const fadeEffect: TextEffect = {\n keyframes: `\n @keyframes textFadeInOut {\n 0%, 100% { opacity: 0.3; }\n 50% { opacity: 1; }\n }\n `,\n className: `\n .vfx-text-fade {\n animation: textFadeInOut 2s ease-in-out infinite;\n }\n `,\n};\n", "/**\n * flowing.ts - \uD750\uB974\uB294 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const flowingEffect: TextEffect = {\n keyframes: `\n @keyframes flowingText {\n 0% { \n left: 100%;\n transform: translateX(0);\n }\n 100% { \n left: 0;\n transform: translateX(-100%);\n }\n }\n `,\n className: `\n .vfx-text-flowing-container {\n display: flex;\n flex-grow: 1;\n align-items: center; \n overflow: hidden;\n white-space: nowrap;\n position: relative;\n width: 100%;\n height: 100%;\n }\n .vfx-text-flowing {\n animation: flowingText linear infinite;\n }\n `,\n customRender: true,\n};\n", "/**\n * pulse.ts - \uD384\uC2A4 \uAE00\uB85C\uC6B0 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC (6\uAC00\uC9C0 \uC0C9\uC0C1)\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const yellowPulseEffect: TextEffect = {\n keyframes: `\n @keyframes yellowTextGlow {\n 0%, 100% { \n text-shadow: none;\n filter: none;\n }\n 50% { \n text-shadow: 0 0 6px rgba(255, 255, 0, 0.6),\n 0 0 12px rgba(255, 255, 0, 0.4),\n 0 0 18px rgba(255, 255, 0, 0.2);\n filter: drop-shadow(0 0 4px rgba(255, 255, 0, 0.5));\n }\n }\n `,\n className: `\n .vfx-text-yellow-pulse {\n animation: yellowTextGlow 2s ease-in-out infinite;\n }\n `,\n};\n\nexport const redPulseEffect: TextEffect = {\n keyframes: `\n @keyframes redTextGlow {\n 0%, 100% { \n text-shadow: none;\n filter: none;\n }\n 50% { \n text-shadow: 0 0 6px rgba(255, 0, 0, 0.6),\n 0 0 12px rgba(255, 0, 0, 0.4),\n 0 0 18px rgba(255, 0, 0, 0.2);\n filter: drop-shadow(0 0 4px rgba(255, 0, 0, 0.5));\n }\n }\n `,\n className: `\n .vfx-text-red-pulse {\n animation: redTextGlow 2s ease-in-out infinite;\n }\n `,\n};\n\nexport const bluePulseEffect: TextEffect = {\n keyframes: `\n @keyframes blueTextGlow {\n 0%, 100% { \n text-shadow: none;\n filter: none;\n }\n 50% { \n text-shadow: 0 0 6px rgba(0, 100, 255, 0.6),\n 0 0 12px rgba(0, 100, 255, 0.4),\n 0 0 18px rgba(0, 100, 255, 0.2);\n filter: drop-shadow(0 0 4px rgba(0, 100, 255, 0.5));\n }\n }\n `,\n className: `\n .vfx-text-blue-pulse {\n animation: blueTextGlow 2s ease-in-out infinite;\n }\n `,\n};\n\nexport const greenPulseEffect: TextEffect = {\n keyframes: `\n @keyframes greenTextGlow {\n 0%, 100% { \n text-shadow: none;\n filter: none;\n }\n 50% { \n text-shadow: 0 0 6px rgba(0, 255, 50, 0.6),\n 0 0 12px rgba(0, 255, 50, 0.4),\n 0 0 18px rgba(0, 255, 50, 0.2);\n filter: drop-shadow(0 0 4px rgba(0, 255, 50, 0.5));\n }\n }\n `,\n className: `\n .vfx-text-green-pulse {\n animation: greenTextGlow 2s ease-in-out infinite;\n }\n `,\n};\n\nexport const pinkPulseEffect: TextEffect = {\n keyframes: `\n @keyframes pinkTextGlow {\n 0%, 100% { \n text-shadow: none;\n filter: none;\n }\n 50% { \n text-shadow: 0 0 6px rgba(255, 105, 180, 0.6),\n 0 0 12px rgba(255, 105, 180, 0.4),\n 0 0 18px rgba(255, 105, 180, 0.2);\n filter: drop-shadow(0 0 4px rgba(255, 105, 180, 0.5));\n }\n }\n `,\n className: `\n .vfx-text-pink-pulse {\n animation: pinkTextGlow 2s ease-in-out infinite;\n }\n `,\n};\n\nexport const purplePulseEffect: TextEffect = {\n keyframes: `\n @keyframes purpleTextGlow {\n 0%, 100% { \n text-shadow: none;\n filter: none;\n }\n 50% { \n text-shadow: 0 0 6px rgba(138, 43, 226, 0.6),\n 0 0 12px rgba(138, 43, 226, 0.4),\n 0 0 18px rgba(138, 43, 226, 0.2);\n filter: drop-shadow(0 0 4px rgba(138, 43, 226, 0.5));\n }\n }\n `,\n className: `\n .vfx-text-purple-pulse {\n animation: purpleTextGlow 2s ease-in-out infinite;\n }\n `,\n};\n", "/**\n * blink.ts - \uAE5C\uBE61\uC784 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const blinkEffect: TextEffect = {\n keyframes: `\n @keyframes textBlink {\n 0%, 49% { opacity: 1; }\n 50%, 100% { opacity: 0; }\n }\n `,\n className: `\n .vfx-text-blink {\n animation: textBlink 0.8s steps(1) infinite;\n }\n `,\n};\n", "/**\n * spin.ts - \uD68C\uC804 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\uB4E4\n */\n\nimport { TextEffect } from \"./types\";\n\n// X\uCD95 \uAE30\uC900 \uD68C\uC804 (\uC55E\uB4A4\uB85C \uB4A4\uC9D1\uD798)\nexport const spinXEffect: TextEffect = {\n keyframes: `\n @keyframes textSpinX {\n 0% { transform: perspective(400px) rotateX(0); }\n 50% { transform: perspective(400px) rotateX(180deg); }\n 100% { transform: perspective(400px) rotateX(360deg); }\n }\n `,\n className: `\n .vfx-text-spin-x {\n animation: textSpinX 2s ease-in-out infinite;\n display: inline-block;\n }\n `,\n};\n\n// Y\uCD95 \uAE30\uC900 \uD3C9\uBA74 \uD68C\uC804 (\uC2DC\uACC4\uBC29\uD5A5)\nexport const spinYEffect: TextEffect = {\n keyframes: `\n @keyframes textSpinY {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `,\n className: `\n .vfx-text-spin-y {\n animation: textSpinY 2s linear infinite;\n display: inline-block;\n }\n .vfx-text-spin-y-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n }\n `,\n customRender: true,\n};\n\n// \uC911\uC2EC\uCD95 \uAE30\uC900 Y\uCD95 \uAC00\uB85C \uD68C\uC804\nexport const spinCenterEffect: TextEffect = {\n keyframes: `\n @keyframes textSpinCenter {\n 0% { transform: perspective(800px) rotateY(0deg); }\n 100% { transform: perspective(800px) rotateY(360deg); }\n }\n `,\n className: `\n .vfx-text-spin-center {\n animation: textSpinCenter 2s linear infinite;\n display: inline-block;\n transform-style: preserve-3d;\n }\n .vfx-text-spin-center-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n }\n `,\n customRender: true,\n};\n", "/**\n * swing.ts - \uD754\uB4E4\uB9BC \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\uB4E4\n */\n\nimport { TextEffect } from \"./types\";\n\n// X\uCD95 \uD754\uB4E4\uB9BC (\uC88C\uC6B0)\nexport const swingXEffect: TextEffect = {\n keyframes: `\n @keyframes textSwingX {\n 0% { transform: translateX(0); }\n 25% { transform: translateX(15px); }\n 50% { transform: translateX(0); }\n 75% { transform: translateX(-15px); }\n 100% { transform: translateX(0); }\n }\n `,\n className: `\n .vfx-text-swing-x {\n animation: textSwingX 2s ease-in-out infinite;\n display: inline-block;\n }\n `,\n additionalStyle: { paddingLeft: \"15px\" },\n};\n\n// Y\uCD95 \uD754\uB4E4\uB9BC (\uC0C1\uD558)\nexport const swingYEffect: TextEffect = {\n keyframes: `\n @keyframes textSwingY {\n 0% { transform: translateY(0); }\n 25% { transform: translateY(-5px); }\n 50% { transform: translateY(0); }\n 75% { transform: translateY(5px); }\n 100% { transform: translateY(0); }\n }\n `,\n className: `\n .vfx-text-swing-y {\n animation: textSwingY 2s ease-in-out infinite;\n display: inline-block;\n }\n `,\n};\n", "/**\n * shake.ts - \uB5A8\uB9BC \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const shakeEffect: TextEffect = {\n keyframes: `\n @keyframes textShake {\n 0%, 100% { transform: translateX(0); }\n 10% { transform: translateX(-4px) rotate(-1deg); }\n 20% { transform: translateX(4px) rotate(1deg); }\n 30% { transform: translateX(-4px) rotate(-1deg); }\n 40% { transform: translateX(4px) rotate(1deg); }\n 50% { transform: translateX(-4px) rotate(-1deg); }\n 60% { transform: translateX(4px) rotate(1deg); }\n 70% { transform: translateX(-4px) rotate(-1deg); }\n 80% { transform: translateX(4px) rotate(1deg); }\n 90% { transform: translateX(-4px) rotate(-1deg); }\n }\n `,\n className: `\n .vfx-text-shake {\n animation: textShake 0.5s ease-in-out infinite;\n display: inline-block;\n }\n `,\n};\n", "/**\n * bounce.ts - \uD280\uB294 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const bounceEffect: TextEffect = {\n keyframes: `\n @keyframes textBounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n }\n `,\n className: `\n .vfx-text-bounce {\n animation: textBounce 0.6s ease-in-out infinite;\n display: inline-block;\n }\n `,\n};\n", "/**\n * wave.ts - \uD30C\uB3C4 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const waveEffect: TextEffect = {\n keyframes: `\n @keyframes textWave {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n }\n `,\n className: `\n .vfx-text-wave-char {\n animation: textWave 0.6s ease-in-out infinite;\n display: inline-block;\n }\n .vfx-text-wave-container {\n display: inline-flex;\n }\n `,\n customRender: true,\n};\n", "/**\n * glitch.ts - \uAE00\uB9AC\uCE58 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const glitchEffect: TextEffect = {\n keyframes: `\n @keyframes textGlitch {\n 0%, 100% { \n transform: translate(0);\n text-shadow: -2px 0 #ff0000, 2px 0 #00ffff;\n }\n 20% { \n transform: translate(-2px, 2px);\n text-shadow: 2px 0 #ff0000, -2px 0 #00ffff;\n }\n 40% { \n transform: translate(2px, -2px);\n text-shadow: -2px 0 #ff0000, 2px 0 #00ffff;\n }\n 60% { \n transform: translate(-2px, 0);\n text-shadow: 2px 0 #00ffff, -2px 0 #ff0000;\n }\n 80% { \n transform: translate(2px, 2px);\n text-shadow: -2px 0 #00ffff, 2px 0 #ff0000;\n }\n }\n `,\n className: `\n .vfx-text-glitch {\n animation: textGlitch 0.3s ease-in-out infinite;\n display: inline-block;\n }\n `,\n};\n", "/**\n * neon.ts - \uB124\uC628 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const neonEffect: TextEffect = {\n keyframes: `\n @keyframes textNeon {\n 0%, 100% { \n text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #0ff, 0 0 20px #0ff, 0 0 25px #0ff;\n }\n 50% { \n text-shadow: 0 0 2px #fff, 0 0 5px #fff, 0 0 8px #0ff, 0 0 10px #0ff, 0 0 12px #0ff;\n }\n }\n `,\n className: `\n .vfx-text-neon {\n animation: textNeon 1.5s ease-in-out infinite;\n color: #fff;\n }\n `,\n};\n", "/**\n * zoom.ts - \uD655\uB300/\uCD95\uC18C \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const zoomEffect: TextEffect = {\n keyframes: `\n @keyframes textZoom {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.2); }\n }\n `,\n className: `\n .vfx-text-zoom {\n animation: textZoom 1s ease-in-out infinite;\n display: inline-block;\n transform-origin: left center;\n }\n `,\n};\n", "/**\n * blur.ts - \uBE14\uB7EC \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const blurEffect: TextEffect = {\n keyframes: `\n @keyframes textBlur {\n 0%, 100% { filter: blur(0); }\n 50% { filter: blur(3px); }\n }\n `,\n className: `\n .vfx-text-blur {\n animation: textBlur 2s ease-in-out infinite;\n }\n `,\n};\n", "/**\n * rainbow.ts - \uBB34\uC9C0\uAC1C \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const rainbowEffect: TextEffect = {\n keyframes: `\n @keyframes textRainbow {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n `,\n className: `\n .vfx-text-rainbow {\n background: linear-gradient(90deg, #ff6b6b, #feca57, #48dbfb, #ff9ff3, #ff6b6b);\n background-size: 300% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: textRainbow 3s ease-in-out infinite;\n }\n `,\n};\n", "/**\n * jitter.ts - \uC9C0\uD130 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC (\uBBF8\uC138 \uB5A8\uB9BC)\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const jitterEffect: TextEffect = {\n keyframes: `\n @keyframes textJitter {\n 0%, 100% { \n opacity: 1;\n transform: translateY(0);\n }\n 25% { \n opacity: 0.8;\n transform: translateY(-2px);\n }\n 50% { \n opacity: 0.6;\n transform: translateY(2px);\n }\n 75% { \n opacity: 0.8;\n transform: translateY(-1px);\n }\n }\n `,\n className: `\n .vfx-text-jitter {\n animation: textJitter 0.3s steps(4) infinite;\n display: inline-block;\n }\n `,\n};\n", "/**\n * fly-in.ts - \uB0A0\uC544\uC624\uB294 \uD14D\uC2A4\uD2B8 \uD6A8\uACFC\n */\n\nimport { TextEffect } from \"./types\";\n\nexport const flyInEffect: TextEffect = {\n keyframes: `\n @keyframes textFlyIn {\n 0% { \n opacity: 0;\n transform: translateX(30px);\n }\n 40% { \n opacity: 1;\n transform: translateX(0);\n }\n 60% {\n opacity: 1;\n transform: translateX(0);\n }\n 100% { \n opacity: 0;\n transform: translateX(30px);\n }\n }\n `,\n className: `\n .vfx-text-fly-in-char {\n animation: textFlyIn 2.5s ease-in-out infinite;\n display: inline-block;\n opacity: 0;\n }\n .vfx-text-fly-in-container {\n display: inline-flex;\n }\n `,\n customRender: true,\n};\n", "/**\n * text-effects/index.ts - \uD14D\uC2A4\uD2B8 \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\n */\n\nimport { TextEffect, TextEffectRegistry } from \"./types\";\nimport { fadeEffect } from \"./fade\";\nimport { flowingEffect } from \"./flowing\";\nimport {\n yellowPulseEffect,\n redPulseEffect,\n bluePulseEffect,\n greenPulseEffect,\n pinkPulseEffect,\n purplePulseEffect,\n} from \"./pulse\";\nimport { blinkEffect } from \"./blink\";\nimport { spinXEffect, spinYEffect, spinCenterEffect } from \"./spin\";\nimport { swingXEffect, swingYEffect } from \"./swing\";\nimport { shakeEffect } from \"./shake\";\nimport { bounceEffect } from \"./bounce\";\nimport { waveEffect } from \"./wave\";\nimport { glitchEffect } from \"./glitch\";\nimport { neonEffect } from \"./neon\";\nimport { zoomEffect } from \"./zoom\";\nimport { blurEffect } from \"./blur\";\nimport { rainbowEffect } from \"./rainbow\";\nimport { jitterEffect } from \"./jitter\";\nimport { flyInEffect } from \"./fly-in\";\n\nexport type { TextEffect, TextEffectRegistry };\n\n// \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\nexport const textEffectRegistry: TextEffectRegistry = {\n fade: fadeEffect,\n flowing: flowingEffect,\n \"yellow-pulse\": yellowPulseEffect,\n \"red-pulse\": redPulseEffect,\n \"blue-pulse\": bluePulseEffect,\n \"green-pulse\": greenPulseEffect,\n \"pink-pulse\": pinkPulseEffect,\n \"purple-pulse\": purplePulseEffect,\n blink: blinkEffect,\n \"spin-x\": spinXEffect,\n \"spin-y\": spinYEffect,\n \"spin-center\": spinCenterEffect,\n \"swing-x\": swingXEffect,\n \"swing-y\": swingYEffect,\n shake: shakeEffect,\n bounce: bounceEffect,\n wave: waveEffect,\n glitch: glitchEffect,\n neon: neonEffect,\n zoom: zoomEffect,\n blur: blurEffect,\n rainbow: rainbowEffect,\n jitter: jitterEffect,\n \"fly-in\": flyInEffect,\n};\n\n// \uBAA8\uB4E0 CSS \uC2A4\uD0C0\uC77C \uC0DD\uC131\nexport const generateAllTextEffectStyles = (): string => {\n const styles: string[] = [];\n\n // \uAE30\uBCF8 \uCEE8\uD14C\uC774\uB108 \uC2A4\uD0C0\uC77C\n styles.push(`\n .vfx-text-effect-container {\n display: flex;\n position: relative;\n align-items: center;\n width: 100%;\n overflow: hidden;\n }\n `);\n\n // \uAC01 \uD6A8\uACFC\uC758 keyframes\uC640 className \uCD94\uAC00\n Object.values(textEffectRegistry).forEach((effect) => {\n styles.push(effect.keyframes);\n styles.push(effect.className);\n if (effect.additionalClasses) {\n styles.push(effect.additionalClasses);\n }\n });\n\n return styles.join(\"\\n\");\n};\n\n// \uD6A8\uACFC\uC5D0 \uB530\uB978 CSS \uD074\uB798\uC2A4 \uBC18\uD658\nexport const getTextEffectClass = (effect: string | undefined): string => {\n if (!effect) return \"\";\n const effectConfig = textEffectRegistry[effect];\n if (!effectConfig) return \"\";\n return `vfx-text-${effect}`;\n};\n\n// \uD6A8\uACFC\uC5D0 \uB530\uB978 \uCD94\uAC00 \uC2A4\uD0C0\uC77C \uBC18\uD658\nexport const getTextEffectAdditionalStyle = (\n effect: string | undefined\n): React.CSSProperties => {\n if (!effect) return {};\n const effectConfig = textEffectRegistry[effect];\n return effectConfig?.additionalStyle || {};\n};\n\n// \uCEE4\uC2A4\uD140 \uB80C\uB354\uB9C1 \uD544\uC694 \uC5EC\uBD80\nexport const needsCustomRender = (effect: string | undefined): boolean => {\n if (!effect) return false;\n const effectConfig = textEffectRegistry[effect];\n return effectConfig?.customRender || false;\n};\n\n// \uAC1C\uBCC4 \uD6A8\uACFC \uB0B4\uBCF4\uB0B4\uAE30\nexport {\n fadeEffect,\n flowingEffect,\n yellowPulseEffect,\n redPulseEffect,\n bluePulseEffect,\n greenPulseEffect,\n pinkPulseEffect,\n purplePulseEffect,\n blinkEffect,\n spinXEffect,\n spinYEffect,\n spinCenterEffect,\n swingXEffect,\n swingYEffect,\n shakeEffect,\n bounceEffect,\n waveEffect,\n glitchEffect,\n neonEffect,\n zoomEffect,\n blurEffect,\n rainbowEffect,\n jitterEffect,\n flyInEffect,\n};\n", "/**\n * VfxText.tsx\n */\n\nimport React, { CSSProperties } from \"react\";\nimport { useTextEffect } from \"./hooks/useTextEffect\";\nimport { TextEffectType, VfxTextProps } from \"./types\";\nimport {\n generateAllTextEffectStyles,\n getTextEffectClass,\n getTextEffectAdditionalStyle,\n} from \"./effects/texts\";\n\nexport type { TextEffectType, VfxTextProps };\n\n// CSS \uD0A4\uD504\uB808\uC784\uC744 \uCD94\uAC00\uD558\uB294 \uD568\uC218\n// eslint-disable-next-line\nexport const addTextEffectStyles = () => {\n const styleId = \"text-effect-styles\";\n\n // \uC774\uBBF8 \uCD94\uAC00\uB41C \uC2A4\uD0C0\uC77C\uC774 \uC788\uB294\uC9C0 \uD655\uC778\n if (document.getElementById(styleId)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = generateAllTextEffectStyles();\n document.head.appendChild(style);\n};\n\nexport const VfxText: React.FC<VfxTextProps> = ({\n title,\n effect,\n isActive,\n className = \"\",\n style = {},\n}) => {\n const { textToShow, getEffectStyle, isTypingComplete } = useTextEffect(\n title,\n effect,\n isActive\n );\n\n // \uD14D\uC2A4\uD2B8 \uAE38\uC774\uC5D0 \uB530\uB978 \uC560\uB2C8\uBA54\uC774\uC158 \uC9C0\uC18D\uC2DC\uAC04 \uACC4\uC0B0\n const calculateFlowingDuration = (text: string): number => {\n const baseSpeed = 100; // \uAE30\uBCF8 \uC18D\uB3C4 (\uBB38\uC790\uB2F9 ms)\n const minDuration = 2; // \uCD5C\uC18C \uC9C0\uC18D\uC2DC\uAC04 (\uCD08)\n const maxDuration = 10; // \uCD5C\uB300 \uC9C0\uC18D\uC2DC\uAC04 (\uCD08)\n\n const calculatedDuration = (text.length * baseSpeed) / 1000;\n return Math.min(Math.max(calculatedDuration, minDuration), maxDuration);\n };\n\n // \uD6A8\uACFC \uD074\uB798\uC2A4 \uBC0F \uCD94\uAC00 \uC2A4\uD0C0\uC77C \uAC00\uC838\uC624\uAE30\n let glowClass = \"\";\n let additionalStyle: React.CSSProperties = {};\n\n if (isActive && effect) {\n glowClass = ` ${getTextEffectClass(effect)}`;\n additionalStyle = getTextEffectAdditionalStyle(effect);\n }\n\n // \uAE30\uBCF8 \uC2A4\uD0C0\uC77C \uC18D\uC131 \uCD94\uAC00 (\uBAA8\uB4E0 \uD6A8\uACFC\uC5D0 \uC801\uC6A9)\n const baseStyle: CSSProperties = {\n ...style,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n maxWidth: \"100%\",\n display: \"flex\",\n };\n\n className = `vfx-text-effect-container w-full h-full ${className}`.trim();\n if (glowClass) className += glowClass;\n\n // wave \uD6A8\uACFC\uC778 \uACBD\uC6B0 \uAE00\uC790\uBCC4 \uB80C\uB354\uB9C1\n if (effect === \"wave\" && isActive) {\n return (\n <div\n className={`vfx-text-effect-container w-full h-full ${className}`.trim()}\n style={{ ...baseStyle, ...style }}\n >\n <span className=\"vfx-text-wave-container\">\n {title.split(\"\").map((char, index) => (\n <span\n key={index}\n className=\"vfx-text-wave-char\"\n style={{\n animationDelay: `${index * 0.05}s`,\n }}\n >\n {char === \" \" ? \"\\u00A0\" : char}\n </span>\n ))}\n </span>\n </div>\n );\n }\n\n // fly-in \uD6A8\uACFC\uC778 \uACBD\uC6B0 \uAE00\uC790\uBCC4 \uB80C\uB354\uB9C1 (\uC67C\uCABD\uC5D0\uC11C \uB0A0\uC544\uC634)\n if (effect === \"fly-in\" && isActive) {\n return (\n <div\n className={`vfx-text-effect-container w-full h-full ${className}`.trim()}\n style={{ ...baseStyle, ...style, overflow: \"visible\" }}\n >\n <span className=\"vfx-text-fly-in-container\">\n {title.split(\"\").map((char, index) => (\n <span\n key={index}\n className=\"vfx-text-fly-in-char\"\n style={{\n animationDelay: `${index * 0.08}s`,\n }}\n >\n {char === \" \" ? \"\\u00A0\" : char}\n </span>\n ))}\n </span>\n </div>\n );\n }\n\n // spin-y \uD6A8\uACFC\uC778 \uACBD\uC6B0 \uC911\uC559 \uAE30\uC900 \uD68C\uC804\uC744 \uC704\uD55C wrapper \uC0AC\uC6A9\n if (effect === \"spin-y\" && isActive) {\n return (\n <div\n className={`vfx-text-effect-container w-full h-full ${className}`.trim()}\n style={{ ...baseStyle, ...style, overflow: \"visible\" }}\n >\n <div className=\"vfx-text-spin-y-wrapper\">\n <span className=\"vfx-text-spin-y\">{title}</span>\n </div>\n </div>\n );\n }\n\n // spin-center \uD6A8\uACFC\uC778 \uACBD\uC6B0 \uC911\uC559 \uAE30\uC900 Y\uCD95 \uAC00\uB85C \uD68C\uC804\uC744 \uC704\uD55C wrapper \uC0AC\uC6A9\n if (effect === \"spin-center\" && isActive) {\n return (\n <div\n className={`vfx-text-effect-container w-full h-full ${className}`.trim()}\n style={{ ...baseStyle, ...style, overflow: \"visible\" }}\n >\n <div className=\"vfx-text-spin-center-wrapper\">\n <span className=\"vfx-text-spin-center\">{title}</span>\n </div>\n </div>\n );\n }\n\n // \uD750\uB974\uB294 \uD6A8\uACFC\uC778 \uACBD\uC6B0 \uD2B9\uBCC4\uD55C \uB80C\uB354\uB9C1\n if (effect === \"flowing\" && isActive) {\n const duration = calculateFlowingDuration(title);\n\n return (\n <div\n className={className}\n style={{\n position: \"relative\",\n whiteSpace: \"nowrap\",\n height: \"auto\",\n }}\n >\n {/* \uBCF4\uC774\uC9C0 \uC54A\uB294 \uD14D\uC2A4\uD2B8\uB85C \uB192\uC774 \uD655\uBCF4 */}\n <div\n style={{\n visibility: \"hidden\",\n width: 0,\n overflow: \"hidden\",\n }}\n >\n {title}\n </div>\n\n <div\n className=\"vfx-text-flowing\"\n style={{\n display: \"inline-block\",\n position: \"absolute\",\n animationDuration: `${duration}s`,\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ ...baseStyle, ...getEffectStyle(), ...additionalStyle }}\n >\n {textToShow}\n {effect === \"typing\" && isActive && !isTypingComplete && (\n <span className=\"animate-pulse\">_</span>\n )}\n </div>\n );\n};\n", "/**\n * VfxDiv.tsx\n */\n\nimport React, { useEffect } from \"react\";\nimport { BorderEffectType, VfxDivProps } from \"./types\";\nimport {\n generateAllBorderEffectStyles,\n getBorderEffectClass,\n} from \"./effects/borders\";\n\nexport type { BorderEffectType, VfxDivProps };\n\n// CSS \uD0A4\uD504\uB808\uC784\uC744 \uCD94\uAC00\uD558\uB294 \uD568\uC218\n// eslint-disable-next-line\nexport const addBorderEffectStyles = () => {\n const styleId = \"border-effect-styles\";\n\n // \uC774\uBBF8 \uCD94\uAC00\uB41C \uC2A4\uD0C0\uC77C\uC774 \uC788\uB294\uC9C0 \uD655\uC778\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = generateAllBorderEffectStyles();\n document.head.appendChild(style);\n};\n\nexport const VfxDiv: React.FC<VfxDivProps> = ({\n borderEffect,\n children,\n className = \"\",\n style,\n ...divProps\n}) => {\n // CSS \uD0A4\uD504\uB808\uC784 \uCD94\uAC00\n useEffect(() => {\n addBorderEffectStyles();\n }, []);\n\n // \uD6A8\uACFC \uD074\uB798\uC2A4 \uACB0\uC815\n const effectClass = getBorderEffectClass(borderEffect);\n\n return (\n <div\n {...divProps}\n className={`vfx-div ${className} ${effectClass}`.trim()}\n style={{\n ...style,\n // \uAE30\uBCF8 box-shadow\uB97C \uBA85\uC2DC\uC801\uC73C\uB85C \uC81C\uAC70\n ...(borderEffect && { boxShadow: \"none\" }),\n }}\n >\n {children}\n </div>\n );\n};\n", "/**\n * border-effects/types.ts\n */\n\n/** \uBCF4\uB354 \uD6A8\uACFC \uC778\uD130\uD398\uC774\uC2A4 */\nexport interface BorderEffect {\n /** CSS \uD0A4\uD504\uB808\uC784 \uC815\uC758 */\n keyframes: string;\n /** CSS \uD074\uB798\uC2A4 \uC815\uC758 */\n className: string;\n}\n\n/** \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uD0C0\uC785 */\nexport type BorderEffectRegistry = {\n [key: string]: BorderEffect;\n};\n\n// \uBCF4\uB354 \uD6A8\uACFC \uC0C1\uC218\nexport const BORDER_GLOW_SPEED = \"2s\";\nexport const BORDER_GLOW_SIZE = 7;\nexport const BORDER_GLOW_RATIO = {\n BASE: 0,\n MEDIUM: 0,\n LARGE: 0,\n INTENSE_SMALL: 1,\n INTENSE_MEDIUM: 1.5,\n INTENSE_LARGE: 2,\n};\n", "/**\n * pulse.ts - \uD384\uC2A4 \uBCF4\uB354 \uD6A8\uACFC (6\uAC00\uC9C0 \uC0C9\uC0C1)\n */\n\nimport {\n BorderEffect,\n BORDER_GLOW_SIZE,\n BORDER_GLOW_RATIO,\n BORDER_GLOW_SPEED,\n} from \"./types\";\n\nexport const yellowPulseBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes yellowBorderGlow {\n 0%, 100% { \n box-shadow: none;\n }\n 50% { \n box-shadow: 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_SMALL\n }px rgba(255, 193, 7, 1), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_MEDIUM\n }px rgba(255, 193, 7, 0.8), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_LARGE\n }px rgba(255, 193, 7, 0.6);\n }\n }\n `,\n className: `\n .vfx-border-yellow-pulse {\n animation: yellowBorderGlow ${BORDER_GLOW_SPEED} ease-in-out infinite !important;\n }\n `,\n};\n\nexport const redPulseBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes redBorderGlow {\n 0%, 100% { \n box-shadow: none;\n }\n 50% { \n box-shadow: 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_SMALL\n }px rgba(244, 67, 54, 1), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_MEDIUM\n }px rgba(244, 67, 54, 0.8), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_LARGE\n }px rgba(244, 67, 54, 0.6);\n }\n }\n `,\n className: `\n .vfx-border-red-pulse {\n animation: redBorderGlow ${BORDER_GLOW_SPEED} ease-in-out infinite !important;\n }\n `,\n};\n\nexport const bluePulseBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes blueBorderGlow {\n 0%, 100% { \n box-shadow: none;\n }\n 50% { \n box-shadow: 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_SMALL\n }px rgba(33, 150, 243, 1), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_MEDIUM\n }px rgba(33, 150, 243, 0.8), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_LARGE\n }px rgba(33, 150, 243, 0.6);\n }\n }\n `,\n className: `\n .vfx-border-blue-pulse {\n animation: blueBorderGlow ${BORDER_GLOW_SPEED} ease-in-out infinite !important;\n }\n `,\n};\n\nexport const greenPulseBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes greenBorderGlow {\n 0%, 100% { \n box-shadow: none;\n }\n 50% { \n box-shadow: 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_SMALL\n }px rgba(76, 175, 80, 1), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_MEDIUM\n }px rgba(76, 175, 80, 0.8), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_LARGE\n }px rgba(76, 175, 80, 0.6);\n }\n }\n `,\n className: `\n .vfx-border-green-pulse {\n animation: greenBorderGlow ${BORDER_GLOW_SPEED} ease-in-out infinite !important;\n }\n `,\n};\n\nexport const pinkPulseBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes pinkBorderGlow {\n 0%, 100% { \n box-shadow: none;\n }\n 50% { \n box-shadow: 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_SMALL\n }px rgba(233, 30, 99, 1), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_MEDIUM\n }px rgba(233, 30, 99, 0.8), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_LARGE\n }px rgba(233, 30, 99, 0.6);\n }\n }\n `,\n className: `\n .vfx-border-pink-pulse {\n animation: pinkBorderGlow ${BORDER_GLOW_SPEED} ease-in-out infinite !important;\n }\n `,\n};\n\nexport const purplePulseBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes purpleBorderGlow {\n 0%, 100% { \n box-shadow: none;\n }\n 50% { \n box-shadow: 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_SMALL\n }px rgba(156, 39, 176, 1), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_MEDIUM\n }px rgba(156, 39, 176, 0.8), 0 0 ${\n BORDER_GLOW_SIZE * BORDER_GLOW_RATIO.INTENSE_LARGE\n }px rgba(156, 39, 176, 0.6);\n }\n }\n `,\n className: `\n .vfx-border-purple-pulse {\n animation: purpleBorderGlow ${BORDER_GLOW_SPEED} ease-in-out infinite !important;\n }\n `,\n};\n", "/**\n * sparkle.ts - \uC2A4\uD30C\uD074 \uBCF4\uB354 \uD6A8\uACFC (7\uAC00\uC9C0)\n */\n\nimport { BorderEffect } from \"./types\";\n\nexport const yellowSparkleBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes yellowSparkle {\n 0%, 100% { \n box-shadow: \n 0 0 6px rgba(255, 215, 0, 0.9),\n 3px -2px 8px rgba(255, 255, 0, 1),\n -2px 3px 8px rgba(255, 193, 7, 0.8);\n }\n 25% { \n box-shadow: \n 0 0 8px rgba(255, 255, 0, 1),\n -4px -3px 10px rgba(255, 215, 0, 0.8),\n 4px 2px 6px rgba(255, 193, 7, 0.9);\n }\n 50% { \n box-shadow: \n 0 0 5px rgba(255, 193, 7, 0.7),\n 2px 4px 10px rgba(255, 255, 0, 1),\n -3px -2px 8px rgba(255, 215, 0, 0.9);\n }\n 75% { \n box-shadow: \n 0 0 10px rgba(255, 215, 0, 1),\n -3px 2px 6px rgba(255, 193, 7, 0.8),\n 3px -4px 12px rgba(255, 255, 0, 1);\n }\n }\n `,\n className: `\n .vfx-border-yellow-sparkle {\n border: 2px solid rgba(255, 215, 0, 0.6);\n animation: yellowSparkle 0.8s ease-in-out infinite !important;\n }\n `,\n};\n\nexport const redSparkleBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes redSparkle {\n 0%, 100% { \n box-shadow: \n 0 0 6px rgba(255, 0, 0, 0.9),\n 3px -2px 8px rgba(255, 99, 71, 1),\n -2px 3px 8px rgba(220, 20, 60, 0.8);\n }\n 25% { \n box-shadow: \n 0 0 8px rgba(255, 99, 71, 1),\n -4px -3px 10px rgba(255, 0, 0, 0.8),\n 4px 2px 6px rgba(220, 20, 60, 0.9);\n }\n 50% { \n box-shadow: \n 0 0 5px rgba(220, 20, 60, 0.7),\n 2px 4px 10px rgba(255, 99, 71, 1),\n -3px -2px 8px rgba(255, 0, 0, 0.9);\n }\n 75% { \n box-shadow: \n 0 0 10px rgba(255, 0, 0, 1),\n -3px 2px 6px rgba(220, 20, 60, 0.8),\n 3px -4px 12px rgba(255, 99, 71, 1);\n }\n }\n `,\n className: `\n .vfx-border-red-sparkle {\n border: 2px solid rgba(255, 0, 0, 0.6);\n animation: redSparkle 0.8s ease-in-out infinite !important;\n }\n `,\n};\n\nexport const blueSparkleBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes blueSparkle {\n 0%, 100% { \n box-shadow: \n 0 0 6px rgba(0, 100, 255, 0.9),\n 3px -2px 8px rgba(30, 144, 255, 1),\n -2px 3px 8px rgba(65, 105, 225, 0.8);\n }\n 25% { \n box-shadow: \n 0 0 8px rgba(30, 144, 255, 1),\n -4px -3px 10px rgba(0, 100, 255, 0.8),\n 4px 2px 6px rgba(65, 105, 225, 0.9);\n }\n 50% { \n box-shadow: \n 0 0 5px rgba(65, 105, 225, 0.7),\n 2px 4px 10px rgba(30, 144, 255, 1),\n -3px -2px 8px rgba(0, 100, 255, 0.9);\n }\n 75% { \n box-shadow: \n 0 0 10px rgba(0, 100, 255, 1),\n -3px 2px 6px rgba(65, 105, 225, 0.8),\n 3px -4px 12px rgba(30, 144, 255, 1);\n }\n }\n `,\n className: `\n .vfx-border-blue-sparkle {\n border: 2px solid rgba(0, 100, 255, 0.6);\n animation: blueSparkle 0.8s ease-in-out infinite !important;\n }\n `,\n};\n\nexport const greenSparkleBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes greenSparkle {\n 0%, 100% { \n box-shadow: \n 0 0 6px rgba(0, 200, 0, 0.9),\n 3px -2px 8px rgba(50, 205, 50, 1),\n -2px 3px 8px rgba(34, 139, 34, 0.8);\n }\n 25% { \n box-shadow: \n 0 0 8px rgba(50, 205, 50, 1),\n -4px -3px 10px rgba(0, 200, 0, 0.8),\n 4px 2px 6px rgba(34, 139, 34, 0.9);\n }\n 50% { \n box-shadow: \n 0 0 5px rgba(34, 139, 34, 0.7),\n 2px 4px 10px rgba(50, 205, 50, 1),\n -3px -2px 8px rgba(0, 200, 0, 0.9);\n }\n 75% { \n box-shadow: \n 0 0 10px rgba(0, 200, 0, 1),\n -3px 2px 6px rgba(34, 139, 34, 0.8),\n 3px -4px 12px rgba(50, 205, 50, 1);\n }\n }\n `,\n className: `\n .vfx-border-green-sparkle {\n border: 2px solid rgba(0, 200, 0, 0.6);\n animation: greenSparkle 0.8s ease-in-out infinite !important;\n }\n `,\n};\n\nexport const pinkSparkleBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes pinkSparkle {\n 0%, 100% { \n box-shadow: \n 0 0 6px rgba(255, 20, 147, 0.9),\n 3px -2px 8px rgba(255, 105, 180, 1),\n -2px 3px 8px rgba(219, 112, 147, 0.8);\n }\n 25% { \n box-shadow: \n 0 0 8px rgba(255, 105, 180, 1),\n -4px -3px 10px rgba(255, 20, 147, 0.8),\n 4px 2px 6px rgba(219, 112, 147, 0.9);\n }\n 50% { \n box-shadow: \n 0 0 5px rgba(219, 112, 147, 0.7),\n 2px 4px 10px rgba(255, 105, 180, 1),\n -3px -2px 8px rgba(255, 20, 147, 0.9);\n }\n 75% { \n box-shadow: \n 0 0 10px rgba(255, 20, 147, 1),\n -3px 2px 6px rgba(219, 112, 147, 0.8),\n 3px -4px 12px rgba(255, 105, 180, 1);\n }\n }\n `,\n className: `\n .vfx-border-pink-sparkle {\n border: 2px solid rgba(255, 20, 147, 0.6);\n animation: pinkSparkle 0.8s ease-in-out infinite !important;\n }\n `,\n};\n\nexport const purpleSparkleBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes purpleSparkle {\n 0%, 100% { \n box-shadow: \n 0 0 6px rgba(138, 43, 226, 0.9),\n 3px -2px 8px rgba(148, 0, 211, 1),\n -2px 3px 8px rgba(128, 0, 128, 0.8);\n }\n 25% { \n box-shadow: \n 0 0 8px rgba(148, 0, 211, 1),\n -4px -3px 10px rgba(138, 43, 226, 0.8),\n 4px 2px 6px rgba(128, 0, 128, 0.9);\n }\n 50% { \n box-shadow: \n 0 0 5px rgba(128, 0, 128, 0.7),\n 2px 4px 10px rgba(148, 0, 211, 1),\n -3px -2px 8px rgba(138, 43, 226, 0.9);\n }\n 75% { \n box-shadow: \n 0 0 10px rgba(138, 43, 226, 1),\n -3px 2px 6px rgba(128, 0, 128, 0.8),\n 3px -4px 12px rgba(148, 0, 211, 1);\n }\n }\n `,\n className: `\n .vfx-border-purple-sparkle {\n border: 2px solid rgba(138, 43, 226, 0.6);\n animation: purpleSparkle 0.8s ease-in-out infinite !important;\n }\n `,\n};\n\nexport const rainbowSparkleBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes borderRainbowSparkle {\n 0%, 100% { \n box-shadow: \n 0 0 5px #fff,\n 2px -2px 8px #ff0,\n -2px 2px 8px #0ff;\n }\n 25% { \n box-shadow: \n 0 0 8px #fff,\n -3px -1px 10px #f0f,\n 3px 1px 10px #0f0;\n }\n 50% { \n box-shadow: \n 0 0 5px #fff,\n 1px 3px 8px #ff0,\n -1px -3px 8px #f00;\n }\n 75% { \n box-shadow: \n 0 0 10px #fff,\n -2px 2px 12px #0ff,\n 2px -2px 12px #f0f;\n }\n }\n `,\n className: `\n .vfx-border-rainbow-sparkle {\n border: 2px solid rgba(255, 255, 255, 0.6);\n animation: borderRainbowSparkle 1s ease-in-out infinite !important;\n }\n `,\n};\n", "/**\n * dash-flow.ts - \uC810\uC120 \uD750\uB984 \uBCF4\uB354 \uD6A8\uACFC (6\uAC00\uC9C0 \uC0C9\uC0C1)\n */\n\nimport { BorderEffect } from \"./types\";\n\nconst dashFlowKeyframes = `\n @keyframes dashFlowHorizontal {\n 0% { background-position: 0 0, 0 100%; }\n 100% { background-position: 100% 0, 100% 100%; }\n }\n @keyframes dashFlowVertical {\n 0% { background-position: 0 0, 100% 0; }\n 100% { background-position: 0 100%, 100% 100%; }\n }\n`;\n\nconst createDashFlowClass = (color: string, colorHex: string): string => `\n .vfx-border-${color}-dash-flow {\n position: relative;\n border: none !important;\n }\n .vfx-border-${color}-dash-flow::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n background: \n linear-gradient(90deg, ${colorHex} 50%, transparent 50%) 0 0,\n linear-gradient(90deg, transparent 50%, ${colorHex} 50%) 0 100%;\n background-size: 20px 2px, 20px 2px;\n background-repeat: repeat-x, repeat-x;\n animation: dashFlowHorizontal 3s linear infinite;\n pointer-events: none;\n }\n .vfx-border-${color}-dash-flow::after {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n background: \n linear-gradient(0deg, ${colorHex} 50%, transparent 50%) 0 0,\n linear-gradient(0deg, transparent 50%, ${colorHex} 50%) 100% 0;\n background-size: 2px 20px, 2px 20px;\n background-repeat: repeat-y, repeat-y;\n animation: dashFlowVertical 2s linear infinite;\n pointer-events: none;\n }\n`;\n\nexport const yellowDashFlowBorderEffect: BorderEffect = {\n keyframes: dashFlowKeyframes,\n className: createDashFlowClass(\"yellow\", \"#ffc107\"),\n};\n\nexport const redDashFlowBorderEffect: BorderEffect = {\n keyframes: \"\", // \uACF5\uC720 keyframes\uB294 \uCCAB \uBC88\uC9F8\uC5D0\uB9CC\n className: createDashFlowClass(\"red\", \"#f44336\"),\n};\n\nexport const blueDashFlowBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: createDashFlowClass(\"blue\", \"#2196f3\"),\n};\n\nexport const greenDashFlowBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: createDashFlowClass(\"green\", \"#4caf50\"),\n};\n\nexport const pinkDashFlowBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: createDashFlowClass(\"pink\", \"#e91e63\"),\n};\n\nexport const purpleDashFlowBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: createDashFlowClass(\"purple\", \"#9c27b0\"),\n};\n", "/**\n * dash-rotate.ts - \uC810\uC120 \uD68C\uC804 \uBCF4\uB354 \uD6A8\uACFC (7\uAC00\uC9C0)\n */\n\nimport { BorderEffect } from \"./types\";\n\nconst dashRotateBaseKeyframes = `\n @keyframes dashRotateAnim {\n from { transform: translate(-50%, -50%) rotate(0deg); }\n to { transform: translate(-50%, -50%) rotate(360deg); }\n }\n`;\n\nconst dashRotateBaseClasses = `\n .vfx-border-yellow-dash-rotate, .vfx-border-red-dash-rotate, .vfx-border-blue-dash-rotate,\n .vfx-border-green-dash-rotate, .vfx-border-pink-dash-rotate, .vfx-border-purple-dash-rotate,\n .vfx-border-rainbow-dash-rotate {\n position: relative;\n border: none !important;\n overflow: hidden;\n }\n .vfx-border-yellow-dash-rotate::before, .vfx-border-red-dash-rotate::before, .vfx-border-blue-dash-rotate::before,\n .vfx-border-green-dash-rotate::before, .vfx-border-pink-dash-rotate::before, .vfx-border-purple-dash-rotate::before,\n .vfx-border-rainbow-dash-rotate::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: 150%;\n height: 150%;\n animation: dashRotateAnim 2s linear infinite;\n z-index: 0;\n }\n .vfx-border-yellow-dash-rotate::after, .vfx-border-red-dash-rotate::after, .vfx-border-blue-dash-rotate::after,\n .vfx-border-green-dash-rotate::after, .vfx-border-pink-dash-rotate::after, .vfx-border-purple-dash-rotate::after,\n .vfx-border-rainbow-dash-rotate::after {\n content: '';\n position: absolute;\n top: 3px;\n left: 3px;\n right: 3px;\n bottom: 3px;\n background: #e0e0e0;\n border-radius: inherit;\n z-index: 1;\n }\n .vfx-border-yellow-dash-rotate > *, .vfx-border-red-dash-rotate > *, .vfx-border-blue-dash-rotate > *,\n .vfx-border-green-dash-rotate > *, .vfx-border-pink-dash-rotate > *, .vfx-border-purple-dash-rotate > *,\n .vfx-border-rainbow-dash-rotate > * {\n position: relative;\n z-index: 2;\n }\n`;\n\nconst createDashRotateGradient = (colorHex: string): string => `\n background: conic-gradient(\n from 0deg,\n ${colorHex} 0deg 30deg, transparent 30deg 60deg,\n ${colorHex} 60deg 90deg, transparent 90deg 120deg,\n ${colorHex} 120deg 150deg, transparent 150deg 180deg,\n ${colorHex} 180deg 210deg, transparent 210deg 240deg,\n ${colorHex} 240deg 270deg, transparent 270deg 300deg,\n ${colorHex} 300deg 330deg, transparent 330deg 360deg\n );\n`;\n\nexport const yellowDashRotateBorderEffect: BorderEffect = {\n keyframes: dashRotateBaseKeyframes,\n className: `\n ${dashRotateBaseClasses}\n .vfx-border-yellow-dash-rotate::before {\n ${createDashRotateGradient(\"#ffc107\")}\n }\n `,\n};\n\nexport const redDashRotateBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: `\n .vfx-border-red-dash-rotate::before {\n ${createDashRotateGradient(\"#f44336\")}\n }\n `,\n};\n\nexport const blueDashRotateBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: `\n .vfx-border-blue-dash-rotate::before {\n ${createDashRotateGradient(\"#2196f3\")}\n }\n `,\n};\n\nexport const greenDashRotateBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: `\n .vfx-border-green-dash-rotate::before {\n ${createDashRotateGradient(\"#4caf50\")}\n }\n `,\n};\n\nexport const pinkDashRotateBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: `\n .vfx-border-pink-dash-rotate::before {\n ${createDashRotateGradient(\"#e91e63\")}\n }\n `,\n};\n\nexport const purpleDashRotateBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: `\n .vfx-border-purple-dash-rotate::before {\n ${createDashRotateGradient(\"#9c27b0\")}\n }\n `,\n};\n\nexport const rainbowDashRotateBorderEffect: BorderEffect = {\n keyframes: \"\",\n className: `\n .vfx-border-rainbow-dash-rotate::before {\n background: conic-gradient(\n from 0deg,\n #ff0000 0deg 30deg, transparent 30deg 60deg,\n #ff8000 60deg 90deg, transparent 90deg 120deg,\n #ffff00 120deg 150deg, transparent 150deg 180deg,\n #00ff00 180deg 210deg, transparent 210deg 240deg,\n #00ffff 240deg 270deg, transparent 270deg 300deg,\n #ff00ff 300deg 330deg, transparent 330deg 360deg\n );\n }\n `,\n};\n", "/**\n * special.ts - \uD2B9\uC218 \uBCF4\uB354 \uD6A8\uACFC (rainbow, breathe, electric)\n */\n\nimport { BorderEffect } from \"./types\";\n\nexport const rainbowBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes borderRainbow {\n 0% { \n border-color: #ff0000;\n box-shadow: 0 0 10px #ff0000;\n }\n 16% { \n border-color: #ff8000;\n box-shadow: 0 0 10px #ff8000;\n }\n 33% { \n border-color: #ffff00;\n box-shadow: 0 0 10px #ffff00;\n }\n 50% { \n border-color: #00ff00;\n box-shadow: 0 0 10px #00ff00;\n }\n 66% { \n border-color: #0080ff;\n box-shadow: 0 0 10px #0080ff;\n }\n 83% { \n border-color: #8000ff;\n box-shadow: 0 0 10px #8000ff;\n }\n 100% { \n border-color: #ff0000;\n box-shadow: 0 0 10px #ff0000;\n }\n }\n `,\n className: `\n .vfx-border-rainbow {\n border: 2px solid #ff0000;\n animation: borderRainbow 3s linear infinite !important;\n }\n `,\n};\n\nexport const breatheBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes borderBreathe {\n 0%, 100% { \n transform: scale(1);\n box-shadow: 0 0 5px rgba(255, 255, 255, 0.3);\n }\n 50% { \n transform: scale(1.05);\n box-shadow: 0 0 20px rgba(255, 255, 255, 0.7);\n }\n }\n `,\n className: `\n .vfx-border-breathe {\n border: 2px solid rgba(255, 255, 255, 0.5);\n animation: borderBreathe 3s ease-in-out infinite !important;\n }\n `,\n};\n\nexport const electricBorderEffect: BorderEffect = {\n keyframes: `\n @keyframes borderElectric {\n 0%, 100% { \n box-shadow: \n 0 0 5px #fff,\n 0 0 10px #ff0,\n 0 0 15px #ff0;\n }\n 25% { \n box-shadow: \n 2px -2px 5px #fff,\n 4px 0 10px #ffff00,\n -2px 3px 15px #ffa500;\n }\n 50% { \n box-shadow: \n -3px 2px 5px #fff,\n 0 -4px 10px #ffff00,\n 3px -2px 15px #ff0;\n }\n 75% { \n box-shadow: \n 3px 3px 5px #fff,\n -3px 2px 10px #ffa500,\n 2px 4px 15px #ffff00;\n }\n }\n `,\n className: `\n .vfx-border-electric {\n border: 2px solid #ffff00;\n animation: borderElectric 0.15s ease-in-out infinite !important;\n }\n `,\n};\n", "/**\n * border-effects/index.ts - \uBCF4\uB354 \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\n */\n\nimport { BorderEffect, BorderEffectRegistry } from \"./types\";\nimport {\n yellowPulseBorderEffect,\n redPulseBorderEffect,\n bluePulseBorderEffect,\n greenPulseBorderEffect,\n pinkPulseBorderEffect,\n purplePulseBorderEffect,\n} from \"./pulse\";\nimport {\n yellowSparkleBorderEffect,\n redSparkleBorderEffect,\n blueSparkleBorderEffect,\n greenSparkleBorderEffect,\n pinkSparkleBorderEffect,\n purpleSparkleBorderEffect,\n rainbowSparkleBorderEffect,\n} from \"./sparkle\";\nimport {\n yellowDashFlowBorderEffect,\n redDashFlowBorderEffect,\n blueDashFlowBorderEffect,\n greenDashFlowBorderEffect,\n pinkDashFlowBorderEffect,\n purpleDashFlowBorderEffect,\n} from \"./dash-flow\";\nimport {\n yellowDashRotateBorderEffect,\n redDashRotateBorderEffect,\n blueDashRotateBorderEffect,\n greenDashRotateBorderEffect,\n pinkDashRotateBorderEffect,\n purpleDashRotateBorderEffect,\n rainbowDashRotateBorderEffect,\n} from \"./dash-rotate\";\nimport {\n rainbowBorderEffect,\n breatheBorderEffect,\n electricBorderEffect,\n} from \"./special\";\n\nexport type { BorderEffect, BorderEffectRegistry };\nexport * from \"./types\";\n\n// \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\nexport const borderEffectRegistry: BorderEffectRegistry = {\n // Pulse \uD6A8\uACFC\n \"yellow-pulse\": yellowPulseBorderEffect,\n \"red-pulse\": redPulseBorderEffect,\n \"blue-pulse\": bluePulseBorderEffect,\n \"green-pulse\": greenPulseBorderEffect,\n \"pink-pulse\": pinkPulseBorderEffect,\n \"purple-pulse\": purplePulseBorderEffect,\n // Sparkle \uD6A8\uACFC\n \"yellow-sparkle\": yellowSparkleBorderEffect,\n \"red-sparkle\": redSparkleBorderEffect,\n \"blue-sparkle\": blueSparkleBorderEffect,\n \"green-sparkle\": greenSparkleBorderEffect,\n \"pink-sparkle\": pinkSparkleBorderEffect,\n \"purple-sparkle\": purpleSparkleBorderEffect,\n \"rainbow-sparkle\": rainbowSparkleBorderEffect,\n // Dash Flow \uD6A8\uACFC\n \"yellow-dash-flow\": yellowDashFlowBorderEffect,\n \"red-dash-flow\": redDashFlowBorderEffect,\n \"blue-dash-flow\": blueDashFlowBorderEffect,\n \"green-dash-flow\": greenDashFlowBorderEffect,\n \"pink-dash-flow\": pinkDashFlowBorderEffect,\n \"purple-dash-flow\": purpleDashFlowBorderEffect,\n // Dash Rotate \uD6A8\uACFC\n \"yellow-dash-rotate\": yellowDashRotateBorderEffect,\n \"red-dash-rotate\": redDashRotateBorderEffect,\n \"blue-dash-rotate\": blueDashRotateBorderEffect,\n \"green-dash-rotate\": greenDashRotateBorderEffect,\n \"pink-dash-rotate\": pinkDashRotateBorderEffect,\n \"purple-dash-rotate\": purpleDashRotateBorderEffect,\n \"rainbow-dash-rotate\": rainbowDashRotateBorderEffect,\n // Special \uD6A8\uACFC\n rainbow: rainbowBorderEffect,\n breathe: breatheBorderEffect,\n electric: electricBorderEffect,\n};\n\n// \uBAA8\uB4E0 CSS \uC2A4\uD0C0\uC77C \uC0DD\uC131\nexport const generateAllBorderEffectStyles = (): string => {\n const styles: string[] = [];\n\n // \uAC01 \uD6A8\uACFC\uC758 keyframes\uC640 className \uCD94\uAC00\n Object.values(borderEffectRegistry).forEach((effect) => {\n if (effect.keyframes) {\n styles.push(effect.keyframes);\n }\n styles.push(effect.className);\n });\n\n return styles.join(\"\\n\");\n};\n\n// \uD6A8\uACFC\uC5D0 \uB530\uB978 CSS \uD074\uB798\uC2A4 \uBC18\uD658\nexport const getBorderEffectClass = (effect: string | undefined): string => {\n if (!effect) return \"\";\n return `vfx-border-${effect}`;\n};\n\n// \uAC1C\uBCC4 \uD6A8\uACFC \uB0B4\uBCF4\uB0B4\uAE30\nexport {\n // Pulse\n yellowPulseBorderEffect,\n redPulseBorderEffect,\n bluePulseBorderEffect,\n greenPulseBorderEffect,\n pinkPulseBorderEffect,\n purplePulseBorderEffect,\n // Sparkle\n yellowSparkleBorderEffect,\n redSparkleBorderEffect,\n blueSparkleBorderEffect,\n greenSparkleBorderEffect,\n pinkSparkleBorderEffect,\n purpleSparkleBorderEffect,\n rainbowSparkleBorderEffect,\n // Dash Flow\n yellowDashFlowBorderEffect,\n redDashFlowBorderEffect,\n blueDashFlowBorderEffect,\n greenDashFlowBorderEffect,\n pinkDashFlowBorderEffect,\n purpleDashFlowBorderEffect,\n // Dash Rotate\n yellowDashRotateBorderEffect,\n redDashRotateBorderEffect,\n blueDashRotateBorderEffect,\n greenDashRotateBorderEffect,\n pinkDashRotateBorderEffect,\n purpleDashRotateBorderEffect,\n rainbowDashRotateBorderEffect,\n // Special\n rainbowBorderEffect,\n breatheBorderEffect,\n electricBorderEffect,\n};\n", "/**\n * VfxParticle.tsx\n */\n\nimport React, { useRef, useEffect, useCallback } from \"react\";\nimport { ParticleEffectType, ParticleOptions, VfxParticleProps } from \"./types\";\nimport {\n Particle,\n EffectRefs,\n effectRegistry,\n getDefaultColors,\n} from \"./effects/particles\";\n\nexport type { ParticleEffectType, ParticleOptions, VfxParticleProps };\n\nexport const VfxParticle: React.FC<VfxParticleProps> = ({\n effect,\n isActive = true,\n options = {},\n width = \"100%\",\n height = \"100%\",\n className = \"\",\n style = {},\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const particlesRef = useRef<Particle[]>([]);\n const animationRef = useRef<number>();\n const effectRefsRef = useRef<EffectRefs>({\n fireworksBurst: { x: 0, y: 0, frame: 0 },\n explosionBurst: { x: 0, y: 0, frame: 0 },\n });\n\n const effectModule = effectRegistry[effect];\n\n const {\n count = effectModule?.defaultCount ?? 30,\n speed = 1,\n size = 4,\n colors = getDefaultColors(effect),\n opacity = 1,\n } = options;\n\n const createParticle = useCallback(\n (canvas: HTMLCanvasElement, isInitial: boolean = false): Particle => {\n const color = colors[Math.floor(Math.random() * colors.length)];\n\n if (effectModule) {\n return effectModule.create(\n canvas,\n color,\n speed,\n size,\n opacity,\n isInitial,\n effectRefsRef.current\n );\n }\n\n // \uAE30\uBCF8 \uD30C\uD2F0\uD074 (\uD6A8\uACFC \uBAA8\uB4C8\uC774 \uC5C6\uB294 \uACBD\uC6B0)\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: 0,\n vy: 0,\n size: Math.random() * size + 1,\n color,\n opacity: Math.random() * opacity,\n life: Math.random() * 60,\n maxLife: 60 + Math.random() * 60,\n };\n },\n [effect, speed, size, colors, opacity, effectModule]\n );\n\n const drawParticle = useCallback(\n (ctx: CanvasRenderingContext2D, particle: Particle) => {\n if (effectModule) {\n effectModule.draw(ctx, particle);\n return;\n }\n\n // \uAE30\uBCF8 \uADF8\uB9AC\uAE30 (\uD6A8\uACFC \uBAA8\uB4C8\uC774 \uC5C6\uB294 \uACBD\uC6B0)\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n ctx.fillStyle = particle.color;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n },\n [effectModule]\n );\n\n const updateParticle = useCallback(\n (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n if (effectModule) {\n return effectModule.update(particle, canvas, speed);\n }\n\n // \uAE30\uBCF8 \uC5C5\uB370\uC774\uD2B8 (\uD6A8\uACFC \uBAA8\uB4C8\uC774 \uC5C6\uB294 \uACBD\uC6B0)\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n return particle.life < particle.maxLife;\n },\n [effectModule, speed]\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || !isActive) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // \uCE94\uBC84\uC2A4 \uD06C\uAE30 \uC124\uC815\n const resizeCanvas = () => {\n const rect = canvas.getBoundingClientRect();\n canvas.width = rect.width;\n canvas.height = rect.height;\n };\n resizeCanvas();\n window.addEventListener(\"resize\", resizeCanvas);\n\n // \uCD08\uAE30 \uD30C\uD2F0\uD074 \uC0DD\uC131\n particlesRef.current = Array.from({ length: count }, () =>\n createParticle(canvas, true)\n );\n\n const animate = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // \uD30C\uD2F0\uD074 \uC5C5\uB370\uC774\uD2B8 \uBC0F \uADF8\uB9AC\uAE30\n particlesRef.current = particlesRef.current.filter((particle) => {\n const alive = updateParticle(particle, canvas);\n if (alive) {\n drawParticle(ctx, particle);\n }\n return alive;\n });\n\n // \uC8FD\uC740 \uD30C\uD2F0\uD074 \uB300\uCCB4\n if (effect === \"fireworks\") {\n // \uBD88\uAF43\uB180\uC774: \uD30C\uD2F0\uD074\uC774 \uB9CE\uC774 \uC8FD\uC5C8\uC744 \uB54C \uD55C\uAEBC\uBC88\uC5D0 \uBC84\uC2A4\uD2B8 \uC0DD\uC131\n if (particlesRef.current.length < count * 0.3) {\n // \uC0C8\uB85C\uC6B4 \uBC84\uC2A4\uD2B8 \uC9C0\uC810 \uC124\uC815\n if (effectRefsRef.current.fireworksBurst) {\n effectRefsRef.current.fireworksBurst.frame = 0;\n }\n // \uD55C\uAEBC\uBC88\uC5D0 \uBAA8\uB4E0 \uD30C\uD2F0\uD074 \uC0DD\uC131\n while (particlesRef.current.length < count) {\n particlesRef.current.push(createParticle(canvas));\n }\n }\n } else if (effect === \"explosion\") {\n // \uD3ED\uBC1C: \uD30C\uD2F0\uD074\uC774 \uB9CE\uC774 \uC8FD\uC5C8\uC744 \uB54C \uD55C\uAEBC\uBC88\uC5D0 \uD3ED\uBC1C\n if (particlesRef.current.length < count * 0.3) {\n // \uC0C8\uB85C\uC6B4 \uD3ED\uBC1C \uC9C0\uC810 \uC124\uC815\n if (effectRefsRef.current.explosionBurst) {\n effectRefsRef.current.explosionBurst.frame = 0;\n }\n // \uD55C\uAEBC\uBC88\uC5D0 \uBAA8\uB4E0 \uD30C\uD2F0\uD074 \uC0DD\uC131\n while (particlesRef.current.length < count) {\n particlesRef.current.push(createParticle(canvas));\n }\n }\n } else {\n // \uB2E4\uB978 \uD6A8\uACFC\uB4E4: \uAE30\uC874\uCC98\uB7FC \uD558\uB098\uC529 \uAD50\uCCB4\n while (particlesRef.current.length < count) {\n particlesRef.current.push(createParticle(canvas));\n }\n }\n\n animationRef.current = requestAnimationFrame(animate);\n };\n\n animate();\n\n return () => {\n window.removeEventListener(\"resize\", resizeCanvas);\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }, [isActive, count, effect, createParticle, updateParticle, drawParticle]);\n\n return (\n <canvas\n ref={canvasRef}\n className={`vfx-particle ${className}`}\n style={{\n width,\n height,\n display: \"block\",\n pointerEvents: \"none\",\n ...style,\n }}\n />\n );\n};\n", "/**\n * Sparkle Effect - \uBC18\uC9DD\uC784 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const sparkleEffect: ParticleEffect = {\n defaultColors: [\"#FFD700\", \"#FFA500\", \"#FFFF00\", \"#FFFFFF\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: (Math.random() - 0.5) * speed,\n vy: (Math.random() - 0.5) * speed,\n size: Math.random() * size + 1,\n color,\n opacity: Math.random() * opacity,\n life: 0,\n maxLife: 60 + Math.random() * 60,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n // 4\uAC01 \uBCC4 \uBAA8\uC591\n ctx.fillStyle = particle.color;\n ctx.translate(particle.x, particle.y);\n ctx.beginPath();\n for (let i = 0; i < 4; i++) {\n ctx.rotate(Math.PI / 2);\n ctx.lineTo(0, particle.size);\n ctx.lineTo(particle.size / 3, particle.size / 3);\n }\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // \uBC18\uC9DD\uAC70\uB9AC\uB294 \uD6A8\uACFC\n particle.opacity = Math.sin(\n (particle.life / particle.maxLife) * Math.PI\n );\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Confetti Effect - \uC0C9\uC885\uC774 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const confettiEffect: ParticleEffect = {\n defaultColors: [\n \"#FF6B6B\",\n \"#4ECDC4\",\n \"#45B7D1\",\n \"#96CEB4\",\n \"#FFEAA7\",\n \"#DDA0DD\",\n ],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: -10,\n vx: (Math.random() - 0.5) * speed * 2,\n vy: Math.random() * speed * 2 + 1,\n size: Math.random() * size + 3,\n color,\n opacity,\n life: 0,\n maxLife: 200,\n rotation: Math.random() * 360,\n rotationSpeed: (Math.random() - 0.5) * 10,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.translate(particle.x, particle.y);\n ctx.rotate(((particle.rotation || 0) * Math.PI) / 180);\n ctx.fillStyle = particle.color;\n ctx.fillRect(\n -particle.size / 2,\n -particle.size / 4,\n particle.size,\n particle.size / 2\n );\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n if (\n particle.rotation !== undefined &&\n particle.rotationSpeed !== undefined\n ) {\n particle.rotation += particle.rotationSpeed;\n }\n\n particle.vy += 0.05; // \uC911\uB825\n particle.vx *= 0.99; // \uACF5\uAE30 \uC800\uD56D\n return particle.y < canvas.height + 20;\n },\n};\n", "/**\n * Snow Effect - \uB208 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const snowEffect: ParticleEffect = {\n defaultColors: [\"#FFFFFF\", \"#E8E8E8\", \"#F0F8FF\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: isInitial ? Math.random() * canvas.height : -10,\n vx: (Math.random() - 0.5) * speed * 0.5,\n vy: Math.random() * speed + 0.5,\n size: Math.random() * size + 1,\n color,\n opacity: Math.random() * 0.5 + 0.5,\n life: 0,\n maxLife: 300,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.fillStyle = particle.color;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.vx = Math.sin(particle.life * 0.02) * 0.5; // \uC88C\uC6B0 \uD754\uB4E4\uB9BC\n return particle.y < canvas.height + 10;\n },\n};\n", "/**\n * Firefly Effect - \uBC18\uB527\uBD88\uC774 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const fireflyEffect: ParticleEffect = {\n defaultColors: [\"#FFFF00\", \"#ADFF2F\", \"#7FFF00\", \"#00FF7F\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: (Math.random() - 0.5) * speed * 0.5,\n vy: (Math.random() - 0.5) * speed * 0.5,\n size: Math.random() * size + 2,\n color,\n opacity: 0,\n life: 0,\n maxLife: 100 + Math.random() * 100,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n const gradient = ctx.createRadialGradient(\n particle.x,\n particle.y,\n 0,\n particle.x,\n particle.y,\n particle.size * 2\n );\n gradient.addColorStop(0, particle.color);\n gradient.addColorStop(1, \"transparent\");\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size * 2, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (\n particle: Particle,\n canvas: HTMLCanvasElement,\n speed: number\n ): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // \uBD80\uB4DC\uB7FD\uAC8C \uBC1D\uC544\uC84C\uB2E4 \uC5B4\uB450\uC6CC\uC9C0\uB294 \uD6A8\uACFC\n particle.opacity =\n Math.sin((particle.life / particle.maxLife) * Math.PI) * 0.8;\n // \uB79C\uB364\uD558\uAC8C \uBC29\uD5A5 \uBCC0\uACBD\n if (Math.random() < 0.02) {\n particle.vx = (Math.random() - 0.5) * speed * 0.5;\n particle.vy = (Math.random() - 0.5) * speed * 0.5;\n }\n // \uD654\uBA74 \uACBD\uACC4 \uCC98\uB9AC\n if (particle.x < 0) particle.x = canvas.width;\n if (particle.x > canvas.width) particle.x = 0;\n if (particle.y < 0) particle.y = canvas.height;\n if (particle.y > canvas.height) particle.y = 0;\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Bubbles Effect - \uAC70\uD488 \uD6A8\uACFC\n * (bubbles-color, bubbles-yellow, bubbles-pink, bubbles-blue, bubbles-green \uD1B5\uD569)\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const bubblesEffect: ParticleEffect = {\n defaultColors: [\"#87CEEB\", \"#ADD8E6\", \"#FF69B4\", \"#98FB98\", \"#DDA0DD\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: canvas.height + 10,\n vx: (Math.random() - 0.5) * speed * 0.3,\n vy: -(Math.random() * speed + 0.5),\n size: Math.random() * size * 2 + 3,\n color,\n opacity: Math.random() * 0.4 + 0.2,\n life: 0,\n maxLife: 200,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.strokeStyle = particle.color;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n ctx.stroke();\n // \uD558\uC774\uB77C\uC774\uD2B8\n ctx.fillStyle = \"rgba(255,255,255,0.3)\";\n ctx.beginPath();\n ctx.arc(\n particle.x - particle.size / 3,\n particle.y - particle.size / 3,\n particle.size / 4,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.vx = Math.sin(particle.life * 0.03) * 0.3; // \uC88C\uC6B0 \uD754\uB4E4\uB9BC\n return particle.y > -particle.size * 2;\n },\n};\n", "/**\n * Stars Effect - \uBCC4 \uD6A8\uACFC\n * (stars, stars-color \uD1B5\uD569)\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const starsEffect: ParticleEffect = {\n defaultColors: [\"#FFFFFF\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n _speed: number,\n size: number,\n opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: 0,\n vy: 0,\n size: Math.random() * size + 1,\n color,\n opacity: Math.random() * opacity,\n life: Math.random() * 60,\n maxLife: 60 + Math.random() * 60,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n // 5\uAC01 \uBCC4 \uBAA8\uC591\n ctx.fillStyle = particle.color;\n ctx.translate(particle.x, particle.y);\n ctx.beginPath();\n for (let i = 0; i < 5; i++) {\n ctx.lineTo(\n Math.cos(((18 + i * 72) * Math.PI) / 180) * particle.size,\n -Math.sin(((18 + i * 72) * Math.PI) / 180) * particle.size\n );\n ctx.lineTo(\n Math.cos(((54 + i * 72) * Math.PI) / 180) * particle.size * 0.5,\n -Math.sin(((54 + i * 72) * Math.PI) / 180) * particle.size * 0.5\n );\n }\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // \uBCC4 \uAE5C\uBE61\uC784\n particle.opacity = Math.sin(\n (particle.life / particle.maxLife) * Math.PI\n );\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Rain Effect - \uBE44 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const rainEffect: ParticleEffect = {\n defaultColors: [\"#87CEEB\", \"#ADD8E6\", \"#6495ED\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n _size: number,\n _opacity: number,\n isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: isInitial ? Math.random() * canvas.height : -10,\n vx: -speed * 0.1,\n vy: speed * 3 + Math.random() * 2,\n size: Math.random() * 0.5 + 0.5,\n color,\n opacity: Math.random() * 0.4 + 0.2,\n life: 0,\n maxLife: 200,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.strokeStyle = particle.color;\n ctx.lineWidth = particle.size;\n ctx.lineCap = \"round\";\n ctx.beginPath();\n ctx.moveTo(particle.x, particle.y);\n ctx.lineTo(particle.x + 1, particle.y + 20);\n ctx.stroke();\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n return particle.y < canvas.height + 20;\n },\n};\n", "/**\n * Leaves Effect - \uB099\uC5FD \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const leavesEffect: ParticleEffect = {\n defaultColors: [\n \"#8B4513\",\n \"#D2691E\",\n \"#CD853F\",\n \"#DEB887\",\n \"#F4A460\",\n \"#FF4500\",\n \"#FF6347\",\n \"#DC143C\",\n \"#FFD700\",\n \"#FFA500\",\n ],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: isInitial ? Math.random() * canvas.height : -20,\n vx: (Math.random() - 0.5) * speed * 0.3,\n vy: Math.random() * speed * 0.3 + 0.3,\n size: Math.random() * size + 5,\n color,\n opacity: Math.random() * 0.5 + 0.5,\n life: 0,\n maxLife: 300,\n rotation: Math.random() * 360,\n rotationSpeed: (Math.random() - 0.5) * 3,\n leafType: Math.floor(Math.random() * 3),\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.translate(particle.x, particle.y);\n ctx.rotate(((particle.rotation || 0) * Math.PI) / 180);\n ctx.fillStyle = particle.color;\n\n const leafSize = particle.size;\n const leafType = particle.leafType || 0;\n\n if (leafType === 0) {\n // \uD0C0\uC6D0\uD615 \uC78E\n ctx.beginPath();\n ctx.ellipse(0, 0, leafSize, leafSize / 2, 0, 0, Math.PI * 2);\n ctx.fill();\n // \uC78E\uB9E5\n ctx.strokeStyle = \"rgba(0,0,0,0.2)\";\n ctx.lineWidth = 0.5;\n ctx.beginPath();\n ctx.moveTo(-leafSize, 0);\n ctx.lineTo(leafSize, 0);\n ctx.stroke();\n } else if (leafType === 1) {\n // \uB2E8\uD48D\uC78E (5\uAC08\uB798)\n ctx.beginPath();\n const s = leafSize * 0.8;\n ctx.moveTo(0, -s * 1.2);\n // \uC67C\uCABD \uAC00\uC7A5\uC790\uB9AC\n ctx.lineTo(-s * 0.3, -s * 0.5);\n ctx.lineTo(-s * 1.0, -s * 0.6);\n ctx.lineTo(-s * 0.5, -s * 0.1);\n ctx.lineTo(-s * 1.1, s * 0.3);\n ctx.lineTo(-s * 0.4, s * 0.3);\n // \uC911\uC559 \uC544\uB798\n ctx.lineTo(0, s * 0.8);\n // \uC624\uB978\uCABD \uAC00\uC7A5\uC790\uB9AC\n ctx.lineTo(s * 0.4, s * 0.3);\n ctx.lineTo(s * 1.1, s * 0.3);\n ctx.lineTo(s * 0.5, -s * 0.1);\n ctx.lineTo(s * 1.0, -s * 0.6);\n ctx.lineTo(s * 0.3, -s * 0.5);\n ctx.closePath();\n ctx.fill();\n } else {\n // \uC740\uD589\uC78E (\uBD80\uCC44\uAF34)\n ctx.beginPath();\n const g = leafSize;\n ctx.moveTo(0, g);\n ctx.quadraticCurveTo(-g * 1.2, g * 0.3, -g * 0.8, -g * 0.5);\n ctx.quadraticCurveTo(0, -g * 0.2, g * 0.8, -g * 0.5);\n ctx.quadraticCurveTo(g * 1.2, g * 0.3, 0, g);\n ctx.fill();\n }\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n if (\n particle.rotation !== undefined &&\n particle.rotationSpeed !== undefined\n ) {\n particle.rotation += particle.rotationSpeed;\n }\n\n // \uBD80\uB4DC\uB7EC\uC6B4 \uC88C\uC6B0 \uD754\uB4E4\uB9BC (\uC0B4\uB791\uC0B4\uB791)\n particle.vx = Math.sin(particle.life * 0.01) * 0.3;\n return particle.y < canvas.height + 30;\n },\n};\n", "/**\n * Sakura Effect - \uBC9A\uAF43 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const sakuraEffect: ParticleEffect = {\n defaultColors: [\"#FFB7C5\", \"#FFC0CB\", \"#FFD1DC\", \"#FFDFEB\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: isInitial ? Math.random() * canvas.height : -10,\n vx: (Math.random() - 0.5) * speed * 0.5,\n vy: Math.random() * speed * 0.3 + 0.2,\n size: Math.random() * size + 4,\n color,\n opacity: Math.random() * 0.4 + 0.6,\n life: 0,\n maxLife: 400,\n rotation: Math.random() * 360,\n rotationSpeed: (Math.random() - 0.5) * 2,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.translate(particle.x, particle.y);\n ctx.rotate(((particle.rotation || 0) * Math.PI) / 180);\n ctx.fillStyle = particle.color;\n // \uBC9A\uAF43\uC78E \uD55C \uC7A5 (\uD558\uD2B8 \uBE44\uC2B7\uD55C \uAF43\uC78E \uBAA8\uC591)\n ctx.beginPath();\n const sakuraSize = particle.size;\n ctx.moveTo(0, -sakuraSize);\n ctx.bezierCurveTo(\n sakuraSize * 0.8,\n -sakuraSize,\n sakuraSize,\n -sakuraSize * 0.3,\n sakuraSize * 0.5,\n sakuraSize * 0.3\n );\n ctx.quadraticCurveTo(0, sakuraSize * 0.6, 0, sakuraSize * 0.8);\n ctx.quadraticCurveTo(\n 0,\n sakuraSize * 0.6,\n -sakuraSize * 0.5,\n sakuraSize * 0.3\n );\n ctx.bezierCurveTo(\n -sakuraSize,\n -sakuraSize * 0.3,\n -sakuraSize * 0.8,\n -sakuraSize,\n 0,\n -sakuraSize\n );\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n if (\n particle.rotation !== undefined &&\n particle.rotationSpeed !== undefined\n ) {\n particle.rotation += particle.rotationSpeed;\n }\n\n // \uC0B4\uC9DD \uC88C\uC6B0\uB85C \uD754\uB4E4\uB9AC\uBA70 \uB5A8\uC5B4\uC9D0\n particle.vx = Math.sin(particle.life * 0.008) * 0.2;\n return particle.y < canvas.height + 20;\n },\n};\n", "/**\n * Smoke Effect - \uC5F0\uAE30 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const smokeEffect: ParticleEffect = {\n defaultColors: [\"#808080\", \"#A9A9A9\", \"#C0C0C0\", \"#D3D3D3\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: canvas.width / 2 + (Math.random() - 0.5) * 50,\n y: canvas.height,\n vx: (Math.random() - 0.5) * speed * 0.5,\n vy: -Math.random() * speed - 0.5,\n size: Math.random() * size * 3 + 10,\n color,\n opacity: Math.random() * 0.3 + 0.1,\n life: 0,\n maxLife: 150,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n const gradient = ctx.createRadialGradient(\n particle.x,\n particle.y,\n 0,\n particle.x,\n particle.y,\n particle.size\n );\n gradient.addColorStop(0, particle.color);\n gradient.addColorStop(1, \"transparent\");\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.size += 0.5;\n particle.opacity *= 0.97;\n // \uC62C\uB77C\uAC08\uC218\uB85D \uC88C\uC6B0\uB85C \uD37C\uC9D0\n particle.vx += (Math.random() - 0.5) * 0.3;\n particle.vx *= 1.02;\n return particle.opacity > 0.01;\n },\n};\n", "/**\n * Dust Effect - \uBA3C\uC9C0 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const dustEffect: ParticleEffect = {\n defaultColors: [\"#DEB887\", \"#D2B48C\", \"#C4A484\", \"#BC8F8F\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n _size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: (Math.random() - 0.5) * speed * 0.2,\n vy: (Math.random() - 0.5) * speed * 0.2,\n size: Math.random() * 2 + 1,\n color,\n opacity: Math.random() * 0.3 + 0.1,\n life: 0,\n maxLife: 200 + Math.random() * 100,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.fillStyle = particle.color;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (\n particle: Particle,\n _canvas: HTMLCanvasElement,\n speed: number\n ): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.opacity =\n Math.sin((particle.life / particle.maxLife) * Math.PI) * 0.3;\n if (Math.random() < 0.01) {\n particle.vx = (Math.random() - 0.5) * speed * 0.2;\n particle.vy = (Math.random() - 0.5) * speed * 0.2;\n }\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Fireworks Effect - \uBD88\uAF43\uB180\uC774 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect, EffectRefs } from \"./types\";\n\nexport const fireworksEffect: ParticleEffect = {\n defaultColors: [\n \"#FF0000\",\n \"#FF7F00\",\n \"#FFFF00\",\n \"#00FF00\",\n \"#0000FF\",\n \"#8B00FF\",\n \"#FFFFFF\",\n ],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n _size: number,\n _opacity: number,\n _isInitial?: boolean,\n refs?: EffectRefs\n ): Particle => {\n // \uBC84\uC2A4\uD2B8 \uC9C0\uC810\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC73C\uBA74 \uC0C8\uB85C \uC124\uC815\n if (refs?.fireworksBurst && refs.fireworksBurst.frame === 0) {\n const burstPoints = [\n { x: canvas.width * 0.15, y: canvas.height * 0.25 },\n { x: canvas.width * 0.5, y: canvas.height * 0.2 },\n { x: canvas.width * 0.85, y: canvas.height * 0.3 },\n { x: canvas.width * 0.25, y: canvas.height * 0.45 },\n { x: canvas.width * 0.75, y: canvas.height * 0.4 },\n { x: canvas.width * 0.4, y: canvas.height * 0.35 },\n { x: canvas.width * 0.6, y: canvas.height * 0.5 },\n ];\n const burst =\n burstPoints[Math.floor(Math.random() * burstPoints.length)];\n refs.fireworksBurst.x = burst.x + (Math.random() - 0.5) * 30;\n refs.fireworksBurst.y = burst.y + (Math.random() - 0.5) * 30;\n refs.fireworksBurst.frame = 1; // \uBC84\uC2A4\uD2B8 \uD65C\uC131\uD654 \uD45C\uC2DC\n }\n\n const burstX = refs?.fireworksBurst?.x ?? canvas.width / 2;\n const burstY = refs?.fireworksBurst?.y ?? canvas.height / 2;\n const fwAngle = Math.random() * Math.PI * 2;\n const fwSpeed = Math.random() * speed * 5 + 3;\n\n return {\n x: burstX,\n y: burstY,\n vx: Math.cos(fwAngle) * fwSpeed,\n vy: Math.sin(fwAngle) * fwSpeed,\n size: Math.random() * 3 + 2,\n color,\n opacity: 1,\n life: 0,\n maxLife: 45 + Math.random() * 15,\n burstCenterX: burstX,\n burstCenterY: burstY,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n // \uBD88\uAF43 \uD30C\uD2F0\uD074 (\uAF2C\uB9AC \uD6A8\uACFC)\n const tailX = particle.x - particle.vx * 0.5;\n const tailY = particle.y - particle.vy * 0.5;\n\n // \uAF2C\uB9AC \uADF8\uB77C\uB370\uC774\uC158\n const gradient = ctx.createLinearGradient(\n tailX,\n tailY,\n particle.x,\n particle.y\n );\n gradient.addColorStop(0, \"transparent\");\n gradient.addColorStop(1, particle.color);\n\n ctx.strokeStyle = gradient;\n ctx.lineWidth = particle.size;\n ctx.lineCap = \"round\";\n ctx.beginPath();\n ctx.moveTo(tailX, tailY);\n ctx.lineTo(particle.x, particle.y);\n ctx.stroke();\n\n // \uBC1D\uC740 \uBA38\uB9AC \uBD80\uBD84\n ctx.fillStyle = \"#FFFFFF\";\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size / 2, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.vy += 0.08; // \uC911\uB825\n particle.vx *= 0.98; // \uACF5\uAE30\uC800\uD56D\n particle.vy *= 0.98;\n particle.opacity = 1 - particle.life / particle.maxLife;\n particle.size *= 0.99;\n return particle.life < particle.maxLife && particle.opacity > 0.05;\n },\n};\n", "/**\n * Hearts Effect - \uD558\uD2B8 \uD6A8\uACFC (Up/Down)\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\n// \uACF5\uD1B5 \uD558\uD2B8 \uADF8\uB9AC\uAE30 \uD568\uC218\nconst drawHeart = (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.translate(particle.x, particle.y);\n ctx.rotate(((particle.rotation || 0) * Math.PI) / 180);\n ctx.fillStyle = particle.color;\n ctx.beginPath();\n const heartSize = particle.size / 2;\n ctx.moveTo(0, heartSize);\n ctx.bezierCurveTo(\n -heartSize,\n -heartSize / 2,\n -heartSize * 2,\n heartSize / 2,\n 0,\n heartSize * 2\n );\n ctx.bezierCurveTo(\n heartSize * 2,\n heartSize / 2,\n heartSize,\n -heartSize / 2,\n 0,\n heartSize\n );\n ctx.fill();\n\n ctx.restore();\n};\n\n// Hearts Up Effect - \uC544\uB798\uC5D0\uC11C \uC704\uB85C \uC62C\uB77C\uAC00\uB294 \uD558\uD2B8\nexport const heartsUpEffect: ParticleEffect = {\n defaultColors: [\"#FF1493\", \"#FF69B4\", \"#FF6B6B\", \"#E91E63\"],\n defaultCount: 15, // \uAE30\uBCF8 50\uC758 1/3\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: canvas.height + 10,\n vx: (Math.random() - 0.5) * speed,\n vy: -Math.random() * speed * 2 - 1,\n size: Math.random() * size + 5,\n color,\n opacity: Math.random() * 0.5 + 0.5,\n life: 0,\n maxLife: 200,\n rotation: 0,\n rotationSpeed: (Math.random() - 0.5) * 2,\n };\n },\n\n draw: drawHeart,\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n if (\n particle.rotation !== undefined &&\n particle.rotationSpeed !== undefined\n ) {\n particle.rotation += particle.rotationSpeed;\n }\n\n particle.vx = Math.sin(particle.life * 0.05) * 0.5;\n particle.opacity = Math.max(0, 1 - particle.life / particle.maxLife);\n return particle.y > -particle.size;\n },\n};\n\n// Hearts Down Effect - \uC704\uC5D0\uC11C \uC544\uB798\uB85C \uB0B4\uB824\uC624\uB294 \uD558\uD2B8\nexport const heartsDownEffect: ParticleEffect = {\n defaultColors: [\"#FF1493\", \"#FF69B4\", \"#FF6B6B\", \"#E91E63\"],\n defaultCount: 15, // \uAE30\uBCF8 50\uC758 1/3\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: isInitial ? Math.random() * canvas.height : -20,\n vx: (Math.random() - 0.5) * speed,\n vy: Math.random() * speed * 2 + 1,\n size: Math.random() * size + 5,\n color,\n opacity: Math.random() * 0.5 + 0.5,\n life: 0,\n maxLife: 200,\n rotation: 0,\n rotationSpeed: (Math.random() - 0.5) * 2,\n };\n },\n\n draw: drawHeart,\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n if (\n particle.rotation !== undefined &&\n particle.rotationSpeed !== undefined\n ) {\n particle.rotation += particle.rotationSpeed;\n }\n\n particle.vx = Math.sin(particle.life * 0.05) * 0.5;\n particle.opacity = Math.max(0, 1 - particle.life / particle.maxLife);\n return particle.y < canvas.height + particle.size;\n },\n};\n\n// Hearts Pop Effect - \uB79C\uB364 \uC704\uCE58\uC5D0\uC11C \uD398\uC774\uB4DC\uC778+\uADF8\uB85C\uC6B0 \uB418\uBA74\uC11C \uC0AC\uB77C\uC9C0\uB294 \uD558\uD2B8\nexport const heartsPopEffect: ParticleEffect = {\n defaultColors: [\"#FF1493\", \"#FF69B4\", \"#FF6B6B\", \"#E91E63\"],\n defaultCount: 15, // \uAE30\uBCF8 50\uC758 1/3\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n _speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: 0,\n vy: 0,\n size: 0, // \uCC98\uC74C\uC5D4 \uD06C\uAE30 0\uC5D0\uC11C \uC2DC\uC791\n color,\n opacity: 0, // \uCC98\uC74C\uC5D4 \uD22C\uBA85\uD558\uAC8C \uC2DC\uC791\n life: 0,\n maxLife: 60 + Math.random() * 40, // 60~100 \uD504\uB808\uC784\n rotation: (Math.random() - 0.5) * 30, // \uC57D\uAC04\uC758 \uAE30\uC6B8\uAE30\n rotationSpeed: 0,\n // leafType\uC744 targetSize \uC800\uC7A5\uC6A9\uC73C\uB85C \uC0AC\uC6A9 (\uD06C\uAE30 \uB2E4\uC591\uD558\uAC8C: \uC791\uC740\uAC83~\uD070\uAC83)\n leafType: size * (0.7 + Math.random() * 2.3), // 70%~300% \uBC94\uC704\uB85C \uD06C\uAE30 \uB2E4\uC591\uD654\n };\n },\n\n draw: drawHeart,\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n\n const progress = particle.life / particle.maxLife;\n const targetSize = particle.leafType || 10;\n\n if (progress < 0.3) {\n // \uD398\uC774\uB4DC\uC778 + \uADF8\uB85C\uC6B0 (0~30%)\n const growProgress = progress / 0.3;\n particle.opacity = growProgress;\n particle.size = targetSize * growProgress;\n } else if (progress < 0.7) {\n // \uC720\uC9C0 (30~70%)\n particle.opacity = 1;\n particle.size = targetSize;\n } else {\n // \uD398\uC774\uB4DC\uC544\uC6C3 + \uB354 \uCEE4\uC9C0\uBA74\uC11C \uC0AC\uB77C\uC9D0 (70~100%)\n const fadeProgress = (progress - 0.7) / 0.3;\n particle.opacity = 1 - fadeProgress;\n particle.size = targetSize * (1 + fadeProgress * 0.3); // 30% \uB354 \uCEE4\uC9C0\uBA74\uC11C \uC0AC\uB77C\uC9D0\n }\n\n return particle.life < particle.maxLife;\n },\n};\n\n// \uAE30\uC874 hearts \uC774\uB984 \uC720\uC9C0 (heartsUp\uACFC \uB3D9\uC77C)\nexport const heartsEffect = heartsUpEffect;\n", "/**\n * Coins Effect - \uB3D9\uC804 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const coinsEffect: ParticleEffect = {\n defaultColors: [\"#FFD700\", \"#FFA500\", \"#DAA520\", \"#B8860B\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: -20,\n vx: (Math.random() - 0.5) * speed,\n vy: Math.random() * speed * 3 + 2,\n size: Math.random() * size + 8,\n color,\n opacity: 1,\n life: 0,\n maxLife: 200,\n rotation: Math.random() * 360,\n rotationSpeed: (Math.random() - 0.5) * 15,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.translate(particle.x, particle.y);\n const scaleX = Math.cos(((particle.rotation || 0) * Math.PI) / 180);\n ctx.scale(scaleX, 1);\n ctx.fillStyle = particle.color;\n ctx.beginPath();\n ctx.arc(0, 0, particle.size / 2, 0, Math.PI * 2);\n ctx.fill();\n ctx.strokeStyle = \"#B8860B\";\n ctx.lineWidth = 2;\n ctx.stroke();\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n if (\n particle.rotation !== undefined &&\n particle.rotationSpeed !== undefined\n ) {\n particle.rotation += particle.rotationSpeed;\n }\n\n particle.vy += 0.1;\n return particle.y < canvas.height + 30;\n },\n};\n", "/**\n * Balloons Effect - \uD48D\uC120 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const balloonsEffect: ParticleEffect = {\n defaultColors: [\n \"#FF6B6B\",\n \"#4ECDC4\",\n \"#45B7D1\",\n \"#FFEAA7\",\n \"#DDA0DD\",\n \"#98D8C8\",\n ],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: canvas.height + 20,\n vx: (Math.random() - 0.5) * speed * 0.5,\n vy: -Math.random() * speed - 0.8,\n size: Math.random() * size * 2 + 10,\n color,\n opacity: 0.9,\n life: 0,\n maxLife: 400,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.fillStyle = particle.color;\n ctx.beginPath();\n ctx.ellipse(\n particle.x,\n particle.y,\n particle.size / 2,\n particle.size / 1.5,\n 0,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n // \uB048\n ctx.strokeStyle = \"#666\";\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(particle.x, particle.y + particle.size / 1.5);\n ctx.quadraticCurveTo(\n particle.x + 5,\n particle.y + particle.size,\n particle.x,\n particle.y + particle.size * 1.5\n );\n ctx.stroke();\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.vx = Math.sin(particle.life * 0.02) * 0.3;\n return particle.y > -particle.size * 2;\n },\n};\n", "/**\n * Magic Effect - \uB9C8\uBC95 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const magicEffect: ParticleEffect = {\n defaultColors: [\"#8A2BE2\", \"#9400D3\", \"#BA55D3\", \"#DA70D6\", \"#EE82EE\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n const mAngle = Math.random() * Math.PI * 2;\n const mDistance = Math.random() * 50;\n return {\n x: canvas.width / 2 + Math.cos(mAngle) * mDistance,\n y: canvas.height / 2 + Math.sin(mAngle) * mDistance,\n vx: Math.cos(mAngle) * speed * 2,\n vy: Math.sin(mAngle) * speed * 2,\n size: Math.random() * size + 2,\n color,\n opacity: 1,\n life: 0,\n maxLife: 60 + Math.random() * 40,\n rotation: Math.random() * Math.PI * 2,\n rotationSpeed: (Math.random() - 0.5) * 0.15,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.translate(particle.x, particle.y);\n ctx.rotate(particle.rotation || 0);\n\n // \uC911\uC2EC \uBC1D\uC740 \uC810\n ctx.fillStyle = \"#FFFFFF\";\n ctx.beginPath();\n ctx.arc(0, 0, particle.size * 0.3, 0, Math.PI * 2);\n ctx.fill();\n\n // 4\uBC29\uD5A5 \uBFB0\uC871\uD55C \uBE5B\uC904\uAE30 (\uC2ED\uC790 \uBAA8\uC591)\n ctx.fillStyle = particle.color;\n const magicSpike = particle.size * 1.5;\n const magicWidth = particle.size * 0.15;\n\n // \uC0C1\uD558\uC88C\uC6B0 \uBFB0\uC871\uD55C \uBE5B\uC904\uAE30\n ctx.beginPath();\n ctx.moveTo(0, -magicSpike); // \uC704 \uB05D\n ctx.lineTo(magicWidth, -magicWidth);\n ctx.lineTo(magicSpike, 0); // \uC624\uB978\uCABD \uB05D\n ctx.lineTo(magicWidth, magicWidth);\n ctx.lineTo(0, magicSpike); // \uC544\uB798 \uB05D\n ctx.lineTo(-magicWidth, magicWidth);\n ctx.lineTo(-magicSpike, 0); // \uC67C\uCABD \uB05D\n ctx.lineTo(-magicWidth, -magicWidth);\n ctx.closePath();\n ctx.fill();\n\n // \uB300\uAC01\uC120 \uC791\uC740 \uBE5B\uC904\uAE30\n ctx.rotate(Math.PI / 4);\n const smallSpike = particle.size * 0.8;\n const smallWidth = particle.size * 0.1;\n ctx.beginPath();\n ctx.moveTo(0, -smallSpike);\n ctx.lineTo(smallWidth, -smallWidth);\n ctx.lineTo(smallSpike, 0);\n ctx.lineTo(smallWidth, smallWidth);\n ctx.lineTo(0, smallSpike);\n ctx.lineTo(-smallWidth, smallWidth);\n ctx.lineTo(-smallSpike, 0);\n ctx.lineTo(-smallWidth, -smallWidth);\n ctx.closePath();\n ctx.fill();\n\n // \uC791\uC740 \uC810\uB4E4 \uC8FC\uBCC0\uC5D0 \uD769\uBFCC\uB9AC\uAE30\n ctx.rotate(-Math.PI / 4);\n ctx.fillStyle = particle.color;\n for (let i = 0; i < 3; i++) {\n const angle =\n ((particle.rotation || 0) * 2 + i * 2.1) % (Math.PI * 2);\n const dist =\n particle.size * (1.5 + Math.sin(particle.life * 3 + i) * 0.5);\n const dotSize = particle.size * 0.15;\n ctx.beginPath();\n ctx.arc(\n Math.cos(angle) * dist,\n Math.sin(angle) * dist,\n dotSize,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n }\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.rotation =\n (particle.rotation || 0) + (particle.rotationSpeed || 0.05);\n particle.opacity = Math.sin(\n (particle.life / particle.maxLife) * Math.PI\n );\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Portal Effect - \uD3EC\uD0C8 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const portalEffect: ParticleEffect = {\n defaultColors: [\"#00CED1\", \"#00BFFF\", \"#1E90FF\", \"#4169E1\", \"#6A5ACD\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n _speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n const pAngle = Math.random() * Math.PI * 2;\n const pRadius = 30 + Math.random() * 30;\n return {\n x: canvas.width / 2 + Math.cos(pAngle) * pRadius,\n y: canvas.height / 2 + Math.sin(pAngle) * pRadius,\n vx: 0,\n vy: 0,\n size: Math.random() * size + 2,\n color,\n opacity: 1,\n life: 0,\n maxLife: 100,\n rotation: pAngle * (180 / Math.PI),\n rotationSpeed: 3,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.fillStyle = particle.color;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n\n const angle =\n ((particle.rotation || 0) * Math.PI) / 180 + particle.life * 0.05;\n const radius = 30 + Math.sin(particle.life * 0.1) * 10;\n particle.x = canvas.width / 2 + Math.cos(angle) * radius;\n particle.y = canvas.height / 2 + Math.sin(angle) * radius;\n particle.opacity = Math.sin(\n (particle.life / particle.maxLife) * Math.PI\n );\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Explosion Effect - \uD3ED\uBC1C \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect, EffectRefs } from \"./types\";\n\nexport const explosionEffect: ParticleEffect = {\n defaultColors: [\n \"#FF2200\",\n \"#FF4400\",\n \"#FF6600\",\n \"#FF3300\",\n \"#CC1100\",\n \"#FFAA00\",\n ],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n size: number,\n _opacity: number,\n _isInitial?: boolean,\n refs?: EffectRefs\n ): Particle => {\n // \uBC84\uC2A4\uD2B8 \uC9C0\uC810\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC73C\uBA74 \uC0C8\uB85C \uC124\uC815 (\uBC14\uB2E5 \uC911\uC559\uC5D0\uC11C \uC704\uCABD\uC73C\uB85C)\n if (refs?.explosionBurst && refs.explosionBurst.frame === 0) {\n refs.explosionBurst.x =\n canvas.width / 2 + (Math.random() - 0.5) * 80;\n refs.explosionBurst.y = canvas.height - 10; // \uBC14\uB2E5\uC5D0\uC11C \uC2DC\uC791\n refs.explosionBurst.frame = 1;\n }\n\n const expBurstX = refs?.explosionBurst?.x ?? canvas.width / 2;\n const expBurstY = refs?.explosionBurst?.y ?? canvas.height - 10;\n // \uC704\uCABD\uC73C\uB85C \uD37C\uC9C0\uB294 \uBD80\uCC44\uAF34 \uD615\uD0DC\n const eAngle = -Math.PI * 0.85 + Math.random() * Math.PI * 0.7; // \uC704\uCABD \uBC29\uD5A5\n const eSpeed = Math.random() * speed * 8 + 4;\n\n return {\n x: expBurstX,\n y: expBurstY,\n vx: Math.cos(eAngle) * eSpeed,\n vy: Math.sin(eAngle) * eSpeed - 3, // \uC704\uB85C \uB354 \uAC15\uD558\uAC8C\n size: Math.random() * size * 1.5 + 4,\n color,\n opacity: 1,\n life: 0,\n maxLife: 35 + Math.random() * 15,\n rotation: Math.random() * Math.PI * 2,\n rotationSpeed: (Math.random() - 0.5) * 0.3,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.translate(particle.x, particle.y);\n ctx.rotate(particle.rotation || 0);\n\n // \uBD88\uADDC\uCE59\uD55C \uD3ED\uBC1C \uD30C\uD3B8 \uBAA8\uC591\n const spikes = 5 + Math.floor(Math.random() * 3);\n const outerRadius = particle.size;\n const innerRadius = particle.size * 0.3;\n\n // \uD30C\uD3B8 \uADF8\uB77C\uB370\uC774\uC158 (\uC911\uC2EC \uBC1D\uACE0 \uBC14\uAE65 \uC5B4\uB450\uC6C0)\n const gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, outerRadius);\n gradient.addColorStop(0, \"#FFFF88\");\n gradient.addColorStop(0.2, \"#FFAA00\");\n gradient.addColorStop(0.5, particle.color);\n gradient.addColorStop(1, \"#330000\");\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n\n for (let i = 0; i < spikes * 2; i++) {\n const angle = (i * Math.PI) / spikes;\n // \uBD88\uADDC\uCE59\uD558\uAC8C \uB9CC\uB4E4\uAE30 \uC704\uD574 \uB79C\uB364 \uBCC0\uD615 \uCD94\uAC00\n const jitter = 0.7 + Math.sin(particle.life * 0.5 + i) * 0.3;\n const radius =\n i % 2 === 0 ? outerRadius * jitter : innerRadius * jitter;\n const x = Math.cos(angle) * radius;\n const y = Math.sin(angle) * radius;\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n ctx.closePath();\n ctx.fill();\n\n // \uC911\uC2EC\uC5D0 \uBC1D\uC740 \uCF54\uC5B4\n ctx.fillStyle = \"#FFFFFF\";\n ctx.beginPath();\n ctx.arc(0, 0, particle.size * 0.15, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n particle.rotation =\n (particle.rotation || 0) + (particle.rotationSpeed || 0.1);\n particle.vx *= 0.94;\n particle.vy *= 0.94;\n particle.vy += 0.15; // \uC911\uB825 \uD6A8\uACFC\n particle.opacity = 1 - particle.life / particle.maxLife;\n particle.size *= 0.97;\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Matrix Effect - \uB9E4\uD2B8\uB9AD\uC2A4 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const matrixEffect: ParticleEffect = {\n defaultColors: [\"#00FF00\", \"#32CD32\", \"#90EE90\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n _size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n // \uAC01 \uC5F4\uC758 \uBB38\uC790\uB4E4\uC744 \uCD94\uC801\uD558\uAE30 \uC704\uD55C \uBB38\uC790\uC5F4 \uC0DD\uC131\n const codeLength = 10 + Math.floor(Math.random() * 15); // 10~25\uC790\n let codeString = \"\";\n for (let i = 0; i < codeLength; i++) {\n codeString += Math.random() > 0.5 ? \"1\" : \"0\";\n }\n return {\n x: Math.floor(Math.random() * (canvas.width / 11)) * 11, // \uC5F4 \uC815\uB82C (11px \uAC04\uACA9)\n y: -codeLength * 11, // \uBB38\uC790\uC5F4 \uAE38\uC774\uB9CC\uD07C \uC704\uC5D0\uC11C \uC2DC\uC791\n vx: 0,\n vy: Math.random() * speed * 3 + 2,\n size: 10, // \uD3F0\uD2B8 \uD06C\uAE30 10px\n color,\n opacity: 1,\n life: 0,\n maxLife: 500,\n codeString, // 01 \uBB38\uC790\uC5F4 \uC800\uC7A5\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n\n ctx.font = `${particle.size}px monospace`;\n const code = particle.codeString || \"01010101\";\n\n // \uAC01 \uBB38\uC790\uB97C \uC138\uB85C\uB85C \uADF8\uB9AC\uAE30\n for (let i = 0; i < code.length; i++) {\n // \uC544\uB798\uCABD \uBB38\uC790\uB294 \uBC1D\uAC8C, \uC704\uCABD\uC73C\uB85C \uAC08\uC218\uB85D \uD76C\uBBF8\uD558\uAC8C\n const charOpacity = Math.max(0, particle.opacity * (1 - i * 0.06));\n\n // \uB9E8 \uC544\uB798 \uBB38\uC790\uB294 \uD770\uC0C9\uC73C\uB85C \uBC1D\uAC8C\n if (i === 0) {\n ctx.fillStyle = `rgba(255, 255, 255, ${charOpacity})`;\n } else {\n ctx.fillStyle = `rgba(0, 255, 0, ${charOpacity})`;\n }\n\n ctx.fillText(\n code[i],\n particle.x,\n particle.y + i * 11 // \uAC01 \uBB38\uC790 11px \uAC04\uACA9\n );\n }\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // \uBB38\uC790\uC5F4 \uAE38\uC774\uB9CC\uD07C \uC704\uC5D0\uC11C \uC544\uB798\uB85C \uC9C4\uD589\n const codeLen = (particle.codeString || \"\").length;\n const totalHeight = codeLen * 11; // 11px \uAC04\uACA9\n // \uD654\uBA74 \uC544\uB798\uB85C \uB098\uAC00\uBA74 \uC0AC\uB77C\uC9D0\n if (particle.y > canvas.height + totalHeight) {\n return false;\n }\n // \uC704\uC5D0\uC11C \uC544\uB798\uB85C \uC9C4\uD589\uD558\uBA74\uC11C \uC810\uC810 \uD76C\uBBF8\uD574\uC9D0\n particle.opacity = Math.max(\n 0,\n 1 - (particle.life / particle.maxLife) * 0.5\n );\n return particle.opacity > 0;\n },\n};\n", "/**\n * Fog Effect - \uC548\uAC1C \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const fogEffect: ParticleEffect = {\n defaultColors: [\"#FFFFFF\", \"#F5F5F5\", \"#E8E8E8\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n speed: number,\n _size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: (Math.random() - 0.5) * speed * 0.2,\n vy: (Math.random() - 0.5) * speed * 0.1,\n size: Math.random() * 40 + 20, // \uD06C\uAE30 \uC904\uC784\n color,\n opacity: Math.random() * 0.08 + 0.02, // \uB354 \uD76C\uBBF8\uD558\uAC8C\n life: 0,\n maxLife: 300 + Math.random() * 200,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n const gradient = ctx.createRadialGradient(\n particle.x,\n particle.y,\n 0,\n particle.x,\n particle.y,\n particle.size\n );\n gradient.addColorStop(0, particle.color);\n gradient.addColorStop(1, \"transparent\");\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n },\n\n update: (particle: Particle, canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n if (particle.x < -particle.size)\n particle.x = canvas.width + particle.size;\n if (particle.x > canvas.width + particle.size)\n particle.x = -particle.size;\n particle.opacity =\n Math.sin((particle.life / particle.maxLife) * Math.PI) * 0.08; // \uB354 \uD76C\uBBF8\uD558\uAC8C\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Electric Effect - \uC804\uAE30 \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const electricEffect: ParticleEffect = {\n defaultColors: [\"#FFFFFF\", \"#F0FFFF\", \"#87CEEB\", \"#00BFFF\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n _speed: number,\n _size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n return {\n x: Math.random() * canvas.width,\n y: 0,\n vx: 0,\n vy: 0,\n size: Math.random() * 3 + 1,\n color,\n opacity: 1,\n life: 0,\n maxLife: 5 + Math.random() * 10,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n ctx.globalAlpha = particle.opacity;\n\n ctx.strokeStyle = particle.color;\n ctx.lineWidth = particle.size;\n ctx.shadowColor = particle.color;\n ctx.shadowBlur = 10;\n ctx.beginPath();\n let ex = particle.x;\n let ey = particle.y;\n ctx.moveTo(ex, ey);\n const eSegments = 8;\n const eSegHeight = 150 / eSegments;\n for (let i = 0; i < eSegments; i++) {\n ex += (Math.random() - 0.5) * 30;\n ey += eSegHeight;\n ctx.lineTo(ex, ey);\n }\n ctx.stroke();\n ctx.shadowBlur = 0;\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Lightning Effect - \uBC88\uAC1C \uD6A8\uACFC\n */\n\nimport { Particle, ParticleEffect } from \"./types\";\n\nexport const lightningEffect: ParticleEffect = {\n defaultColors: [\"#FFFF00\", \"#FFD700\", \"#FFA500\"],\n\n create: (\n canvas: HTMLCanvasElement,\n color: string,\n _speed: number,\n _size: number,\n _opacity: number,\n _isInitial?: boolean\n ): Particle => {\n // \uBC88\uAC1C \uC904\uAE30 \uACBD\uB85C (4-5\uBC88 \uB79C\uB364 \uAEBD\uC784)\n const startX = canvas.width * 0.3 + Math.random() * canvas.width * 0.4;\n const height = canvas.height * 0.85;\n\n // 4-5\uBC88 \uB79C\uB364 \uAEBD\uC784\n const bendCount = Math.random() > 0.5 ? 5 : 4;\n const points: string[] = [];\n let currentX = startX;\n\n // \uC2DC\uC791\uC810\n points.push(`${startX},0`);\n\n // \uCCAB \uAEBD\uC784 \uBC29\uD5A5 \uB79C\uB364 \uACB0\uC815\n let direction = Math.random() > 0.5 ? 1 : -1;\n\n // \uAEBD\uC784 \uC810\uB4E4 \uC0DD\uC131 (\uBC29\uD5A5 \uBC88\uAC08\uC544\uAC00\uBA70)\n for (let i = 0; i < bendCount; i++) {\n const yRatio = (i + 1) / (bendCount + 1);\n const y = height * (yRatio * 0.85 + Math.random() * 0.08);\n const zigzag = direction * (20 + Math.random() * 35);\n currentX += zigzag;\n points.push(`${currentX},${y}`);\n direction *= -1; // \uBC29\uD5A5 \uBC18\uC804\n }\n\n // \uB05D\uC810 (\uB9C8\uC9C0\uB9C9 \uAEBD\uC784\uACFC \uAC19\uC740 x, \uB05D \uB192\uC774)\n points.push(`${currentX},${height}`);\n\n const pathStr = points.join(\"|\");\n\n // \uBC88\uAC1C \uD45C\uC2DC: 15~20\uD504\uB808\uC784, \uB300\uAE30: 60\uD504\uB808\uC784 (\uC57D 1\uCD08)\n const flashDuration = 15 + Math.random() * 8;\n const waitDuration = 60;\n\n return {\n x: startX,\n y: 0,\n vx: 0,\n vy: 0,\n size: Math.random() * 1 + 1.5, // \uB354 \uC587\uAC8C\n color,\n opacity: 1,\n life: 0,\n maxLife: flashDuration + waitDuration,\n codeString: pathStr,\n rotation: flashDuration,\n };\n },\n\n draw: (ctx: CanvasRenderingContext2D, particle: Particle): void => {\n ctx.save();\n\n // \uBC88\uCBE1 \uD6A8\uACFC (\uD654\uBA74 \uC804\uCCB4 \uBC1D\uAC8C) - \uCD08\uBC18\uC5D0\uB9CC \uBC1D\uAC8C\n const flashOpacity =\n particle.life < 2\n ? 0.5 * particle.opacity\n : 0.15 * particle.opacity;\n ctx.globalAlpha = flashOpacity;\n ctx.fillStyle = \"#FFFFCC\";\n ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n // \uBC88\uAC1C \uACBD\uB85C \uD30C\uC2F1\n const pathStr = particle.codeString || \"\";\n const points = pathStr.split(\"|\").map((p) => {\n const [px, py] = p.split(\",\");\n return { x: parseFloat(px), y: parseFloat(py) };\n });\n\n if (points.length < 2) {\n ctx.restore();\n return;\n }\n\n ctx.globalAlpha = particle.opacity;\n ctx.lineJoin = \"miter\";\n ctx.miterLimit = 15;\n ctx.lineCap = \"round\";\n\n // \uB9C8\uC9C0\uB9C9 \uC810 (\uB05D\uC810)\n const lastPoint = points[points.length - 1];\n\n // \uBA54\uC778 \uBC88\uAC1C \uADF8\uB9AC\uAE30 \uD568\uC218\n const drawMainBolt = (color: string, width: number, blur: number) => {\n ctx.strokeStyle = color;\n ctx.lineWidth = width;\n ctx.shadowColor = color === \"#FFFF88\" ? \"#FFFFFF\" : \"#FFD700\";\n ctx.shadowBlur = blur;\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.stroke();\n };\n\n // \uB05D\uC810\uC5D0 \uC5ED\uC0BC\uAC01\uD615 (\uBFB0\uC871\uD55C \uB05D)\n const drawArrowTip = (color: string, width: number, blur: number) => {\n ctx.fillStyle = color;\n ctx.shadowColor = color === \"#FFFF88\" ? \"#FFFFFF\" : \"#FFD700\";\n ctx.shadowBlur = blur;\n\n const tipLength = 8; // \uC0BC\uAC01\uD615 \uB192\uC774\n const tipWidth = width * 0.5; // \uC0BC\uAC01\uD615 \uB108\uBE44 (\uC120 \uB450\uAED8\uC758 \uC808\uBC18)\n\n ctx.beginPath();\n ctx.moveTo(lastPoint.x - tipWidth / 2, lastPoint.y); // \uC67C\uCABD\n ctx.lineTo(lastPoint.x + tipWidth / 2, lastPoint.y); // \uC624\uB978\uCABD\n ctx.lineTo(lastPoint.x, lastPoint.y + tipLength); // \uC544\uB798 \uBFB0\uC871\uC810\n ctx.closePath();\n ctx.fill();\n };\n\n // \uC678\uACFD \uAE00\uB85C\uC6B0 (\uC8FC\uD669\uC0C9)\n drawMainBolt(\"#FFA500\", particle.size + 3, 25);\n drawArrowTip(\"#FFA500\", particle.size + 3, 25);\n\n // \uC911\uAC04 \uC120 (\uB178\uB780\uC0C9)\n drawMainBolt(\"#FFD700\", particle.size + 1, 12);\n drawArrowTip(\"#FFD700\", particle.size + 1, 12);\n\n // \uB0B4\uBD80 \uBC1D\uC740 \uC120 (\uD770\uC0C9)\n drawMainBolt(\"#FFFF88\", Math.max(1, particle.size - 1), 5);\n drawArrowTip(\"#FFFF88\", Math.max(1, particle.size - 1), 5);\n\n ctx.restore();\n },\n\n update: (particle: Particle, _canvas: HTMLCanvasElement): boolean => {\n particle.life++;\n\n // rotation\uC5D0 \uBC88\uAC1C \uD45C\uC2DC \uC2DC\uAC04 \uC800\uC7A5\uB428\n const flashEnd = particle.rotation || 20;\n\n if (particle.life < 3) {\n // \uCD08\uBC18 3\uD504\uB808\uC784: \uCD5C\uB300 \uBC1D\uAE30\n particle.opacity = 1;\n } else if (particle.life < flashEnd) {\n // \uBC88\uAC1C \uD398\uC774\uB4DC\uC544\uC6C3 \uAD6C\uAC04\n particle.opacity = Math.max(\n 0,\n 1 - (particle.life - 3) / (flashEnd - 3)\n );\n } else {\n // \uB300\uAE30 \uAD6C\uAC04: \uC644\uC804\uD788 \uD22C\uBA85\n particle.opacity = 0;\n }\n return particle.life < particle.maxLife;\n },\n};\n", "/**\n * Particle Effects Index\n */\n\nexport * from \"./types\";\n\n// \uAC1C\uBCC4 \uD6A8\uACFC \uBAA8\uB4C8\uB4E4\nexport { sparkleEffect } from \"./sparkle\";\nexport { confettiEffect } from \"./confetti\";\nexport { snowEffect } from \"./snow\";\nexport { fireflyEffect } from \"./firefly\";\nexport { bubblesEffect } from \"./bubbles\";\nexport { starsEffect } from \"./stars\";\nexport { rainEffect } from \"./rain\";\nexport { leavesEffect } from \"./leaves\";\nexport { sakuraEffect } from \"./sakura\";\nexport { smokeEffect } from \"./smoke\";\nexport { dustEffect } from \"./dust\";\nexport { fireworksEffect } from \"./fireworks\";\nexport {\n heartsEffect,\n heartsUpEffect,\n heartsDownEffect,\n heartsPopEffect,\n} from \"./hearts\";\nexport { coinsEffect } from \"./coins\";\nexport { balloonsEffect } from \"./balloons\";\nexport { magicEffect } from \"./magic\";\nexport { portalEffect } from \"./portal\";\nexport { explosionEffect } from \"./explosion\";\nexport { matrixEffect } from \"./matrix\";\nexport { fogEffect } from \"./fog\";\nexport { electricEffect } from \"./electric\";\nexport { lightningEffect } from \"./lightning\";\n\n// \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\nimport { ParticleEffect } from \"./types\";\nimport { sparkleEffect } from \"./sparkle\";\nimport { confettiEffect } from \"./confetti\";\nimport { snowEffect } from \"./snow\";\nimport { fireflyEffect } from \"./firefly\";\nimport { bubblesEffect } from \"./bubbles\";\nimport { starsEffect } from \"./stars\";\nimport { rainEffect } from \"./rain\";\nimport { leavesEffect } from \"./leaves\";\nimport { sakuraEffect } from \"./sakura\";\nimport { smokeEffect } from \"./smoke\";\nimport { dustEffect } from \"./dust\";\nimport { fireworksEffect } from \"./fireworks\";\nimport {\n heartsEffect,\n heartsUpEffect,\n heartsDownEffect,\n heartsPopEffect,\n} from \"./hearts\";\nimport { coinsEffect } from \"./coins\";\nimport { balloonsEffect } from \"./balloons\";\nimport { magicEffect } from \"./magic\";\nimport { portalEffect } from \"./portal\";\nimport { explosionEffect } from \"./explosion\";\nimport { matrixEffect } from \"./matrix\";\nimport { fogEffect } from \"./fog\";\nimport { electricEffect } from \"./electric\";\nimport { lightningEffect } from \"./lightning\";\n\nexport const effectRegistry: Record<string, ParticleEffect> = {\n sparkle: sparkleEffect,\n confetti: confettiEffect,\n snow: snowEffect,\n firefly: fireflyEffect,\n \"bubbles-color\": bubblesEffect,\n \"bubbles-yellow\": bubblesEffect,\n \"bubbles-pink\": bubblesEffect,\n \"bubbles-blue\": bubblesEffect,\n \"bubbles-green\": bubblesEffect,\n stars: starsEffect,\n \"stars-color\": starsEffect,\n rain: rainEffect,\n leaves: leavesEffect,\n sakura: sakuraEffect,\n smoke: smokeEffect,\n dust: dustEffect,\n fireworks: fireworksEffect,\n hearts: heartsEffect,\n \"hearts-up\": heartsUpEffect,\n \"hearts-down\": heartsDownEffect,\n \"hearts-pop\": heartsPopEffect,\n coins: coinsEffect,\n balloons: balloonsEffect,\n magic: magicEffect,\n portal: portalEffect,\n explosion: explosionEffect,\n matrix: matrixEffect,\n fog: fogEffect,\n electric: electricEffect,\n lightning: lightningEffect,\n};\n\n// \uD6A8\uACFC\uBCC4 \uAE30\uBCF8 \uC0C9\uC0C1 \uAC00\uC838\uC624\uAE30 (\uC0C9\uC0C1 \uBCC0\uD615\uC744 \uC704\uD55C \uD5EC\uD37C)\nexport const getDefaultColors = (effect: string): string[] => {\n // bubbles \uC0C9\uC0C1 \uBCC0\uD615\n if (effect === \"bubbles-yellow\") return [\"#FFD700\", \"#FFA500\", \"#FFFF00\"];\n if (effect === \"bubbles-pink\") return [\"#FF69B4\", \"#FF1493\", \"#FFB6C1\"];\n if (effect === \"bubbles-blue\") return [\"#00BFFF\", \"#87CEEB\", \"#4169E1\"];\n if (effect === \"bubbles-green\") return [\"#00FF00\", \"#32CD32\", \"#98FB98\"];\n\n // stars \uC0C9\uC0C1 \uBCC0\uD615\n if (effect === \"stars-color\")\n return [\"#FFFFFF\", \"#FFD700\", \"#FFA500\", \"#FF69B4\"];\n\n // \uAE30\uBCF8 \uD6A8\uACFC \uC0C9\uC0C1\n const effectModule = effectRegistry[effect];\n if (effectModule) {\n return effectModule.defaultColors;\n }\n\n // \uAE30\uBCF8\uAC12\n return [\"#FFFFFF\"];\n};\n", "/**\n * VfxSlide.tsx - \uC774\uBBF8\uC9C0 \uC2AC\uB77C\uC774\uB4DC/\uAC24\uB7EC\uB9AC \uD2B8\uB79C\uC9C0\uC158 \uD6A8\uACFC \uCEF4\uD3EC\uB10C\uD2B8\n */\n\nimport React, {\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n} from \"react\";\nimport { slideEffectRegistry, driftEffectRegistry } from \"./effects/slides\";\nimport {\n SlideEffectType,\n DriftEffectType,\n VfxSlideItemProps,\n VfxSlideProps,\n} from \"./types\";\n\nexport type { VfxSlideProps };\n\n// VfxSlideItem\uC778\uC9C0 \uD655\uC778\uD558\uB294 \uD0C0\uC785 \uAC00\uB4DC\ninterface SlideItemConfig {\n content: React.ReactNode;\n effect?: SlideEffectType;\n driftEffect?: DriftEffectType;\n duration?: number;\n interval?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst VfxSlide: React.FC<VfxSlideProps> = ({\n children,\n effect = \"fade\",\n driftEffect = \"none\",\n activeIndex: controlledIndex,\n onSlideChange,\n autoPlay = false,\n autoPlayInterval = 5000,\n duration,\n loop = true,\n pauseOnHover = true,\n className = \"\",\n style = {},\n showNavigation = true,\n showIndicators = true,\n enableKeyboard = true,\n enableSwipe = true,\n}) => {\n // children\uC744 \uBD84\uC11D\uD574\uC11C SlideItemConfig \uBC30\uC5F4\uB85C \uBCC0\uD658\n const slideItems: SlideItemConfig[] = useMemo(() => {\n return React.Children.toArray(children).map((child) => {\n // VfxSlideItem\uC778\uC9C0 \uD655\uC778\n if (\n React.isValidElement(child) &&\n (child.type as any)?.displayName === \"VfxSlideItem\"\n ) {\n const props = child.props as VfxSlideItemProps;\n return {\n content: props.children,\n effect: props.effect,\n driftEffect: props.driftEffect,\n duration: props.duration,\n interval: props.interval,\n className: props.className,\n style: props.style,\n };\n }\n // \uC77C\uBC18 \uC694\uC18C\uB294 \uADF8\uB300\uB85C \uC0AC\uC6A9\n return {\n content: child,\n };\n });\n }, [children]);\n\n const slideCount = slideItems.length;\n const [internalIndex, setInternalIndex] = useState(0);\n const [prevIndex, setPrevIndex] = useState<number | null>(null);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [currentRandomDrift, setCurrentRandomDrift] = useState<string>(\"\");\n\n const containerRef = useRef<HTMLDivElement>(null);\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n\n const activeIndex =\n controlledIndex !== undefined ? controlledIndex : internalIndex;\n\n // \uD604\uC7AC \uC2AC\uB77C\uC774\uB4DC\uC758 \uAC1C\uBCC4 \uC124\uC815 \uAC00\uC838\uC624\uAE30\n const getCurrentSlideConfig = useCallback(\n (index: number) => {\n const item = slideItems[index];\n return {\n effect: item?.effect || effect,\n driftEffect: item?.driftEffect || driftEffect,\n duration: item?.duration || duration,\n interval: item?.interval || autoPlayInterval,\n };\n },\n [slideItems, effect, driftEffect, duration, autoPlayInterval]\n );\n\n // \uD604\uC7AC \uC2AC\uB77C\uC774\uB4DC \uC124\uC815\n const currentConfig = getCurrentSlideConfig(activeIndex);\n\n // drift-random: \uC2AC\uB77C\uC774\uB4DC \uC804\uD658\uB9C8\uB2E4 \uC0C8\uB85C\uC6B4 \uB79C\uB364 \uD6A8\uACFC \uC120\uD0DD\n useEffect(() => {\n const currentDrift = currentConfig.driftEffect;\n if (currentDrift === \"drift-random\") {\n const driftOptions = [\n \"drift-left\",\n \"drift-right\",\n \"drift-up\",\n \"drift-down\",\n \"drift-zoom\",\n ];\n\n const selected =\n driftOptions[Math.floor(Math.random() * driftOptions.length)];\n console.log(\n `[VfxSlide] \uC2AC\uB77C\uC774\uB4DC ${activeIndex}: drift-random \u2192 ${selected}`\n );\n setCurrentRandomDrift(selected);\n }\n }, [currentConfig.driftEffect, activeIndex]);\n\n // \uC804\uD658 \uD6A8\uACFC \uAC00\uC838\uC624\uAE30 (\uD604\uC7AC \uC2AC\uB77C\uC774\uB4DC\uC758 \uAC1C\uBCC4 \uC124\uC815 \uC6B0\uC120)\n const slideEffect = useMemo(() => {\n return (\n slideEffectRegistry[currentConfig.effect] ||\n slideEffectRegistry[\"fade\"]\n );\n }, [currentConfig.effect]);\n\n const effectDuration =\n currentConfig.duration || slideEffect.defaultDuration;\n\n // \uC2A4\uD0C0\uC77C \uC8FC\uC785 - \uBAA8\uB4E0 \uC0AC\uC6A9\uB41C \uD6A8\uACFC\uB4E4\uC758 \uC2A4\uD0C0\uC77C\uC744 \uC8FC\uC785\n useEffect(() => {\n // \uBAA8\uB4E0 \uC2AC\uB77C\uC774\uB4DC\uC5D0\uC11C \uC0AC\uC6A9\uD558\uB294 \uD6A8\uACFC\uB4E4 \uC218\uC9D1\n const usedEffects = new Set<string>([effect]);\n const usedDriftEffects = new Set<string>();\n if (driftEffect !== \"none\") usedDriftEffects.add(driftEffect);\n\n slideItems.forEach((item) => {\n if (item.effect) usedEffects.add(item.effect);\n if (item.driftEffect && item.driftEffect !== \"none\") {\n usedDriftEffects.add(item.driftEffect);\n }\n });\n\n // \uC804\uD658 \uD6A8\uACFC \uC2A4\uD0C0\uC77C \uC8FC\uC785\n usedEffects.forEach((eff) => {\n const styleId = `vfx-slide-${eff}`;\n if (!document.getElementById(styleId)) {\n const effData = slideEffectRegistry[eff as SlideEffectType];\n if (effData) {\n const styleEl = document.createElement(\"style\");\n styleEl.id = styleId;\n styleEl.textContent = `\n ${effData.enterKeyframes}\n ${effData.exitKeyframes}\n ${effData.enterClass}\n ${effData.exitClass}\n `;\n document.head.appendChild(styleEl);\n }\n }\n });\n\n // \uB4DC\uB9AC\uD504\uD2B8 \uD6A8\uACFC \uC2A4\uD0C0\uC77C \uC8FC\uC785\n usedDriftEffects.forEach((drift) => {\n // drift-random\uC77C \uACBD\uC6B0 \uBAA8\uB4E0 drift \uD6A8\uACFC \uC2A4\uD0C0\uC77C \uC8FC\uC785\n if (drift === \"drift-random\") {\n const allDriftTypes = [\n \"drift-left\",\n \"drift-right\",\n \"drift-up\",\n \"drift-down\",\n \"drift-zoom\",\n ];\n allDriftTypes.forEach((dt) => {\n const dtData =\n driftEffectRegistry[\n dt as keyof typeof driftEffectRegistry\n ];\n const dtStyleId = `vfx-slide-drift-${dt}`;\n if (dtData && !document.getElementById(dtStyleId)) {\n const dtStyleEl = document.createElement(\"style\");\n dtStyleEl.id = dtStyleId;\n dtStyleEl.textContent = `\n ${dtData.enterKeyframes}\n ${dtData.enterClass}\n `;\n document.head.appendChild(dtStyleEl);\n }\n });\n } else {\n const driftData =\n driftEffectRegistry[\n drift as keyof typeof driftEffectRegistry\n ];\n const driftStyleId = `vfx-slide-drift-${drift}`;\n if (driftData && !document.getElementById(driftStyleId)) {\n const driftStyleEl = document.createElement(\"style\");\n driftStyleEl.id = driftStyleId;\n driftStyleEl.textContent = `\n ${driftData.enterKeyframes}\n ${driftData.enterClass}\n `;\n document.head.appendChild(driftStyleEl);\n }\n }\n });\n\n // \uACF5\uD1B5 \uC2A4\uD0C0\uC77C\n const commonStyleId = \"vfx-slide-common\";\n if (!document.getElementById(commonStyleId)) {\n const commonStyleEl = document.createElement(\"style\");\n commonStyleEl.id = commonStyleId;\n commonStyleEl.textContent = `\n .vfx-slide-container {\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n }\n \n .vfx-slide-item {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n pointer-events: none;\n z-index: 0;\n }\n \n .vfx-slide-item.prev-slide {\n opacity: 1;\n z-index: 1;\n }\n \n .vfx-slide-item.active {\n opacity: 1;\n pointer-events: auto;\n z-index: 2;\n }\n \n .vfx-slide-item.exiting {\n opacity: 1;\n z-index: 1;\n }\n \n .vfx-slide-nav {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n background: rgba(0, 0, 0, 0.5);\n color: white;\n border: none;\n padding: 12px 16px;\n cursor: pointer;\n z-index: 10;\n font-size: 18px;\n transition: background 0.2s;\n }\n \n .vfx-slide-nav:hover {\n background: rgba(0, 0, 0, 0.8);\n }\n \n .vfx-slide-nav:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n \n .vfx-slide-nav.prev {\n left: 10px;\n border-radius: 4px;\n }\n \n .vfx-slide-nav.next {\n right: 10px;\n border-radius: 4px;\n }\n \n .vfx-slide-indicators {\n position: absolute;\n bottom: 15px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 8px;\n z-index: 10;\n }\n \n .vfx-slide-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.5);\n border: none;\n cursor: pointer;\n padding: 0;\n transition: background 0.2s, transform 0.2s;\n }\n \n .vfx-slide-indicator:hover {\n background: rgba(255, 255, 255, 0.8);\n }\n \n .vfx-slide-indicator.active {\n background: white;\n transform: scale(1.2);\n }\n `;\n document.head.appendChild(commonStyleEl);\n }\n }, [effect, driftEffect, slideItems]);\n\n // \uC2AC\uB77C\uC774\uB4DC \uBCC0\uACBD\n const goToSlide = useCallback(\n (index: number) => {\n if (isTransitioning || index === activeIndex) return;\n\n let targetIndex = index;\n\n if (loop) {\n if (index < 0) targetIndex = slideCount - 1;\n if (index >= slideCount) targetIndex = 0;\n } else {\n if (index < 0 || index >= slideCount) return;\n }\n\n setPrevIndex(activeIndex);\n setIsTransitioning(true);\n\n if (controlledIndex === undefined) {\n setInternalIndex(targetIndex);\n }\n\n onSlideChange?.(targetIndex);\n\n setTimeout(() => {\n setIsTransitioning(false);\n setPrevIndex(null);\n }, effectDuration);\n },\n [\n activeIndex,\n slideCount,\n loop,\n controlledIndex,\n onSlideChange,\n effectDuration,\n isTransitioning,\n ]\n );\n\n const goNext = useCallback(() => {\n goToSlide(activeIndex + 1);\n }, [activeIndex, goToSlide]);\n\n const goPrev = useCallback(() => {\n goToSlide(activeIndex - 1);\n }, [activeIndex, goToSlide]);\n\n // \uC790\uB3D9 \uC7AC\uC0DD\n useEffect(() => {\n if (!autoPlay || isPaused) return;\n\n const timer = setInterval(() => {\n goNext();\n }, autoPlayInterval);\n\n return () => clearInterval(timer);\n }, [autoPlay, autoPlayInterval, isPaused, goNext]);\n\n // \uD0A4\uBCF4\uB4DC \uB124\uBE44\uAC8C\uC774\uC158\n useEffect(() => {\n if (!enableKeyboard) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowRight\") {\n goNext();\n } else if (e.key === \"ArrowLeft\") {\n goPrev();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [enableKeyboard, goNext, goPrev]);\n\n // \uD130\uCE58/\uC2A4\uC640\uC774\uD504\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (!enableSwipe) return;\n touchStartRef.current = {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY,\n };\n },\n [enableSwipe]\n );\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (!enableSwipe || !touchStartRef.current) return;\n\n const deltaX =\n e.changedTouches[0].clientX - touchStartRef.current.x;\n const deltaY =\n e.changedTouches[0].clientY - touchStartRef.current.y;\n\n // \uC218\uD3C9 \uC2A4\uC640\uC774\uD504\uAC00 \uC218\uC9C1\uBCF4\uB2E4 \uD06C\uBA74\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {\n if (deltaX > 0) {\n goPrev();\n } else {\n goNext();\n }\n }\n\n touchStartRef.current = null;\n },\n [enableSwipe, goNext, goPrev]\n );\n\n // \uD638\uBC84 \uC77C\uC2DC\uC815\uC9C0\n const handleMouseEnter = useCallback(() => {\n if (pauseOnHover && autoPlay) {\n setIsPaused(true);\n }\n }, [pauseOnHover, autoPlay]);\n\n const handleMouseLeave = useCallback(() => {\n if (pauseOnHover && autoPlay) {\n setIsPaused(false);\n }\n }, [pauseOnHover, autoPlay]);\n\n // \uC5D4\uD130/\uC5D1\uC2EF \uD074\uB798\uC2A4 \uC774\uB984 \uACC4\uC0B0 (\uC2AC\uB77C\uC774\uB4DC\uBCC4 \uAC1C\uBCC4 \uC124\uC815 \uC9C0\uC6D0)\n const getEnterClassName = (slideIndex: number) => {\n const config = getCurrentSlideConfig(slideIndex);\n return `vfx-slide-${config.effect}-enter`;\n };\n\n const getDriftIdleClassName = (slideIndex: number) => {\n const config = getCurrentSlideConfig(slideIndex);\n const slideDrift = config.driftEffect;\n if (slideDrift === \"none\" || !slideDrift) return \"\";\n if (slideDrift === \"drift-random\" && currentRandomDrift) {\n return `vfx-slide-${currentRandomDrift}-idle`;\n }\n return `vfx-slide-${slideDrift}-idle`;\n };\n\n return (\n <div\n ref={containerRef}\n className={`vfx-slide-container ${className}`}\n style={\n {\n ...style,\n \"--slide-duration\": `${effectDuration}ms`,\n \"--slide-interval\": `${currentConfig.interval}ms`,\n } as React.CSSProperties\n }\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n >\n {slideItems.map((item, index) => {\n const isActive = index === activeIndex;\n const isPrev = prevIndex !== null && index === prevIndex;\n const itemConfig = getCurrentSlideConfig(index);\n\n let itemClassName = \"vfx-slide-item\";\n if (item.className) itemClassName += ` ${item.className}`;\n let itemStyle: React.CSSProperties = { ...item.style };\n\n if (isPrev && isTransitioning) {\n itemClassName += \" prev-slide\";\n // \uC774\uC804 \uC2AC\uB77C\uC774\uB4DC\uC5D0\uB3C4 drift \uD6A8\uACFC \uC720\uC9C0 (\uC804\uD658 \uC911\uC5D0\uB3C4 drift \uC0C1\uD0DC \uC720\uC9C0)\n if (\n itemConfig.driftEffect !== \"none\" &&\n itemConfig.driftEffect\n ) {\n const driftClass = getDriftIdleClassName(index);\n if (driftClass) {\n itemClassName += ` ${driftClass}`;\n }\n }\n }\n\n if (isActive) {\n itemClassName += \" active\";\n if (isTransitioning) {\n itemClassName += ` ${getEnterClassName(index)}`;\n } else if (\n itemConfig.driftEffect !== \"none\" &&\n itemConfig.driftEffect\n ) {\n // \uB4DC\uB9AC\uD504\uD2B8 \uD6A8\uACFC \uC801\uC6A9 (\uC804\uD658 \uC911\uC774 \uC544\uB2D0 \uB54C)\n const driftClass = getDriftIdleClassName(index);\n if (driftClass) {\n itemClassName += ` ${driftClass}`;\n }\n }\n }\n\n return (\n <div\n key={index}\n className={itemClassName}\n style={itemStyle}\n >\n {item.content}\n </div>\n );\n })}\n\n {showNavigation && slideCount > 1 && (\n <>\n <button\n className=\"vfx-slide-nav prev\"\n onClick={goPrev}\n disabled={!loop && activeIndex === 0}\n aria-label=\"\uC774\uC804 \uC2AC\uB77C\uC774\uB4DC\"\n >\n &#10094;\n </button>\n <button\n className=\"vfx-slide-nav next\"\n onClick={goNext}\n disabled={!loop && activeIndex === slideCount - 1}\n aria-label=\"\uB2E4\uC74C \uC2AC\uB77C\uC774\uB4DC\"\n >\n &#10095;\n </button>\n </>\n )}\n\n {showIndicators && slideCount > 1 && (\n <div className=\"vfx-slide-indicators\">\n {slideItems.map((_, index) => (\n <button\n key={index}\n className={`vfx-slide-indicator ${\n index === activeIndex ? \"active\" : \"\"\n }`}\n onClick={() => goToSlide(index)}\n aria-label={`\uC2AC\uB77C\uC774\uB4DC ${index + 1}`}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nVfxSlide.displayName = \"VfxSlide\";\n\nexport default VfxSlide;\n", "/**\n * fade.ts - \uD398\uC774\uB4DC \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC\n */\n\nimport { SlideEffect } from \"./types\";\n\nexport const fadeEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFadeEnter {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `,\n exitKeyframes: `\n @keyframes slideFadeExit {\n from { opacity: 1; }\n to { opacity: 0; }\n }\n `,\n enterClass: `\n .vfx-slide-fade-enter {\n animation: slideFadeEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-fade-exit {\n animation: slideFadeExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n\nexport const fadeUpEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFadeUpEnter {\n from { \n opacity: 0; \n transform: translateY(30px);\n }\n to { \n opacity: 1; \n transform: translateY(0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideFadeUpExit {\n from { \n opacity: 1; \n transform: translateY(0);\n }\n to { \n opacity: 0; \n transform: translateY(-30px);\n }\n }\n `,\n enterClass: `\n .vfx-slide-fade-up-enter {\n animation: slideFadeUpEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-fade-up-exit {\n animation: slideFadeUpExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n\nexport const fadeDownEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFadeDownEnter {\n from { \n opacity: 0; \n transform: translateY(-30px);\n }\n to { \n opacity: 1; \n transform: translateY(0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideFadeDownExit {\n from { \n opacity: 1; \n transform: translateY(0);\n }\n to { \n opacity: 0; \n transform: translateY(30px);\n }\n }\n `,\n enterClass: `\n .vfx-slide-fade-down-enter {\n animation: slideFadeDownEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-fade-down-exit {\n animation: slideFadeDownExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n\nexport const fadeLeftEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFadeLeftEnter {\n from { \n opacity: 0; \n transform: translateX(30px);\n }\n to { \n opacity: 1; \n transform: translateX(0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideFadeLeftExit {\n from { \n opacity: 1; \n transform: translateX(0);\n }\n to { \n opacity: 0; \n transform: translateX(-30px);\n }\n }\n `,\n enterClass: `\n .vfx-slide-fade-left-enter {\n animation: slideFadeLeftEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-fade-left-exit {\n animation: slideFadeLeftExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n\nexport const fadeRightEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFadeRightEnter {\n from { \n opacity: 0; \n transform: translateX(-30px);\n }\n to { \n opacity: 1; \n transform: translateX(0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideFadeRightExit {\n from { \n opacity: 1; \n transform: translateX(0);\n }\n to { \n opacity: 0; \n transform: translateX(30px);\n }\n }\n `,\n enterClass: `\n .vfx-slide-fade-right-enter {\n animation: slideFadeRightEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-fade-right-exit {\n animation: slideFadeRightExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n", "/**\n * slide.ts - \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC\n */\n\nimport { SlideEffect } from \"./types\";\n\nexport const slideUpEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideUpEnter {\n from { transform: translateY(100%); }\n to { transform: translateY(0); }\n }\n `,\n exitKeyframes: `\n @keyframes slideUpExit {\n from { transform: translateY(0); }\n to { transform: translateY(-100%); }\n }\n `,\n enterClass: `\n .vfx-slide-slide-up-enter {\n animation: slideUpEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-slide-up-exit {\n animation: slideUpExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n\nexport const slideDownEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideDownEnter {\n from { transform: translateY(-100%); }\n to { transform: translateY(0); }\n }\n `,\n exitKeyframes: `\n @keyframes slideDownExit {\n from { transform: translateY(0); }\n to { transform: translateY(100%); }\n }\n `,\n enterClass: `\n .vfx-slide-slide-down-enter {\n animation: slideDownEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-slide-down-exit {\n animation: slideDownExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n\nexport const slideLeftEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideLeftEnter {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n `,\n exitKeyframes: `\n @keyframes slideLeftExit {\n from { transform: translateX(0); }\n to { transform: translateX(-100%); }\n }\n `,\n enterClass: `\n .vfx-slide-slide-left-enter {\n animation: slideLeftEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-slide-left-exit {\n animation: slideLeftExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n\nexport const slideRightEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideRightEnter {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n }\n `,\n exitKeyframes: `\n @keyframes slideRightExit {\n from { transform: translateX(0); }\n to { transform: translateX(100%); }\n }\n `,\n enterClass: `\n .vfx-slide-slide-right-enter {\n animation: slideRightEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-slide-right-exit {\n animation: slideRightExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n};\n", "/**\n * rotate.ts - \uD68C\uC804 \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC\n */\n\nimport { SlideEffect } from \"./types\";\n\nexport const rotateLeftEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideRotateLeftEnter {\n from { \n opacity: 0;\n transform: rotate(-90deg) scale(0.8);\n }\n to { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideRotateLeftExit {\n from { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n to { \n opacity: 0;\n transform: rotate(-90deg) scale(0.8);\n }\n }\n `,\n enterClass: `\n .vfx-slide-rotate-left-enter {\n animation: slideRotateLeftEnter var(--slide-duration, 600ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-rotate-left-exit {\n animation: slideRotateLeftExit var(--slide-duration, 600ms) ease-in forwards;\n }\n `,\n defaultDuration: 600,\n};\n\nexport const rotateRightEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideRotateRightEnter {\n from { \n opacity: 0;\n transform: rotate(90deg) scale(0.8);\n }\n to { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideRotateRightExit {\n from { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n to { \n opacity: 0;\n transform: rotate(90deg) scale(0.8);\n }\n }\n `,\n enterClass: `\n .vfx-slide-rotate-right-enter {\n animation: slideRotateRightEnter var(--slide-duration, 600ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-rotate-right-exit {\n animation: slideRotateRightExit var(--slide-duration, 600ms) ease-in forwards;\n }\n `,\n defaultDuration: 600,\n};\n\nexport const rotateInEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideRotateInEnter {\n from { \n opacity: 0;\n transform: rotate(-180deg) scale(0);\n }\n to { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideRotateInExit {\n from { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n to { \n opacity: 0;\n transform: rotate(180deg) scale(0);\n }\n }\n `,\n enterClass: `\n .vfx-slide-rotate-in-enter {\n animation: slideRotateInEnter var(--slide-duration, 700ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-rotate-in-exit {\n animation: slideRotateInExit var(--slide-duration, 700ms) ease-in forwards;\n }\n `,\n defaultDuration: 700,\n};\n\nexport const rotateOutEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideRotateOutEnter {\n from { \n opacity: 0;\n transform: rotate(180deg) scale(1.5);\n }\n to { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideRotateOutExit {\n from { \n opacity: 1;\n transform: rotate(0) scale(1);\n }\n to { \n opacity: 0;\n transform: rotate(-180deg) scale(1.5);\n }\n }\n `,\n enterClass: `\n .vfx-slide-rotate-out-enter {\n animation: slideRotateOutEnter var(--slide-duration, 700ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-rotate-out-exit {\n animation: slideRotateOutExit var(--slide-duration, 700ms) ease-in forwards;\n }\n `,\n defaultDuration: 700,\n};\n", "/**\n * flip.ts - \uD50C\uB9BD \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC\n */\n\nimport { SlideEffect } from \"./types\";\n\nexport const flipXEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFlipXEnter {\n from { \n opacity: 0;\n transform: perspective(1000px) rotateX(-90deg);\n }\n to { \n opacity: 1;\n transform: perspective(1000px) rotateX(0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideFlipXExit {\n from { \n opacity: 1;\n transform: perspective(1000px) rotateX(0);\n }\n to { \n opacity: 0;\n transform: perspective(1000px) rotateX(90deg);\n }\n }\n `,\n enterClass: `\n .vfx-slide-flip-x-enter {\n animation: slideFlipXEnter var(--slide-duration, 600ms) ease-out forwards;\n transform-style: preserve-3d;\n }\n `,\n exitClass: `\n .vfx-slide-flip-x-exit {\n animation: slideFlipXExit var(--slide-duration, 600ms) ease-in forwards;\n transform-style: preserve-3d;\n }\n `,\n defaultDuration: 600,\n};\n\nexport const flipYEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFlipYEnter {\n from { \n opacity: 0;\n transform: perspective(1000px) rotateY(-90deg);\n }\n to { \n opacity: 1;\n transform: perspective(1000px) rotateY(0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideFlipYExit {\n from { \n opacity: 1;\n transform: perspective(1000px) rotateY(0);\n }\n to { \n opacity: 0;\n transform: perspective(1000px) rotateY(90deg);\n }\n }\n `,\n enterClass: `\n .vfx-slide-flip-y-enter {\n animation: slideFlipYEnter var(--slide-duration, 600ms) ease-out forwards;\n transform-style: preserve-3d;\n }\n `,\n exitClass: `\n .vfx-slide-flip-y-exit {\n animation: slideFlipYExit var(--slide-duration, 600ms) ease-in forwards;\n transform-style: preserve-3d;\n }\n `,\n defaultDuration: 600,\n};\n\nexport const flipDiagonalEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideFlipDiagonalEnter {\n from { \n opacity: 0;\n transform: perspective(1000px) rotate3d(1, 1, 0, -90deg);\n }\n to { \n opacity: 1;\n transform: perspective(1000px) rotate3d(1, 1, 0, 0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideFlipDiagonalExit {\n from { \n opacity: 1;\n transform: perspective(1000px) rotate3d(1, 1, 0, 0);\n }\n to { \n opacity: 0;\n transform: perspective(1000px) rotate3d(1, 1, 0, 90deg);\n }\n }\n `,\n enterClass: `\n .vfx-slide-flip-diagonal-enter {\n animation: slideFlipDiagonalEnter var(--slide-duration, 700ms) ease-out forwards;\n transform-style: preserve-3d;\n }\n `,\n exitClass: `\n .vfx-slide-flip-diagonal-exit {\n animation: slideFlipDiagonalExit var(--slide-duration, 700ms) ease-in forwards;\n transform-style: preserve-3d;\n }\n `,\n defaultDuration: 700,\n};\n", "/**\n * zoom.ts - \uC90C \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC\n */\n\nimport { SlideEffect } from \"./types\";\n\nexport const zoomInEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideZoomInEnter {\n from { \n opacity: 0;\n transform: scale(0.3);\n }\n to { \n opacity: 1;\n transform: scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideZoomInExit {\n from { \n opacity: 1;\n transform: scale(1);\n }\n to { \n opacity: 0;\n transform: scale(1.5);\n }\n }\n `,\n enterClass: `\n .vfx-slide-zoom-in-enter {\n animation: slideZoomInEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-zoom-in-exit {\n animation: slideZoomInExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const zoomOutEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideZoomOutEnter {\n from { \n opacity: 0;\n transform: scale(1.5);\n }\n to { \n opacity: 1;\n transform: scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideZoomOutExit {\n from { \n opacity: 1;\n transform: scale(1);\n }\n to { \n opacity: 0;\n transform: scale(0.3);\n }\n }\n `,\n enterClass: `\n .vfx-slide-zoom-out-enter {\n animation: slideZoomOutEnter var(--slide-duration, 500ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-zoom-out-exit {\n animation: slideZoomOutExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const zoomLeftEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideZoomLeftEnter {\n from { \n opacity: 0;\n transform: scale(0.3) translateX(-50%);\n transform-origin: left center;\n }\n to { \n opacity: 1;\n transform: scale(1) translateX(0);\n transform-origin: left center;\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideZoomLeftExit {\n from { \n opacity: 1;\n transform: scale(1) translateX(0);\n transform-origin: left center;\n }\n to { \n opacity: 0;\n transform: scale(0.3) translateX(-50%);\n transform-origin: left center;\n }\n }\n `,\n enterClass: `\n .vfx-slide-zoom-left-enter {\n animation: slideZoomLeftEnter var(--slide-duration, 500ms) ease-out forwards;\n transform-origin: left center;\n }\n `,\n exitClass: `\n .vfx-slide-zoom-left-exit {\n animation: slideZoomLeftExit var(--slide-duration, 500ms) ease-in forwards;\n transform-origin: left center;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const zoomRightEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideZoomRightEnter {\n from { \n opacity: 0;\n transform: scale(0.3) translateX(50%);\n transform-origin: right center;\n }\n to { \n opacity: 1;\n transform: scale(1) translateX(0);\n transform-origin: right center;\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideZoomRightExit {\n from { \n opacity: 1;\n transform: scale(1) translateX(0);\n transform-origin: right center;\n }\n to { \n opacity: 0;\n transform: scale(0.3) translateX(50%);\n transform-origin: right center;\n }\n }\n `,\n enterClass: `\n .vfx-slide-zoom-right-enter {\n animation: slideZoomRightEnter var(--slide-duration, 500ms) ease-out forwards;\n transform-origin: right center;\n }\n `,\n exitClass: `\n .vfx-slide-zoom-right-exit {\n animation: slideZoomRightExit var(--slide-duration, 500ms) ease-in forwards;\n transform-origin: right center;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const zoomTopEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideZoomTopEnter {\n from { \n opacity: 0;\n transform: scale(0.3) translateY(-50%);\n transform-origin: center top;\n }\n to { \n opacity: 1;\n transform: scale(1) translateY(0);\n transform-origin: center top;\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideZoomTopExit {\n from { \n opacity: 1;\n transform: scale(1) translateY(0);\n transform-origin: center top;\n }\n to { \n opacity: 0;\n transform: scale(0.3) translateY(-50%);\n transform-origin: center top;\n }\n }\n `,\n enterClass: `\n .vfx-slide-zoom-top-enter {\n animation: slideZoomTopEnter var(--slide-duration, 500ms) ease-out forwards;\n transform-origin: center top;\n }\n `,\n exitClass: `\n .vfx-slide-zoom-top-exit {\n animation: slideZoomTopExit var(--slide-duration, 500ms) ease-in forwards;\n transform-origin: center top;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const zoomBottomEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideZoomBottomEnter {\n from { \n opacity: 0;\n transform: scale(0.3) translateY(50%);\n transform-origin: center bottom;\n }\n to { \n opacity: 1;\n transform: scale(1) translateY(0);\n transform-origin: center bottom;\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideZoomBottomExit {\n from { \n opacity: 1;\n transform: scale(1) translateY(0);\n transform-origin: center bottom;\n }\n to { \n opacity: 0;\n transform: scale(0.3) translateY(50%);\n transform-origin: center bottom;\n }\n }\n `,\n enterClass: `\n .vfx-slide-zoom-bottom-enter {\n animation: slideZoomBottomEnter var(--slide-duration, 500ms) ease-out forwards;\n transform-origin: center bottom;\n }\n `,\n exitClass: `\n .vfx-slide-zoom-bottom-exit {\n animation: slideZoomBottomExit var(--slide-duration, 500ms) ease-in forwards;\n transform-origin: center bottom;\n }\n `,\n defaultDuration: 500,\n};\n", "/**\n * special.ts - \uD2B9\uC218 \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC (bounce, elastic, swing, blur, kenburns)\n */\n\nimport { SlideEffect } from \"./types\";\n\nexport const bounceEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideBounceEnter {\n 0% { \n opacity: 0;\n transform: scale(0.3);\n }\n 50% { \n transform: scale(1.1);\n }\n 70% { \n transform: scale(0.9);\n }\n 100% { \n opacity: 1;\n transform: scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideBounceExit {\n 0% { \n opacity: 1;\n transform: scale(1);\n }\n 30% { \n transform: scale(1.1);\n }\n 100% { \n opacity: 0;\n transform: scale(0.3);\n }\n }\n `,\n enterClass: `\n .vfx-slide-bounce-enter {\n animation: slideBounceEnter var(--slide-duration, 700ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-bounce-exit {\n animation: slideBounceExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n defaultDuration: 700,\n};\n\nexport const elasticEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideElasticEnter {\n 0% { \n opacity: 0;\n transform: scale(0);\n }\n 55% { \n opacity: 1;\n transform: scale(1.1);\n }\n 70% { \n transform: scale(0.95);\n }\n 85% { \n transform: scale(1.02);\n }\n 100% { \n transform: scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideElasticExit {\n 0% { \n opacity: 1;\n transform: scale(1);\n }\n 15% { \n transform: scale(1.05);\n }\n 100% { \n opacity: 0;\n transform: scale(0);\n }\n }\n `,\n enterClass: `\n .vfx-slide-elastic-enter {\n animation: slideElasticEnter var(--slide-duration, 800ms) cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards;\n }\n `,\n exitClass: `\n .vfx-slide-elastic-exit {\n animation: slideElasticExit var(--slide-duration, 500ms) ease-in forwards;\n }\n `,\n defaultDuration: 800,\n};\n\nexport const swingEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideSwingEnter {\n 0% { \n opacity: 0;\n transform: perspective(500px) rotateY(-90deg);\n transform-origin: right center;\n }\n 100% { \n opacity: 1;\n transform: perspective(500px) rotateY(0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideSwingExit {\n 0% { \n opacity: 1;\n transform: perspective(500px) rotateY(0);\n transform-origin: left center;\n }\n 100% { \n opacity: 0;\n transform: perspective(500px) rotateY(90deg);\n }\n }\n `,\n enterClass: `\n .vfx-slide-swing-enter {\n animation: slideSwingEnter var(--slide-duration, 600ms) ease-out forwards;\n transform-style: preserve-3d;\n }\n `,\n exitClass: `\n .vfx-slide-swing-exit {\n animation: slideSwingExit var(--slide-duration, 500ms) ease-in forwards;\n transform-style: preserve-3d;\n }\n `,\n defaultDuration: 600,\n};\n\nexport const blurEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideBlurEnter {\n from { \n opacity: 0;\n filter: blur(20px);\n transform: scale(1.2);\n }\n to { \n opacity: 1;\n filter: blur(0);\n transform: scale(1);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideBlurExit {\n from { \n opacity: 1;\n filter: blur(0);\n transform: scale(1);\n }\n to { \n opacity: 0;\n filter: blur(20px);\n transform: scale(0.8);\n }\n }\n `,\n enterClass: `\n .vfx-slide-blur-enter {\n animation: slideBlurEnter var(--slide-duration, 600ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-blur-exit {\n animation: slideBlurExit var(--slide-duration, 600ms) ease-in forwards;\n }\n `,\n defaultDuration: 600,\n};\n\nexport const kenburnsEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideKenburnsEnter {\n from { \n opacity: 0;\n transform: scale(1.3) translate(-5%, -5%);\n }\n to { \n opacity: 1;\n transform: scale(1) translate(0, 0);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideKenburnsExit {\n from { \n opacity: 1;\n transform: scale(1) translate(0, 0);\n }\n to { \n opacity: 0;\n transform: scale(1.3) translate(5%, 5%);\n }\n }\n `,\n enterClass: `\n .vfx-slide-kenburns-enter {\n animation: slideKenburnsEnter var(--slide-duration, 1000ms) ease-out forwards;\n }\n `,\n exitClass: `\n .vfx-slide-kenburns-exit {\n animation: slideKenburnsExit var(--slide-duration, 1000ms) ease-in forwards;\n }\n `,\n defaultDuration: 1000,\n};\n", "/**\n * drift.ts - \uB4DC\uB9AC\uD504\uD2B8(\uD328\uB2DD+\uC90C) \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC\n * \uD604\uC7AC \uC774\uBBF8\uC9C0\uAC00 \uC11C\uC11C\uD788 \uC90C\uC778/\uD328\uB2DD\uB418\uB2E4\uAC00 \uB2E4\uC74C \uC774\uBBF8\uC9C0\uB85C \uC804\uD658\n */\n\nimport { SlideEffect } from \"./types\";\n\nexport const driftLeftEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideDriftLeftEnter {\n from { \n opacity: 0;\n }\n to { \n opacity: 1;\n }\n }\n @keyframes slideDriftLeftIdle {\n from { \n transform: scale(1) translateX(0);\n }\n to { \n transform: scale(1.3) translateX(-12%);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideDriftLeftExit {\n from { \n opacity: 1;\n }\n to { \n opacity: 0;\n }\n }\n `,\n enterClass: `\n .vfx-slide-drift-left-enter {\n animation: slideDriftLeftEnter 500ms ease-out forwards;\n }\n .vfx-slide-drift-left-idle {\n animation: slideDriftLeftIdle calc(var(--slide-interval, 5000ms) * 2) linear forwards;\n }\n `,\n exitClass: `\n .vfx-slide-drift-left-exit {\n animation: slideDriftLeftExit 500ms ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const driftRightEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideDriftRightEnter {\n from { \n opacity: 0;\n }\n to { \n opacity: 1;\n }\n }\n @keyframes slideDriftRightIdle {\n from { \n transform: scale(1) translateX(0);\n }\n to { \n transform: scale(1.3) translateX(12%);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideDriftRightExit {\n from { \n opacity: 1;\n }\n to { \n opacity: 0;\n }\n }\n `,\n enterClass: `\n .vfx-slide-drift-right-enter {\n animation: slideDriftRightEnter 500ms ease-out forwards;\n }\n .vfx-slide-drift-right-idle {\n animation: slideDriftRightIdle calc(var(--slide-interval, 5000ms) * 2) linear forwards;\n }\n `,\n exitClass: `\n .vfx-slide-drift-right-exit {\n animation: slideDriftRightExit 500ms ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const driftUpEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideDriftUpEnter {\n from { \n opacity: 0;\n }\n to { \n opacity: 1;\n }\n }\n @keyframes slideDriftUpIdle {\n from { \n transform: scale(1) translateY(0);\n }\n to { \n transform: scale(1.3) translateY(-10%);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideDriftUpExit {\n from { \n opacity: 1;\n }\n to { \n opacity: 0;\n }\n }\n `,\n enterClass: `\n .vfx-slide-drift-up-enter {\n animation: slideDriftUpEnter 500ms ease-out forwards;\n }\n .vfx-slide-drift-up-idle {\n animation: slideDriftUpIdle calc(var(--slide-interval, 5000ms) * 2) linear forwards;\n }\n `,\n exitClass: `\n .vfx-slide-drift-up-exit {\n animation: slideDriftUpExit 500ms ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const driftDownEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideDriftDownEnter {\n from { \n opacity: 0;\n }\n to { \n opacity: 1;\n }\n }\n @keyframes slideDriftDownIdle {\n from { \n transform: scale(1) translateY(0);\n }\n to { \n transform: scale(1.3) translateY(10%);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideDriftDownExit {\n from { \n opacity: 1;\n }\n to { \n opacity: 0;\n }\n }\n `,\n enterClass: `\n .vfx-slide-drift-down-enter {\n animation: slideDriftDownEnter 500ms ease-out forwards;\n }\n .vfx-slide-drift-down-idle {\n animation: slideDriftDownIdle calc(var(--slide-interval, 5000ms) * 2) linear forwards;\n }\n `,\n exitClass: `\n .vfx-slide-drift-down-exit {\n animation: slideDriftDownExit 500ms ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const driftZoomEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideDriftZoomEnter {\n from { \n opacity: 0;\n }\n to { \n opacity: 1;\n }\n }\n @keyframes slideDriftZoomIdle {\n from { \n transform: scale(1);\n }\n to { \n transform: scale(1.2);\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideDriftZoomExit {\n from { \n opacity: 1;\n }\n to { \n opacity: 0;\n }\n }\n `,\n enterClass: `\n .vfx-slide-drift-zoom-enter {\n animation: slideDriftZoomEnter 500ms ease-out forwards;\n }\n .vfx-slide-drift-zoom-idle {\n animation: slideDriftZoomIdle calc(var(--slide-interval, 5000ms) * 2) linear forwards;\n }\n `,\n exitClass: `\n .vfx-slide-drift-zoom-exit {\n animation: slideDriftZoomExit 500ms ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n\nexport const driftRandomEffect: SlideEffect = {\n enterKeyframes: `\n @keyframes slideDriftRandomEnter {\n from { \n opacity: 0;\n }\n to { \n opacity: 1;\n }\n }\n @keyframes slideDriftRandomIdle {\n from { \n transform: scale(1) translate(0, 0);\n }\n to { \n transform: scale(1.25) translate(var(--drift-x, 0%), var(--drift-y, 0%));\n }\n }\n `,\n exitKeyframes: `\n @keyframes slideDriftRandomExit {\n from { \n opacity: 1;\n }\n to { \n opacity: 0;\n }\n }\n `,\n enterClass: `\n .vfx-slide-drift-random-enter {\n animation: slideDriftRandomEnter 500ms ease-out forwards;\n }\n .vfx-slide-drift-random-idle {\n animation: slideDriftRandomIdle calc(var(--slide-interval, 5000ms) * 2) linear forwards;\n }\n `,\n exitClass: `\n .vfx-slide-drift-random-exit {\n animation: slideDriftRandomExit 500ms ease-in forwards;\n }\n `,\n defaultDuration: 500,\n};\n", "/**\n * slide-effects/index.ts - \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\n */\n\nimport { SlideEffectType, SlideEffect, DriftEffectType } from \"./types\";\n\n// Fade effects\nimport {\n fadeEffect,\n fadeUpEffect,\n fadeDownEffect,\n fadeLeftEffect,\n fadeRightEffect,\n} from \"./fade\";\n\n// Slide effects\nimport {\n slideUpEffect,\n slideDownEffect,\n slideLeftEffect,\n slideRightEffect,\n} from \"./slide\";\n\n// Rotate effects\nimport {\n rotateLeftEffect,\n rotateRightEffect,\n rotateInEffect,\n rotateOutEffect,\n} from \"./rotate\";\n\n// Flip effects\nimport { flipXEffect, flipYEffect, flipDiagonalEffect } from \"./flip\";\n\n// Zoom effects\nimport {\n zoomInEffect,\n zoomOutEffect,\n zoomLeftEffect,\n zoomRightEffect,\n zoomTopEffect,\n zoomBottomEffect,\n} from \"./zoom\";\n\n// Special effects\nimport {\n bounceEffect,\n elasticEffect,\n swingEffect,\n blurEffect,\n kenburnsEffect,\n} from \"./special\";\n\n// Drift effects\nimport {\n driftLeftEffect,\n driftRightEffect,\n driftUpEffect,\n driftDownEffect,\n driftZoomEffect,\n driftRandomEffect,\n} from \"./drift\";\n\n/**\n * \uC2AC\uB77C\uC774\uB4DC \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\n */\nexport const slideEffectRegistry: Record<SlideEffectType, SlideEffect> = {\n // Fade\n fade: fadeEffect,\n \"fade-up\": fadeUpEffect,\n \"fade-down\": fadeDownEffect,\n \"fade-left\": fadeLeftEffect,\n \"fade-right\": fadeRightEffect,\n\n // Slide\n \"slide-up\": slideUpEffect,\n \"slide-down\": slideDownEffect,\n \"slide-left\": slideLeftEffect,\n \"slide-right\": slideRightEffect,\n\n // Rotate\n \"rotate-left\": rotateLeftEffect,\n \"rotate-right\": rotateRightEffect,\n \"rotate-in\": rotateInEffect,\n \"rotate-out\": rotateOutEffect,\n\n // Flip\n \"flip-x\": flipXEffect,\n \"flip-y\": flipYEffect,\n \"flip-diagonal\": flipDiagonalEffect,\n\n // Zoom\n \"zoom-in\": zoomInEffect,\n \"zoom-out\": zoomOutEffect,\n \"zoom-left\": zoomLeftEffect,\n \"zoom-right\": zoomRightEffect,\n \"zoom-top\": zoomTopEffect,\n \"zoom-bottom\": zoomBottomEffect,\n\n // Special\n bounce: bounceEffect,\n elastic: elasticEffect,\n swing: swingEffect,\n blur: blurEffect,\n kenburns: kenburnsEffect,\n};\n\n/**\n * \uB4DC\uB9AC\uD504\uD2B8(idle) \uD6A8\uACFC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\n */\nexport const driftEffectRegistry: Record<\n Exclude<DriftEffectType, \"none\">,\n SlideEffect\n> = {\n \"drift-left\": driftLeftEffect,\n \"drift-right\": driftRightEffect,\n \"drift-up\": driftUpEffect,\n \"drift-down\": driftDownEffect,\n \"drift-zoom\": driftZoomEffect,\n \"drift-random\": driftRandomEffect,\n};\n\n// \uAC1C\uBCC4 \uD6A8\uACFC export\nexport {\n fadeEffect,\n fadeUpEffect,\n fadeDownEffect,\n fadeLeftEffect,\n fadeRightEffect,\n};\nexport { slideUpEffect, slideDownEffect, slideLeftEffect, slideRightEffect };\nexport { rotateLeftEffect, rotateRightEffect, rotateInEffect, rotateOutEffect };\nexport { flipXEffect, flipYEffect, flipDiagonalEffect };\nexport {\n zoomInEffect,\n zoomOutEffect,\n zoomLeftEffect,\n zoomRightEffect,\n zoomTopEffect,\n zoomBottomEffect,\n};\nexport { bounceEffect, elasticEffect, swingEffect, blurEffect, kenburnsEffect };\nexport {\n driftLeftEffect,\n driftRightEffect,\n driftUpEffect,\n driftDownEffect,\n driftZoomEffect,\n driftRandomEffect,\n};\n\n// \uD0C0\uC785 export\nexport type { SlideEffectType, SlideEffect, DriftEffectType } from \"./types\";\n", "import React from \"react\";\nimport { VfxSlideItemProps } from \"./types\";\n\nexport type { VfxSlideItemProps };\n\n/**\n * VfxSlideItem - VfxSlide \uB0B4\uBD80\uC5D0\uC11C \uC0AC\uC6A9\uD558\uB294 \uAC1C\uBCC4 \uC2AC\uB77C\uC774\uB4DC \uC544\uC774\uD15C\n *\n * \uAC01 \uC2AC\uB77C\uC774\uB4DC\uB9C8\uB2E4 \uB2E4\uB978 \uC804\uD658 \uD6A8\uACFC, \uB4DC\uB9AC\uD504\uD2B8 \uD6A8\uACFC, \uC9C0\uC18D \uC2DC\uAC04\uC744 \uC124\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\n * \uC124\uC815\uD558\uC9C0 \uC54A\uC740 \uC18D\uC131\uC740 \uBD80\uBAA8 VfxSlide\uC758 \uAE30\uBCF8\uAC12\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n *\n * @example\n * ```tsx\n * <VfxSlide effect=\"fade\" driftEffect=\"drift-zoom\">\n * <VfxSlideItem effect=\"zoom-in\" driftEffect=\"drift-left\">\n * <img src=\"image1.jpg\" />\n * </VfxSlideItem>\n * <VfxSlideItem effect=\"slide-right\">\n * <img src=\"image2.jpg\" />\n * </VfxSlideItem>\n * <VfxSlideItem>\n * <img src=\"image3.jpg\" />\n * </VfxSlideItem>\n * </VfxSlide>\n * ```\n */\nconst VfxSlideItem: React.FC<VfxSlideItemProps> = ({ children, className }) => {\n // \uC774 \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uC2E4\uC81C\uB85C \uB80C\uB354\uB9C1\uB418\uC9C0 \uC54A\uACE0 VfxSlide\uC5D0\uC11C props\uB97C \uCD94\uCD9C\uD558\uB294 \uC6A9\uB3C4\uB85C \uC0AC\uC6A9\uB429\uB2C8\uB2E4.\n // VfxSlide\uAC00 children\uC744 \uBD84\uC11D\uD560 \uB54C \uC774 \uCEF4\uD3EC\uB10C\uD2B8\uC758 props\uB97C \uC77D\uC5B4\uC11C \uAC1C\uBCC4 \uC124\uC815\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4.\n return (\n <div className={`vfx-slide-item-content ${className || \"\"}`}>\n {children}\n </div>\n );\n};\n\n// VfxSlide\uC5D0\uC11C VfxSlideItem\uC778\uC9C0 \uD655\uC778\uD558\uAE30 \uC704\uD55C \uC2DD\uBCC4\uC790\nVfxSlideItem.displayName = \"VfxSlideItem\";\n\nexport default VfxSlideItem;\n"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "VfxDiv", "VfxParticle", "VfxSlide_default", "VfxSlideItem_default", "VfxText", "addBorderEffectStyles", "addTextEffectStyles", "driftEffectRegistry", "slideEffectRegistry", "useTextEffect", "__toCommonJS", "import_react", "useTextEffect", "text", "effect", "isActive", "displayedText", "setDisplayedText", "currentIndex", "setCurrentIndex", "typingInterval", "restartTimeout", "startTyping", "index", "fadeEffect", "flowingEffect", "yellowPulseEffect", "redPulseEffect", "bluePulseEffect", "greenPulseEffect", "pinkPulseEffect", "purplePulseEffect", "blinkEffect", "spinXEffect", "spinYEffect", "spinCenterEffect", "swingXEffect", "swingYEffect", "shakeEffect", "bounceEffect", "waveEffect", "glitchEffect", "neonEffect", "zoomEffect", "blurEffect", "rainbowEffect", "jitterEffect", "flyInEffect", "textEffectRegistry", "fadeEffect", "flowingEffect", "yellowPulseEffect", "redPulseEffect", "bluePulseEffect", "greenPulseEffect", "pinkPulseEffect", "purplePulseEffect", "blinkEffect", "spinXEffect", "spinYEffect", "spinCenterEffect", "swingXEffect", "swingYEffect", "shakeEffect", "bounceEffect", "waveEffect", "glitchEffect", "neonEffect", "zoomEffect", "blurEffect", "rainbowEffect", "jitterEffect", "flyInEffect", "generateAllTextEffectStyles", "styles", "effect", "getTextEffectClass", "getTextEffectAdditionalStyle", "import_jsx_runtime", "addTextEffectStyles", "styleId", "style", "generateAllTextEffectStyles", "VfxText", "title", "effect", "isActive", "className", "textToShow", "getEffectStyle", "isTypingComplete", "useTextEffect", "calculateFlowingDuration", "text", "calculatedDuration", "glowClass", "additionalStyle", "getTextEffectClass", "getTextEffectAdditionalStyle", "baseStyle", "char", "index", "duration", "import_react", "BORDER_GLOW_SPEED", "BORDER_GLOW_RATIO", "yellowPulseBorderEffect", "BORDER_GLOW_RATIO", "BORDER_GLOW_SPEED", "redPulseBorderEffect", "bluePulseBorderEffect", "greenPulseBorderEffect", "pinkPulseBorderEffect", "purplePulseBorderEffect", "yellowSparkleBorderEffect", "redSparkleBorderEffect", "blueSparkleBorderEffect", "greenSparkleBorderEffect", "pinkSparkleBorderEffect", "purpleSparkleBorderEffect", "rainbowSparkleBorderEffect", "dashFlowKeyframes", "createDashFlowClass", "color", "colorHex", "yellowDashFlowBorderEffect", "redDashFlowBorderEffect", "blueDashFlowBorderEffect", "greenDashFlowBorderEffect", "pinkDashFlowBorderEffect", "purpleDashFlowBorderEffect", "dashRotateBaseKeyframes", "dashRotateBaseClasses", "createDashRotateGradient", "colorHex", "yellowDashRotateBorderEffect", "redDashRotateBorderEffect", "blueDashRotateBorderEffect", "greenDashRotateBorderEffect", "pinkDashRotateBorderEffect", "purpleDashRotateBorderEffect", "rainbowDashRotateBorderEffect", "rainbowBorderEffect", "breatheBorderEffect", "electricBorderEffect", "borderEffectRegistry", "yellowPulseBorderEffect", "redPulseBorderEffect", "bluePulseBorderEffect", "greenPulseBorderEffect", "pinkPulseBorderEffect", "purplePulseBorderEffect", "yellowSparkleBorderEffect", "redSparkleBorderEffect", "blueSparkleBorderEffect", "greenSparkleBorderEffect", "pinkSparkleBorderEffect", "purpleSparkleBorderEffect", "rainbowSparkleBorderEffect", "yellowDashFlowBorderEffect", "redDashFlowBorderEffect", "blueDashFlowBorderEffect", "greenDashFlowBorderEffect", "pinkDashFlowBorderEffect", "purpleDashFlowBorderEffect", "yellowDashRotateBorderEffect", "redDashRotateBorderEffect", "blueDashRotateBorderEffect", "greenDashRotateBorderEffect", "pinkDashRotateBorderEffect", "purpleDashRotateBorderEffect", "rainbowDashRotateBorderEffect", "rainbowBorderEffect", "breatheBorderEffect", "electricBorderEffect", "generateAllBorderEffectStyles", "styles", "effect", "getBorderEffectClass", "import_jsx_runtime", "addBorderEffectStyles", "styleId", "style", "generateAllBorderEffectStyles", "VfxDiv", "borderEffect", "children", "className", "divProps", "effectClass", "getBorderEffectClass", "import_react", "sparkleEffect", "canvas", "color", "speed", "size", "opacity", "_isInitial", "ctx", "particle", "i", "_canvas", "confettiEffect", "canvas", "color", "speed", "size", "opacity", "_isInitial", "ctx", "particle", "snowEffect", "canvas", "color", "speed", "size", "_opacity", "isInitial", "ctx", "particle", "fireflyEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "ctx", "particle", "gradient", "bubblesEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "ctx", "particle", "_canvas", "starsEffect", "canvas", "color", "_speed", "size", "opacity", "_isInitial", "ctx", "particle", "i", "_canvas", "rainEffect", "canvas", "color", "speed", "_size", "_opacity", "isInitial", "ctx", "particle", "leavesEffect", "canvas", "color", "speed", "size", "_opacity", "isInitial", "ctx", "particle", "leafSize", "leafType", "s", "g", "sakuraEffect", "canvas", "color", "speed", "size", "_opacity", "isInitial", "ctx", "particle", "sakuraSize", "smokeEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "ctx", "particle", "gradient", "_canvas", "dustEffect", "canvas", "color", "speed", "_size", "_opacity", "_isInitial", "ctx", "particle", "_canvas", "fireworksEffect", "canvas", "color", "speed", "_size", "_opacity", "_isInitial", "refs", "burstPoints", "burst", "burstX", "burstY", "fwAngle", "fwSpeed", "ctx", "particle", "tailX", "tailY", "gradient", "_canvas", "drawHeart", "ctx", "particle", "heartSize", "heartsUpEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "_canvas", "heartsDownEffect", "isInitial", "heartsPopEffect", "_speed", "progress", "targetSize", "growProgress", "fadeProgress", "heartsEffect", "coinsEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "ctx", "particle", "scaleX", "balloonsEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "ctx", "particle", "_canvas", "magicEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "mAngle", "mDistance", "ctx", "particle", "magicSpike", "magicWidth", "smallSpike", "smallWidth", "i", "angle", "dist", "dotSize", "_canvas", "portalEffect", "canvas", "color", "_speed", "size", "_opacity", "_isInitial", "pAngle", "pRadius", "ctx", "particle", "angle", "radius", "explosionEffect", "canvas", "color", "speed", "size", "_opacity", "_isInitial", "refs", "expBurstX", "expBurstY", "eAngle", "eSpeed", "ctx", "particle", "spikes", "outerRadius", "innerRadius", "gradient", "i", "angle", "jitter", "radius", "x", "y", "_canvas", "matrixEffect", "canvas", "color", "speed", "_size", "_opacity", "_isInitial", "codeLength", "codeString", "i", "ctx", "particle", "code", "charOpacity", "totalHeight", "fogEffect", "canvas", "color", "speed", "_size", "_opacity", "_isInitial", "ctx", "particle", "gradient", "electricEffect", "canvas", "color", "_speed", "_size", "_opacity", "_isInitial", "ctx", "particle", "ex", "ey", "eSegments", "eSegHeight", "i", "_canvas", "lightningEffect", "canvas", "color", "_speed", "_size", "_opacity", "_isInitial", "startX", "height", "bendCount", "points", "currentX", "direction", "i", "yRatio", "y", "zigzag", "pathStr", "flashDuration", "ctx", "particle", "flashOpacity", "p", "px", "py", "lastPoint", "drawMainBolt", "width", "blur", "drawArrowTip", "tipLength", "tipWidth", "_canvas", "flashEnd", "effectRegistry", "sparkleEffect", "confettiEffect", "snowEffect", "fireflyEffect", "bubblesEffect", "starsEffect", "rainEffect", "leavesEffect", "sakuraEffect", "smokeEffect", "dustEffect", "fireworksEffect", "heartsEffect", "heartsUpEffect", "heartsDownEffect", "heartsPopEffect", "coinsEffect", "balloonsEffect", "magicEffect", "portalEffect", "explosionEffect", "matrixEffect", "fogEffect", "electricEffect", "lightningEffect", "getDefaultColors", "effect", "effectModule", "import_jsx_runtime", "VfxParticle", "effect", "isActive", "options", "width", "height", "className", "style", "canvasRef", "particlesRef", "animationRef", "effectRefsRef", "effectModule", "effectRegistry", "count", "speed", "size", "colors", "getDefaultColors", "opacity", "createParticle", "canvas", "isInitial", "color", "drawParticle", "ctx", "particle", "updateParticle", "resizeCanvas", "rect", "animate", "alive", "import_react", "fadeEffect", "fadeUpEffect", "fadeDownEffect", "fadeLeftEffect", "fadeRightEffect", "slideUpEffect", "slideDownEffect", "slideLeftEffect", "slideRightEffect", "rotateLeftEffect", "rotateRightEffect", "rotateInEffect", "rotateOutEffect", "flipXEffect", "flipYEffect", "flipDiagonalEffect", "zoomInEffect", "zoomOutEffect", "zoomLeftEffect", "zoomRightEffect", "zoomTopEffect", "zoomBottomEffect", "bounceEffect", "elasticEffect", "swingEffect", "blurEffect", "kenburnsEffect", "driftLeftEffect", "driftRightEffect", "driftUpEffect", "driftDownEffect", "driftZoomEffect", "driftRandomEffect", "slideEffectRegistry", "fadeEffect", "fadeUpEffect", "fadeDownEffect", "fadeLeftEffect", "fadeRightEffect", "slideUpEffect", "slideDownEffect", "slideLeftEffect", "slideRightEffect", "rotateLeftEffect", "rotateRightEffect", "rotateInEffect", "rotateOutEffect", "flipXEffect", "flipYEffect", "flipDiagonalEffect", "zoomInEffect", "zoomOutEffect", "zoomLeftEffect", "zoomRightEffect", "zoomTopEffect", "zoomBottomEffect", "bounceEffect", "elasticEffect", "swingEffect", "blurEffect", "kenburnsEffect", "driftEffectRegistry", "driftLeftEffect", "driftRightEffect", "driftUpEffect", "driftDownEffect", "driftZoomEffect", "driftRandomEffect", "import_jsx_runtime", "VfxSlide", "children", "effect", "driftEffect", "controlledIndex", "onSlideChange", "autoPlay", "autoPlayInterval", "duration", "loop", "pauseOnHover", "className", "style", "showNavigation", "showIndicators", "enableKeyboard", "enableSwipe", "slideItems", "React", "child", "props", "slideCount", "internalIndex", "setInternalIndex", "prevIndex", "setPrevIndex", "isTransitioning", "setIsTransitioning", "isPaused", "setIsPaused", "currentRandomDrift", "setCurrentRandomDrift", "containerRef", "touchStartRef", "activeIndex", "getCurrentSlideConfig", "index", "item", "currentConfig", "driftOptions", "selected", "slideEffect", "slideEffectRegistry", "effectDuration", "usedEffects", "usedDriftEffects", "eff", "styleId", "effData", "styleEl", "drift", "dt", "dtData", "driftEffectRegistry", "dtStyleId", "dtStyleEl", "driftData", "driftStyleId", "driftStyleEl", "commonStyleId", "commonStyleEl", "goToSlide", "targetIndex", "goNext", "goPrev", "timer", "handleKeyDown", "e", "handleTouchStart", "handleTouchEnd", "deltaX", "deltaY", "handleMouseEnter", "handleMouseLeave", "getEnterClassName", "slideIndex", "getDriftIdleClassName", "slideDrift", "isActive", "isPrev", "itemConfig", "itemClassName", "itemStyle", "driftClass", "_", "VfxSlide_default", "import_jsx_runtime", "VfxSlideItem", "children", "className", "VfxSlideItem_default"]
7
+ }