@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.
- package/babel.config.js +4 -3
- package/db.sqlite +0 -0
- package/dist/animation/animate.js +63 -0
- package/dist/animation/animate.js.map +1 -0
- package/dist/animation/animations/animation.js +122 -0
- package/dist/animation/animations/animation.js.map +1 -0
- package/dist/animation/animations/fade.js +28 -0
- package/dist/animation/animations/fade.js.map +1 -0
- package/dist/animation/animations/heartbeat.js +28 -0
- package/dist/animation/animations/heartbeat.js.map +1 -0
- package/dist/animation/animations/moving.js +24 -0
- package/dist/animation/animations/moving.js.map +1 -0
- package/dist/animation/animations/outline.js +47 -0
- package/dist/animation/animations/outline.js.map +1 -0
- package/dist/animation/animations/rotation.js +22 -0
- package/dist/animation/animations/rotation.js.map +1 -0
- package/dist/animation/animations/vibration.js +31 -0
- package/dist/animation/animations/vibration.js.map +1 -0
- package/dist/animation/compile.js +31 -0
- package/dist/animation/compile.js.map +1 -0
- package/dist/animation/delta.js +51 -0
- package/dist/animation/delta.js.map +1 -0
- package/dist/animation/index.js +14 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/command/command-change.js +33 -0
- package/dist/command/command-change.js.map +1 -0
- package/dist/command/command-migrate.js +103 -0
- package/dist/command/command-migrate.js.map +1 -0
- package/dist/command/command.js +18 -0
- package/dist/command/command.js.map +1 -0
- package/dist/command/snapshot-commander.js +84 -0
- package/dist/command/snapshot-commander.js.map +1 -0
- package/dist/components/anchor/anchor.js +105 -0
- package/dist/components/anchor/anchor.js.map +1 -0
- package/dist/components/anchor/ellipse-anchors.js +53 -0
- package/dist/components/anchor/ellipse-anchors.js.map +1 -0
- package/dist/components/anchor/rect-anchors.js +53 -0
- package/dist/components/anchor/rect-anchors.js.map +1 -0
- package/dist/components/audio.js +154 -0
- package/dist/components/audio.js.map +1 -0
- package/dist/components/cloud.js +44 -0
- package/dist/components/cloud.js.map +1 -0
- package/dist/components/component.js +1086 -0
- package/dist/components/component.js.map +1 -0
- package/dist/components/container-abstract.js +387 -0
- package/dist/components/container-abstract.js.map +1 -0
- package/dist/components/container.js +331 -0
- package/dist/components/container.js.map +1 -0
- package/dist/components/data/data-mapping.js +82 -0
- package/dist/components/data/data-mapping.js.map +1 -0
- package/dist/components/data/data.js +166 -0
- package/dist/components/data/data.js.map +1 -0
- package/dist/components/data/evaluator.js +103 -0
- package/dist/components/data/evaluator.js.map +1 -0
- package/dist/components/donut.js +104 -0
- package/dist/components/donut.js.map +1 -0
- package/dist/components/drawer/draw-image-pendable.js +20 -0
- package/dist/components/drawer/draw-image-pendable.js.map +1 -0
- package/dist/components/drawer/effect.js +19 -0
- package/dist/components/drawer/effect.js.map +1 -0
- package/dist/components/drawer/fill.js +228 -0
- package/dist/components/drawer/fill.js.map +1 -0
- package/dist/components/drawer/format.js +115 -0
- package/dist/components/drawer/format.js.map +1 -0
- package/dist/components/drawer/line.js +191 -0
- package/dist/components/drawer/line.js.map +1 -0
- package/dist/components/drawer/stroke.js +62 -0
- package/dist/components/drawer/stroke.js.map +1 -0
- package/dist/components/drawer/text-wrapper.js +51 -0
- package/dist/components/drawer/text-wrapper.js.map +1 -0
- package/dist/components/drawer/text.js +269 -0
- package/dist/components/drawer/text.js.map +1 -0
- package/dist/components/ellipse.js +110 -0
- package/dist/components/ellipse.js.map +1 -0
- package/dist/components/file/ondropfile.js +19 -0
- package/dist/components/file/ondropfile.js.map +1 -0
- package/dist/components/fit/fit.js +137 -0
- package/dist/components/fit/fit.js.map +1 -0
- package/dist/components/geometry/transcoord.js +339 -0
- package/dist/components/geometry/transcoord.js.map +1 -0
- package/dist/components/geometry/union.js +35 -0
- package/dist/components/geometry/union.js.map +1 -0
- package/dist/components/gif-view.js +128 -0
- package/dist/components/gif-view.js.map +1 -0
- package/dist/components/global-ref.js +154 -0
- package/dist/components/global-ref.js.map +1 -0
- package/dist/components/group.js +171 -0
- package/dist/components/group.js.map +1 -0
- package/dist/components/html/elements.js +24 -0
- package/dist/components/html/elements.js.map +1 -0
- package/dist/components/html/fill.js +126 -0
- package/dist/components/html/fill.js.map +1 -0
- package/dist/components/html/reposition.js +119 -0
- package/dist/components/html/reposition.js.map +1 -0
- package/dist/components/html/shadow.js +24 -0
- package/dist/components/html/shadow.js.map +1 -0
- package/dist/components/html-overlay-container.js +27 -0
- package/dist/components/html-overlay-container.js.map +1 -0
- package/dist/components/html-overlay-element.js +22 -0
- package/dist/components/html-overlay-element.js.map +1 -0
- package/dist/components/image-view.js +193 -0
- package/dist/components/image-view.js.map +1 -0
- package/dist/components/index.js +231 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/info-window.js +416 -0
- package/dist/components/info-window.js.map +1 -0
- package/dist/components/line.js +374 -0
- package/dist/components/line.js.map +1 -0
- package/dist/components/local-ref.js +114 -0
- package/dist/components/local-ref.js.map +1 -0
- package/dist/components/mixins/connectable.js +128 -0
- package/dist/components/mixins/connectable.js.map +1 -0
- package/dist/components/mixins/data-source.js +34 -0
- package/dist/components/mixins/data-source.js.map +1 -0
- package/dist/components/mixins/html-element.js +107 -0
- package/dist/components/mixins/html-element.js.map +1 -0
- package/dist/components/mixins/move-handle.js +73 -0
- package/dist/components/mixins/move-handle.js.map +1 -0
- package/dist/components/mixins/rect-path.js +113 -0
- package/dist/components/mixins/rect-path.js.map +1 -0
- package/dist/components/mixins/value-holder.js +81 -0
- package/dist/components/mixins/value-holder.js.map +1 -0
- package/dist/components/mutater/bounds.js +68 -0
- package/dist/components/mutater/bounds.js.map +1 -0
- package/dist/components/mutater/path.js +73 -0
- package/dist/components/mutater/path.js.map +1 -0
- package/dist/components/ortholine.js +763 -0
- package/dist/components/ortholine.js.map +1 -0
- package/dist/components/outline/ellipse-outline.js +23 -0
- package/dist/components/outline/ellipse-outline.js.map +1 -0
- package/dist/components/outline/path-outline.js +48 -0
- package/dist/components/outline/path-outline.js.map +1 -0
- package/dist/components/path.js +49 -0
- package/dist/components/path.js.map +1 -0
- package/dist/components/polygon.js +91 -0
- package/dist/components/polygon.js.map +1 -0
- package/dist/components/polyline.js +114 -0
- package/dist/components/polyline.js.map +1 -0
- package/dist/components/popup.js +160 -0
- package/dist/components/popup.js.map +1 -0
- package/dist/components/rect.js +72 -0
- package/dist/components/rect.js.map +1 -0
- package/dist/components/retention/retention-manager.js +81 -0
- package/dist/components/retention/retention-manager.js.map +1 -0
- package/dist/components/root-container.js +519 -0
- package/dist/components/root-container.js.map +1 -0
- package/dist/components/ruler.js +103 -0
- package/dist/components/ruler.js.map +1 -0
- package/dist/components/shape.js +97 -0
- package/dist/components/shape.js.map +1 -0
- package/dist/components/star.js +103 -0
- package/dist/components/star.js.map +1 -0
- package/dist/components/text/substitutor.js +92 -0
- package/dist/components/text/substitutor.js.map +1 -0
- package/dist/components/text.js +21 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/triangle.js +92 -0
- package/dist/components/triangle.js.map +1 -0
- package/dist/const.js +71 -0
- package/dist/const.js.map +1 -0
- package/dist/core/collection.js +28 -0
- package/dist/core/collection.js.map +1 -0
- package/dist/core/debug.js +12 -0
- package/dist/core/debug.js.map +1 -0
- package/dist/core/deep-equals.js +112 -0
- package/dist/core/deep-equals.js.map +1 -0
- package/dist/core/dom-to-image.js +617 -0
- package/dist/core/dom-to-image.js.map +1 -0
- package/dist/core/event.js +205 -0
- package/dist/core/event.js.map +1 -0
- package/dist/core/index.js +21 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/list.js +87 -0
- package/dist/core/list.js.map +1 -0
- package/dist/core/logger.js +29 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/memoize.js +40 -0
- package/dist/core/memoize.js.map +1 -0
- package/dist/core/mixin.js +26 -0
- package/dist/core/mixin.js.map +1 -0
- package/dist/core/obj-accessor.js +26 -0
- package/dist/core/obj-accessor.js.map +1 -0
- package/dist/core/reference-map.js +147 -0
- package/dist/core/reference-map.js.map +1 -0
- package/dist/core/round-rect.js +62 -0
- package/dist/core/round-rect.js.map +1 -0
- package/dist/core/safe-round.js +10 -0
- package/dist/core/safe-round.js.map +1 -0
- package/dist/core/script-loader.js +148 -0
- package/dist/core/script-loader.js.map +1 -0
- package/dist/core/snapshot-taker.js +59 -0
- package/dist/core/snapshot-taker.js.map +1 -0
- package/dist/core/stack.js +18 -0
- package/dist/core/stack.js.map +1 -0
- package/dist/core/timecapsule.js +88 -0
- package/dist/core/timecapsule.js.map +1 -0
- package/dist/core/utils.js +309 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/decorator/anchors-decorator.js +53 -0
- package/dist/decorator/anchors-decorator.js.map +1 -0
- package/dist/decorator/bouncing-arrow-decorator.js +52 -0
- package/dist/decorator/bouncing-arrow-decorator.js.map +1 -0
- package/dist/decorator/data-spread-decorator.js +69 -0
- package/dist/decorator/data-spread-decorator.js.map +1 -0
- package/dist/decorator/decotag-decorator.js +33 -0
- package/dist/decorator/decotag-decorator.js.map +1 -0
- package/dist/decorator/index.js +31 -0
- package/dist/decorator/index.js.map +1 -0
- package/dist/decorator/link-decorator.js +66 -0
- package/dist/decorator/link-decorator.js.map +1 -0
- package/dist/effect/gradation.js +37 -0
- package/dist/effect/gradation.js.map +1 -0
- package/dist/effect/index.js +23 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/effect/shadow.js +33 -0
- package/dist/effect/shadow.js.map +1 -0
- package/dist/effect/turn.js +25 -0
- package/dist/effect/turn.js.map +1 -0
- package/dist/event/event-engine.js +76 -0
- package/dist/event/event-engine.js.map +1 -0
- package/dist/event/event-pump.js +92 -0
- package/dist/event/event-pump.js.map +1 -0
- package/dist/event/event-tracker.js +97 -0
- package/dist/event/event-tracker.js.map +1 -0
- package/dist/event/index.js +21 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/ua-event-handler.js +453 -0
- package/dist/event/ua-event-handler.js.map +1 -0
- package/dist/event-map/animator-handler.js +225 -0
- package/dist/event-map/animator-handler.js.map +1 -0
- package/dist/event-map/animators/animated-icon.js +265 -0
- package/dist/event-map/animators/animated-icon.js.map +1 -0
- package/dist/event-map/animators/border-highlighting.js +476 -0
- package/dist/event-map/animators/border-highlighting.js.map +1 -0
- package/dist/event-map/animators/bouncing-arrow.js +226 -0
- package/dist/event-map/animators/bouncing-arrow.js.map +1 -0
- package/dist/event-map/event-map.js +36 -0
- package/dist/event-map/event-map.js.map +1 -0
- package/dist/event-map/index.js +20 -0
- package/dist/event-map/index.js.map +1 -0
- package/dist/event-map/move-handler.js +233 -0
- package/dist/event-map/move-handler.js.map +1 -0
- package/dist/event-map/paste-handler.js +176 -0
- package/dist/event-map/paste-handler.js.map +1 -0
- package/dist/event-map/shift-handler.js +55 -0
- package/dist/event-map/shift-handler.js.map +1 -0
- package/dist/event-map/text-editor-lite.js +276 -0
- package/dist/event-map/text-editor-lite.js.map +1 -0
- package/dist/event-map/zoom-handler.js +49 -0
- package/dist/event-map/zoom-handler.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/layer/action/emphasize.js +42 -0
- package/dist/layer/action/emphasize.js.map +1 -0
- package/dist/layer/action/popup.js +461 -0
- package/dist/layer/action/popup.js.map +1 -0
- package/dist/layer/action/pressed.js +31 -0
- package/dist/layer/action/pressed.js.map +1 -0
- package/dist/layer/add-layer.js +180 -0
- package/dist/layer/add-layer.js.map +1 -0
- package/dist/layer/decotag-layer.js +121 -0
- package/dist/layer/decotag-layer.js.map +1 -0
- package/dist/layer/guide-layer.js +292 -0
- package/dist/layer/guide-layer.js.map +1 -0
- package/dist/layer/index.js +70 -0
- package/dist/layer/index.js.map +1 -0
- package/dist/layer/layer.js +230 -0
- package/dist/layer/layer.js.map +1 -0
- package/dist/layer/minimap-layer.js +84 -0
- package/dist/layer/minimap-layer.js.map +1 -0
- package/dist/layer/model-layer.js +465 -0
- package/dist/layer/model-layer.js.map +1 -0
- package/dist/layer/modeler/anchor-handler.js +193 -0
- package/dist/layer/modeler/anchor-handler.js.map +1 -0
- package/dist/layer/modeler/control-handler.js +95 -0
- package/dist/layer/modeler/control-handler.js.map +1 -0
- package/dist/layer/modeler/focus-outline.js +41 -0
- package/dist/layer/modeler/focus-outline.js.map +1 -0
- package/dist/layer/modeler/group-outline.js +30 -0
- package/dist/layer/modeler/group-outline.js.map +1 -0
- package/dist/layer/modeler/index.js +56 -0
- package/dist/layer/modeler/index.js.map +1 -0
- package/dist/layer/modeler/path-handler.js +300 -0
- package/dist/layer/modeler/path-handler.js.map +1 -0
- package/dist/layer/modeler/resizer.js +333 -0
- package/dist/layer/modeler/resizer.js.map +1 -0
- package/dist/layer/modeler/rotator.js +134 -0
- package/dist/layer/modeler/rotator.js.map +1 -0
- package/dist/layer/modeling-layer.js +491 -0
- package/dist/layer/modeling-layer.js.map +1 -0
- package/dist/layer/reaction-layer.js +111 -0
- package/dist/layer/reaction-layer.js.map +1 -0
- package/dist/layer/scroll-layer.js +191 -0
- package/dist/layer/scroll-layer.js.map +1 -0
- package/dist/layer/selection/selected-finder.js +96 -0
- package/dist/layer/selection/selected-finder.js.map +1 -0
- package/dist/layer/selection-layer.js +373 -0
- package/dist/layer/selection-layer.js.map +1 -0
- package/dist/layer/shift-layer.js +83 -0
- package/dist/layer/shift-layer.js.map +1 -0
- package/dist/layout/absolute.js +30 -0
- package/dist/layout/absolute.js.map +1 -0
- package/dist/layout/card.js +52 -0
- package/dist/layout/card.js.map +1 -0
- package/dist/layout/html-absolute.js +32 -0
- package/dist/layout/html-absolute.js.map +1 -0
- package/dist/layout/index.js +56 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/layout.js +36 -0
- package/dist/layout/layout.js.map +1 -0
- package/dist/layout/linear-horizontal.js +56 -0
- package/dist/layout/linear-horizontal.js.map +1 -0
- package/dist/layout/linear-vertical.js +56 -0
- package/dist/layout/linear-vertical.js.map +1 -0
- package/dist/layout/table.js +106 -0
- package/dist/layout/table.js.map +1 -0
- package/dist/license/license.js +170 -0
- package/dist/license/license.js.map +1 -0
- package/dist/model/compile.js +40 -0
- package/dist/model/compile.js.map +1 -0
- package/dist/model/duplicate.js +19 -0
- package/dist/model/duplicate.js.map +1 -0
- package/dist/model/index.js +34 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/selector.js +104 -0
- package/dist/model/selector.js.map +1 -0
- package/dist/style/compile.js +14 -0
- package/dist/style/compile.js.map +1 -0
- package/dist/style/index.js +14 -0
- package/dist/style/index.js.map +1 -0
- package/dist/things-scene/api/add-start.js +18 -0
- package/dist/things-scene/api/add-start.js.map +1 -0
- package/dist/things-scene/api/add.js +71 -0
- package/dist/things-scene/api/add.js.map +1 -0
- package/dist/things-scene/api/align.js +116 -0
- package/dist/things-scene/api/align.js.map +1 -0
- package/dist/things-scene/api/center-to.js +50 -0
- package/dist/things-scene/api/center-to.js.map +1 -0
- package/dist/things-scene/api/change.js +27 -0
- package/dist/things-scene/api/change.js.map +1 -0
- package/dist/things-scene/api/clipboard.js +45 -0
- package/dist/things-scene/api/clipboard.js.map +1 -0
- package/dist/things-scene/api/distribute.js +57 -0
- package/dist/things-scene/api/distribute.js.map +1 -0
- package/dist/things-scene/api/duplicate.js +47 -0
- package/dist/things-scene/api/duplicate.js.map +1 -0
- package/dist/things-scene/api/fullscreen.js +26 -0
- package/dist/things-scene/api/fullscreen.js.map +1 -0
- package/dist/things-scene/api/group.js +91 -0
- package/dist/things-scene/api/group.js.map +1 -0
- package/dist/things-scene/api/ids.js +28 -0
- package/dist/things-scene/api/ids.js.map +1 -0
- package/dist/things-scene/api/index.js +192 -0
- package/dist/things-scene/api/index.js.map +1 -0
- package/dist/things-scene/api/listener.js +69 -0
- package/dist/things-scene/api/listener.js.map +1 -0
- package/dist/things-scene/api/paste-start.js +27 -0
- package/dist/things-scene/api/paste-start.js.map +1 -0
- package/dist/things-scene/api/place.js +98 -0
- package/dist/things-scene/api/place.js.map +1 -0
- package/dist/things-scene/api/remove.js +57 -0
- package/dist/things-scene/api/remove.js.map +1 -0
- package/dist/things-scene/api/symmetry.js +47 -0
- package/dist/things-scene/api/symmetry.js.map +1 -0
- package/dist/things-scene/api/to-data-url.js +76 -0
- package/dist/things-scene/api/to-data-url.js.map +1 -0
- package/dist/things-scene/api/zorder.js +68 -0
- package/dist/things-scene/api/zorder.js.map +1 -0
- package/dist/things-scene/application-context.js +168 -0
- package/dist/things-scene/application-context.js.map +1 -0
- package/dist/things-scene/config.js +18 -0
- package/dist/things-scene/config.js.map +1 -0
- package/dist/things-scene/create.js +67 -0
- package/dist/things-scene/create.js.map +1 -0
- package/dist/things-scene/fps.js +26 -0
- package/dist/things-scene/fps.js.map +1 -0
- package/dist/things-scene/index.js +152 -0
- package/dist/things-scene/index.js.map +1 -0
- package/dist/things-scene/polyfill.js +111 -0
- package/dist/things-scene/polyfill.js.map +1 -0
- package/dist/things-scene/scene.js +442 -0
- package/dist/things-scene/scene.js.map +1 -0
- package/dist/things-scene/version.js +12 -0
- package/dist/things-scene/version.js.map +1 -0
- package/package.json +8 -6
- 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":[]}
|