@hatiolab/things-scene 9.0.0-beta.34 → 9.0.0-beta.36

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 (386) hide show
  1. package/babel.config.js +4 -3
  2. package/db.sqlite +0 -0
  3. package/dist/animation/animate.js +63 -0
  4. package/dist/animation/animate.js.map +1 -0
  5. package/dist/animation/animations/animation.js +122 -0
  6. package/dist/animation/animations/animation.js.map +1 -0
  7. package/dist/animation/animations/fade.js +28 -0
  8. package/dist/animation/animations/fade.js.map +1 -0
  9. package/dist/animation/animations/heartbeat.js +28 -0
  10. package/dist/animation/animations/heartbeat.js.map +1 -0
  11. package/dist/animation/animations/moving.js +24 -0
  12. package/dist/animation/animations/moving.js.map +1 -0
  13. package/dist/animation/animations/outline.js +47 -0
  14. package/dist/animation/animations/outline.js.map +1 -0
  15. package/dist/animation/animations/rotation.js +22 -0
  16. package/dist/animation/animations/rotation.js.map +1 -0
  17. package/dist/animation/animations/vibration.js +31 -0
  18. package/dist/animation/animations/vibration.js.map +1 -0
  19. package/dist/animation/compile.js +31 -0
  20. package/dist/animation/compile.js.map +1 -0
  21. package/dist/animation/delta.js +51 -0
  22. package/dist/animation/delta.js.map +1 -0
  23. package/dist/animation/index.js +14 -0
  24. package/dist/animation/index.js.map +1 -0
  25. package/dist/command/command-change.js +33 -0
  26. package/dist/command/command-change.js.map +1 -0
  27. package/dist/command/command-migrate.js +103 -0
  28. package/dist/command/command-migrate.js.map +1 -0
  29. package/dist/command/command.js +18 -0
  30. package/dist/command/command.js.map +1 -0
  31. package/dist/command/snapshot-commander.js +84 -0
  32. package/dist/command/snapshot-commander.js.map +1 -0
  33. package/dist/components/anchor/anchor.js +105 -0
  34. package/dist/components/anchor/anchor.js.map +1 -0
  35. package/dist/components/anchor/ellipse-anchors.js +53 -0
  36. package/dist/components/anchor/ellipse-anchors.js.map +1 -0
  37. package/dist/components/anchor/rect-anchors.js +53 -0
  38. package/dist/components/anchor/rect-anchors.js.map +1 -0
  39. package/dist/components/audio.js +154 -0
  40. package/dist/components/audio.js.map +1 -0
  41. package/dist/components/cloud.js +44 -0
  42. package/dist/components/cloud.js.map +1 -0
  43. package/dist/components/component.js +1086 -0
  44. package/dist/components/component.js.map +1 -0
  45. package/dist/components/container-abstract.js +387 -0
  46. package/dist/components/container-abstract.js.map +1 -0
  47. package/dist/components/container.js +331 -0
  48. package/dist/components/container.js.map +1 -0
  49. package/dist/components/data/data-mapping.js +82 -0
  50. package/dist/components/data/data-mapping.js.map +1 -0
  51. package/dist/components/data/data.js +166 -0
  52. package/dist/components/data/data.js.map +1 -0
  53. package/dist/components/data/evaluator.js +103 -0
  54. package/dist/components/data/evaluator.js.map +1 -0
  55. package/dist/components/donut.js +104 -0
  56. package/dist/components/donut.js.map +1 -0
  57. package/dist/components/drawer/draw-image-pendable.js +20 -0
  58. package/dist/components/drawer/draw-image-pendable.js.map +1 -0
  59. package/dist/components/drawer/effect.js +19 -0
  60. package/dist/components/drawer/effect.js.map +1 -0
  61. package/dist/components/drawer/fill.js +228 -0
  62. package/dist/components/drawer/fill.js.map +1 -0
  63. package/dist/components/drawer/format.js +115 -0
  64. package/dist/components/drawer/format.js.map +1 -0
  65. package/dist/components/drawer/line.js +191 -0
  66. package/dist/components/drawer/line.js.map +1 -0
  67. package/dist/components/drawer/stroke.js +62 -0
  68. package/dist/components/drawer/stroke.js.map +1 -0
  69. package/dist/components/drawer/text-wrapper.js +51 -0
  70. package/dist/components/drawer/text-wrapper.js.map +1 -0
  71. package/dist/components/drawer/text.js +269 -0
  72. package/dist/components/drawer/text.js.map +1 -0
  73. package/dist/components/ellipse.js +110 -0
  74. package/dist/components/ellipse.js.map +1 -0
  75. package/dist/components/file/ondropfile.js +19 -0
  76. package/dist/components/file/ondropfile.js.map +1 -0
  77. package/dist/components/fit/fit.js +137 -0
  78. package/dist/components/fit/fit.js.map +1 -0
  79. package/dist/components/geometry/transcoord.js +339 -0
  80. package/dist/components/geometry/transcoord.js.map +1 -0
  81. package/dist/components/geometry/union.js +35 -0
  82. package/dist/components/geometry/union.js.map +1 -0
  83. package/dist/components/gif-view.js +128 -0
  84. package/dist/components/gif-view.js.map +1 -0
  85. package/dist/components/global-ref.js +154 -0
  86. package/dist/components/global-ref.js.map +1 -0
  87. package/dist/components/group.js +171 -0
  88. package/dist/components/group.js.map +1 -0
  89. package/dist/components/html/elements.js +24 -0
  90. package/dist/components/html/elements.js.map +1 -0
  91. package/dist/components/html/fill.js +126 -0
  92. package/dist/components/html/fill.js.map +1 -0
  93. package/dist/components/html/reposition.js +119 -0
  94. package/dist/components/html/reposition.js.map +1 -0
  95. package/dist/components/html/shadow.js +24 -0
  96. package/dist/components/html/shadow.js.map +1 -0
  97. package/dist/components/html-overlay-container.js +27 -0
  98. package/dist/components/html-overlay-container.js.map +1 -0
  99. package/dist/components/html-overlay-element.js +22 -0
  100. package/dist/components/html-overlay-element.js.map +1 -0
  101. package/dist/components/image-view.js +193 -0
  102. package/dist/components/image-view.js.map +1 -0
  103. package/dist/components/index.js +231 -0
  104. package/dist/components/index.js.map +1 -0
  105. package/dist/components/info-window.js +416 -0
  106. package/dist/components/info-window.js.map +1 -0
  107. package/dist/components/line.js +374 -0
  108. package/dist/components/line.js.map +1 -0
  109. package/dist/components/local-ref.js +114 -0
  110. package/dist/components/local-ref.js.map +1 -0
  111. package/dist/components/mixins/connectable.js +128 -0
  112. package/dist/components/mixins/connectable.js.map +1 -0
  113. package/dist/components/mixins/data-source.js +34 -0
  114. package/dist/components/mixins/data-source.js.map +1 -0
  115. package/dist/components/mixins/html-element.js +107 -0
  116. package/dist/components/mixins/html-element.js.map +1 -0
  117. package/dist/components/mixins/move-handle.js +73 -0
  118. package/dist/components/mixins/move-handle.js.map +1 -0
  119. package/dist/components/mixins/rect-path.js +113 -0
  120. package/dist/components/mixins/rect-path.js.map +1 -0
  121. package/dist/components/mixins/value-holder.js +81 -0
  122. package/dist/components/mixins/value-holder.js.map +1 -0
  123. package/dist/components/mutater/bounds.js +68 -0
  124. package/dist/components/mutater/bounds.js.map +1 -0
  125. package/dist/components/mutater/path.js +73 -0
  126. package/dist/components/mutater/path.js.map +1 -0
  127. package/dist/components/ortholine.js +763 -0
  128. package/dist/components/ortholine.js.map +1 -0
  129. package/dist/components/outline/ellipse-outline.js +23 -0
  130. package/dist/components/outline/ellipse-outline.js.map +1 -0
  131. package/dist/components/outline/path-outline.js +48 -0
  132. package/dist/components/outline/path-outline.js.map +1 -0
  133. package/dist/components/path.js +49 -0
  134. package/dist/components/path.js.map +1 -0
  135. package/dist/components/polygon.js +91 -0
  136. package/dist/components/polygon.js.map +1 -0
  137. package/dist/components/polyline.js +114 -0
  138. package/dist/components/polyline.js.map +1 -0
  139. package/dist/components/popup.js +160 -0
  140. package/dist/components/popup.js.map +1 -0
  141. package/dist/components/rect.js +72 -0
  142. package/dist/components/rect.js.map +1 -0
  143. package/dist/components/retention/retention-manager.js +81 -0
  144. package/dist/components/retention/retention-manager.js.map +1 -0
  145. package/dist/components/root-container.js +519 -0
  146. package/dist/components/root-container.js.map +1 -0
  147. package/dist/components/ruler.js +103 -0
  148. package/dist/components/ruler.js.map +1 -0
  149. package/dist/components/shape.js +97 -0
  150. package/dist/components/shape.js.map +1 -0
  151. package/dist/components/star.js +103 -0
  152. package/dist/components/star.js.map +1 -0
  153. package/dist/components/text/substitutor.js +92 -0
  154. package/dist/components/text/substitutor.js.map +1 -0
  155. package/dist/components/text.js +21 -0
  156. package/dist/components/text.js.map +1 -0
  157. package/dist/components/triangle.js +92 -0
  158. package/dist/components/triangle.js.map +1 -0
  159. package/dist/const.js +71 -0
  160. package/dist/const.js.map +1 -0
  161. package/dist/core/collection.js +28 -0
  162. package/dist/core/collection.js.map +1 -0
  163. package/dist/core/debug.js +12 -0
  164. package/dist/core/debug.js.map +1 -0
  165. package/dist/core/deep-equals.js +112 -0
  166. package/dist/core/deep-equals.js.map +1 -0
  167. package/dist/core/dom-to-image.js +617 -0
  168. package/dist/core/dom-to-image.js.map +1 -0
  169. package/dist/core/event.js +205 -0
  170. package/dist/core/event.js.map +1 -0
  171. package/dist/core/index.js +21 -0
  172. package/dist/core/index.js.map +1 -0
  173. package/dist/core/list.js +87 -0
  174. package/dist/core/list.js.map +1 -0
  175. package/dist/core/logger.js +29 -0
  176. package/dist/core/logger.js.map +1 -0
  177. package/dist/core/memoize.js +40 -0
  178. package/dist/core/memoize.js.map +1 -0
  179. package/dist/core/mixin.js +26 -0
  180. package/dist/core/mixin.js.map +1 -0
  181. package/dist/core/obj-accessor.js +26 -0
  182. package/dist/core/obj-accessor.js.map +1 -0
  183. package/dist/core/reference-map.js +147 -0
  184. package/dist/core/reference-map.js.map +1 -0
  185. package/dist/core/round-rect.js +62 -0
  186. package/dist/core/round-rect.js.map +1 -0
  187. package/dist/core/safe-round.js +10 -0
  188. package/dist/core/safe-round.js.map +1 -0
  189. package/dist/core/script-loader.js +148 -0
  190. package/dist/core/script-loader.js.map +1 -0
  191. package/dist/core/snapshot-taker.js +59 -0
  192. package/dist/core/snapshot-taker.js.map +1 -0
  193. package/dist/core/stack.js +18 -0
  194. package/dist/core/stack.js.map +1 -0
  195. package/dist/core/timecapsule.js +88 -0
  196. package/dist/core/timecapsule.js.map +1 -0
  197. package/dist/core/utils.js +309 -0
  198. package/dist/core/utils.js.map +1 -0
  199. package/dist/decorator/anchors-decorator.js +53 -0
  200. package/dist/decorator/anchors-decorator.js.map +1 -0
  201. package/dist/decorator/bouncing-arrow-decorator.js +52 -0
  202. package/dist/decorator/bouncing-arrow-decorator.js.map +1 -0
  203. package/dist/decorator/data-spread-decorator.js +69 -0
  204. package/dist/decorator/data-spread-decorator.js.map +1 -0
  205. package/dist/decorator/decotag-decorator.js +33 -0
  206. package/dist/decorator/decotag-decorator.js.map +1 -0
  207. package/dist/decorator/index.js +31 -0
  208. package/dist/decorator/index.js.map +1 -0
  209. package/dist/decorator/link-decorator.js +66 -0
  210. package/dist/decorator/link-decorator.js.map +1 -0
  211. package/dist/effect/gradation.js +37 -0
  212. package/dist/effect/gradation.js.map +1 -0
  213. package/dist/effect/index.js +23 -0
  214. package/dist/effect/index.js.map +1 -0
  215. package/dist/effect/shadow.js +33 -0
  216. package/dist/effect/shadow.js.map +1 -0
  217. package/dist/effect/turn.js +25 -0
  218. package/dist/effect/turn.js.map +1 -0
  219. package/dist/event/event-engine.js +76 -0
  220. package/dist/event/event-engine.js.map +1 -0
  221. package/dist/event/event-pump.js +92 -0
  222. package/dist/event/event-pump.js.map +1 -0
  223. package/dist/event/event-tracker.js +97 -0
  224. package/dist/event/event-tracker.js.map +1 -0
  225. package/dist/event/index.js +21 -0
  226. package/dist/event/index.js.map +1 -0
  227. package/dist/event/ua-event-handler.js +453 -0
  228. package/dist/event/ua-event-handler.js.map +1 -0
  229. package/dist/event-map/animator-handler.js +225 -0
  230. package/dist/event-map/animator-handler.js.map +1 -0
  231. package/dist/event-map/animators/animated-icon.js +265 -0
  232. package/dist/event-map/animators/animated-icon.js.map +1 -0
  233. package/dist/event-map/animators/border-highlighting.js +476 -0
  234. package/dist/event-map/animators/border-highlighting.js.map +1 -0
  235. package/dist/event-map/animators/bouncing-arrow.js +226 -0
  236. package/dist/event-map/animators/bouncing-arrow.js.map +1 -0
  237. package/dist/event-map/event-map.js +36 -0
  238. package/dist/event-map/event-map.js.map +1 -0
  239. package/dist/event-map/index.js +20 -0
  240. package/dist/event-map/index.js.map +1 -0
  241. package/dist/event-map/move-handler.js +233 -0
  242. package/dist/event-map/move-handler.js.map +1 -0
  243. package/dist/event-map/paste-handler.js +176 -0
  244. package/dist/event-map/paste-handler.js.map +1 -0
  245. package/dist/event-map/shift-handler.js +55 -0
  246. package/dist/event-map/shift-handler.js.map +1 -0
  247. package/dist/event-map/text-editor-lite.js +276 -0
  248. package/dist/event-map/text-editor-lite.js.map +1 -0
  249. package/dist/event-map/zoom-handler.js +49 -0
  250. package/dist/event-map/zoom-handler.js.map +1 -0
  251. package/dist/index.js +20 -0
  252. package/dist/index.js.map +1 -0
  253. package/dist/layer/action/emphasize.js +42 -0
  254. package/dist/layer/action/emphasize.js.map +1 -0
  255. package/dist/layer/action/popup.js +461 -0
  256. package/dist/layer/action/popup.js.map +1 -0
  257. package/dist/layer/action/pressed.js +31 -0
  258. package/dist/layer/action/pressed.js.map +1 -0
  259. package/dist/layer/add-layer.js +180 -0
  260. package/dist/layer/add-layer.js.map +1 -0
  261. package/dist/layer/decotag-layer.js +121 -0
  262. package/dist/layer/decotag-layer.js.map +1 -0
  263. package/dist/layer/guide-layer.js +292 -0
  264. package/dist/layer/guide-layer.js.map +1 -0
  265. package/dist/layer/index.js +70 -0
  266. package/dist/layer/index.js.map +1 -0
  267. package/dist/layer/layer.js +230 -0
  268. package/dist/layer/layer.js.map +1 -0
  269. package/dist/layer/minimap-layer.js +84 -0
  270. package/dist/layer/minimap-layer.js.map +1 -0
  271. package/dist/layer/model-layer.js +465 -0
  272. package/dist/layer/model-layer.js.map +1 -0
  273. package/dist/layer/modeler/anchor-handler.js +193 -0
  274. package/dist/layer/modeler/anchor-handler.js.map +1 -0
  275. package/dist/layer/modeler/control-handler.js +95 -0
  276. package/dist/layer/modeler/control-handler.js.map +1 -0
  277. package/dist/layer/modeler/focus-outline.js +41 -0
  278. package/dist/layer/modeler/focus-outline.js.map +1 -0
  279. package/dist/layer/modeler/group-outline.js +30 -0
  280. package/dist/layer/modeler/group-outline.js.map +1 -0
  281. package/dist/layer/modeler/index.js +56 -0
  282. package/dist/layer/modeler/index.js.map +1 -0
  283. package/dist/layer/modeler/path-handler.js +300 -0
  284. package/dist/layer/modeler/path-handler.js.map +1 -0
  285. package/dist/layer/modeler/resizer.js +333 -0
  286. package/dist/layer/modeler/resizer.js.map +1 -0
  287. package/dist/layer/modeler/rotator.js +134 -0
  288. package/dist/layer/modeler/rotator.js.map +1 -0
  289. package/dist/layer/modeling-layer.js +491 -0
  290. package/dist/layer/modeling-layer.js.map +1 -0
  291. package/dist/layer/reaction-layer.js +111 -0
  292. package/dist/layer/reaction-layer.js.map +1 -0
  293. package/dist/layer/scroll-layer.js +191 -0
  294. package/dist/layer/scroll-layer.js.map +1 -0
  295. package/dist/layer/selection/selected-finder.js +96 -0
  296. package/dist/layer/selection/selected-finder.js.map +1 -0
  297. package/dist/layer/selection-layer.js +373 -0
  298. package/dist/layer/selection-layer.js.map +1 -0
  299. package/dist/layer/shift-layer.js +83 -0
  300. package/dist/layer/shift-layer.js.map +1 -0
  301. package/dist/layout/absolute.js +30 -0
  302. package/dist/layout/absolute.js.map +1 -0
  303. package/dist/layout/card.js +52 -0
  304. package/dist/layout/card.js.map +1 -0
  305. package/dist/layout/html-absolute.js +32 -0
  306. package/dist/layout/html-absolute.js.map +1 -0
  307. package/dist/layout/index.js +56 -0
  308. package/dist/layout/index.js.map +1 -0
  309. package/dist/layout/layout.js +36 -0
  310. package/dist/layout/layout.js.map +1 -0
  311. package/dist/layout/linear-horizontal.js +56 -0
  312. package/dist/layout/linear-horizontal.js.map +1 -0
  313. package/dist/layout/linear-vertical.js +56 -0
  314. package/dist/layout/linear-vertical.js.map +1 -0
  315. package/dist/layout/table.js +106 -0
  316. package/dist/layout/table.js.map +1 -0
  317. package/dist/license/license.js +170 -0
  318. package/dist/license/license.js.map +1 -0
  319. package/dist/model/compile.js +40 -0
  320. package/dist/model/compile.js.map +1 -0
  321. package/dist/model/duplicate.js +19 -0
  322. package/dist/model/duplicate.js.map +1 -0
  323. package/dist/model/index.js +34 -0
  324. package/dist/model/index.js.map +1 -0
  325. package/dist/model/selector.js +104 -0
  326. package/dist/model/selector.js.map +1 -0
  327. package/dist/style/compile.js +14 -0
  328. package/dist/style/compile.js.map +1 -0
  329. package/dist/style/index.js +14 -0
  330. package/dist/style/index.js.map +1 -0
  331. package/dist/things-scene/api/add-start.js +18 -0
  332. package/dist/things-scene/api/add-start.js.map +1 -0
  333. package/dist/things-scene/api/add.js +71 -0
  334. package/dist/things-scene/api/add.js.map +1 -0
  335. package/dist/things-scene/api/align.js +116 -0
  336. package/dist/things-scene/api/align.js.map +1 -0
  337. package/dist/things-scene/api/center-to.js +50 -0
  338. package/dist/things-scene/api/center-to.js.map +1 -0
  339. package/dist/things-scene/api/change.js +27 -0
  340. package/dist/things-scene/api/change.js.map +1 -0
  341. package/dist/things-scene/api/clipboard.js +45 -0
  342. package/dist/things-scene/api/clipboard.js.map +1 -0
  343. package/dist/things-scene/api/distribute.js +57 -0
  344. package/dist/things-scene/api/distribute.js.map +1 -0
  345. package/dist/things-scene/api/duplicate.js +47 -0
  346. package/dist/things-scene/api/duplicate.js.map +1 -0
  347. package/dist/things-scene/api/fullscreen.js +26 -0
  348. package/dist/things-scene/api/fullscreen.js.map +1 -0
  349. package/dist/things-scene/api/group.js +91 -0
  350. package/dist/things-scene/api/group.js.map +1 -0
  351. package/dist/things-scene/api/ids.js +28 -0
  352. package/dist/things-scene/api/ids.js.map +1 -0
  353. package/dist/things-scene/api/index.js +192 -0
  354. package/dist/things-scene/api/index.js.map +1 -0
  355. package/dist/things-scene/api/listener.js +69 -0
  356. package/dist/things-scene/api/listener.js.map +1 -0
  357. package/dist/things-scene/api/paste-start.js +27 -0
  358. package/dist/things-scene/api/paste-start.js.map +1 -0
  359. package/dist/things-scene/api/place.js +98 -0
  360. package/dist/things-scene/api/place.js.map +1 -0
  361. package/dist/things-scene/api/remove.js +57 -0
  362. package/dist/things-scene/api/remove.js.map +1 -0
  363. package/dist/things-scene/api/symmetry.js +47 -0
  364. package/dist/things-scene/api/symmetry.js.map +1 -0
  365. package/dist/things-scene/api/to-data-url.js +76 -0
  366. package/dist/things-scene/api/to-data-url.js.map +1 -0
  367. package/dist/things-scene/api/zorder.js +68 -0
  368. package/dist/things-scene/api/zorder.js.map +1 -0
  369. package/dist/things-scene/application-context.js +168 -0
  370. package/dist/things-scene/application-context.js.map +1 -0
  371. package/dist/things-scene/config.js +18 -0
  372. package/dist/things-scene/config.js.map +1 -0
  373. package/dist/things-scene/create.js +67 -0
  374. package/dist/things-scene/create.js.map +1 -0
  375. package/dist/things-scene/fps.js +26 -0
  376. package/dist/things-scene/fps.js.map +1 -0
  377. package/dist/things-scene/index.js +152 -0
  378. package/dist/things-scene/index.js.map +1 -0
  379. package/dist/things-scene/polyfill.js +111 -0
  380. package/dist/things-scene/polyfill.js.map +1 -0
  381. package/dist/things-scene/scene.js +442 -0
  382. package/dist/things-scene/scene.js.map +1 -0
  383. package/dist/things-scene/version.js +12 -0
  384. package/dist/things-scene/version.js.map +1 -0
  385. package/package.json +8 -6
  386. package/things-scene.d.ts +1 -0
@@ -0,0 +1,476 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
8
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
9
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
10
+ /*
11
+ * Copyright © HatioLab Inc. All rights reserved.
12
+ */
13
+ class BorderHighlighting {
14
+ /**
15
+ * 특정 target에 대한 고유 ID를 가져오거나 생성
16
+ * @param {Object} target - 하이라이팅할 대상
17
+ * @returns {string} - target의 고유 ID
18
+ */
19
+ static getTargetId(target) {
20
+ if (!BorderHighlighting._targetIdMap.has(target)) {
21
+ const newId = `target-${Math.random().toString(36).substring(2, 9)}`; // UUID 기반 ID 생성
22
+ BorderHighlighting._targetIdMap.set(target, newId);
23
+ }
24
+ return BorderHighlighting._targetIdMap.get(target);
25
+ }
26
+
27
+ /**
28
+ * overlay 별로 개별 SVG 컨테이너를 생성하고 관리하는 메서드
29
+ * @param {HTMLElement} overlay - SVG를 추가할 부모 요소
30
+ * @returns {SVGElement} - 해당 overlay의 공유되는 SVG 컨테이너
31
+ */
32
+ static getSvgContainer(overlay) {
33
+ if (!BorderHighlighting._svgMap.has(overlay)) {
34
+ const svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
35
+ svgElement.setAttribute('class', 'border-highlighting-container');
36
+ svgElement.setAttribute('pointer-events', 'none');
37
+ svgElement.style.overflow = 'visible';
38
+ svgElement.style.position = 'absolute';
39
+ svgElement.style.top = '0';
40
+ svgElement.style.left = '0';
41
+
42
+ // Gradient 정의를 위한 <defs> 추가
43
+ const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
44
+ svgElement.appendChild(defs);
45
+
46
+ // Path 그룹을 관리하는 <g> 추가
47
+ const gElement = document.createElementNS('http://www.w3.org/2000/svg', 'g');
48
+ gElement.setAttribute('class', 'border-highlighting-group');
49
+ svgElement.appendChild(gElement);
50
+ overlay.appendChild(svgElement);
51
+ BorderHighlighting._svgMap.set(overlay, svgElement);
52
+ }
53
+ return BorderHighlighting._svgMap.get(overlay);
54
+ }
55
+ constructor(overlay, target, decorator) {
56
+ this.overlayRef = new WeakRef(overlay); // overlay에 대한 약한 참조
57
+ this.target = target;
58
+ this.decorator = decorator;
59
+ }
60
+
61
+ /**
62
+ * 하이라이팅 요소 생성
63
+ * @returns {SVGPathElement} - 생성된 path 요소
64
+ */
65
+ get element() {
66
+ const overlay = this.overlayRef.deref();
67
+ if (!overlay) return null; // overlay가 GC에 의해 해제되었으면 종료
68
+
69
+ const {
70
+ distance = 10,
71
+ lineWidth = 2,
72
+ color = 'red',
73
+ animation = false,
74
+ fillStyle: filter
75
+ } = this.decorator || {};
76
+ const {
77
+ round = 0,
78
+ fillStyle
79
+ } = this.target.state;
80
+ const path = this.target.path.map(p => this.target.transcoordS2T(p.x, p.y));
81
+ const offsetPoints = this.createOffsetPath(path, distance);
82
+ const pathData = this.pointsToPathData(offsetPoints, round);
83
+ const svg = BorderHighlighting.getSvgContainer(overlay);
84
+ const targetId = BorderHighlighting.getTargetId(this.target);
85
+ const group = svg.querySelector('.border-highlighting-group');
86
+
87
+ // 기존에 같은 target에 대한 path가 있으면 제거
88
+ const existingPath = group.querySelector(`[data-target-id="${targetId}"]`);
89
+ if (existingPath) {
90
+ existingPath.remove();
91
+ }
92
+ const offsetPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
93
+ offsetPath.setAttribute('d', pathData);
94
+ offsetPath.setAttribute('fill', 'none');
95
+ offsetPath.setAttribute('stroke-width', lineWidth);
96
+ offsetPath.setAttribute('stroke-linejoin', 'round');
97
+ offsetPath.setAttribute('pointer-events', 'none');
98
+ offsetPath.setAttribute('data-target-id', targetId);
99
+
100
+ // Filter 적용
101
+ const filterColor = filter || fillStyle || 'rgba(0, 0, 0, 0.5)';
102
+ const defs = svg.querySelector('defs');
103
+ const filterElement = this.createFilter(targetId, filterColor);
104
+ defs.appendChild(filterElement);
105
+ offsetPath.setAttribute('filter', `url(#${targetId}-filter)`);
106
+ if (animation) {
107
+ const defs = svg.querySelector('defs');
108
+ const linearGradient = this.createGradient(targetId, color);
109
+ defs.appendChild(linearGradient);
110
+ offsetPath.setAttribute('stroke', `url(#${targetId})`);
111
+ } else {
112
+ offsetPath.setAttribute('stroke', color);
113
+ }
114
+ group.appendChild(offsetPath);
115
+ return offsetPath;
116
+ }
117
+
118
+ /**
119
+ * Creates an offset path based on the original path and distance.
120
+ * @param {Array} path - The original path (array of points).
121
+ * @param {number} distance - The offset distance.
122
+ * @returns {Array} - The offset path.
123
+ */
124
+ createOffsetPath(path, distance) {
125
+ const offsetPath = [];
126
+ const numPoints = path.length;
127
+ for (let i = 0; i < numPoints; i++) {
128
+ const prev = path[(i - 1 + numPoints) % numPoints];
129
+ const curr = path[i];
130
+ const next = path[(i + 1) % numPoints];
131
+
132
+ // Calculate the normal vector at the current point
133
+ const dx1 = curr.x - prev.x;
134
+ const dy1 = curr.y - prev.y;
135
+ const dx2 = next.x - curr.x;
136
+ const dy2 = next.y - curr.y;
137
+
138
+ // 법선 벡터 방향을 반대로 설정 (바깥쪽을 가리키도록)
139
+ const normal1 = this.normalize({
140
+ x: dy1,
141
+ y: -dx1
142
+ }); // 방향 반전
143
+ const normal2 = this.normalize({
144
+ x: dy2,
145
+ y: -dx2
146
+ }); // 방향 반전
147
+
148
+ // Calculate the average normal vector
149
+ const avgNormal = this.normalize({
150
+ x: (normal1.x + normal2.x) / 2,
151
+ y: (normal1.y + normal2.y) / 2
152
+ });
153
+
154
+ // Calculate the offset point
155
+ const offsetPoint = {
156
+ x: curr.x + avgNormal.x * distance,
157
+ y: curr.y + avgNormal.y * distance
158
+ };
159
+ offsetPath.push(offsetPoint);
160
+ }
161
+ return offsetPath;
162
+ }
163
+
164
+ /**
165
+ * Normalizes a vector.
166
+ * @param {Object} vector - { x, y }
167
+ * @returns {Object} - The normalized vector.
168
+ */
169
+ normalize(vector) {
170
+ const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
171
+ return {
172
+ x: vector.x / length,
173
+ y: vector.y / length
174
+ };
175
+ }
176
+
177
+ /**
178
+ * Converts an array of points to SVG path data with smooth curves,
179
+ * including additional points for curve start and end.
180
+ * @param {Array} points - Array of points (each point has x, y).
181
+ * @param {number} round - Rounding radius for smooth transitions.
182
+ * @returns {string} - The SVG path data with smooth connections.
183
+ */
184
+ pointsToPathData(points, round = 0) {
185
+ if (points.length < 2) return '';
186
+ let pathData = ''; // Start with an empty path
187
+ const numPoints = points.length;
188
+
189
+ // Helper function to calculate intermediate points
190
+ const calculateIntermediatePoint = (p1, p2, distance) => {
191
+ const dx = p2.x - p1.x;
192
+ const dy = p2.y - p1.y;
193
+ const len = Math.sqrt(dx * dx + dy * dy);
194
+ return {
195
+ x: p1.x + dx / len * distance,
196
+ y: p1.y + dy / len * distance
197
+ };
198
+ };
199
+ for (let i = 0; i < numPoints; i++) {
200
+ const curr = points[i];
201
+ const next = points[(i + 1) % numPoints]; // Wrap around for closed path
202
+ const prev = points[(i - 1 + numPoints) % numPoints]; // Wrap around for closed path
203
+
204
+ // Calculate the effective rounding radius for this segment
205
+ const distPrev = Math.sqrt((curr.x - prev.x) ** 2 + (curr.y - prev.y) ** 2);
206
+ const distNext = Math.sqrt((curr.x - next.x) ** 2 + (curr.y - next.y) ** 2);
207
+ const effectiveRound = Math.min(round, distPrev / 2, distNext / 2);
208
+
209
+ // Calculate the curve start and end points
210
+ const curveStart = calculateIntermediatePoint(curr, prev, effectiveRound);
211
+ const curveEnd = calculateIntermediatePoint(curr, next, effectiveRound);
212
+ if (i === 0) {
213
+ // Start the path at the first curve start point
214
+ pathData += `M${curveStart.x},${curveStart.y}`;
215
+ } else {
216
+ // Add a straight line to the current curve start
217
+ pathData += ` L${curveStart.x},${curveStart.y}`;
218
+ }
219
+
220
+ // Add the curve to the path
221
+ pathData += ` Q${curr.x},${curr.y} ${curveEnd.x},${curveEnd.y}`;
222
+ }
223
+
224
+ // Close the path by connecting to the first curve start
225
+ pathData += ' Z';
226
+ return pathData;
227
+ }
228
+
229
+ /**
230
+ * SVG 필터 생성 (path 내부만 마스킹 효과 적용)
231
+ * @param {string} id - 필터의 고유 ID
232
+ * @param {string} color - 마스킹 효과를 적용할 색상
233
+ * @returns {SVGFilterElement} - 생성된 SVG 필터
234
+ */
235
+ createFilter(id, color) {
236
+ const filter = document.createElementNS('http://www.w3.org/2000/svg', 'filter');
237
+ filter.setAttribute('id', `${id}-filter`);
238
+
239
+ // 배경색을 채우는 feFlood
240
+ const feFlood = document.createElementNS('http://www.w3.org/2000/svg', 'feFlood');
241
+ feFlood.setAttribute('flood-color', color);
242
+ feFlood.setAttribute('result', 'flood');
243
+
244
+ // path 내부 shape만 유지하도록 설정 (SourceAlpha 사용)
245
+ const feComposite = document.createElementNS('http://www.w3.org/2000/svg', 'feComposite');
246
+ feComposite.setAttribute('in', 'flood');
247
+ feComposite.setAttribute('in2', 'SourceAlpha'); // path 내부 shape만 남김
248
+ feComposite.setAttribute('operator', 'in');
249
+ feComposite.setAttribute('result', 'mask');
250
+
251
+ // 원본 그래픽과 필터를 혼합 (SourceGraphic은 path 내부 shape만 유지)
252
+ const feMerge = document.createElementNS('http://www.w3.org/2000/svg', 'feMerge');
253
+ const feMergeNode1 = document.createElementNS('http://www.w3.org/2000/svg', 'feMergeNode');
254
+ feMergeNode1.setAttribute('in', 'mask');
255
+ const feMergeNode2 = document.createElementNS('http://www.w3.org/2000/svg', 'feMergeNode');
256
+ feMergeNode2.setAttribute('in', 'SourceGraphic'); // 원본 유지
257
+
258
+ feMerge.appendChild(feMergeNode1);
259
+ feMerge.appendChild(feMergeNode2);
260
+
261
+ // 필터 조합
262
+ filter.appendChild(feFlood);
263
+ filter.appendChild(feComposite);
264
+ filter.appendChild(feMerge);
265
+ return filter;
266
+ }
267
+
268
+ /**
269
+ * 동적으로 그라디언트를 생성하는 메서드
270
+ * @param {string} id - 그라디언트의 고유 ID
271
+ * @param {string} baseColor - 사용자 지정 색상 (기본값: 빨강)
272
+ * @returns {SVGLinearGradientElement} - 애니메이션이 적용된 SVG 그라디언트
273
+ */
274
+ createGradient(id, baseColor) {
275
+ const gradient = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient');
276
+ gradient.setAttribute('id', id);
277
+ gradient.setAttribute('x1', '0%');
278
+ gradient.setAttribute('y1', '0%');
279
+ gradient.setAttribute('x2', '100%');
280
+ gradient.setAttribute('y2', '0%');
281
+
282
+ // 보조 색상 자동 생성 (Hue 변경)
283
+ const color2 = this.alterColor(baseColor, 120); // 기본 색상에서 120도 회전 (초록 계열)
284
+ const color3 = this.alterColor(baseColor, 240); // 기본 색상에서 240도 회전 (파랑 계열)
285
+
286
+ gradient.innerHTML = `
287
+ <stop offset="0%" stop-color="${baseColor}">
288
+ <animate attributeName="stop-color" values="${baseColor};${color2};${color3};${baseColor}" dur="5s" repeatCount="indefinite" />
289
+ </stop>
290
+ <stop offset="100%" stop-color="${color3}">
291
+ <animate attributeName="stop-color" values="${color3};${baseColor};${color2};${color3}" dur="5s" repeatCount="indefinite" />
292
+ </stop>
293
+ `;
294
+ return gradient;
295
+ }
296
+
297
+ /**
298
+ * 주어진 색상의 Hue(색상) 값을 변경하여 새로운 색상을 생성
299
+ * @param {string} color - 원본 색상 (HEX 코드)
300
+ * @param {number} degree - 변경할 Hue 값 (0~360)
301
+ * @returns {string} - 새로운 HEX 색상 코드
302
+ */
303
+ alterColor(color, degree) {
304
+ const hexColor = this.convertToHex(color); // CSS 색상명을 HEX로 변환
305
+
306
+ let r = parseInt(hexColor.substring(1, 3), 16);
307
+ let g = parseInt(hexColor.substring(3, 5), 16);
308
+ let b = parseInt(hexColor.substring(5, 7), 16);
309
+ const hsl = this.rgbToHsl(r, g, b);
310
+ hsl[0] = (hsl[0] + degree / 360) % 1; // Hue 값 회전
311
+ const rgb = this.hslToRgb(hsl[0], hsl[1], hsl[2]);
312
+ return `#${rgb[0].toString(16).padStart(2, '0')}${rgb[1].toString(16).padStart(2, '0')}${rgb[2].toString(16).padStart(2, '0')}`;
313
+ }
314
+
315
+ /**
316
+ * RGB → HSL 변환
317
+ */
318
+ rgbToHsl(r, g, b) {
319
+ ;
320
+ r /= 255, g /= 255, b /= 255;
321
+ let max = Math.max(r, g, b),
322
+ min = Math.min(r, g, b);
323
+ let h,
324
+ s,
325
+ l = (max + min) / 2;
326
+ if (max === min) {
327
+ h = s = 0;
328
+ } else {
329
+ let d = max - min;
330
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
331
+ switch (max) {
332
+ case r:
333
+ h = (g - b) / d + (g < b ? 6 : 0);
334
+ break;
335
+ case g:
336
+ h = (b - r) / d + 2;
337
+ break;
338
+ case b:
339
+ h = (r - g) / d + 4;
340
+ break;
341
+ }
342
+ h /= 6;
343
+ }
344
+ return [h, s, l];
345
+ }
346
+
347
+ /**
348
+ * HSL → RGB 변환
349
+ */
350
+ hslToRgb(h, s, l) {
351
+ let r, g, b;
352
+ if (s === 0) {
353
+ r = g = b = l;
354
+ } else {
355
+ const hue2rgb = (p, q, t) => {
356
+ if (t < 0) t += 1;
357
+ if (t > 1) t -= 1;
358
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
359
+ if (t < 1 / 2) return q;
360
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
361
+ return p;
362
+ };
363
+ let q = l < 0.5 ? l * (1 + s) : l + s - l * s;
364
+ let p = 2 * l - q;
365
+ r = hue2rgb(p, q, h + 1 / 3);
366
+ g = hue2rgb(p, q, h);
367
+ b = hue2rgb(p, q, h - 1 / 3);
368
+ }
369
+ return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
370
+ }
371
+
372
+ /**
373
+ * CSS 색상명을 HEX 코드로 변환하는 함수
374
+ * @param {string} color - 'red', 'blue' 같은 CSS 색상명 또는 HEX 코드
375
+ * @returns {string} - HEX 코드 ('#RRGGBB' 형식)
376
+ */
377
+ convertToHex(color) {
378
+ // 이미 HEX 코드라면 변환 없이 반환
379
+ if (/^#([0-9A-F]{6})$/i.test(color)) return color;
380
+
381
+ // 임시 DOM 요소를 생성하여 getComputedStyle로 RGB 값 추출
382
+ const tempElement = document.createElement('div');
383
+ tempElement.style.color = color;
384
+ document.body.appendChild(tempElement);
385
+ const computedColor = window.getComputedStyle(tempElement).color;
386
+ document.body.removeChild(tempElement);
387
+
388
+ // RGB에서 HEX로 변환
389
+ const match = computedColor.match(/\d+/g); // RGB 숫자 값 추출
390
+ if (!match || match.length < 3) {
391
+ console.warn(`Invalid color: ${color}. Defaulting to #FF0000.`);
392
+ return '#FF0000'; // 기본 색상 (빨강) 사용
393
+ }
394
+ return `#${match.slice(0, 3).map(x => parseInt(x, 10).toString(16).padStart(2, '0')).join('')}`;
395
+ }
396
+
397
+ /**
398
+ * 하이라이팅 시작 (애니메이션 실행 포함)
399
+ */
400
+ start() {
401
+ const overlay = this.overlayRef.deref();
402
+ if (!overlay) return; // overlay가 없으면 실행하지 않음
403
+
404
+ const svg = BorderHighlighting.getSvgContainer(overlay);
405
+ if (!overlay.contains(svg)) {
406
+ overlay.appendChild(svg);
407
+ }
408
+
409
+ // ensure the element is created before animation starts
410
+ const element = this.element;
411
+ if (!element) return;
412
+ if (this.decorator.animation) {
413
+ const targetId = element.getAttribute('data-target-id');
414
+ if (!targetId) return;
415
+
416
+ // defs 내부에서 해당 gradient 찾기
417
+ const defs = svg.querySelector('defs');
418
+ if (!defs) return;
419
+ const gradient = defs.querySelector(`#${targetId}`);
420
+ if (!gradient) return;
421
+
422
+ // `animate` 요소를 gradient 내부에서 찾기
423
+ requestAnimationFrame(() => {
424
+ const animateElements = gradient.querySelectorAll('animate'); // 🎯 수정된 로직
425
+ animateElements.forEach(animate => {
426
+ animate.beginElement();
427
+ });
428
+ });
429
+ }
430
+ }
431
+
432
+ /**
433
+ * 하이라이팅 중지 및 제거
434
+ */
435
+ stop() {
436
+ if (!this.element) return;
437
+ const overlay = this.overlayRef.deref();
438
+ if (!overlay) return;
439
+ const svg = BorderHighlighting._svgMap.get(overlay);
440
+ if (!svg) return;
441
+ const group = svg.querySelector('.border-highlighting-group');
442
+ if (!group) return;
443
+ const defs = svg.querySelector('defs'); // Gradient가 정의된 defs 요소 가져오기
444
+ if (!defs) return;
445
+ const targetId = BorderHighlighting.getTargetId(this.target); // target의 ID 가져오기
446
+
447
+ // 현재 target의 path 요소 삭제
448
+ const pathElement = group.querySelector(`[data-target-id="${targetId}"]`);
449
+ if (pathElement) {
450
+ group.removeChild(pathElement);
451
+ pathElement.remove();
452
+ const gradientElement = defs.querySelector(`#${targetId}`);
453
+ if (gradientElement) {
454
+ defs.removeChild(gradientElement);
455
+ gradientElement.remove();
456
+ }
457
+ }
458
+ BorderHighlighting._targetIdMap.delete(this.target);
459
+
460
+ // 해당 overlay의 모든 path가 삭제되었으면 SVG 컨테이너 제거
461
+ if (group.children.length === 0) {
462
+ svg.remove();
463
+ BorderHighlighting._svgMap.delete(overlay);
464
+ }
465
+ }
466
+ }
467
+ exports.default = BorderHighlighting;
468
+ /**
469
+ * WeakMap을 사용하여 overlay별 SVG 컨테이너를 자동 관리
470
+ */
471
+ _defineProperty(BorderHighlighting, "_svgMap", new WeakMap());
472
+ /**
473
+ * WeakMap을 사용하여 target 별 고유 ID를 관리
474
+ */
475
+ _defineProperty(BorderHighlighting, "_targetIdMap", new WeakMap());
476
+ //# sourceMappingURL=border-highlighting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border-highlighting.js","names":["BorderHighlighting","getTargetId","target","_targetIdMap","has","newId","Math","random","toString","substring","set","get","getSvgContainer","overlay","_svgMap","svgElement","document","createElementNS","setAttribute","style","overflow","position","top","left","defs","appendChild","gElement","constructor","decorator","overlayRef","WeakRef","element","deref","distance","lineWidth","color","animation","fillStyle","filter","round","state","path","map","p","transcoordS2T","x","y","offsetPoints","createOffsetPath","pathData","pointsToPathData","svg","targetId","group","querySelector","existingPath","remove","offsetPath","filterColor","filterElement","createFilter","linearGradient","createGradient","numPoints","length","i","prev","curr","next","dx1","dy1","dx2","dy2","normal1","normalize","normal2","avgNormal","offsetPoint","push","vector","sqrt","points","calculateIntermediatePoint","p1","p2","dx","dy","len","distPrev","distNext","effectiveRound","min","curveStart","curveEnd","id","feFlood","feComposite","feMerge","feMergeNode1","feMergeNode2","baseColor","gradient","color2","alterColor","color3","innerHTML","degree","hexColor","convertToHex","r","parseInt","g","b","hsl","rgbToHsl","rgb","hslToRgb","padStart","max","h","s","l","d","hue2rgb","q","t","test","tempElement","createElement","body","computedColor","window","getComputedStyle","removeChild","match","console","warn","slice","join","start","contains","getAttribute","requestAnimationFrame","animateElements","querySelectorAll","forEach","animate","beginElement","stop","pathElement","gradientElement","delete","children","exports","default","_defineProperty","WeakMap"],"sources":["../../../src/event-map/animators/border-highlighting.js"],"sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nexport default class BorderHighlighting {\n /**\n * WeakMap을 사용하여 overlay별 SVG 컨테이너를 자동 관리\n */\n static _svgMap = new WeakMap()\n\n /**\n * WeakMap을 사용하여 target 별 고유 ID를 관리\n */\n static _targetIdMap = new WeakMap()\n\n /**\n * 특정 target에 대한 고유 ID를 가져오거나 생성\n * @param {Object} target - 하이라이팅할 대상\n * @returns {string} - target의 고유 ID\n */\n static getTargetId(target) {\n if (!BorderHighlighting._targetIdMap.has(target)) {\n const newId = `target-${Math.random().toString(36).substring(2, 9)}` // UUID 기반 ID 생성\n BorderHighlighting._targetIdMap.set(target, newId)\n }\n return BorderHighlighting._targetIdMap.get(target)\n }\n\n /**\n * overlay 별로 개별 SVG 컨테이너를 생성하고 관리하는 메서드\n * @param {HTMLElement} overlay - SVG를 추가할 부모 요소\n * @returns {SVGElement} - 해당 overlay의 공유되는 SVG 컨테이너\n */\n static getSvgContainer(overlay) {\n if (!BorderHighlighting._svgMap.has(overlay)) {\n const svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svgElement.setAttribute('class', 'border-highlighting-container')\n svgElement.setAttribute('pointer-events', 'none')\n svgElement.style.overflow = 'visible'\n svgElement.style.position = 'absolute'\n svgElement.style.top = '0'\n svgElement.style.left = '0'\n\n // Gradient 정의를 위한 <defs> 추가\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n svgElement.appendChild(defs)\n\n // Path 그룹을 관리하는 <g> 추가\n const gElement = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n gElement.setAttribute('class', 'border-highlighting-group')\n svgElement.appendChild(gElement)\n\n overlay.appendChild(svgElement)\n BorderHighlighting._svgMap.set(overlay, svgElement)\n }\n\n return BorderHighlighting._svgMap.get(overlay)\n }\n\n constructor(overlay, target, decorator) {\n this.overlayRef = new WeakRef(overlay) // overlay에 대한 약한 참조\n this.target = target\n this.decorator = decorator\n }\n\n /**\n * 하이라이팅 요소 생성\n * @returns {SVGPathElement} - 생성된 path 요소\n */\n get element() {\n const overlay = this.overlayRef.deref()\n if (!overlay) return null // overlay가 GC에 의해 해제되었으면 종료\n\n const { distance = 10, lineWidth = 2, color = 'red', animation = false, fillStyle: filter } = this.decorator || {}\n const { round = 0, fillStyle } = this.target.state\n\n const path = this.target.path.map(p => this.target.transcoordS2T(p.x, p.y))\n\n const offsetPoints = this.createOffsetPath(path, distance)\n const pathData = this.pointsToPathData(offsetPoints, round)\n\n const svg = BorderHighlighting.getSvgContainer(overlay)\n const targetId = BorderHighlighting.getTargetId(this.target)\n\n const group = svg.querySelector('.border-highlighting-group')\n\n // 기존에 같은 target에 대한 path가 있으면 제거\n const existingPath = group.querySelector(`[data-target-id=\"${targetId}\"]`)\n if (existingPath) {\n existingPath.remove()\n }\n\n const offsetPath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n offsetPath.setAttribute('d', pathData)\n offsetPath.setAttribute('fill', 'none')\n offsetPath.setAttribute('stroke-width', lineWidth)\n offsetPath.setAttribute('stroke-linejoin', 'round')\n offsetPath.setAttribute('pointer-events', 'none')\n offsetPath.setAttribute('data-target-id', targetId)\n\n // Filter 적용\n const filterColor = filter || fillStyle || 'rgba(0, 0, 0, 0.5)'\n const defs = svg.querySelector('defs')\n const filterElement = this.createFilter(targetId, filterColor)\n defs.appendChild(filterElement)\n\n offsetPath.setAttribute('filter', `url(#${targetId}-filter)`)\n\n if (animation) {\n const defs = svg.querySelector('defs')\n const linearGradient = this.createGradient(targetId, color)\n defs.appendChild(linearGradient)\n\n offsetPath.setAttribute('stroke', `url(#${targetId})`)\n } else {\n offsetPath.setAttribute('stroke', color)\n }\n\n group.appendChild(offsetPath)\n\n return offsetPath\n }\n\n /**\n * Creates an offset path based on the original path and distance.\n * @param {Array} path - The original path (array of points).\n * @param {number} distance - The offset distance.\n * @returns {Array} - The offset path.\n */\n createOffsetPath(path, distance) {\n const offsetPath = []\n const numPoints = path.length\n\n for (let i = 0; i < numPoints; i++) {\n const prev = path[(i - 1 + numPoints) % numPoints]\n const curr = path[i]\n const next = path[(i + 1) % numPoints]\n\n // Calculate the normal vector at the current point\n const dx1 = curr.x - prev.x\n const dy1 = curr.y - prev.y\n const dx2 = next.x - curr.x\n const dy2 = next.y - curr.y\n\n // 법선 벡터 방향을 반대로 설정 (바깥쪽을 가리키도록)\n const normal1 = this.normalize({ x: dy1, y: -dx1 }) // 방향 반전\n const normal2 = this.normalize({ x: dy2, y: -dx2 }) // 방향 반전\n\n // Calculate the average normal vector\n const avgNormal = this.normalize({\n x: (normal1.x + normal2.x) / 2,\n y: (normal1.y + normal2.y) / 2\n })\n\n // Calculate the offset point\n const offsetPoint = {\n x: curr.x + avgNormal.x * distance,\n y: curr.y + avgNormal.y * distance\n }\n\n offsetPath.push(offsetPoint)\n }\n\n return offsetPath\n }\n\n /**\n * Normalizes a vector.\n * @param {Object} vector - { x, y }\n * @returns {Object} - The normalized vector.\n */\n normalize(vector) {\n const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y)\n return {\n x: vector.x / length,\n y: vector.y / length\n }\n }\n\n /**\n * Converts an array of points to SVG path data with smooth curves,\n * including additional points for curve start and end.\n * @param {Array} points - Array of points (each point has x, y).\n * @param {number} round - Rounding radius for smooth transitions.\n * @returns {string} - The SVG path data with smooth connections.\n */\n pointsToPathData(points, round = 0) {\n if (points.length < 2) return ''\n\n let pathData = '' // Start with an empty path\n const numPoints = points.length\n\n // Helper function to calculate intermediate points\n const calculateIntermediatePoint = (p1, p2, distance) => {\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n const len = Math.sqrt(dx * dx + dy * dy)\n return {\n x: p1.x + (dx / len) * distance,\n y: p1.y + (dy / len) * distance\n }\n }\n\n for (let i = 0; i < numPoints; i++) {\n const curr = points[i]\n const next = points[(i + 1) % numPoints] // Wrap around for closed path\n const prev = points[(i - 1 + numPoints) % numPoints] // Wrap around for closed path\n\n // Calculate the effective rounding radius for this segment\n const distPrev = Math.sqrt((curr.x - prev.x) ** 2 + (curr.y - prev.y) ** 2)\n const distNext = Math.sqrt((curr.x - next.x) ** 2 + (curr.y - next.y) ** 2)\n const effectiveRound = Math.min(round, distPrev / 2, distNext / 2)\n\n // Calculate the curve start and end points\n const curveStart = calculateIntermediatePoint(curr, prev, effectiveRound)\n const curveEnd = calculateIntermediatePoint(curr, next, effectiveRound)\n\n if (i === 0) {\n // Start the path at the first curve start point\n pathData += `M${curveStart.x},${curveStart.y}`\n } else {\n // Add a straight line to the current curve start\n pathData += ` L${curveStart.x},${curveStart.y}`\n }\n\n // Add the curve to the path\n pathData += ` Q${curr.x},${curr.y} ${curveEnd.x},${curveEnd.y}`\n }\n\n // Close the path by connecting to the first curve start\n pathData += ' Z'\n return pathData\n }\n\n /**\n * SVG 필터 생성 (path 내부만 마스킹 효과 적용)\n * @param {string} id - 필터의 고유 ID\n * @param {string} color - 마스킹 효과를 적용할 색상\n * @returns {SVGFilterElement} - 생성된 SVG 필터\n */\n createFilter(id, color) {\n const filter = document.createElementNS('http://www.w3.org/2000/svg', 'filter')\n filter.setAttribute('id', `${id}-filter`)\n\n // 배경색을 채우는 feFlood\n const feFlood = document.createElementNS('http://www.w3.org/2000/svg', 'feFlood')\n feFlood.setAttribute('flood-color', color)\n feFlood.setAttribute('result', 'flood')\n\n // path 내부 shape만 유지하도록 설정 (SourceAlpha 사용)\n const feComposite = document.createElementNS('http://www.w3.org/2000/svg', 'feComposite')\n feComposite.setAttribute('in', 'flood')\n feComposite.setAttribute('in2', 'SourceAlpha') // path 내부 shape만 남김\n feComposite.setAttribute('operator', 'in')\n feComposite.setAttribute('result', 'mask')\n\n // 원본 그래픽과 필터를 혼합 (SourceGraphic은 path 내부 shape만 유지)\n const feMerge = document.createElementNS('http://www.w3.org/2000/svg', 'feMerge')\n\n const feMergeNode1 = document.createElementNS('http://www.w3.org/2000/svg', 'feMergeNode')\n feMergeNode1.setAttribute('in', 'mask')\n\n const feMergeNode2 = document.createElementNS('http://www.w3.org/2000/svg', 'feMergeNode')\n feMergeNode2.setAttribute('in', 'SourceGraphic') // 원본 유지\n\n feMerge.appendChild(feMergeNode1)\n feMerge.appendChild(feMergeNode2)\n\n // 필터 조합\n filter.appendChild(feFlood)\n filter.appendChild(feComposite)\n filter.appendChild(feMerge)\n\n return filter\n }\n\n /**\n * 동적으로 그라디언트를 생성하는 메서드\n * @param {string} id - 그라디언트의 고유 ID\n * @param {string} baseColor - 사용자 지정 색상 (기본값: 빨강)\n * @returns {SVGLinearGradientElement} - 애니메이션이 적용된 SVG 그라디언트\n */\n createGradient(id, baseColor) {\n const gradient = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')\n\n gradient.setAttribute('id', id)\n gradient.setAttribute('x1', '0%')\n gradient.setAttribute('y1', '0%')\n gradient.setAttribute('x2', '100%')\n gradient.setAttribute('y2', '0%')\n\n // 보조 색상 자동 생성 (Hue 변경)\n const color2 = this.alterColor(baseColor, 120) // 기본 색상에서 120도 회전 (초록 계열)\n const color3 = this.alterColor(baseColor, 240) // 기본 색상에서 240도 회전 (파랑 계열)\n\n gradient.innerHTML = `\n <stop offset=\"0%\" stop-color=\"${baseColor}\">\n <animate attributeName=\"stop-color\" values=\"${baseColor};${color2};${color3};${baseColor}\" dur=\"5s\" repeatCount=\"indefinite\" />\n </stop>\n <stop offset=\"100%\" stop-color=\"${color3}\">\n <animate attributeName=\"stop-color\" values=\"${color3};${baseColor};${color2};${color3}\" dur=\"5s\" repeatCount=\"indefinite\" />\n </stop>\n `\n\n return gradient\n }\n\n /**\n * 주어진 색상의 Hue(색상) 값을 변경하여 새로운 색상을 생성\n * @param {string} color - 원본 색상 (HEX 코드)\n * @param {number} degree - 변경할 Hue 값 (0~360)\n * @returns {string} - 새로운 HEX 색상 코드\n */\n alterColor(color, degree) {\n const hexColor = this.convertToHex(color) // CSS 색상명을 HEX로 변환\n\n let r = parseInt(hexColor.substring(1, 3), 16)\n let g = parseInt(hexColor.substring(3, 5), 16)\n let b = parseInt(hexColor.substring(5, 7), 16)\n\n const hsl = this.rgbToHsl(r, g, b)\n hsl[0] = (hsl[0] + degree / 360) % 1 // Hue 값 회전\n const rgb = this.hslToRgb(hsl[0], hsl[1], hsl[2])\n\n return `#${rgb[0].toString(16).padStart(2, '0')}${rgb[1].toString(16).padStart(2, '0')}${rgb[2]\n .toString(16)\n .padStart(2, '0')}`\n }\n\n /**\n * RGB → HSL 변환\n */\n rgbToHsl(r, g, b) {\n ;(r /= 255), (g /= 255), (b /= 255)\n let max = Math.max(r, g, b),\n min = Math.min(r, g, b)\n let h,\n s,\n l = (max + min) / 2\n\n if (max === min) {\n h = s = 0\n } else {\n let d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, l]\n }\n\n /**\n * HSL → RGB 변환\n */\n hslToRgb(h, s, l) {\n let r, g, b\n\n if (s === 0) {\n r = g = b = l\n } else {\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n }\n\n let q = l < 0.5 ? l * (1 + s) : l + s - l * s\n let p = 2 * l - q\n\n r = hue2rgb(p, q, h + 1 / 3)\n g = hue2rgb(p, q, h)\n b = hue2rgb(p, q, h - 1 / 3)\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]\n }\n\n /**\n * CSS 색상명을 HEX 코드로 변환하는 함수\n * @param {string} color - 'red', 'blue' 같은 CSS 색상명 또는 HEX 코드\n * @returns {string} - HEX 코드 ('#RRGGBB' 형식)\n */\n convertToHex(color) {\n // 이미 HEX 코드라면 변환 없이 반환\n if (/^#([0-9A-F]{6})$/i.test(color)) return color\n\n // 임시 DOM 요소를 생성하여 getComputedStyle로 RGB 값 추출\n const tempElement = document.createElement('div')\n tempElement.style.color = color\n document.body.appendChild(tempElement)\n const computedColor = window.getComputedStyle(tempElement).color\n document.body.removeChild(tempElement)\n\n // RGB에서 HEX로 변환\n const match = computedColor.match(/\\d+/g) // RGB 숫자 값 추출\n if (!match || match.length < 3) {\n console.warn(`Invalid color: ${color}. Defaulting to #FF0000.`)\n return '#FF0000' // 기본 색상 (빨강) 사용\n }\n\n return `#${match\n .slice(0, 3)\n .map(x => parseInt(x, 10).toString(16).padStart(2, '0'))\n .join('')}`\n }\n\n /**\n * 하이라이팅 시작 (애니메이션 실행 포함)\n */\n start() {\n const overlay = this.overlayRef.deref()\n if (!overlay) return // overlay가 없으면 실행하지 않음\n\n const svg = BorderHighlighting.getSvgContainer(overlay)\n if (!overlay.contains(svg)) {\n overlay.appendChild(svg)\n }\n\n // ensure the element is created before animation starts\n const element = this.element\n if (!element) return\n\n if (this.decorator.animation) {\n const targetId = element.getAttribute('data-target-id')\n if (!targetId) return\n\n // defs 내부에서 해당 gradient 찾기\n const defs = svg.querySelector('defs')\n if (!defs) return\n const gradient = defs.querySelector(`#${targetId}`)\n if (!gradient) return\n\n // `animate` 요소를 gradient 내부에서 찾기\n requestAnimationFrame(() => {\n const animateElements = gradient.querySelectorAll('animate') // 🎯 수정된 로직\n animateElements.forEach(animate => {\n animate.beginElement()\n })\n })\n }\n }\n\n /**\n * 하이라이팅 중지 및 제거\n */\n stop() {\n if (!this.element) return\n\n const overlay = this.overlayRef.deref()\n if (!overlay) return\n\n const svg = BorderHighlighting._svgMap.get(overlay)\n if (!svg) return\n\n const group = svg.querySelector('.border-highlighting-group')\n if (!group) return\n\n const defs = svg.querySelector('defs') // Gradient가 정의된 defs 요소 가져오기\n if (!defs) return\n\n const targetId = BorderHighlighting.getTargetId(this.target) // target의 ID 가져오기\n\n // 현재 target의 path 요소 삭제\n const pathElement = group.querySelector(`[data-target-id=\"${targetId}\"]`)\n if (pathElement) {\n group.removeChild(pathElement)\n pathElement.remove()\n\n const gradientElement = defs.querySelector(`#${targetId}`)\n if (gradientElement) {\n defs.removeChild(gradientElement)\n gradientElement.remove()\n }\n }\n\n BorderHighlighting._targetIdMap.delete(this.target)\n\n // 해당 overlay의 모든 path가 삭제되었으면 SVG 컨테이너 제거\n if (group.children.length === 0) {\n svg.remove()\n BorderHighlighting._svgMap.delete(overlay)\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}