@simplysm/angular 14.1.13 → 14.1.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sd-textfield.d.ts","sourceRoot":"","sources":["../../../src/controls/input/sd-textfield.ts"],"names":[],"mappings":"AAiBA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;;AAEtC,qBAqRa,WAAW,CAAC,CAAC,SAAS,MAAM,gBAAgB;IACvD,KAAK,uEAAgC;IAErC,IAAI,yCAAuB;IAC3B,WAAW,0DAAmB;IAC9B,KAAK,0DAAmB;IACxB,UAAU,0DAAmB;IAC7B,UAAU,0DAAmB;IAE7B,QAAQ,qEAAiD;IACzD,QAAQ,qEAAiD;IAEzD,QAAQ,qEAAiD;IACzD,GAAG,uEAAgC;IACnC,GAAG,uEAAgC;IACnC,SAAS,0DAAmB;IAC5B,SAAS,0DAAmB;IAC5B,OAAO,0DAAmB;IAC1B,WAAW,+CAAiB,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,eAAI;IACtF,MAAM,0DAAmB;IAEzB,IAAI,0DAAmB;IACvB,YAAY,0DAAmB;IAC/B,cAAc,qEAAgD;IAC9D,SAAS,0DAAmB;IAE5B,MAAM,qEAAiD;IACvD,KAAK,qEAAiD;IACtD,IAAI,+DAAwB;IAC5B,KAAK,8IAED;IAEJ,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsD;IAGlF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAc;IAGpD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsD;IAE/E,WAAW,yCAA+C;IAE1D,WAAW,kDAA+D;IAE1E,YAAY,yCAOT;IAEH,gBAAgB,qDAMb;;IAmEH,kBAAkB,IAAI,IAAI;IAI1B,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAK/C,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM3B,OAAO,CAAC,WAAW;IAiBnB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ/B,OAAO,CAAC,mBAAmB;yCAzKhB,WAAW;2CAAX,WAAW;CA6KvB"}
1
+ {"version":3,"file":"sd-textfield.d.ts","sourceRoot":"","sources":["../../../src/controls/input/sd-textfield.ts"],"names":[],"mappings":"AAiBA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;;AAEtC,qBAqRa,WAAW,CAAC,CAAC,SAAS,MAAM,gBAAgB;IACvD,KAAK,uEAAgC;IAErC,IAAI,yCAAuB;IAC3B,WAAW,0DAAmB;IAC9B,KAAK,0DAAmB;IACxB,UAAU,0DAAmB;IAC7B,UAAU,0DAAmB;IAE7B,QAAQ,qEAAiD;IACzD,QAAQ,qEAAiD;IAEzD,QAAQ,qEAAiD;IACzD,GAAG,uEAAgC;IACnC,GAAG,uEAAgC;IACnC,SAAS,0DAAmB;IAC5B,SAAS,0DAAmB;IAC5B,OAAO,0DAAmB;IAC1B,WAAW,+CAAiB,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,eAAI;IACtF,MAAM,0DAAmB;IAEzB,IAAI,0DAAmB;IACvB,YAAY,0DAAmB;IAC/B,cAAc,qEAAgD;IAC9D,SAAS,0DAAmB;IAE5B,MAAM,qEAAiD;IACvD,KAAK,qEAAiD;IACtD,IAAI,+DAAwB;IAC5B,KAAK,8IAED;IAEJ,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsD;IAGlF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAc;IAGpD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsD;IAE/E,WAAW,yCAA+C;IAE1D,WAAW,kDAA+D;IAE1E,YAAY,yCAOT;IAEH,gBAAgB,qDAMb;;IAuEH,kBAAkB,IAAI,IAAI;IAI1B,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAK/C,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAO3B,OAAO,CAAC,WAAW;IAiBnB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAU/B,OAAO,CAAC,mBAAmB;yCAhLhB,WAAW;2CAAX,WAAW;CAoLvB"}
@@ -132,6 +132,10 @@ export class SdTextfield {
132
132
  const inputEl = this._inputElRef()?.nativeElement;
133
133
  if (inputEl == null)
134
134
  return;
135
+ // IME 조합 중에는 DOM 을 되쓰지 않는다. 되쓰면 진행 중 조합이 깨진다.
136
+ // 조합이 끝나면 onCompositionEnd → value.set 이 controlValue 를 바꿔 effect 가 다시 돌아 최종값을 반영한다.
137
+ if (this._composing)
138
+ return;
135
139
  // 편집(포커스) 중이라도 변경 origin 을 구분한다.
136
140
  // 사용자 입력이 만든 DOM(정규화 차이·진행 중 입력 포함)은 보호하고,
137
141
  // 모델만 외부에서 바뀐 경우(프로그래밍적 리셋·prefill·표시옵션 변경)는 되써서 반영한다.
@@ -191,7 +195,8 @@ export class SdTextfield {
191
195
  }
192
196
  onInput(event) {
193
197
  // 조합 중 input 은 무시하고, 완성 시 onCompositionEnd 에서 한 번만 반영
194
- if (this._composing)
198
+ // isComposing 은 compositionstart 가 늦거나 누락된 IME 에서도 브라우저가 조합 구간 input 에 직접 실어주는 신호
199
+ if (event.isComposing || this._composing)
195
200
  return;
196
201
  this._applyInput(event.target);
197
202
  }
@@ -216,6 +221,8 @@ export class SdTextfield {
216
221
  onBlur(event) {
217
222
  // 편집 종료 시 모델 기준값으로 동기화 (number 콤마 포맷 반영, date 미완성 입력 정리)
218
223
  // date 미완성 입력은 input.value 가 "" 라 비교 없이 무조건 되써야 남은 세그먼트가 정리됨
224
+ // compositionend 가 스킵된 채 blur 되면 _composing 이 true 로 고착되므로 여기서 리셋한다.
225
+ this._composing = false;
219
226
  const inputEl = event.target;
220
227
  inputEl.value = this.controlValue();
221
228
  this._syncNativeValidity(inputEl);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/angular",
3
- "version": "14.1.13",
3
+ "version": "14.1.15",
4
4
  "description": "심플리즘 패키지 - Angular",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -32,11 +32,11 @@
32
32
  "./styles.css"
33
33
  ],
34
34
  "dependencies": {
35
- "@angular/common": "^22.0.4",
36
- "@angular/core": "^22.0.4",
37
- "@angular/platform-browser": "^22.0.4",
38
- "@angular/router": "^22.0.4",
39
- "@angular/service-worker": "^22.0.4",
35
+ "@angular/common": "^22.0.5",
36
+ "@angular/core": "^22.0.5",
37
+ "@angular/platform-browser": "^22.0.5",
38
+ "@angular/router": "^22.0.5",
39
+ "@angular/service-worker": "^22.0.5",
40
40
  "@ng-icons/core": "^33.3.0",
41
41
  "@ng-icons/tabler-icons": "^33.3.0",
42
42
  "@tiptap/core": "^3.27.1",
@@ -52,19 +52,19 @@
52
52
  "@tiptap/extension-underline": "^3.27.1",
53
53
  "@tiptap/markdown": "^3.27.1",
54
54
  "@tiptap/starter-kit": "^3.27.1",
55
- "bwip-js": "^4.11.1",
55
+ "bwip-js": "^4.11.2",
56
56
  "echarts": "^6.1.0",
57
57
  "html-to-image": "^1.11.13",
58
58
  "jspdf": "^4.2.1",
59
59
  "rxjs": "^7.8.2",
60
60
  "tabbable": "^6.5.0",
61
- "@simplysm/core-common": "14.1.13",
62
- "@simplysm/core-browser": "14.1.13",
63
- "@simplysm/service-common": "14.1.13",
64
- "@simplysm/service-client": "14.1.13"
61
+ "@simplysm/core-browser": "14.1.15",
62
+ "@simplysm/service-client": "14.1.15",
63
+ "@simplysm/service-common": "14.1.15",
64
+ "@simplysm/core-common": "14.1.15"
65
65
  },
66
66
  "devDependencies": {
67
- "@angular/compiler": "^22.0.4"
67
+ "@angular/compiler": "^22.0.5"
68
68
  },
69
69
  "scripts": {}
70
70
  }
@@ -368,6 +368,10 @@ export class SdTextfield<K extends keyof SdTextfieldTypes> {
368
368
  const inputEl = this._inputElRef()?.nativeElement;
369
369
  if (inputEl == null) return;
370
370
 
371
+ // IME 조합 중에는 DOM 을 되쓰지 않는다. 되쓰면 진행 중 조합이 깨진다.
372
+ // 조합이 끝나면 onCompositionEnd → value.set 이 controlValue 를 바꿔 effect 가 다시 돌아 최종값을 반영한다.
373
+ if (this._composing) return;
374
+
371
375
  // 편집(포커스) 중이라도 변경 origin 을 구분한다.
372
376
  // 사용자 입력이 만든 DOM(정규화 차이·진행 중 입력 포함)은 보호하고,
373
377
  // 모델만 외부에서 바뀐 경우(프로그래밍적 리셋·prefill·표시옵션 변경)는 되써서 반영한다.
@@ -437,7 +441,8 @@ export class SdTextfield<K extends keyof SdTextfieldTypes> {
437
441
 
438
442
  onInput(event: Event): void {
439
443
  // 조합 중 input 은 무시하고, 완성 시 onCompositionEnd 에서 한 번만 반영
440
- if (this._composing) return;
444
+ // isComposing 은 compositionstart 가 늦거나 누락된 IME 에서도 브라우저가 조합 구간 input 에 직접 실어주는 신호
445
+ if ((event as InputEvent).isComposing || this._composing) return;
441
446
  this._applyInput(event.target as HTMLInputElement);
442
447
  }
443
448
 
@@ -461,6 +466,8 @@ export class SdTextfield<K extends keyof SdTextfieldTypes> {
461
466
  onBlur(event: FocusEvent): void {
462
467
  // 편집 종료 시 모델 기준값으로 동기화 (number 콤마 포맷 반영, date 미완성 입력 정리)
463
468
  // date 미완성 입력은 input.value 가 "" 라 비교 없이 무조건 되써야 남은 세그먼트가 정리됨
469
+ // compositionend 가 스킵된 채 blur 되면 _composing 이 true 로 고착되므로 여기서 리셋한다.
470
+ this._composing = false;
464
471
  const inputEl = event.target as HTMLInputElement;
465
472
  inputEl.value = this.controlValue();
466
473
  this._syncNativeValidity(inputEl);