@operato/image-marker 9.0.20 → 9.0.25

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/CHANGELOG.md CHANGED
@@ -3,6 +3,23 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ### [9.0.25](https://github.com/hatiolab/operato/compare/v9.0.24...v9.0.25) (2025-08-23)
7
+
8
+
9
+ ### :bug: Bug Fix
10
+
11
+ * image-marker image loading effect ([0bf3552](https://github.com/hatiolab/operato/commit/0bf3552a8ed202f8738e6f973eacc27027946790))
12
+
13
+
14
+
15
+ ### [9.0.21](https://github.com/hatiolab/operato/compare/v9.0.20...v9.0.21) (2025-08-04)
16
+
17
+ **Note:** Version bump only for package @operato/image-marker
18
+
19
+
20
+
21
+
22
+
6
23
  ### [9.0.20](https://github.com/hatiolab/operato/compare/v9.0.19...v9.0.20) (2025-08-04)
7
24
 
8
25
  **Note:** Version bump only for package @operato/image-marker
@@ -9,9 +9,13 @@ export declare class BaseImageMarker extends LitElement {
9
9
  protected currentImage?: string;
10
10
  protected viewBox: string;
11
11
  protected zoomLevel: number;
12
+ protected isLoading: boolean;
13
+ protected showLoadingUI: boolean;
12
14
  protected debouncedUpdateImage: import("lodash").DebouncedFunc<() => Promise<void>>;
13
15
  protected zoomFactor: number;
14
16
  protected zoomThreshold: number;
17
+ protected loadingDelay: number;
18
+ protected loadingTimer?: number;
15
19
  protected initialViewBox: string | null;
16
20
  protected svg: SVGSVGElement;
17
21
  protected image: SVGImageElement;
@@ -34,4 +38,5 @@ export declare class BaseImageMarker extends LitElement {
34
38
  x: number;
35
39
  y: number;
36
40
  };
41
+ protected renderLoadingOverlay(): typeof nothing | import("lit-html").TemplateResult<1>;
37
42
  }
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from "tslib";
2
- import { LitElement, css, svg, nothing } from 'lit';
2
+ import { LitElement, css, html, svg, nothing } from 'lit';
3
3
  import { property, state, query } from 'lit/decorators.js';
4
4
  import { debounce } from 'lodash-es';
5
5
  import { GestureHelper } from '@operato/utils/gesture-helper.js';
@@ -12,9 +12,12 @@ export class BaseImageMarker extends LitElement {
12
12
  this.imageProvider = new DefaultImageProvider();
13
13
  this.viewBox = '0 0 800 600';
14
14
  this.zoomLevel = 1;
15
+ this.isLoading = false;
16
+ this.showLoadingUI = false;
15
17
  this.debouncedUpdateImage = debounce(this.updateImage.bind(this), 300);
16
18
  this.zoomFactor = 0.1;
17
19
  this.zoomThreshold = 0.05;
20
+ this.loadingDelay = 500; // 0.5초 지연
18
21
  this.initialViewBox = null;
19
22
  this.gestureHelper = null;
20
23
  }
@@ -42,6 +45,48 @@ export class BaseImageMarker extends LitElement {
42
45
  .link:hover {
43
46
  cursor: pointer;
44
47
  }
48
+
49
+ .loading-overlay {
50
+ position: absolute;
51
+ top: 0;
52
+ left: 0;
53
+ width: 100%;
54
+ height: 100%;
55
+ background: rgba(255, 255, 255, 0.8);
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ z-index: 1000;
60
+ backdrop-filter: blur(2px);
61
+ }
62
+
63
+ .loading-spinner {
64
+ width: 40px;
65
+ height: 40px;
66
+ border: 4px solid #f3f3f3;
67
+ border-top: 4px solid #3498db;
68
+ border-radius: 50%;
69
+ animation: spin 1s linear infinite;
70
+ }
71
+
72
+ @keyframes spin {
73
+ 0% {
74
+ transform: rotate(0deg);
75
+ }
76
+ 100% {
77
+ transform: rotate(360deg);
78
+ }
79
+ }
80
+
81
+ .loading-text {
82
+ margin-left: 12px;
83
+ color: #666;
84
+ font-size: 14px;
85
+ font-family:
86
+ system-ui,
87
+ -apple-system,
88
+ sans-serif;
89
+ }
45
90
  `
46
91
  ]; }
47
92
  connectedCallback() {
@@ -52,6 +97,11 @@ export class BaseImageMarker extends LitElement {
52
97
  }
53
98
  disconnectedCallback() {
54
99
  super.disconnectedCallback();
100
+ // 로딩 타이머 정리
101
+ if (this.loadingTimer) {
102
+ clearTimeout(this.loadingTimer);
103
+ this.loadingTimer = undefined;
104
+ }
55
105
  this.gestureHelper?.dispose();
56
106
  this.gestureHelper = null;
57
107
  }
@@ -94,14 +144,43 @@ export class BaseImageMarker extends LitElement {
94
144
  if (!this.imageUrl) {
95
145
  return;
96
146
  }
97
- const options = {
98
- id: this.imageUrl, // 이미지 ID는 imageUrl 속성을 사용
99
- scale: this.zoomLevel, // scale은 zoomLevel 속성을 사용
100
- offsetX: 0, // offsetX는 0으로 설정
101
- offsetY: 0, // offsetY는 0으로 설정
102
- currentImage: this.currentImage // 기존 이미지 객체 전달
103
- };
104
- this.currentImage = await this.imageProvider.getImage(options);
147
+ // 기존 타이머 정리
148
+ if (this.loadingTimer) {
149
+ clearTimeout(this.loadingTimer);
150
+ this.loadingTimer = undefined;
151
+ }
152
+ // 로딩 시작
153
+ this.isLoading = true;
154
+ this.showLoadingUI = false;
155
+ // 0.5초 후에 로딩 UI 표시
156
+ this.loadingTimer = window.setTimeout(() => {
157
+ if (this.isLoading) {
158
+ this.showLoadingUI = true;
159
+ }
160
+ }, this.loadingDelay);
161
+ try {
162
+ const options = {
163
+ id: this.imageUrl, // 이미지 ID는 imageUrl 속성을 사용
164
+ scale: this.zoomLevel, // scale은 zoomLevel 속성을 사용
165
+ offsetX: 0, // offsetX는 0으로 설정
166
+ offsetY: 0, // offsetY는 0으로 설정
167
+ currentImage: this.currentImage // 기존 이미지 객체 전달
168
+ };
169
+ const newImage = await this.imageProvider.getImage(options);
170
+ // 새 이미지가 로드되면 기존 이미지 교체
171
+ if (newImage !== this.currentImage) {
172
+ this.currentImage = newImage;
173
+ }
174
+ }
175
+ finally {
176
+ // 로딩 완료 - 타이머 정리 및 상태 초기화
177
+ if (this.loadingTimer) {
178
+ clearTimeout(this.loadingTimer);
179
+ this.loadingTimer = undefined;
180
+ }
181
+ this.isLoading = false;
182
+ this.showLoadingUI = false;
183
+ }
105
184
  }
106
185
  onSvgWheel(event) {
107
186
  event.preventDefault();
@@ -207,6 +286,16 @@ export class BaseImageMarker extends LitElement {
207
286
  };
208
287
  }
209
288
  }
289
+ renderLoadingOverlay() {
290
+ return this.showLoadingUI
291
+ ? html `
292
+ <div class="loading-overlay">
293
+ <div class="loading-spinner"></div>
294
+ <div class="loading-text">Loading image...</div>
295
+ </div>
296
+ `
297
+ : nothing;
298
+ }
210
299
  }
211
300
  __decorate([
212
301
  property({ type: String })
@@ -226,6 +315,12 @@ __decorate([
226
315
  __decorate([
227
316
  state()
228
317
  ], BaseImageMarker.prototype, "zoomLevel", void 0);
318
+ __decorate([
319
+ state()
320
+ ], BaseImageMarker.prototype, "isLoading", void 0);
321
+ __decorate([
322
+ state()
323
+ ], BaseImageMarker.prototype, "showLoadingUI", void 0);
229
324
  __decorate([
230
325
  query('svg')
231
326
  ], BaseImageMarker.prototype, "svg", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"base-image-marker.js","sourceRoot":"","sources":["../../src/base-image-marker.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAQ,GAAG,EAAE,OAAO,EAAkB,MAAM,KAAK,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAIL,aAAa,EACd,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAElE,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAA/C;;QA4B8B,aAAQ,GAAW,EAAE,CAAA;QACtB,WAAM,GAAY,EAAE,CAAA;QACnB,kBAAa,GAAmB,IAAI,oBAAoB,EAAE,CAAA;QAGnE,YAAO,GAAG,aAAa,CAAA;QACvB,cAAS,GAAG,CAAC,CAAA;QAEtB,yBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QACjE,eAAU,GAAG,GAAG,CAAA;QAChB,kBAAa,GAAG,IAAI,CAAA;QAEpB,mBAAc,GAAkB,IAAI,CAAA;QAKtC,kBAAa,GAAyB,IAAI,CAAA;IA8MpD,CAAC;aA1PQ,WAAM,GAAG;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;KAuBF;KACF,AAzBY,CAyBZ;IAqBD,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,qBAAqB,CAAC,GAAG,EAAE;YACzB,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAE5B,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAA;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;IAC3B,CAAC;IAES,OAAO,CAAC,OAAuB;QACvC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;YAC1B,IAAI,CAAC,WAAW,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,QAAuB;QAC7C,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAA;IAC/B,CAAC;IAES,WAAW,CAAC,KAAY;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAyB,CAAA;QAC/C,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAA;QAEvB,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;YAChB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAA;YAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAA;YAEhC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,GAAG,OAAO,KAAK,IAAI,MAAM,EAAE,CAAA;gBAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAA;gBAElC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC/C,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACjD,OAAO,CAAC,YAAY,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAA;YAC9D,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBACpG,MAAM,KAAK,GAAG,YAAY,GAAG,KAAK,CAAA;gBAElC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACzD,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC7D,CAAC;QACH,CAAC,CAAA;QAED,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,YAAa,CAAA;IAC9B,CAAC;IAES,KAAK,CAAC,WAAW;QACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC7C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,0BAA0B;YAC7C,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,0BAA0B;YACjD,OAAO,EAAE,CAAC,EAAE,kBAAkB;YAC9B,OAAO,EAAE,CAAC,EAAE,kBAAkB;YAC9B,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,eAAe;SAChD,CAAA;QAED,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAChE,CAAC;IAES,UAAU,CAAC,KAAiB;QACpC,KAAK,CAAC,cAAc,EAAE,CAAA;QAEtB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;QAC1C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAA;QAEpE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACpC,CAAC;IAES,UAAU,CAAC,CAAoB;QACvC,CAAC,CAAC,eAAe,EAAE,CAAA;QAEnB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,CAAA;QAE5C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACpC,CAAC;IAES,cAAc,CAAC,CAAwB;QAC/C,CAAC,CAAC,eAAe,EAAE,CAAA;QAEnB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAES,SAAS,CAAC,CAAmB;QACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAA;QAEnC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEzE,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAA;QAC7C,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAA;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAEtC,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,CAAA;QACnC,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,CAAA;QAEnC,IAAI,CAAC,OAAO,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAA;QAE3D,IAAI,CAAC,oBAAoB,EAAE,CAAA;IAC7B,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe;QAClD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAA;YAEvB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACzE,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,OAAO,CAAA;YAC/D,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAA;YAEjE,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,CAAA;YAClC,MAAM,WAAW,GAAG,QAAQ,GAAG,KAAK,CAAA;YAEpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,UAAU,CAAA;YACrE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,WAAW,CAAA;YAEvE,IAAI,CAAC,OAAO,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,UAAU,IAAI,WAAW,EAAE,CAAA;YAEjE,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC7B,CAAC;IACH,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAe,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAElB,IAAI,CAAC,oBAAoB,EAAE,CAAA;IAC7B,CAAC;IAES,eAAe,CAAC,KAAY;QACpC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;YAC9B,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;YAC1C,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;IACH,CAAC;IAES,WAAW,CAAC,KAAY;QAChC,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,CAAC;YACjB,IAAI,EAAE,aAAa;SACpB,CAAA;QAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,OAAO,GAAG,CAAA,YAAY,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,mEAAmE,KAAK,CAAC,IAAI,SAAS,CAAA;YACpI,KAAK,WAAW;gBACd,OAAO,GAAG,CAAA,YAAY,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC,MAAM,aAAa,WAAW,CAAC,MAAM,mBAAmB,WAAW,CAAC,cAAc,CAAC,WAAW,WAAW,CAAC,IAAI,WAAW,CAAA;YACjN,KAAK,QAAQ;gBACX,OAAO,GAAG,CAAA,eAAe,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,QAAQ,KAAK,CAAC,CAAC,aAAa,WAAW,CAAC,MAAM,mBAAmB,WAAW,CAAC,cAAc,CAAC,WAAW,WAAW,CAAC,IAAI,aAAa,CAAA;YACxL,KAAK,MAAM;gBACT,OAAO,GAAG,CAAA,aAAa,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,aAAa,WAAW,CAAC,MAAM,mBAAmB,WAAW,CAAC,cAAc,CAAC,WAAW,CAAA;YAC5K,KAAK,OAAO;gBACV,OAAO,GAAG,CAAA;;oCAEkB,KAAK,CAAC,EAAE;yDACa,WAAW,CAAC,MAAM;;;sBAGrD,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,aAAa,WAAW,CAAC,MAAM,mBAAmB,WAAW,CAAC,cAAc,CAAC,gCAAgC,KAAK,CAAC,EAAE,YAAY,CAAA;YAC5M,KAAK,MAAM;gBACT,OAAO,GAAG,CAAA;kCACgB,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC,MAAM;sBAClF,WAAW,CAAC,MAAM;oBACpB,WAAW,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;kBACrF,CAAA;YACZ;gBACE,OAAO,OAAO,CAAA;QAClB,CAAC;IACH,CAAC;IAES,iBAAiB,CAAC,KAAmD;QAC7E,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YACvB,OAAO;gBACL,CAAC,EAAE,KAAK,CAAC,OAAO;gBAChB,CAAC,EAAE,KAAK,CAAC,OAAO;aACjB,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAA;YACzC,OAAO;gBACL,CAAC,EAAE,OAAO;gBACV,CAAC,EAAE,OAAO;aACX,CAAA;QACH,CAAC;IACH,CAAC;;AA9N2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDAAsB;AACtB;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;+CAAqB;AACnB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAA2D;AAEnE;IAAlB,KAAK,EAAE;qDAAgC;AACrB;IAAlB,KAAK,EAAE;gDAAkC;AACvB;IAAlB,KAAK,EAAE;kDAAwB;AAQR;IAAvB,KAAK,CAAC,KAAK,CAAC;4CAA8B;AACjB;IAAzB,KAAK,CAAC,OAAO,CAAC;8CAAkC","sourcesContent":["import { LitElement, css, html, svg, nothing, PropertyValues } from 'lit'\nimport { property, state, query } from 'lit/decorators.js'\nimport { debounce } from 'lodash-es'\n\nimport {\n GestureEventDoubleTap,\n GestureEventDrag,\n GestureEventPinch,\n GestureHelper\n} from '@operato/utils/gesture-helper.js'\nimport { ImageProvider, Shape } from './types.js'\nimport { DefaultImageProvider } from './default-image-provider.js'\n\nexport class BaseImageMarker extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n }\n\n .container {\n flex: 1;\n position: relative;\n }\n\n svg {\n position: absolute;\n top: 0;\n left: 0;\n cursor: pointer;\n width: 100%;\n height: 100%;\n touch-action: none;\n }\n\n .link:hover {\n cursor: pointer;\n }\n `\n ]\n\n @property({ type: String }) imageUrl: string = ''\n @property({ type: Array }) shapes: Shape[] = []\n @property({ type: Object }) imageProvider?: ImageProvider = new DefaultImageProvider()\n\n @state() protected currentImage?: string\n @state() protected viewBox = '0 0 800 600'\n @state() protected zoomLevel = 1\n\n protected debouncedUpdateImage = debounce(this.updateImage.bind(this), 300)\n protected zoomFactor = 0.1\n protected zoomThreshold = 0.05\n\n protected initialViewBox: string | null = null\n\n @query('svg') protected svg!: SVGSVGElement\n @query('image') protected image!: SVGImageElement\n\n private gestureHelper: GestureHelper | null = null\n\n connectedCallback(): void {\n super.connectedCallback()\n requestAnimationFrame(() => {\n this.gestureHelper = new GestureHelper(this.svg)\n })\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n this.gestureHelper?.dispose()\n this.gestureHelper = null\n }\n\n protected updated(changes: PropertyValues): void {\n if (changes.has('imageUrl') || changes.has('imageProvider')) {\n this.zoomLevel = 1\n this.initialViewBox = null\n this.updateImage()\n }\n }\n\n public setImageProvider(provider: ImageProvider) {\n this.imageProvider = provider\n }\n\n protected onImageLoad(event: Event) {\n const element = event.target as SVGImageElement\n const img = new Image()\n\n img.onload = () => {\n const width = img.naturalWidth\n const height = img.naturalHeight\n\n if (!this.initialViewBox) {\n this.initialViewBox = `0 0 ${width} ${height}`\n this.viewBox = this.initialViewBox\n\n element.setAttribute('width', width.toString())\n element.setAttribute('height', height.toString())\n element.setAttribute('preserveAspectRatio', 'xMidYMid meet')\n } else {\n const [initialX, initialY, initialWidth, initialHeight] = this.initialViewBox.split(' ').map(Number)\n const scale = initialWidth / width\n\n element.setAttribute('width', (width * scale).toString())\n element.setAttribute('height', (height * scale).toString())\n }\n }\n\n img.src = this.currentImage!\n }\n\n protected async updateImage() {\n if (!this.imageProvider) {\n throw new Error('ImageProvider is not set')\n }\n\n if (!this.imageUrl) {\n return\n }\n\n const options = {\n id: this.imageUrl, // 이미지 ID는 imageUrl 속성을 사용\n scale: this.zoomLevel, // scale은 zoomLevel 속성을 사용\n offsetX: 0, // offsetX는 0으로 설정\n offsetY: 0, // offsetY는 0으로 설정\n currentImage: this.currentImage // 기존 이미지 객체 전달\n }\n\n this.currentImage = await this.imageProvider.getImage(options)\n }\n\n protected onSvgWheel(event: WheelEvent) {\n event.preventDefault()\n\n const { offsetX, offsetY, deltaY } = event\n const scale = deltaY > 0 ? 1 - this.zoomFactor : 1 + this.zoomFactor\n\n this.zoom(scale, offsetX, offsetY)\n }\n\n protected onSvgPinch(e: GestureEventPinch) {\n e.stopPropagation()\n\n const { scale, centerX, centerY } = e.detail\n\n this.zoom(scale, centerX, centerY)\n }\n\n protected onSvgDoubleTap(e: GestureEventDoubleTap) {\n e.stopPropagation()\n\n this.reset()\n }\n\n protected onSvgDrag(e: GestureEventDrag) {\n const { deltaX, deltaY } = e.detail\n\n const [vbX, vbY, vbWidth, vbHeight] = this.viewBox.split(' ').map(Number)\n\n const scaleX = vbWidth / this.svg.clientWidth\n const scaleY = vbHeight / this.svg.clientHeight\n const scale = Math.max(scaleX, scaleY)\n\n const newVbX = vbX - deltaX * scale\n const newVbY = vbY - deltaY * scale\n\n this.viewBox = `${newVbX} ${newVbY} ${vbWidth} ${vbHeight}`\n\n this.debouncedUpdateImage()\n }\n\n zoom(scale: number, offsetX: number, offsetY: number) {\n if (Math.abs(scale) > this.zoomThreshold) {\n this.zoomLevel *= scale\n\n const [vbX, vbY, vbWidth, vbHeight] = this.viewBox.split(' ').map(Number)\n const mouseX = vbX + (offsetX / this.svg.clientWidth) * vbWidth\n const mouseY = vbY + (offsetY / this.svg.clientHeight) * vbHeight\n\n const newVbWidth = vbWidth / scale\n const newVbHeight = vbHeight / scale\n\n const newVbX = mouseX - (offsetX / this.svg.clientWidth) * newVbWidth\n const newVbY = mouseY - (offsetY / this.svg.clientHeight) * newVbHeight\n\n this.viewBox = `${newVbX} ${newVbY} ${newVbWidth} ${newVbHeight}`\n\n this.debouncedUpdateImage()\n }\n }\n\n public reset() {\n if (!this.initialViewBox) {\n this.zoomLevel = 1\n return\n }\n\n this.viewBox = this.initialViewBox!\n this.zoomLevel = 1\n\n this.debouncedUpdateImage()\n }\n\n protected handleLinkClick(shape: Shape) {\n this.dispatchEvent(\n new CustomEvent('link-clicked', {\n detail: { id: shape.id, link: shape.link },\n bubbles: true,\n composed: true\n })\n )\n }\n\n protected renderShape(shape: Shape) {\n const commonAttrs = {\n stroke: 'red',\n 'stroke-width': 1,\n fill: 'transparent'\n }\n\n switch (shape.type) {\n case 'text':\n return svg`<text x=\"${shape.x}\" y=\"${shape.y}\" text-anchor=\"middle\" alignment-baseline=\"middle\" fill=\"black\">${shape.text}</text>`\n case 'rectangle':\n return svg`<rect x=\"${shape.x}\" y=\"${shape.y}\" width=\"${shape.width}\" height=\"${shape.height}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\" fill=\"${commonAttrs.fill}\"></rect>`\n case 'circle':\n return svg`<circle cx=\"${shape.cx}\" cy=\"${shape.cy}\" r=\"${shape.r}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\" fill=\"${commonAttrs.fill}\"></circle>`\n case 'line':\n return svg`<line x1=\"${shape.x1}\" y1=\"${shape.y1}\" x2=\"${shape.x2}\" y2=\"${shape.y2}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\"></line>`\n case 'arrow':\n return svg`\n <defs>\n <marker id=\"arrowhead-${shape.id}\" markerWidth=\"10\" markerHeight=\"7\" refX=\"10\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"${commonAttrs.stroke}\"></polygon>\n </marker>\n </defs>\n <line x1=\"${shape.x1}\" y1=\"${shape.y1}\" x2=\"${shape.x2}\" y2=\"${shape.y2}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\" marker-end=\"url(#arrowhead-${shape.id})\"></line>`\n case 'link':\n return svg`\n <rect class=\"link\" x=\"${shape.x}\" y=\"${shape.y}\" width=\"${shape.width}\" height=\"${shape.height}\" \n stroke=\"${commonAttrs.stroke}\" stroke-width=\"0\" \n fill=\"${commonAttrs.stroke}\" fill-opacity=\"0.3\" @click=\"${() => this.handleLinkClick(shape)}\">\n </rect>`\n default:\n return nothing\n }\n }\n\n protected getPointFromEvent(event: MouseEvent | PointerEvent | GestureEventDrag) {\n if ('clientX' in event) {\n return {\n x: event.clientX,\n y: event.clientY\n }\n } else {\n const { clientX, clientY } = event.detail\n return {\n x: clientX,\n y: clientY\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"base-image-marker.js","sourceRoot":"","sources":["../../src/base-image-marker.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, css, html, svg, nothing, PropertyValues } from 'lit'\nimport { property, state, query } from 'lit/decorators.js'\nimport { debounce } from 'lodash-es'\n\nimport {\n GestureEventDoubleTap,\n GestureEventDrag,\n GestureEventPinch,\n GestureHelper\n} from '@operato/utils/gesture-helper.js'\nimport { ImageProvider, Shape } from './types.js'\nimport { DefaultImageProvider } from './default-image-provider.js'\n\nexport class BaseImageMarker extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n }\n\n .container {\n flex: 1;\n position: relative;\n }\n\n svg {\n position: absolute;\n top: 0;\n left: 0;\n cursor: pointer;\n width: 100%;\n height: 100%;\n touch-action: none;\n }\n\n .link:hover {\n cursor: pointer;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n backdrop-filter: blur(2px);\n }\n\n .loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n\n .loading-text {\n margin-left: 12px;\n color: #666;\n font-size: 14px;\n font-family:\n system-ui,\n -apple-system,\n sans-serif;\n }\n `\n ]\n\n @property({ type: String }) imageUrl: string = ''\n @property({ type: Array }) shapes: Shape[] = []\n @property({ type: Object }) imageProvider?: ImageProvider = new DefaultImageProvider()\n\n @state() protected currentImage?: string\n @state() protected viewBox = '0 0 800 600'\n @state() protected zoomLevel = 1\n @state() protected isLoading = false\n @state() protected showLoadingUI = false\n\n protected debouncedUpdateImage = debounce(this.updateImage.bind(this), 300)\n protected zoomFactor = 0.1\n protected zoomThreshold = 0.05\n protected loadingDelay = 500 // 0.5초 지연\n protected loadingTimer?: number\n\n protected initialViewBox: string | null = null\n\n @query('svg') protected svg!: SVGSVGElement\n @query('image') protected image!: SVGImageElement\n\n private gestureHelper: GestureHelper | null = null\n\n connectedCallback(): void {\n super.connectedCallback()\n requestAnimationFrame(() => {\n this.gestureHelper = new GestureHelper(this.svg)\n })\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n // 로딩 타이머 정리\n if (this.loadingTimer) {\n clearTimeout(this.loadingTimer)\n this.loadingTimer = undefined\n }\n\n this.gestureHelper?.dispose()\n this.gestureHelper = null\n }\n\n protected updated(changes: PropertyValues): void {\n if (changes.has('imageUrl') || changes.has('imageProvider')) {\n this.zoomLevel = 1\n this.initialViewBox = null\n this.updateImage()\n }\n }\n\n public setImageProvider(provider: ImageProvider) {\n this.imageProvider = provider\n }\n\n protected onImageLoad(event: Event) {\n const element = event.target as SVGImageElement\n const img = new Image()\n\n img.onload = () => {\n const width = img.naturalWidth\n const height = img.naturalHeight\n\n if (!this.initialViewBox) {\n this.initialViewBox = `0 0 ${width} ${height}`\n this.viewBox = this.initialViewBox\n\n element.setAttribute('width', width.toString())\n element.setAttribute('height', height.toString())\n element.setAttribute('preserveAspectRatio', 'xMidYMid meet')\n } else {\n const [initialX, initialY, initialWidth, initialHeight] = this.initialViewBox.split(' ').map(Number)\n const scale = initialWidth / width\n\n element.setAttribute('width', (width * scale).toString())\n element.setAttribute('height', (height * scale).toString())\n }\n }\n\n img.src = this.currentImage!\n }\n\n protected async updateImage() {\n if (!this.imageProvider) {\n throw new Error('ImageProvider is not set')\n }\n\n if (!this.imageUrl) {\n return\n }\n\n // 기존 타이머 정리\n if (this.loadingTimer) {\n clearTimeout(this.loadingTimer)\n this.loadingTimer = undefined\n }\n\n // 로딩 시작\n this.isLoading = true\n this.showLoadingUI = false\n\n // 0.5초 후에 로딩 UI 표시\n this.loadingTimer = window.setTimeout(() => {\n if (this.isLoading) {\n this.showLoadingUI = true\n }\n }, this.loadingDelay)\n\n try {\n const options = {\n id: this.imageUrl, // 이미지 ID는 imageUrl 속성을 사용\n scale: this.zoomLevel, // scale은 zoomLevel 속성을 사용\n offsetX: 0, // offsetX는 0으로 설정\n offsetY: 0, // offsetY는 0으로 설정\n currentImage: this.currentImage // 기존 이미지 객체 전달\n }\n\n const newImage = await this.imageProvider.getImage(options)\n\n // 새 이미지가 로드되면 기존 이미지 교체\n if (newImage !== this.currentImage) {\n this.currentImage = newImage\n }\n } finally {\n // 로딩 완료 - 타이머 정리 및 상태 초기화\n if (this.loadingTimer) {\n clearTimeout(this.loadingTimer)\n this.loadingTimer = undefined\n }\n this.isLoading = false\n this.showLoadingUI = false\n }\n }\n\n protected onSvgWheel(event: WheelEvent) {\n event.preventDefault()\n\n const { offsetX, offsetY, deltaY } = event\n const scale = deltaY > 0 ? 1 - this.zoomFactor : 1 + this.zoomFactor\n\n this.zoom(scale, offsetX, offsetY)\n }\n\n protected onSvgPinch(e: GestureEventPinch) {\n e.stopPropagation()\n\n const { scale, centerX, centerY } = e.detail\n\n this.zoom(scale, centerX, centerY)\n }\n\n protected onSvgDoubleTap(e: GestureEventDoubleTap) {\n e.stopPropagation()\n\n this.reset()\n }\n\n protected onSvgDrag(e: GestureEventDrag) {\n const { deltaX, deltaY } = e.detail\n\n const [vbX, vbY, vbWidth, vbHeight] = this.viewBox.split(' ').map(Number)\n\n const scaleX = vbWidth / this.svg.clientWidth\n const scaleY = vbHeight / this.svg.clientHeight\n const scale = Math.max(scaleX, scaleY)\n\n const newVbX = vbX - deltaX * scale\n const newVbY = vbY - deltaY * scale\n\n this.viewBox = `${newVbX} ${newVbY} ${vbWidth} ${vbHeight}`\n\n this.debouncedUpdateImage()\n }\n\n zoom(scale: number, offsetX: number, offsetY: number) {\n if (Math.abs(scale) > this.zoomThreshold) {\n this.zoomLevel *= scale\n\n const [vbX, vbY, vbWidth, vbHeight] = this.viewBox.split(' ').map(Number)\n const mouseX = vbX + (offsetX / this.svg.clientWidth) * vbWidth\n const mouseY = vbY + (offsetY / this.svg.clientHeight) * vbHeight\n\n const newVbWidth = vbWidth / scale\n const newVbHeight = vbHeight / scale\n\n const newVbX = mouseX - (offsetX / this.svg.clientWidth) * newVbWidth\n const newVbY = mouseY - (offsetY / this.svg.clientHeight) * newVbHeight\n\n this.viewBox = `${newVbX} ${newVbY} ${newVbWidth} ${newVbHeight}`\n\n this.debouncedUpdateImage()\n }\n }\n\n public reset() {\n if (!this.initialViewBox) {\n this.zoomLevel = 1\n return\n }\n\n this.viewBox = this.initialViewBox!\n this.zoomLevel = 1\n\n this.debouncedUpdateImage()\n }\n\n protected handleLinkClick(shape: Shape) {\n this.dispatchEvent(\n new CustomEvent('link-clicked', {\n detail: { id: shape.id, link: shape.link },\n bubbles: true,\n composed: true\n })\n )\n }\n\n protected renderShape(shape: Shape) {\n const commonAttrs = {\n stroke: 'red',\n 'stroke-width': 1,\n fill: 'transparent'\n }\n\n switch (shape.type) {\n case 'text':\n return svg`<text x=\"${shape.x}\" y=\"${shape.y}\" text-anchor=\"middle\" alignment-baseline=\"middle\" fill=\"black\">${shape.text}</text>`\n case 'rectangle':\n return svg`<rect x=\"${shape.x}\" y=\"${shape.y}\" width=\"${shape.width}\" height=\"${shape.height}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\" fill=\"${commonAttrs.fill}\"></rect>`\n case 'circle':\n return svg`<circle cx=\"${shape.cx}\" cy=\"${shape.cy}\" r=\"${shape.r}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\" fill=\"${commonAttrs.fill}\"></circle>`\n case 'line':\n return svg`<line x1=\"${shape.x1}\" y1=\"${shape.y1}\" x2=\"${shape.x2}\" y2=\"${shape.y2}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\"></line>`\n case 'arrow':\n return svg`\n <defs>\n <marker id=\"arrowhead-${shape.id}\" markerWidth=\"10\" markerHeight=\"7\" refX=\"10\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"${commonAttrs.stroke}\"></polygon>\n </marker>\n </defs>\n <line x1=\"${shape.x1}\" y1=\"${shape.y1}\" x2=\"${shape.x2}\" y2=\"${shape.y2}\" stroke=\"${commonAttrs.stroke}\" stroke-width=\"${commonAttrs['stroke-width']}\" marker-end=\"url(#arrowhead-${shape.id})\"></line>`\n case 'link':\n return svg`\n <rect class=\"link\" x=\"${shape.x}\" y=\"${shape.y}\" width=\"${shape.width}\" height=\"${shape.height}\" \n stroke=\"${commonAttrs.stroke}\" stroke-width=\"0\" \n fill=\"${commonAttrs.stroke}\" fill-opacity=\"0.3\" @click=\"${() => this.handleLinkClick(shape)}\">\n </rect>`\n default:\n return nothing\n }\n }\n\n protected getPointFromEvent(event: MouseEvent | PointerEvent | GestureEventDrag) {\n if ('clientX' in event) {\n return {\n x: event.clientX,\n y: event.clientY\n }\n } else {\n const { clientX, clientY } = event.detail\n return {\n x: clientX,\n y: clientY\n }\n }\n }\n\n protected renderLoadingOverlay() {\n return this.showLoadingUI\n ? html`\n <div class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading image...</div>\n </div>\n `\n : nothing\n }\n}\n"]}
@@ -16,6 +16,7 @@ let OxImageMarkerView = class OxImageMarkerView extends BaseImageMarker {
16
16
  <image href=${this.currentImage} @load=${this.onImageLoad}></image>
17
17
  ${this.shapes.map(shape => this.renderShape(shape))}
18
18
  </svg>
19
+ ${this.renderLoadingOverlay()}
19
20
  </div>
20
21
  `;
21
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ox-image-marker-view.js","sourceRoot":"","sources":["../../src/ox-image-marker-view.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGjD,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,eAAe;IACpD,MAAM;QACJ,OAAO,IAAI,CAAA;;;mBAGI,IAAI,CAAC,UAAU;uBACX,IAAI,CAAC,cAAc;mBACvB,IAAI,CAAC,UAAU;kBAChB,IAAI,CAAC,SAAS;oBACZ,IAAI,CAAC,OAAO;;wBAER,IAAI,CAAC,YAAY,UAAU,IAAI,CAAC,WAAW;YACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;;;KAGxD,CAAA;IACH,CAAC;CACF,CAAA;AAjBY,iBAAiB;IAD7B,aAAa,CAAC,sBAAsB,CAAC;GACzB,iBAAiB,CAiB7B","sourcesContent":["import { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { BaseImageMarker } from './base-image-marker.js'\n\n@customElement('ox-image-marker-view')\nexport class OxImageMarkerView extends BaseImageMarker {\n render() {\n return html`\n <div class=\"container\">\n <svg\n @wheel=${this.onSvgWheel}\n @doubletap=${this.onSvgDoubleTap}\n @pinch=${this.onSvgPinch}\n @drag=${this.onSvgDrag}\n viewBox=${this.viewBox}\n >\n <image href=${this.currentImage} @load=${this.onImageLoad}></image>\n ${this.shapes.map(shape => this.renderShape(shape))}\n </svg>\n </div>\n `\n }\n}\n"]}
1
+ {"version":3,"file":"ox-image-marker-view.js","sourceRoot":"","sources":["../../src/ox-image-marker-view.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGjD,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,eAAe;IACpD,MAAM;QACJ,OAAO,IAAI,CAAA;;;mBAGI,IAAI,CAAC,UAAU;uBACX,IAAI,CAAC,cAAc;mBACvB,IAAI,CAAC,UAAU;kBAChB,IAAI,CAAC,SAAS;oBACZ,IAAI,CAAC,OAAO;;wBAER,IAAI,CAAC,YAAY,UAAU,IAAI,CAAC,WAAW;YACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;;UAEnD,IAAI,CAAC,oBAAoB,EAAE;;KAEhC,CAAA;IACH,CAAC;CACF,CAAA;AAlBY,iBAAiB;IAD7B,aAAa,CAAC,sBAAsB,CAAC;GACzB,iBAAiB,CAkB7B","sourcesContent":["import { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { BaseImageMarker } from './base-image-marker.js'\n\n@customElement('ox-image-marker-view')\nexport class OxImageMarkerView extends BaseImageMarker {\n render() {\n return html`\n <div class=\"container\">\n <svg\n @wheel=${this.onSvgWheel}\n @doubletap=${this.onSvgDoubleTap}\n @pinch=${this.onSvgPinch}\n @drag=${this.onSvgDrag}\n viewBox=${this.viewBox}\n >\n <image href=${this.currentImage} @load=${this.onImageLoad}></image>\n ${this.shapes.map(shape => this.renderShape(shape))}\n </svg>\n ${this.renderLoadingOverlay()}\n </div>\n `\n }\n}\n"]}
@@ -221,6 +221,7 @@ let OxImageMarker = class OxImageMarker extends BaseImageMarker {
221
221
  <image href=${this.currentImage} @load=${this.onImageLoad}></image>
222
222
  ${this.shapes.map(shape => keyed(shape.id, this.renderShape(shape)))}
223
223
  </svg>
224
+ ${this.renderLoadingOverlay()}
224
225
  </div>
225
226
 
226
227
  <ox-image-marker-mode
@@ -1 +1 @@
1
- {"version":3,"file":"ox-image-marker.js","sourceRoot":"","sources":["../../src/ox-image-marker.ts"],"names":[],"mappings":"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","sourcesContent":["import './ox-image-marker-mode.js'\n\nimport { html, css, svg, nothing } from 'lit'\nimport { query, state, customElement } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { GestureEventDrag, GestureEventPinch } from '@operato/utils/gesture-helper.js'\n\nimport { ImageMarkerMode, Shape, ShapeType } from './types.js'\nimport { BaseImageMarker } from './base-image-marker.js'\nimport { OxImageMarkerMode } from './ox-image-marker-mode.js'\n\n@customElement('ox-image-marker')\nexport class OxImageMarker extends BaseImageMarker {\n static styles = [\n ...BaseImageMarker.styles,\n css`\n :host {\n position: relative;\n display: flex;\n width: 100%;\n height: 100%;\n }\n\n ox-image-marker-mode {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n svg {\n cursor: default;\n }\n\n svg[drawing] {\n cursor: crosshair;\n }\n\n .resize-handle {\n cursor: nwse-resize;\n }\n `\n ]\n\n @state() private currentShapeType?: ShapeType\n @state() private currentMode: ImageMarkerMode = 'edit'\n @state() private selectedShape: Shape | null = null\n\n @query('ox-image-marker-mode') imageMarkerMode!: OxImageMarkerMode\n\n // private drawingStarted: boolean = false\n private drawing: boolean = false\n private startX: number = 0\n private startY: number = 0\n private offsetX: number = 0\n private offsetY: number = 0\n private shapeMoveThreshold: number = 10\n private shapeMoveInitiated = false\n\n connectedCallback() {\n super.connectedCallback()\n this.setAttribute('tabindex', '0')\n this.addEventListener('focus', this.onFocus)\n this.addEventListener('blur', this.onBlur)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('focus', this.onFocus)\n this.removeEventListener('blur', this.onBlur)\n }\n\n render() {\n return html`\n <div class=\"container\">\n <svg\n @wheel=${this.onSvgWheel}\n @doubletap=${this.onSvgDoubleTap}\n @pinch=${this.onSvgPinch}\n @drag=${this.onSvgDrag}\n @click=${this.onSvgClick}\n viewBox=${this.viewBox}\n ?drawing=${this.currentMode == 'shape'}\n >\n <image href=${this.currentImage} @load=${this.onImageLoad}></image>\n ${this.shapes.map(shape => keyed(shape.id, this.renderShape(shape)))}\n </svg>\n </div>\n\n <ox-image-marker-mode\n currentMode=${this.currentMode}\n currentShapeType=${ifDefined(this.currentShapeType)}\n @mode-changed=${(e: CustomEvent) => {\n const { mode, shapeType } = e.detail\n this.setMode(mode, shapeType)\n }}\n @tap-fit-size=${() => this.reset()}\n @tap-delete=${() => this.deleteSelectedShape()}\n @tap-save=${() => {\n this.dispatchEvent(\n new CustomEvent('shapes-changed', {\n detail: this.shapes,\n bubbles: true,\n composed: true\n })\n )\n }}\n ></ox-image-marker-mode>\n `\n }\n\n private setMode(mode: ImageMarkerMode, shapeType: ShapeType) {\n if (mode == 'view') {\n this.setSelectedShape(null)\n }\n\n this.currentMode = mode\n this.currentShapeType = shapeType\n }\n\n protected onSvgPinch(e: GestureEventPinch) {\n e.stopPropagation()\n\n const { scale, centerX, centerY } = e.detail\n\n this.zoom(scale, centerX, centerY)\n }\n\n protected onSvgDrag(e: GestureEventDrag) {\n const { deltaX, deltaY, end } = e.detail\n\n if (this.currentMode === 'shape') {\n this.drawShape(e)\n } else {\n const [vbX, vbY, vbWidth, vbHeight] = this.viewBox.split(' ').map(Number)\n\n const scaleX = vbWidth / this.svg.clientWidth\n const scaleY = vbHeight / this.svg.clientHeight\n const scale = Math.max(scaleX, scaleY)\n\n const newVbX = vbX - deltaX * scale\n const newVbY = vbY - deltaY * scale\n\n this.viewBox = `${newVbX} ${newVbY} ${vbWidth} ${vbHeight}`\n\n this.debouncedUpdateImage()\n }\n }\n\n protected onSvgClick(e: MouseEvent) {\n if (this.currentMode === 'shape' && this.currentShapeType === 'text') {\n const { x, y } = this.getSvgPoint(e)\n\n const textElement = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n textElement.setAttribute('x', x.toString())\n textElement.setAttribute('y', y.toString())\n textElement.textContent = 'ABC'\n\n this.svg.appendChild(textElement)\n\n /* 강제 지연은 iOS에서 input focus를 받지 못하는 현상이 있다. */\n this.showTextInput(textElement, null, { x, y })\n\n this.imageMarkerMode.setMode('edit')\n }\n }\n\n private drawShape(e: GestureEventDrag) {\n const { end } = e.detail\n const { x, y } = this.getSvgPoint(e)\n\n if (!this.drawing) {\n this.startX = x\n this.startY = y\n this.setSelectedShape(null)\n\n this.drawing = true\n } else if (this.drawing) {\n const minDistance = 5\n const distance = Math.sqrt(Math.pow(x - this.startX, 2) + Math.pow(y - this.startY, 2))\n\n if (!this.selectedShape && distance >= minDistance) {\n let newShape: Shape\n\n switch (this.currentShapeType) {\n case 'rectangle':\n newShape = {\n id: Date.now().toString(),\n type: 'rectangle',\n x: this.startX,\n y: this.startY,\n width: 0,\n height: 0\n }\n break\n case 'circle':\n newShape = {\n id: Date.now().toString(),\n type: 'circle',\n cx: this.startX,\n cy: this.startY,\n r: 0\n }\n break\n case 'triangle':\n newShape = {\n id: Date.now().toString(),\n type: 'triangle',\n x1: this.startX,\n y1: this.startY,\n width: 0,\n height: 0,\n points: `${this.startX},${this.startY} ${this.startX},${this.startY} ${this.startX},${this.startY}`\n }\n break\n case 'line':\n newShape = {\n id: Date.now().toString(),\n type: 'line',\n x1: this.startX,\n y1: this.startY,\n width: 0,\n height: 0\n }\n break\n case 'arrow':\n newShape = {\n id: Date.now().toString(),\n type: 'arrow',\n x1: this.startX,\n y1: this.startY,\n width: 0,\n height: 0\n }\n break\n default:\n return\n }\n\n this.shapes = [...this.shapes, newShape]\n this.setSelectedShape(newShape)\n }\n\n if (this.selectedShape) {\n switch (this.selectedShape.type) {\n case 'rectangle':\n this.selectedShape.x = Math.min(x, this.startX)\n this.selectedShape.y = Math.min(y, this.startY)\n this.selectedShape.width = Math.abs(x - this.startX)\n this.selectedShape.height = Math.abs(y - this.startY)\n break\n case 'circle':\n const dx = x - this.selectedShape.cx!\n const dy = y - this.selectedShape.cy!\n this.selectedShape.r = Math.sqrt(dx * dx + dy * dy)\n break\n case 'triangle':\n const x2 = x\n const y2 = y\n const x3 = this.startX - (x - this.startX)\n const y3 = y\n this.selectedShape.points = `${this.startX},${this.startY} ${x2},${y2} ${x3},${y3}`\n break\n case 'line':\n case 'arrow':\n this.selectedShape.x2 = x\n this.selectedShape.y2 = y\n break\n }\n\n this.requestUpdate()\n }\n\n if (end) {\n this.drawing = false\n this.imageMarkerMode.setMode('edit')\n\n this.requestUpdate()\n }\n }\n }\n\n private setSelectedShape(shape: Shape | null) {\n this.selectedShape = shape\n\n if (!shape) {\n this.shapes = this.shapes.map(s => {\n return { ...s, selected: false }\n })\n } else {\n this.selectedShape!.selected = true\n }\n }\n\n private getSvgPoint(event: MouseEvent | PointerEvent | GestureEventDrag) {\n const { x, y } = this.getPointFromEvent(event)\n\n const svg = this.svg\n const point = svg.createSVGPoint()\n point.x = x\n point.y = y\n const ctm = svg.getScreenCTM()!.inverse()\n\n return point.matrixTransform(ctm)\n }\n\n protected renderShape(shape: Shape) {\n const commonAttrs = {\n stroke: shape.selected ? 'blue' : 'red',\n 'stroke-width': 1,\n fill: 'transparent',\n cursor: 'pointer'\n }\n\n switch (shape.type) {\n case 'text':\n return svg`\n <text\n x=\"${shape.x!}\"\n y=\"${shape.y!}\"\n fill=\"${commonAttrs.stroke}\"\n style=\"cursor: ${commonAttrs.cursor}; font-size: 16px;\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n @dblclick=\"${(e: MouseEvent) => this.onTextDoubleClick(e, shape)}\"\n >${shape.text}</text>\n `\n\n case 'rectangle':\n return svg`\n <rect\n x=\"${shape.x!}\"\n y=\"${shape.y!}\"\n width=\"${shape.width!}\"\n height=\"${shape.height!}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n fill=\"${commonAttrs.fill}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n ></rect>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'circle':\n return svg`\n <circle\n cx=\"${shape.cx!}\"\n cy=\"${shape.cy!}\"\n r=\"${shape.r!}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n fill=\"${commonAttrs.fill}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n ></circle>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'triangle':\n return svg`\n <polygon\n points=\"${shape.points!}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n fill=\"${commonAttrs.fill}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n ></polygon>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'line':\n return svg`\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n ></line>\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"25\"\n stroke-opacity=\"0\"\n pointer-events=\"stroke\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n @mouseenter=\"${() => (this.svg.style.cursor = 'pointer')}\"\n @mouseleave=\"${() => (this.svg.style.cursor = 'default')}\"\n ></line>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'arrow':\n return svg`\n <defs>\n <marker id=\"arrowhead-${shape.id}\" markerWidth=\"10\" markerHeight=\"7\" refX=\"10\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"${commonAttrs.stroke}\"></polygon>\n </marker>\n </defs>\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n marker-end=\"url(#arrowhead-${shape.id})\"\n style=\"cursor: ${commonAttrs.cursor}\"\n ></line>\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"25\"\n stroke-opacity=\"0\"\n pointer-events=\"stroke\"\n @mousedown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n @mouseenter=\"${() => (this.svg.style.cursor = 'pointer')}\"\n @mouseleave=\"${() => (this.svg.style.cursor = 'default')}\"\n @pointerdown=\"${(e: PointerEvent) => this.currentMode == 'edit' && e.stopPropagation()}\"\n ></line>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'link':\n return svg`\n <rect class=\"link\" x=\"${shape.x}\" y=\"${shape.y}\" width=\"${shape.width}\" height=\"${shape.height}\" \n stroke=\"${commonAttrs.stroke}\" stroke-width=\"0\" \n fill=\"${commonAttrs.stroke}\" fill-opacity=\"0.3\" @click=\"${() => this.handleLinkClick(shape)}\">\n </rect>\n `\n default:\n return nothing\n }\n }\n\n private onPointerDownOnShape(event: PointerEvent, shape: Shape) {\n if (this.currentMode !== 'edit') {\n return\n }\n\n // TODO check if single touch ... (멀티터치를 제외해야한다).\n // if ('touches' in event && event.touches.length > 1) {\n // return\n // }\n\n event.stopPropagation()\n event.preventDefault()\n\n this.shapes = this.shapes.map(s => ({\n ...s,\n selected: s.id === shape.id\n }))\n\n this.shapeMoveInitiated = false\n this.setSelectedShape(this.shapes.find(s => s.id == shape.id)!)\n\n const { x, y } = this.getSvgPoint(event)\n\n this.offsetX = x\n this.offsetY = y\n\n document.addEventListener('pointermove', this.onPointerMoveOnShape)\n document.addEventListener('pointerup', this.onPointerUpOnShape)\n }\n\n private onPointerMoveOnShape = (event: PointerEvent) => {\n if (!this.selectedShape) {\n return\n }\n\n // TODO check if single touch ... (멀티터치를 제외해야한다).\n // if ('touches' in event && event.touches.length > 1) {\n // return\n // }\n\n event.preventDefault()\n\n const { x, y } = this.getSvgPoint(event)\n\n const dx = x - this.offsetX\n const dy = y - this.offsetY\n\n if (!this.shapeMoveInitiated) {\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n if (distance < this.shapeMoveThreshold) {\n return\n }\n\n this.shapeMoveInitiated = true\n }\n\n this.offsetX = x\n this.offsetY = y\n\n switch (this.selectedShape.type) {\n case 'text':\n case 'rectangle':\n this.selectedShape.x! += dx\n this.selectedShape.y! += dy\n break\n case 'circle':\n this.selectedShape.cx! += dx\n this.selectedShape.cy! += dy\n break\n case 'triangle':\n const points = this.selectedShape.points!.split(' ').map(p => p.split(',').map(Number))\n\n this.selectedShape.points = points.map(([px, py]) => [px + dx, py + dy].join(',')).join(' ')\n break\n case 'line':\n case 'arrow':\n this.selectedShape.x1! += dx\n this.selectedShape.x2! += dx\n this.selectedShape.y1! += dy\n this.selectedShape.y2! += dy\n break\n }\n\n this.requestUpdate()\n }\n\n private onPointerUpOnShape = (event: PointerEvent) => {\n if (!this.selectedShape) {\n return\n }\n\n // TODO\n // if ('touches' in event && event.touches.length > 1) {\n // return\n // }\n\n event.preventDefault()\n\n document.removeEventListener('pointermove', this.onPointerMoveOnShape)\n document.removeEventListener('pointerup', this.onPointerUpOnShape)\n }\n\n private renderResizeHandles(shape: Shape) {\n let handles: Array<{ x: number; y: number; cursor: string }> = []\n\n switch (shape.type) {\n case 'text':\n case 'rectangle':\n handles = [\n { x: shape.x!, y: shape.y!, cursor: 'nwse-resize' },\n { x: shape.x! + shape.width!, y: shape.y!, cursor: 'nesw-resize' },\n { x: shape.x!, y: shape.y! + shape.height!, cursor: 'nesw-resize' },\n { x: shape.x! + shape.width!, y: shape.y! + shape.height!, cursor: 'nwse-resize' }\n ]\n break\n case 'circle':\n handles = [\n { x: shape.cx! + shape.r!, y: shape.cy!, cursor: 'ew-resize' },\n { x: shape.cx! - shape.r!, y: shape.cy!, cursor: 'ew-resize' },\n { x: shape.cx!, y: shape.cy! + shape.r!, cursor: 'ns-resize' },\n { x: shape.cx!, y: shape.cy! - shape.r!, cursor: 'ns-resize' }\n ]\n break\n case 'triangle':\n const points = shape.points!.split(' ').map(p => p.split(',').map(Number))\n handles = points.map(([x, y]) => ({ x, y, cursor: 'move' }))\n break\n case 'line':\n case 'arrow':\n handles = [\n { x: shape.x1!, y: shape.y1!, cursor: 'move' },\n { x: shape.x2!, y: shape.y2!, cursor: 'move' }\n ]\n break\n }\n\n return svg`\n ${handles.map(\n handle => svg`\n <g\n class=\"resize-handle-group\"\n style=\"transform: translate(${handle.x}px, ${handle.y}px) scale(${1 / this.zoomLevel});\"\n >\n <rect\n x=\"-5\"\n y=\"-5\"\n width=\"10\"\n height=\"10\"\n fill=\"white\"\n stroke=\"black\"\n class=\"resize-handle\"\n style=\"cursor: ${handle.cursor};\"\n @pointerdown=\"${(e: PointerEvent) => this.onResizeHandlePointerDown(e, shape, handle)}\"\n ></rect>\n </g>\n `\n )}\n `\n }\n\n private onResizeHandlePointerDown(event: PointerEvent, shape: Shape, handle: any) {\n event.stopPropagation()\n event.preventDefault()\n\n this.setSelectedShape(shape)\n\n this.offsetX = handle.x\n this.offsetY = handle.y\n\n document.addEventListener('pointermove', this.onResizeHandlePointerMove)\n document.addEventListener('pointerup', this.onResizeHandlePointerUp)\n }\n\n private onResizeHandlePointerMove = (event: PointerEvent) => {\n if (!this.selectedShape) {\n return\n }\n\n event.preventDefault()\n\n const { x, y } = this.getSvgPoint(event)\n\n switch (this.selectedShape.type) {\n case 'rectangle':\n const startX = this.selectedShape.x!\n const startY = this.selectedShape.y!\n const width = this.selectedShape.width!\n const height = this.selectedShape.height!\n\n // 핸들의 좌표에 따라 너비 및 높이 조정\n if (this.offsetX === startX && this.offsetY === startY) {\n // 상좌 핸들 (왼쪽 위)\n this.selectedShape.x = x\n this.selectedShape.y = y\n this.selectedShape.width = width + (startX - x)\n this.selectedShape.height = height + (startY - y)\n } else if (this.offsetX === startX + width && this.offsetY === startY) {\n // 상우 핸들 (오른쪽 위)\n this.selectedShape.y = y\n this.selectedShape.width = Math.abs(x - startX)\n this.selectedShape.height = height + (startY - y)\n } else if (this.offsetX === startX && this.offsetY === startY + height) {\n // 하좌 핸들 (왼쪽 아래)\n this.selectedShape.x = x\n this.selectedShape.width = width + (startX - x)\n this.selectedShape.height = Math.abs(y - startY)\n } else if (this.offsetX === startX + width && this.offsetY === startY + height) {\n // 하우 핸들 (오른쪽 아래)\n this.selectedShape.width = Math.abs(x - startX)\n this.selectedShape.height = Math.abs(y - startY)\n }\n\n // 최소 너비 및 높이 유지\n this.selectedShape.width = Math.max(10, this.selectedShape.width!)\n this.selectedShape.height = Math.max(10, this.selectedShape.height!)\n\n this.offsetX = x\n this.offsetY = y\n\n break\n case 'circle':\n const dx = x - this.selectedShape.cx!\n const dy = y - this.selectedShape.cy!\n this.selectedShape.r = Math.sqrt(dx * dx + dy * dy)\n break\n case 'triangle':\n const points = this.selectedShape.points!.split(' ').map(p => p.split(',').map(Number))\n const index = points.findIndex(([px, py]) => px === this.offsetX && py === this.offsetY)\n if (index !== -1) {\n points[index] = [x, y]\n this.selectedShape.points = points.map(p => p.join(',')).join(' ')\n this.offsetX = x\n this.offsetY = y\n }\n break\n case 'line':\n case 'arrow':\n if (this.offsetX === this.selectedShape.x1 && this.offsetY === this.selectedShape.y1) {\n this.selectedShape.x1 = x\n this.selectedShape.y1 = y\n } else if (this.offsetX === this.selectedShape.x2 && this.offsetY === this.selectedShape.y2) {\n this.selectedShape.x2 = x\n this.selectedShape.y2 = y\n }\n this.offsetX = x\n this.offsetY = y\n break\n }\n\n this.requestUpdate()\n }\n\n private onResizeHandlePointerUp = (event: PointerEvent) => {\n event.preventDefault()\n\n document.removeEventListener('pointermove', this.onResizeHandlePointerMove)\n document.removeEventListener('pointerup', this.onResizeHandlePointerUp)\n }\n\n private onTextDoubleClick(event: MouseEvent, shape: Shape) {\n event.stopPropagation()\n event.preventDefault()\n\n const textElement = event.target as SVGTextElement\n\n this.showTextInput(textElement, shape)\n }\n\n private showTextInput(textElement: SVGTextElement, shape: Shape | null = null, options?: { x: number; y: number }) {\n const input: HTMLInputElement = document.createElement('input')\n input.style.position = 'absolute'\n\n const ctm = textElement.getScreenCTM() || { a: 1, e: 0, d: 1, f: 0 }\n const bbox = textElement.getBBox()\n\n const screenX = bbox.x * ctm.a + ctm.e\n const screenY = bbox.y * ctm.d + ctm.f\n\n input.style.left = `${screenX}px`\n input.style.top = `${screenY}px`\n\n const computedStyle = window.getComputedStyle(textElement)\n const fontSize = parseFloat(computedStyle.fontSize) * ctm.a\n const fontFamily = computedStyle.fontFamily\n const fontWeight = computedStyle.fontWeight\n const textColor = computedStyle.fill || computedStyle.color\n const lineHeight = parseFloat(computedStyle.lineHeight) * ctm.d\n\n input.style.fontSize = `${fontSize}px`\n input.style.fontFamily = fontFamily\n input.style.fontWeight = fontWeight\n input.style.color = textColor\n input.style.lineHeight = `${lineHeight}px`\n input.style.padding = '0'\n input.style.margin = '0'\n input.style.border = 'none'\n input.style.outline = 'none'\n input.style.background = 'transparent'\n\n if (shape) {\n input.value = shape.text || ''\n }\n\n textElement.style.visibility = 'hidden'\n\n document.body.appendChild(input)\n this.adjustInputWidth(input)\n\n /* iOS에서는 딜레이를 주었을 때 focus()를 받지 못하는 현상이 있으므로, delay 없이 바로 focus를 설정함. */\n input.focus()\n\n input.addEventListener('input', () => {\n this.adjustInputWidth(input)\n })\n\n input.addEventListener('keydown', e => {\n if (e.key === 'Enter') {\n const textValue = input.value.trim()\n\n if (textValue) {\n if (shape) {\n shape.text = textValue\n } else {\n const newShape: Shape = {\n id: Date.now().toString(),\n type: 'text',\n x: options!.x,\n y: options!.y,\n text: textValue\n }\n\n this.shapes = [...this.shapes, newShape]\n }\n } else if (shape) {\n this.shapes = this.shapes.filter(s => s.id !== shape.id)\n }\n\n document.body.removeChild(input)\n\n if (!shape) {\n this.svg.removeChild(textElement)\n } else {\n textElement.style.visibility = 'visible'\n }\n\n this.requestUpdate()\n } else if (e.key === 'Escape') {\n document.body.removeChild(input)\n\n if (!shape) {\n this.svg.removeChild(textElement)\n } else {\n textElement.style.visibility = 'visible'\n }\n }\n })\n\n input.addEventListener('blur', () => {\n requestAnimationFrame(() => {\n if (!shape) {\n this.svg.removeChild(textElement)\n } else {\n textElement.style.visibility = 'visible'\n }\n\n if (input.parentElement) {\n document.body.removeChild(input)\n }\n })\n })\n }\n\n private adjustInputWidth(input: HTMLInputElement) {\n const minWidth = 50\n const textWidth = this.measureTextWidth(input.value || input.placeholder, input)\n input.style.width = `${Math.max(textWidth + 10, minWidth)}px`\n }\n\n private measureTextWidth(text: string, input: HTMLInputElement): number {\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')!\n context.font = window.getComputedStyle(input).font\n\n return context.measureText(text).width\n }\n\n private onFocus = () => {\n this.addEventListener('keydown', this.handleKeyDown)\n }\n\n private onBlur = () => {\n this.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if ((event.key === 'Delete' || event.key === 'Backspace') && this.selectedShape) {\n this.deleteSelectedShape()\n }\n }\n\n private deleteSelectedShape() {\n if (this.selectedShape) {\n this.shapes = this.shapes.filter(s => s.id !== this.selectedShape!.id)\n\n this.setSelectedShape(null)\n\n this.requestUpdate()\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ox-image-marker.js","sourceRoot":"","sources":["../../src/ox-image-marker.ts"],"names":[],"mappings":"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","sourcesContent":["import './ox-image-marker-mode.js'\n\nimport { html, css, svg, nothing } from 'lit'\nimport { query, state, customElement } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { GestureEventDrag, GestureEventPinch } from '@operato/utils/gesture-helper.js'\n\nimport { ImageMarkerMode, Shape, ShapeType } from './types.js'\nimport { BaseImageMarker } from './base-image-marker.js'\nimport { OxImageMarkerMode } from './ox-image-marker-mode.js'\n\n@customElement('ox-image-marker')\nexport class OxImageMarker extends BaseImageMarker {\n static styles = [\n ...BaseImageMarker.styles,\n css`\n :host {\n position: relative;\n display: flex;\n width: 100%;\n height: 100%;\n }\n\n ox-image-marker-mode {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n svg {\n cursor: default;\n }\n\n svg[drawing] {\n cursor: crosshair;\n }\n\n .resize-handle {\n cursor: nwse-resize;\n }\n `\n ]\n\n @state() private currentShapeType?: ShapeType\n @state() private currentMode: ImageMarkerMode = 'edit'\n @state() private selectedShape: Shape | null = null\n\n @query('ox-image-marker-mode') imageMarkerMode!: OxImageMarkerMode\n\n // private drawingStarted: boolean = false\n private drawing: boolean = false\n private startX: number = 0\n private startY: number = 0\n private offsetX: number = 0\n private offsetY: number = 0\n private shapeMoveThreshold: number = 10\n private shapeMoveInitiated = false\n\n connectedCallback() {\n super.connectedCallback()\n this.setAttribute('tabindex', '0')\n this.addEventListener('focus', this.onFocus)\n this.addEventListener('blur', this.onBlur)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('focus', this.onFocus)\n this.removeEventListener('blur', this.onBlur)\n }\n\n render() {\n return html`\n <div class=\"container\">\n <svg\n @wheel=${this.onSvgWheel}\n @doubletap=${this.onSvgDoubleTap}\n @pinch=${this.onSvgPinch}\n @drag=${this.onSvgDrag}\n @click=${this.onSvgClick}\n viewBox=${this.viewBox}\n ?drawing=${this.currentMode == 'shape'}\n >\n <image href=${this.currentImage} @load=${this.onImageLoad}></image>\n ${this.shapes.map(shape => keyed(shape.id, this.renderShape(shape)))}\n </svg>\n ${this.renderLoadingOverlay()}\n </div>\n\n <ox-image-marker-mode\n currentMode=${this.currentMode}\n currentShapeType=${ifDefined(this.currentShapeType)}\n @mode-changed=${(e: CustomEvent) => {\n const { mode, shapeType } = e.detail\n this.setMode(mode, shapeType)\n }}\n @tap-fit-size=${() => this.reset()}\n @tap-delete=${() => this.deleteSelectedShape()}\n @tap-save=${() => {\n this.dispatchEvent(\n new CustomEvent('shapes-changed', {\n detail: this.shapes,\n bubbles: true,\n composed: true\n })\n )\n }}\n ></ox-image-marker-mode>\n `\n }\n\n private setMode(mode: ImageMarkerMode, shapeType: ShapeType) {\n if (mode == 'view') {\n this.setSelectedShape(null)\n }\n\n this.currentMode = mode\n this.currentShapeType = shapeType\n }\n\n protected onSvgPinch(e: GestureEventPinch) {\n e.stopPropagation()\n\n const { scale, centerX, centerY } = e.detail\n\n this.zoom(scale, centerX, centerY)\n }\n\n protected onSvgDrag(e: GestureEventDrag) {\n const { deltaX, deltaY, end } = e.detail\n\n if (this.currentMode === 'shape') {\n this.drawShape(e)\n } else {\n const [vbX, vbY, vbWidth, vbHeight] = this.viewBox.split(' ').map(Number)\n\n const scaleX = vbWidth / this.svg.clientWidth\n const scaleY = vbHeight / this.svg.clientHeight\n const scale = Math.max(scaleX, scaleY)\n\n const newVbX = vbX - deltaX * scale\n const newVbY = vbY - deltaY * scale\n\n this.viewBox = `${newVbX} ${newVbY} ${vbWidth} ${vbHeight}`\n\n this.debouncedUpdateImage()\n }\n }\n\n protected onSvgClick(e: MouseEvent) {\n if (this.currentMode === 'shape' && this.currentShapeType === 'text') {\n const { x, y } = this.getSvgPoint(e)\n\n const textElement = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\n textElement.setAttribute('x', x.toString())\n textElement.setAttribute('y', y.toString())\n textElement.textContent = 'ABC'\n\n this.svg.appendChild(textElement)\n\n /* 강제 지연은 iOS에서 input focus를 받지 못하는 현상이 있다. */\n this.showTextInput(textElement, null, { x, y })\n\n this.imageMarkerMode.setMode('edit')\n }\n }\n\n private drawShape(e: GestureEventDrag) {\n const { end } = e.detail\n const { x, y } = this.getSvgPoint(e)\n\n if (!this.drawing) {\n this.startX = x\n this.startY = y\n this.setSelectedShape(null)\n\n this.drawing = true\n } else if (this.drawing) {\n const minDistance = 5\n const distance = Math.sqrt(Math.pow(x - this.startX, 2) + Math.pow(y - this.startY, 2))\n\n if (!this.selectedShape && distance >= minDistance) {\n let newShape: Shape\n\n switch (this.currentShapeType) {\n case 'rectangle':\n newShape = {\n id: Date.now().toString(),\n type: 'rectangle',\n x: this.startX,\n y: this.startY,\n width: 0,\n height: 0\n }\n break\n case 'circle':\n newShape = {\n id: Date.now().toString(),\n type: 'circle',\n cx: this.startX,\n cy: this.startY,\n r: 0\n }\n break\n case 'triangle':\n newShape = {\n id: Date.now().toString(),\n type: 'triangle',\n x1: this.startX,\n y1: this.startY,\n width: 0,\n height: 0,\n points: `${this.startX},${this.startY} ${this.startX},${this.startY} ${this.startX},${this.startY}`\n }\n break\n case 'line':\n newShape = {\n id: Date.now().toString(),\n type: 'line',\n x1: this.startX,\n y1: this.startY,\n width: 0,\n height: 0\n }\n break\n case 'arrow':\n newShape = {\n id: Date.now().toString(),\n type: 'arrow',\n x1: this.startX,\n y1: this.startY,\n width: 0,\n height: 0\n }\n break\n default:\n return\n }\n\n this.shapes = [...this.shapes, newShape]\n this.setSelectedShape(newShape)\n }\n\n if (this.selectedShape) {\n switch (this.selectedShape.type) {\n case 'rectangle':\n this.selectedShape.x = Math.min(x, this.startX)\n this.selectedShape.y = Math.min(y, this.startY)\n this.selectedShape.width = Math.abs(x - this.startX)\n this.selectedShape.height = Math.abs(y - this.startY)\n break\n case 'circle':\n const dx = x - this.selectedShape.cx!\n const dy = y - this.selectedShape.cy!\n this.selectedShape.r = Math.sqrt(dx * dx + dy * dy)\n break\n case 'triangle':\n const x2 = x\n const y2 = y\n const x3 = this.startX - (x - this.startX)\n const y3 = y\n this.selectedShape.points = `${this.startX},${this.startY} ${x2},${y2} ${x3},${y3}`\n break\n case 'line':\n case 'arrow':\n this.selectedShape.x2 = x\n this.selectedShape.y2 = y\n break\n }\n\n this.requestUpdate()\n }\n\n if (end) {\n this.drawing = false\n this.imageMarkerMode.setMode('edit')\n\n this.requestUpdate()\n }\n }\n }\n\n private setSelectedShape(shape: Shape | null) {\n this.selectedShape = shape\n\n if (!shape) {\n this.shapes = this.shapes.map(s => {\n return { ...s, selected: false }\n })\n } else {\n this.selectedShape!.selected = true\n }\n }\n\n private getSvgPoint(event: MouseEvent | PointerEvent | GestureEventDrag) {\n const { x, y } = this.getPointFromEvent(event)\n\n const svg = this.svg\n const point = svg.createSVGPoint()\n point.x = x\n point.y = y\n const ctm = svg.getScreenCTM()!.inverse()\n\n return point.matrixTransform(ctm)\n }\n\n protected renderShape(shape: Shape) {\n const commonAttrs = {\n stroke: shape.selected ? 'blue' : 'red',\n 'stroke-width': 1,\n fill: 'transparent',\n cursor: 'pointer'\n }\n\n switch (shape.type) {\n case 'text':\n return svg`\n <text\n x=\"${shape.x!}\"\n y=\"${shape.y!}\"\n fill=\"${commonAttrs.stroke}\"\n style=\"cursor: ${commonAttrs.cursor}; font-size: 16px;\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n @dblclick=\"${(e: MouseEvent) => this.onTextDoubleClick(e, shape)}\"\n >${shape.text}</text>\n `\n\n case 'rectangle':\n return svg`\n <rect\n x=\"${shape.x!}\"\n y=\"${shape.y!}\"\n width=\"${shape.width!}\"\n height=\"${shape.height!}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n fill=\"${commonAttrs.fill}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n ></rect>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'circle':\n return svg`\n <circle\n cx=\"${shape.cx!}\"\n cy=\"${shape.cy!}\"\n r=\"${shape.r!}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n fill=\"${commonAttrs.fill}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n ></circle>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'triangle':\n return svg`\n <polygon\n points=\"${shape.points!}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n fill=\"${commonAttrs.fill}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n ></polygon>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'line':\n return svg`\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n style=\"cursor: ${commonAttrs.cursor}\"\n ></line>\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"25\"\n stroke-opacity=\"0\"\n pointer-events=\"stroke\"\n @pointerdown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n @mouseenter=\"${() => (this.svg.style.cursor = 'pointer')}\"\n @mouseleave=\"${() => (this.svg.style.cursor = 'default')}\"\n ></line>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'arrow':\n return svg`\n <defs>\n <marker id=\"arrowhead-${shape.id}\" markerWidth=\"10\" markerHeight=\"7\" refX=\"10\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"${commonAttrs.stroke}\"></polygon>\n </marker>\n </defs>\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"${commonAttrs['stroke-width']}\"\n marker-end=\"url(#arrowhead-${shape.id})\"\n style=\"cursor: ${commonAttrs.cursor}\"\n ></line>\n <line\n x1=\"${shape.x1!}\"\n y1=\"${shape.y1!}\"\n x2=\"${shape.x2 ?? shape.x1}\"\n y2=\"${shape.y2 ?? shape.y1}\"\n stroke=\"${commonAttrs.stroke}\"\n stroke-width=\"25\"\n stroke-opacity=\"0\"\n pointer-events=\"stroke\"\n @mousedown=\"${(e: PointerEvent) => this.onPointerDownOnShape(e, shape)}\"\n @mouseenter=\"${() => (this.svg.style.cursor = 'pointer')}\"\n @mouseleave=\"${() => (this.svg.style.cursor = 'default')}\"\n @pointerdown=\"${(e: PointerEvent) => this.currentMode == 'edit' && e.stopPropagation()}\"\n ></line>\n ${shape.selected ? this.renderResizeHandles(shape) : ''}\n `\n\n case 'link':\n return svg`\n <rect class=\"link\" x=\"${shape.x}\" y=\"${shape.y}\" width=\"${shape.width}\" height=\"${shape.height}\" \n stroke=\"${commonAttrs.stroke}\" stroke-width=\"0\" \n fill=\"${commonAttrs.stroke}\" fill-opacity=\"0.3\" @click=\"${() => this.handleLinkClick(shape)}\">\n </rect>\n `\n default:\n return nothing\n }\n }\n\n private onPointerDownOnShape(event: PointerEvent, shape: Shape) {\n if (this.currentMode !== 'edit') {\n return\n }\n\n // TODO check if single touch ... (멀티터치를 제외해야한다).\n // if ('touches' in event && event.touches.length > 1) {\n // return\n // }\n\n event.stopPropagation()\n event.preventDefault()\n\n this.shapes = this.shapes.map(s => ({\n ...s,\n selected: s.id === shape.id\n }))\n\n this.shapeMoveInitiated = false\n this.setSelectedShape(this.shapes.find(s => s.id == shape.id)!)\n\n const { x, y } = this.getSvgPoint(event)\n\n this.offsetX = x\n this.offsetY = y\n\n document.addEventListener('pointermove', this.onPointerMoveOnShape)\n document.addEventListener('pointerup', this.onPointerUpOnShape)\n }\n\n private onPointerMoveOnShape = (event: PointerEvent) => {\n if (!this.selectedShape) {\n return\n }\n\n // TODO check if single touch ... (멀티터치를 제외해야한다).\n // if ('touches' in event && event.touches.length > 1) {\n // return\n // }\n\n event.preventDefault()\n\n const { x, y } = this.getSvgPoint(event)\n\n const dx = x - this.offsetX\n const dy = y - this.offsetY\n\n if (!this.shapeMoveInitiated) {\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n if (distance < this.shapeMoveThreshold) {\n return\n }\n\n this.shapeMoveInitiated = true\n }\n\n this.offsetX = x\n this.offsetY = y\n\n switch (this.selectedShape.type) {\n case 'text':\n case 'rectangle':\n this.selectedShape.x! += dx\n this.selectedShape.y! += dy\n break\n case 'circle':\n this.selectedShape.cx! += dx\n this.selectedShape.cy! += dy\n break\n case 'triangle':\n const points = this.selectedShape.points!.split(' ').map(p => p.split(',').map(Number))\n\n this.selectedShape.points = points.map(([px, py]) => [px + dx, py + dy].join(',')).join(' ')\n break\n case 'line':\n case 'arrow':\n this.selectedShape.x1! += dx\n this.selectedShape.x2! += dx\n this.selectedShape.y1! += dy\n this.selectedShape.y2! += dy\n break\n }\n\n this.requestUpdate()\n }\n\n private onPointerUpOnShape = (event: PointerEvent) => {\n if (!this.selectedShape) {\n return\n }\n\n // TODO\n // if ('touches' in event && event.touches.length > 1) {\n // return\n // }\n\n event.preventDefault()\n\n document.removeEventListener('pointermove', this.onPointerMoveOnShape)\n document.removeEventListener('pointerup', this.onPointerUpOnShape)\n }\n\n private renderResizeHandles(shape: Shape) {\n let handles: Array<{ x: number; y: number; cursor: string }> = []\n\n switch (shape.type) {\n case 'text':\n case 'rectangle':\n handles = [\n { x: shape.x!, y: shape.y!, cursor: 'nwse-resize' },\n { x: shape.x! + shape.width!, y: shape.y!, cursor: 'nesw-resize' },\n { x: shape.x!, y: shape.y! + shape.height!, cursor: 'nesw-resize' },\n { x: shape.x! + shape.width!, y: shape.y! + shape.height!, cursor: 'nwse-resize' }\n ]\n break\n case 'circle':\n handles = [\n { x: shape.cx! + shape.r!, y: shape.cy!, cursor: 'ew-resize' },\n { x: shape.cx! - shape.r!, y: shape.cy!, cursor: 'ew-resize' },\n { x: shape.cx!, y: shape.cy! + shape.r!, cursor: 'ns-resize' },\n { x: shape.cx!, y: shape.cy! - shape.r!, cursor: 'ns-resize' }\n ]\n break\n case 'triangle':\n const points = shape.points!.split(' ').map(p => p.split(',').map(Number))\n handles = points.map(([x, y]) => ({ x, y, cursor: 'move' }))\n break\n case 'line':\n case 'arrow':\n handles = [\n { x: shape.x1!, y: shape.y1!, cursor: 'move' },\n { x: shape.x2!, y: shape.y2!, cursor: 'move' }\n ]\n break\n }\n\n return svg`\n ${handles.map(\n handle => svg`\n <g\n class=\"resize-handle-group\"\n style=\"transform: translate(${handle.x}px, ${handle.y}px) scale(${1 / this.zoomLevel});\"\n >\n <rect\n x=\"-5\"\n y=\"-5\"\n width=\"10\"\n height=\"10\"\n fill=\"white\"\n stroke=\"black\"\n class=\"resize-handle\"\n style=\"cursor: ${handle.cursor};\"\n @pointerdown=\"${(e: PointerEvent) => this.onResizeHandlePointerDown(e, shape, handle)}\"\n ></rect>\n </g>\n `\n )}\n `\n }\n\n private onResizeHandlePointerDown(event: PointerEvent, shape: Shape, handle: any) {\n event.stopPropagation()\n event.preventDefault()\n\n this.setSelectedShape(shape)\n\n this.offsetX = handle.x\n this.offsetY = handle.y\n\n document.addEventListener('pointermove', this.onResizeHandlePointerMove)\n document.addEventListener('pointerup', this.onResizeHandlePointerUp)\n }\n\n private onResizeHandlePointerMove = (event: PointerEvent) => {\n if (!this.selectedShape) {\n return\n }\n\n event.preventDefault()\n\n const { x, y } = this.getSvgPoint(event)\n\n switch (this.selectedShape.type) {\n case 'rectangle':\n const startX = this.selectedShape.x!\n const startY = this.selectedShape.y!\n const width = this.selectedShape.width!\n const height = this.selectedShape.height!\n\n // 핸들의 좌표에 따라 너비 및 높이 조정\n if (this.offsetX === startX && this.offsetY === startY) {\n // 상좌 핸들 (왼쪽 위)\n this.selectedShape.x = x\n this.selectedShape.y = y\n this.selectedShape.width = width + (startX - x)\n this.selectedShape.height = height + (startY - y)\n } else if (this.offsetX === startX + width && this.offsetY === startY) {\n // 상우 핸들 (오른쪽 위)\n this.selectedShape.y = y\n this.selectedShape.width = Math.abs(x - startX)\n this.selectedShape.height = height + (startY - y)\n } else if (this.offsetX === startX && this.offsetY === startY + height) {\n // 하좌 핸들 (왼쪽 아래)\n this.selectedShape.x = x\n this.selectedShape.width = width + (startX - x)\n this.selectedShape.height = Math.abs(y - startY)\n } else if (this.offsetX === startX + width && this.offsetY === startY + height) {\n // 하우 핸들 (오른쪽 아래)\n this.selectedShape.width = Math.abs(x - startX)\n this.selectedShape.height = Math.abs(y - startY)\n }\n\n // 최소 너비 및 높이 유지\n this.selectedShape.width = Math.max(10, this.selectedShape.width!)\n this.selectedShape.height = Math.max(10, this.selectedShape.height!)\n\n this.offsetX = x\n this.offsetY = y\n\n break\n case 'circle':\n const dx = x - this.selectedShape.cx!\n const dy = y - this.selectedShape.cy!\n this.selectedShape.r = Math.sqrt(dx * dx + dy * dy)\n break\n case 'triangle':\n const points = this.selectedShape.points!.split(' ').map(p => p.split(',').map(Number))\n const index = points.findIndex(([px, py]) => px === this.offsetX && py === this.offsetY)\n if (index !== -1) {\n points[index] = [x, y]\n this.selectedShape.points = points.map(p => p.join(',')).join(' ')\n this.offsetX = x\n this.offsetY = y\n }\n break\n case 'line':\n case 'arrow':\n if (this.offsetX === this.selectedShape.x1 && this.offsetY === this.selectedShape.y1) {\n this.selectedShape.x1 = x\n this.selectedShape.y1 = y\n } else if (this.offsetX === this.selectedShape.x2 && this.offsetY === this.selectedShape.y2) {\n this.selectedShape.x2 = x\n this.selectedShape.y2 = y\n }\n this.offsetX = x\n this.offsetY = y\n break\n }\n\n this.requestUpdate()\n }\n\n private onResizeHandlePointerUp = (event: PointerEvent) => {\n event.preventDefault()\n\n document.removeEventListener('pointermove', this.onResizeHandlePointerMove)\n document.removeEventListener('pointerup', this.onResizeHandlePointerUp)\n }\n\n private onTextDoubleClick(event: MouseEvent, shape: Shape) {\n event.stopPropagation()\n event.preventDefault()\n\n const textElement = event.target as SVGTextElement\n\n this.showTextInput(textElement, shape)\n }\n\n private showTextInput(textElement: SVGTextElement, shape: Shape | null = null, options?: { x: number; y: number }) {\n const input: HTMLInputElement = document.createElement('input')\n input.style.position = 'absolute'\n\n const ctm = textElement.getScreenCTM() || { a: 1, e: 0, d: 1, f: 0 }\n const bbox = textElement.getBBox()\n\n const screenX = bbox.x * ctm.a + ctm.e\n const screenY = bbox.y * ctm.d + ctm.f\n\n input.style.left = `${screenX}px`\n input.style.top = `${screenY}px`\n\n const computedStyle = window.getComputedStyle(textElement)\n const fontSize = parseFloat(computedStyle.fontSize) * ctm.a\n const fontFamily = computedStyle.fontFamily\n const fontWeight = computedStyle.fontWeight\n const textColor = computedStyle.fill || computedStyle.color\n const lineHeight = parseFloat(computedStyle.lineHeight) * ctm.d\n\n input.style.fontSize = `${fontSize}px`\n input.style.fontFamily = fontFamily\n input.style.fontWeight = fontWeight\n input.style.color = textColor\n input.style.lineHeight = `${lineHeight}px`\n input.style.padding = '0'\n input.style.margin = '0'\n input.style.border = 'none'\n input.style.outline = 'none'\n input.style.background = 'transparent'\n\n if (shape) {\n input.value = shape.text || ''\n }\n\n textElement.style.visibility = 'hidden'\n\n document.body.appendChild(input)\n this.adjustInputWidth(input)\n\n /* iOS에서는 딜레이를 주었을 때 focus()를 받지 못하는 현상이 있으므로, delay 없이 바로 focus를 설정함. */\n input.focus()\n\n input.addEventListener('input', () => {\n this.adjustInputWidth(input)\n })\n\n input.addEventListener('keydown', e => {\n if (e.key === 'Enter') {\n const textValue = input.value.trim()\n\n if (textValue) {\n if (shape) {\n shape.text = textValue\n } else {\n const newShape: Shape = {\n id: Date.now().toString(),\n type: 'text',\n x: options!.x,\n y: options!.y,\n text: textValue\n }\n\n this.shapes = [...this.shapes, newShape]\n }\n } else if (shape) {\n this.shapes = this.shapes.filter(s => s.id !== shape.id)\n }\n\n document.body.removeChild(input)\n\n if (!shape) {\n this.svg.removeChild(textElement)\n } else {\n textElement.style.visibility = 'visible'\n }\n\n this.requestUpdate()\n } else if (e.key === 'Escape') {\n document.body.removeChild(input)\n\n if (!shape) {\n this.svg.removeChild(textElement)\n } else {\n textElement.style.visibility = 'visible'\n }\n }\n })\n\n input.addEventListener('blur', () => {\n requestAnimationFrame(() => {\n if (!shape) {\n this.svg.removeChild(textElement)\n } else {\n textElement.style.visibility = 'visible'\n }\n\n if (input.parentElement) {\n document.body.removeChild(input)\n }\n })\n })\n }\n\n private adjustInputWidth(input: HTMLInputElement) {\n const minWidth = 50\n const textWidth = this.measureTextWidth(input.value || input.placeholder, input)\n input.style.width = `${Math.max(textWidth + 10, minWidth)}px`\n }\n\n private measureTextWidth(text: string, input: HTMLInputElement): number {\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')!\n context.font = window.getComputedStyle(input).font\n\n return context.measureText(text).width\n }\n\n private onFocus = () => {\n this.addEventListener('keydown', this.handleKeyDown)\n }\n\n private onBlur = () => {\n this.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if ((event.key === 'Delete' || event.key === 'Backspace') && this.selectedShape) {\n this.deleteSelectedShape()\n }\n }\n\n private deleteSelectedShape() {\n if (this.selectedShape) {\n this.shapes = this.shapes.filter(s => s.id !== this.selectedShape!.id)\n\n this.setSelectedShape(null)\n\n this.requestUpdate()\n }\n }\n}\n"]}