cmat 0.0.86 → 0.0.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/fesm2022/cmat-components-adapter.mjs +9 -9
  2. package/fesm2022/cmat-components-adapter.mjs.map +1 -1
  3. package/fesm2022/cmat-components-breadcrumb.mjs +98 -80
  4. package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -1
  5. package/fesm2022/cmat-components-card.mjs +26 -34
  6. package/fesm2022/cmat-components-card.mjs.map +1 -1
  7. package/fesm2022/cmat-components-carousel.mjs +467 -556
  8. package/fesm2022/cmat-components-carousel.mjs.map +1 -1
  9. package/fesm2022/cmat-components-cascade.mjs +270 -259
  10. package/fesm2022/cmat-components-cascade.mjs.map +1 -1
  11. package/fesm2022/cmat-components-chip-input.mjs +200 -116
  12. package/fesm2022/cmat-components-chip-input.mjs.map +1 -1
  13. package/fesm2022/cmat-components-code-editor.mjs +85 -38
  14. package/fesm2022/cmat-components-code-editor.mjs.map +1 -1
  15. package/fesm2022/cmat-components-color-picker.mjs +841 -0
  16. package/fesm2022/cmat-components-color-picker.mjs.map +1 -0
  17. package/fesm2022/cmat-components-custom-formly.mjs +1395 -838
  18. package/fesm2022/cmat-components-custom-formly.mjs.map +1 -1
  19. package/fesm2022/cmat-components-data-picker.mjs +996 -0
  20. package/fesm2022/cmat-components-data-picker.mjs.map +1 -0
  21. package/fesm2022/cmat-components-date-range.mjs +310 -264
  22. package/fesm2022/cmat-components-date-range.mjs.map +1 -1
  23. package/fesm2022/cmat-components-date-time-display.mjs +16 -20
  24. package/fesm2022/cmat-components-date-time-display.mjs.map +1 -1
  25. package/fesm2022/cmat-components-drawer.mjs +120 -137
  26. package/fesm2022/cmat-components-drawer.mjs.map +1 -1
  27. package/fesm2022/cmat-components-empty-state.mjs +17 -24
  28. package/fesm2022/cmat-components-empty-state.mjs.map +1 -1
  29. package/fesm2022/cmat-components-file-preview.mjs +18 -24
  30. package/fesm2022/cmat-components-file-preview.mjs.map +1 -1
  31. package/fesm2022/cmat-components-filter-toolbar.mjs +30 -39
  32. package/fesm2022/cmat-components-filter-toolbar.mjs.map +1 -1
  33. package/fesm2022/cmat-components-form-actions.mjs +12 -12
  34. package/fesm2022/cmat-components-form-actions.mjs.map +1 -1
  35. package/fesm2022/cmat-components-fullscreen.mjs +10 -10
  36. package/fesm2022/cmat-components-fullscreen.mjs.map +1 -1
  37. package/fesm2022/cmat-components-highlight.mjs +48 -41
  38. package/fesm2022/cmat-components-highlight.mjs.map +1 -1
  39. package/fesm2022/cmat-components-image-viewer.mjs +104 -107
  40. package/fesm2022/cmat-components-image-viewer.mjs.map +1 -1
  41. package/fesm2022/cmat-components-inline-loading.mjs +12 -15
  42. package/fesm2022/cmat-components-inline-loading.mjs.map +1 -1
  43. package/fesm2022/cmat-components-json-editor.mjs +118 -75
  44. package/fesm2022/cmat-components-json-editor.mjs.map +1 -1
  45. package/fesm2022/cmat-components-knob-input.mjs +196 -178
  46. package/fesm2022/cmat-components-knob-input.mjs.map +1 -1
  47. package/fesm2022/cmat-components-masonry.mjs +26 -41
  48. package/fesm2022/cmat-components-masonry.mjs.map +1 -1
  49. package/fesm2022/cmat-components-material-color-picker.mjs +81 -80
  50. package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
  51. package/fesm2022/cmat-components-material-datetimepicker.mjs +1212 -1287
  52. package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
  53. package/fesm2022/cmat-components-navigation.mjs +467 -450
  54. package/fesm2022/cmat-components-navigation.mjs.map +1 -1
  55. package/fesm2022/cmat-components-opt-input.mjs +143 -132
  56. package/fesm2022/cmat-components-opt-input.mjs.map +1 -1
  57. package/fesm2022/cmat-components-org-chart.mjs +68 -83
  58. package/fesm2022/cmat-components-org-chart.mjs.map +1 -1
  59. package/fesm2022/cmat-components-page-header.mjs +18 -24
  60. package/fesm2022/cmat-components-page-header.mjs.map +1 -1
  61. package/fesm2022/cmat-components-pagination.mjs +220 -136
  62. package/fesm2022/cmat-components-pagination.mjs.map +1 -1
  63. package/fesm2022/cmat-components-password-strength.mjs +262 -215
  64. package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
  65. package/fesm2022/cmat-components-popover.mjs +227 -195
  66. package/fesm2022/cmat-components-popover.mjs.map +1 -1
  67. package/fesm2022/cmat-components-progress-bar.mjs +15 -34
  68. package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
  69. package/fesm2022/cmat-components-qrcode.mjs +95 -88
  70. package/fesm2022/cmat-components-qrcode.mjs.map +1 -1
  71. package/fesm2022/cmat-components-rating.mjs +70 -67
  72. package/fesm2022/cmat-components-rating.mjs.map +1 -1
  73. package/fesm2022/cmat-components-rich-text-editor.mjs +23 -26
  74. package/fesm2022/cmat-components-rich-text-editor.mjs.map +1 -1
  75. package/fesm2022/cmat-components-select-search.mjs +190 -159
  76. package/fesm2022/cmat-components-select-search.mjs.map +1 -1
  77. package/fesm2022/cmat-components-select-table.mjs +276 -213
  78. package/fesm2022/cmat-components-select-table.mjs.map +1 -1
  79. package/fesm2022/cmat-components-select-tree.mjs +178 -128
  80. package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
  81. package/fesm2022/cmat-components-skeleton.mjs +44 -28
  82. package/fesm2022/cmat-components-skeleton.mjs.map +1 -1
  83. package/fesm2022/cmat-components-speed-dial.mjs +107 -163
  84. package/fesm2022/cmat-components-speed-dial.mjs.map +1 -1
  85. package/fesm2022/cmat-components-status-tag.mjs +29 -36
  86. package/fesm2022/cmat-components-status-tag.mjs.map +1 -1
  87. package/fesm2022/cmat-components-table-toolbar.mjs +14 -18
  88. package/fesm2022/cmat-components-table-toolbar.mjs.map +1 -1
  89. package/fesm2022/cmat-components-timeline.mjs +111 -118
  90. package/fesm2022/cmat-components-timeline.mjs.map +1 -1
  91. package/fesm2022/cmat-components-toast.mjs +65 -66
  92. package/fesm2022/cmat-components-toast.mjs.map +1 -1
  93. package/fesm2022/cmat-components-transfer-picker.mjs +130 -160
  94. package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
  95. package/fesm2022/cmat-components-treetable.mjs +32 -39
  96. package/fesm2022/cmat-components-treetable.mjs.map +1 -1
  97. package/fesm2022/cmat-components-upload.mjs +186 -176
  98. package/fesm2022/cmat-components-upload.mjs.map +1 -1
  99. package/fesm2022/cmat-directives-animate-on-scroll.mjs +25 -28
  100. package/fesm2022/cmat-directives-animate-on-scroll.mjs.map +1 -1
  101. package/fesm2022/cmat-directives-arrow-cursor.mjs +85 -92
  102. package/fesm2022/cmat-directives-arrow-cursor.mjs.map +1 -1
  103. package/fesm2022/cmat-directives-autofocus.mjs +3 -3
  104. package/fesm2022/cmat-directives-autofocus.mjs.map +1 -1
  105. package/fesm2022/cmat-directives-data-exporter.mjs +49 -50
  106. package/fesm2022/cmat-directives-data-exporter.mjs.map +1 -1
  107. package/fesm2022/cmat-directives-debounce.mjs +16 -19
  108. package/fesm2022/cmat-directives-debounce.mjs.map +1 -1
  109. package/fesm2022/cmat-directives-digit-only.mjs +60 -69
  110. package/fesm2022/cmat-directives-digit-only.mjs.map +1 -1
  111. package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
  112. package/fesm2022/cmat-directives-equal-validator.mjs.map +1 -1
  113. package/fesm2022/cmat-directives-seamless-auto-scroll.mjs +31 -30
  114. package/fesm2022/cmat-directives-seamless-auto-scroll.mjs.map +1 -1
  115. package/fesm2022/cmat-lib-mock-api.mjs +6 -6
  116. package/fesm2022/cmat-lib-mock-api.mjs.map +1 -1
  117. package/fesm2022/cmat-pipes-bytes.mjs +3 -3
  118. package/fesm2022/cmat-pipes-bytes.mjs.map +1 -1
  119. package/fesm2022/cmat-pipes-date-format.mjs +3 -3
  120. package/fesm2022/cmat-pipes-date-format.mjs.map +1 -1
  121. package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
  122. package/fesm2022/cmat-pipes-find-by-key.mjs.map +1 -1
  123. package/fesm2022/cmat-pipes-group-by.mjs +3 -3
  124. package/fesm2022/cmat-pipes-group-by.mjs.map +1 -1
  125. package/fesm2022/cmat-pipes-keys.mjs +3 -3
  126. package/fesm2022/cmat-pipes-keys.mjs.map +1 -1
  127. package/fesm2022/cmat-pipes-secure.mjs +7 -13
  128. package/fesm2022/cmat-pipes-secure.mjs.map +1 -1
  129. package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
  130. package/fesm2022/cmat-pipes-uppercase.mjs.map +1 -1
  131. package/fesm2022/cmat-services-alert.mjs +26 -27
  132. package/fesm2022/cmat-services-alert.mjs.map +1 -1
  133. package/fesm2022/cmat-services-config.mjs +14 -23
  134. package/fesm2022/cmat-services-config.mjs.map +1 -1
  135. package/fesm2022/cmat-services-confirmation.mjs +8 -8
  136. package/fesm2022/cmat-services-confirmation.mjs.map +1 -1
  137. package/fesm2022/cmat-services-data.mjs +6 -10
  138. package/fesm2022/cmat-services-data.mjs.map +1 -1
  139. package/fesm2022/cmat-services-export-as.mjs +3 -3
  140. package/fesm2022/cmat-services-export-as.mjs.map +1 -1
  141. package/fesm2022/cmat-services-loading.mjs +30 -47
  142. package/fesm2022/cmat-services-loading.mjs.map +1 -1
  143. package/fesm2022/cmat-services-local-storage.mjs +3 -3
  144. package/fesm2022/cmat-services-local-storage.mjs.map +1 -1
  145. package/fesm2022/cmat-services-media-watcher.mjs +43 -34
  146. package/fesm2022/cmat-services-media-watcher.mjs.map +1 -1
  147. package/fesm2022/cmat-services-platform.mjs +3 -3
  148. package/fesm2022/cmat-services-platform.mjs.map +1 -1
  149. package/fesm2022/cmat-services-splash-screen.mjs +3 -3
  150. package/fesm2022/cmat-services-splash-screen.mjs.map +1 -1
  151. package/fesm2022/cmat-services-title.mjs +3 -3
  152. package/fesm2022/cmat-services-title.mjs.map +1 -1
  153. package/fesm2022/cmat-services-translation.mjs +11 -11
  154. package/fesm2022/cmat-services-translation.mjs.map +1 -1
  155. package/fesm2022/cmat-services-utils.mjs +4 -4
  156. package/fesm2022/cmat-services-utils.mjs.map +1 -1
  157. package/fesm2022/cmat.mjs +9229 -7508
  158. package/fesm2022/cmat.mjs.map +1 -1
  159. package/icons/material-icons/heroicons-outline.svg +3 -0
  160. package/icons/material-icons/heroicons-solid.svg +3 -0
  161. package/package.json +10 -1
  162. package/styles/components/bundle.scss +21 -0
  163. package/styles/overrides/angular-material.scss +22 -1
  164. package/tailwind/plugins/theming.js +183 -183
  165. package/types/cmat-components-breadcrumb.d.ts +40 -37
  166. package/types/cmat-components-card.d.ts +11 -13
  167. package/types/cmat-components-carousel.d.ts +87 -113
  168. package/types/cmat-components-cascade.d.ts +84 -65
  169. package/types/cmat-components-chip-input.d.ts +29 -24
  170. package/types/cmat-components-code-editor.d.ts +28 -12
  171. package/types/cmat-components-color-picker.d.ts +236 -0
  172. package/types/cmat-components-custom-formly.d.ts +316 -184
  173. package/types/cmat-components-data-picker.d.ts +372 -0
  174. package/types/cmat-components-date-range.d.ts +31 -36
  175. package/types/cmat-components-date-time-display.d.ts +8 -8
  176. package/types/cmat-components-drawer.d.ts +30 -32
  177. package/types/cmat-components-empty-state.d.ts +9 -10
  178. package/types/cmat-components-file-preview.d.ts +9 -9
  179. package/types/cmat-components-filter-toolbar.d.ts +15 -15
  180. package/types/cmat-components-form-actions.d.ts +5 -5
  181. package/types/cmat-components-fullscreen.d.ts +5 -5
  182. package/types/cmat-components-highlight.d.ts +13 -14
  183. package/types/cmat-components-image-viewer.d.ts +29 -33
  184. package/types/cmat-components-inline-loading.d.ts +6 -6
  185. package/types/cmat-components-json-editor.d.ts +15 -17
  186. package/types/cmat-components-knob-input.d.ts +58 -55
  187. package/types/cmat-components-masonry.d.ts +9 -12
  188. package/types/cmat-components-material-color-picker.d.ts +16 -21
  189. package/types/cmat-components-material-datetimepicker.d.ts +174 -216
  190. package/types/cmat-components-navigation.d.ts +34 -39
  191. package/types/cmat-components-opt-input.d.ts +35 -33
  192. package/types/cmat-components-org-chart.d.ts +8 -9
  193. package/types/cmat-components-page-header.d.ts +9 -9
  194. package/types/cmat-components-pagination.d.ts +36 -40
  195. package/types/cmat-components-password-strength.d.ts +58 -64
  196. package/types/cmat-components-popover.d.ts +22 -32
  197. package/types/cmat-components-progress-bar.d.ts +7 -10
  198. package/types/cmat-components-qrcode.d.ts +22 -22
  199. package/types/cmat-components-rating.d.ts +17 -19
  200. package/types/cmat-components-rich-text-editor.d.ts +11 -12
  201. package/types/cmat-components-select-search.d.ts +48 -36
  202. package/types/cmat-components-select-table.d.ts +38 -34
  203. package/types/cmat-components-select-tree.d.ts +17 -15
  204. package/types/cmat-components-skeleton.d.ts +27 -10
  205. package/types/cmat-components-speed-dial.d.ts +24 -33
  206. package/types/cmat-components-status-tag.d.ts +19 -9
  207. package/types/cmat-components-table-toolbar.d.ts +7 -7
  208. package/types/cmat-components-timeline.d.ts +33 -34
  209. package/types/cmat-components-toast.d.ts +26 -30
  210. package/types/cmat-components-transfer-picker.d.ts +51 -56
  211. package/types/cmat-components-treetable.d.ts +12 -13
  212. package/types/cmat-components-upload.d.ts +33 -38
  213. package/types/cmat-components-x6-angular-shape.d.ts +1 -1
  214. package/types/cmat-directives-animate-on-scroll.d.ts +7 -7
  215. package/types/cmat-directives-arrow-cursor.d.ts +18 -20
  216. package/types/cmat-directives-data-exporter.d.ts +10 -10
  217. package/types/cmat-directives-debounce.d.ts +5 -5
  218. package/types/cmat-directives-digit-only.d.ts +13 -13
  219. package/types/cmat-directives-seamless-auto-scroll.d.ts +7 -7
  220. package/types/cmat-pipes-secure.d.ts +1 -3
  221. package/types/cmat-services-alert.d.ts +11 -12
  222. package/types/cmat-services-config.d.ts +2 -7
  223. package/types/cmat-services-confirmation.d.ts +2 -2
  224. package/types/cmat-services-data.d.ts +0 -1
  225. package/types/cmat-services-loading.d.ts +14 -22
  226. package/types/cmat-services-media-watcher.d.ts +5 -5
  227. package/types/cmat-services-translation.d.ts +4 -5
  228. package/types/cmat.d.ts +2167 -1746
@@ -2,12 +2,11 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
2
  import * as i1 from '@angular/common';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
- import { EventEmitter, inject, DOCUMENT, DestroyRef, Input, Output, HostBinding, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
5
+ import { input, output, signal, computed, inject, DOCUMENT, DestroyRef, Input, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
6
6
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import * as i2 from '@angular/forms';
8
8
  import { NgControl, FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';
9
9
  import { MatFormFieldControl } from '@angular/material/form-field';
10
- import { isNil } from 'lodash';
11
10
  import { Subject } from 'rxjs';
12
11
 
13
12
  class KeyboardUtil {
@@ -35,75 +34,107 @@ class KeyboardUtil {
35
34
  }
36
35
  }
37
36
 
38
- /* eslint-disable @angular-eslint/no-output-on-prefix */
39
37
  /* eslint-disable @typescript-eslint/member-ordering */
40
38
  let NEXT_ID = 1;
41
39
  class CmatOtpInputComponent {
40
+ get errorState() {
41
+ if (this.ngControl == null)
42
+ return false;
43
+ return (this.ngControl.invalid && ((this.ngControl.dirty ?? false) || this.ngControl.touched)) ?? false;
44
+ }
42
45
  constructor() {
46
+ this.config = input({ length: 4 }, /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "config" }] : /* istanbul ignore next */ []));
48
+ this.onBlur = output();
49
+ this.onInputChange = output();
43
50
  this.id = `cmat-otp-input-${NEXT_ID}`;
44
- this.onBlur = new EventEmitter();
45
- this.onInputChange = new EventEmitter();
46
- this.config = { length: 4 };
47
- this.componentKey = (NEXT_ID++).toString(36);
48
51
  this.stateChanges = new Subject();
49
- this.focused = false;
52
+ this._placeholderSignal = signal('', /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "_placeholderSignal" }] : /* istanbul ignore next */ []));
54
+ this._requiredSignal = signal(false, /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "_requiredSignal" }] : /* istanbul ignore next */ []));
56
+ this._disabledSignal = signal(false, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "_disabledSignal" }] : /* istanbul ignore next */ []));
58
+ this._valueSignal = signal(null, /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "_valueSignal" }] : /* istanbul ignore next */ []));
60
+ this._currentValSignal = signal(null, /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "_currentValSignal" }] : /* istanbul ignore next */ []));
62
+ this._focused = false;
63
+ this._activeFocusCount = 0;
64
+ this.controlKeys = computed(() => Object.keys(this.otpForm?.controls ?? {}), /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "controlKeys" }] : /* istanbul ignore next */ []));
66
+ this.inputType = computed(() => {
67
+ const cfg = this.config();
68
+ return cfg?.isPasswordInput
69
+ ? 'password'
70
+ : cfg?.allowNumbersOnly
71
+ ? 'tel'
72
+ : 'text';
73
+ }, /* @ts-ignore */
74
+ ...(ngDevMode ? [{ debugName: "inputType" }] : /* istanbul ignore next */ []));
75
+ this.componentKey = (NEXT_ID++).toString(36);
50
76
  this.ngControl = inject(NgControl, { optional: true, self: true });
51
77
  this._document = inject(DOCUMENT);
52
78
  this._formBuilder = inject(FormBuilder);
53
79
  this._destroyRef = inject(DestroyRef);
54
80
  this._valueChangesSub = null;
55
- this._activeFocusCount = 0;
56
81
  this._pendingTimeouts = [];
57
- this._placeholder = '';
58
- this._required = false;
59
- this._disabled = false;
60
- // eslint-disable-next-line @typescript-eslint/no-empty-function
61
82
  this._onModelChange = () => { };
62
- // eslint-disable-next-line @typescript-eslint/no-empty-function
63
83
  this._onTouchedChange = () => { };
64
84
  this.otpForm = this._formBuilder.group({});
65
85
  if (this.ngControl != null) {
66
86
  this.ngControl.valueAccessor = this;
67
87
  }
88
+ this._rebuildForm();
68
89
  }
69
- get inputType() {
70
- return this.config?.isPasswordInput
71
- ? 'password'
72
- : this.config?.allowNumbersOnly
73
- ? 'tel'
74
- : 'text';
90
+ get placeholder() {
91
+ return this._placeholderSignal();
75
92
  }
76
- get controlKeys() { return Object.keys(this.otpForm?.controls ?? {}); }
77
- ;
78
- get errorState() {
79
- if (this.ngControl == null)
80
- return false;
81
- return (this.ngControl.invalid && ((this.ngControl.dirty ?? false) || this.ngControl.touched)) ?? false;
93
+ set placeholder(value) {
94
+ this._placeholderSignal.set(value);
95
+ this.stateChanges.next();
82
96
  }
83
- ngOnChanges(changes) {
84
- if (changes.config) {
85
- if (this.config.length !== Object.keys(this.otpForm?.controls ?? {}).length) {
86
- this._valueChangesSub?.unsubscribe();
87
- this._valueChangesSub = null;
88
- this.otpForm = this._formBuilder.group({});
89
- for (let index = 0; index < this.config.length; index++) {
90
- this.otpForm.addControl(this._getControlName(index), new FormControl());
91
- }
92
- this._valueChangesSub = this.otpForm.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {
93
- Object.keys(this.otpForm.controls).forEach((k) => {
94
- const val = this.otpForm.controls[k].value;
95
- if (typeof val === 'string' && val.length > 1) {
96
- if (val.length >= this.config.length) {
97
- this.setValue(val);
98
- }
99
- else {
100
- this._rebuildValue();
101
- }
102
- }
103
- });
104
- });
105
- }
97
+ get required() {
98
+ return this._requiredSignal();
99
+ }
100
+ set required(value) {
101
+ this._requiredSignal.set(coerceBooleanProperty(value));
102
+ this.stateChanges.next();
103
+ }
104
+ get disabled() {
105
+ if (!this.ngControl.disabled && this.ngControl.disabled !== null) {
106
+ return this.ngControl.disabled;
106
107
  }
108
+ return this._disabledSignal();
109
+ }
110
+ set disabled(value) {
111
+ const isDisabled = coerceBooleanProperty(value);
112
+ this._disabledSignal.set(isDisabled);
113
+ this.setDisabledState(isDisabled);
114
+ if (isDisabled && this._focused) {
115
+ this._focused = false;
116
+ this.stateChanges.next();
117
+ }
118
+ }
119
+ get focused() {
120
+ return this._focused;
121
+ }
122
+ get value() {
123
+ return this._valueSignal();
124
+ }
125
+ set value(val) {
126
+ const current = this._valueSignal();
127
+ if (val !== current) {
128
+ this._valueSignal.set(val);
129
+ this.stateChanges.next();
130
+ this._onModelChange(val);
131
+ }
132
+ }
133
+ get empty() {
134
+ return !this._valueSignal();
135
+ }
136
+ get shouldLabelFloat() {
137
+ return this._focused || !this.empty;
107
138
  }
108
139
  setDisabledState(isDisabled) {
109
140
  if (this.otpForm) {
@@ -114,11 +145,12 @@ class CmatOtpInputComponent {
114
145
  this.otpForm.enable({ emitEvent: false });
115
146
  }
116
147
  }
148
+ this.stateChanges.next();
117
149
  }
118
150
  writeValue(value) {
119
- this.currentVal = value || null;
120
- if (this.otpForm && this.currentVal) {
121
- this.setValue(this.currentVal);
151
+ this._currentValSignal.set(value || null);
152
+ if (this.otpForm && this._currentValSignal()) {
153
+ this.setValue(this._currentValSignal());
122
154
  }
123
155
  }
124
156
  registerOnChange(fn) {
@@ -130,8 +162,8 @@ class CmatOtpInputComponent {
130
162
  onFocusIn() {
131
163
  this._onTouchedChange();
132
164
  this._activeFocusCount++;
133
- if (!this.focused) {
134
- this.focused = true;
165
+ if (!this._focused) {
166
+ this._focused = true;
135
167
  this.stateChanges.next();
136
168
  }
137
169
  }
@@ -140,16 +172,16 @@ class CmatOtpInputComponent {
140
172
  this._removePendingTimeout(timeoutId);
141
173
  this._activeFocusCount--;
142
174
  if (this._activeFocusCount === 0) {
143
- this.focused = false;
175
+ this._focused = false;
144
176
  this._onTouchedChange();
145
- this.onBlur.next();
177
+ this.onBlur.emit();
146
178
  this.stateChanges.next();
147
179
  }
148
180
  }, 0);
149
181
  this._pendingTimeouts.push(timeoutId);
150
182
  }
151
183
  ngAfterViewInit() {
152
- if (!this.config.disableAutoFocus) {
184
+ if (!this.config().disableAutoFocus) {
153
185
  const containerItem = this._document.getElementById(`c_${this.componentKey}`);
154
186
  if (containerItem) {
155
187
  const ele = containerItem.getElementsByClassName('cmat-otp-input')[0];
@@ -167,49 +199,8 @@ class CmatOtpInputComponent {
167
199
  this.stateChanges.complete();
168
200
  this.otpForm.reset();
169
201
  }
170
- get placeholder() {
171
- return this._placeholder;
172
- }
173
- set placeholder(value) {
174
- this._placeholder = value;
175
- this.stateChanges.next();
176
- }
177
- get value() {
178
- return this._value;
179
- }
180
- set value(value) {
181
- if (value !== this.value) {
182
- this._value = value;
183
- this.stateChanges.next();
184
- this._onModelChange(value);
185
- }
186
- }
187
- get empty() {
188
- return !this._value;
189
- }
190
- get shouldLabelFloat() {
191
- return this.focused || !this.empty;
192
- }
193
- get required() { return this._required; }
194
- set required(value) {
195
- this._required = coerceBooleanProperty(value);
196
- this.stateChanges.next();
197
- }
198
- get disabled() {
199
- if (!isNil(this.ngControl?.disabled)) {
200
- return this.ngControl.disabled;
201
- }
202
- return this._disabled;
203
- }
204
- set disabled(value) {
205
- this._disabled = coerceBooleanProperty(value);
206
- this.setDisabledState(this._disabled);
207
- if (this.focused) {
208
- this.focused = false;
209
- this.stateChanges.next();
210
- }
211
- }
212
202
  setDescribedByIds(ids) {
203
+ this.userAriaDescribedBy = ids.length ? ids.join(' ') : undefined;
213
204
  const containerItem = this._document.getElementById(`c_${this.componentKey}`);
214
205
  if (containerItem) {
215
206
  if (ids.length) {
@@ -219,11 +210,14 @@ class CmatOtpInputComponent {
219
210
  containerItem.removeAttribute('aria-describedby');
220
211
  }
221
212
  }
213
+ this.stateChanges.next();
222
214
  }
223
215
  onContainerClick() {
224
- const containerItem = this._document.getElementById(`c_${this.componentKey}`);
225
- if (!this.focused && containerItem) {
226
- containerItem.focus();
216
+ if (!this._focused) {
217
+ const containerItem = this._document.getElementById(`c_${this.componentKey}`);
218
+ if (containerItem) {
219
+ containerItem.focus();
220
+ }
227
221
  }
228
222
  }
229
223
  onKeyDown($event, inputIdx) {
@@ -268,8 +262,9 @@ class CmatOtpInputComponent {
268
262
  }
269
263
  onInput($event, inputIdx) {
270
264
  const inputTarget = $event.target;
271
- const newVal = this.currentVal ? `${this.currentVal}${inputTarget.value}` : inputTarget.value;
272
- if (this.config.allowNumbersOnly && !this.validateNumber(newVal)) {
265
+ const currentVal = this._currentValSignal();
266
+ const newVal = currentVal ? `${currentVal}${inputTarget.value}` : inputTarget.value;
267
+ if (this.config().allowNumbersOnly && !this.validateNumber(newVal)) {
273
268
  inputTarget.value = '';
274
269
  $event.stopPropagation();
275
270
  this._clearInput(null, inputIdx);
@@ -309,7 +304,8 @@ class CmatOtpInputComponent {
309
304
  }
310
305
  }
311
306
  setValue(value) {
312
- if (this.config.allowNumbersOnly && isNaN(value)) {
307
+ const cfg = this.config();
308
+ if (cfg.allowNumbersOnly && isNaN(value)) {
313
309
  return;
314
310
  }
315
311
  this.otpForm.reset();
@@ -317,19 +313,19 @@ class CmatOtpInputComponent {
317
313
  this._rebuildValue();
318
314
  return;
319
315
  }
320
- value = value.toString().replace(/\s/g, ''); // remove whitespace
316
+ value = value.toString().replace(/\s/g, '');
321
317
  Array.from(value).forEach((c, idx) => {
322
318
  if (this.otpForm.get(this._getControlName(idx))) {
323
319
  this.otpForm.get(this._getControlName(idx)).setValue(c);
324
320
  }
325
321
  });
326
- if (!this.config.disableAutoFocus) {
322
+ if (!cfg.disableAutoFocus) {
327
323
  const outerTimeoutId = setTimeout(() => {
328
324
  this._removePendingTimeout(outerTimeoutId);
329
325
  const containerItem = this._document.getElementById(`c_${this.componentKey}`);
330
326
  if (!containerItem)
331
327
  return;
332
- const indexOfElementToFocus = value.length < this.config.length ? value.length : (this.config.length - 1);
328
+ const indexOfElementToFocus = value.length < cfg.length ? value.length : (cfg.length - 1);
333
329
  const ele = containerItem.getElementsByClassName('cmat-otp-input')[indexOfElementToFocus];
334
330
  if (ele) {
335
331
  const innerTimeoutId = setTimeout(() => {
@@ -351,7 +347,7 @@ class CmatOtpInputComponent {
351
347
  }
352
348
  e.stopPropagation();
353
349
  e.preventDefault();
354
- if (!pastedData || (this.config.allowNumbersOnly && !this.validateNumber(pastedData))) {
350
+ if (!pastedData || (this.config().allowNumbersOnly && !this.validateNumber(pastedData))) {
355
351
  return;
356
352
  }
357
353
  this.setValue(pastedData);
@@ -391,7 +387,7 @@ class CmatOtpInputComponent {
391
387
  }
392
388
  ifValidKeyCode(event) {
393
389
  const inp = event.key;
394
- if (this.config?.allowNumbersOnly) {
390
+ if (this.config()?.allowNumbersOnly) {
395
391
  return this.validateNumber(inp);
396
392
  }
397
393
  const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
@@ -399,13 +395,14 @@ class CmatOtpInputComponent {
399
395
  }
400
396
  _rebuildValue() {
401
397
  let val = null;
398
+ const cfg = this.config();
402
399
  Object.keys(this.otpForm.controls).forEach((k) => {
403
400
  let ctrlVal = this.otpForm.controls[k].value;
404
401
  if (typeof ctrlVal === 'string' && ctrlVal) {
405
402
  const isLengthExceed = ctrlVal.length > 1;
406
403
  ctrlVal = ctrlVal[0];
407
- const letterCase = this.config.letterCase?.toLocaleLowerCase();
408
- const isCaseTransformEnabled = !this.config.allowNumbersOnly && (letterCase === 'upper' || letterCase === 'lower');
404
+ const letterCase = cfg.letterCase?.toLocaleLowerCase();
405
+ const isCaseTransformEnabled = !cfg.allowNumbersOnly && (letterCase === 'upper' || letterCase === 'lower');
409
406
  if (isCaseTransformEnabled) {
410
407
  ctrlVal = letterCase === 'upper' ? ctrlVal.toUpperCase() : ctrlVal.toLowerCase();
411
408
  this.otpForm.controls[k].setValue(ctrlVal);
@@ -416,37 +413,51 @@ class CmatOtpInputComponent {
416
413
  val = val === null ? ctrlVal : val + ctrlVal;
417
414
  }
418
415
  });
419
- if (this.currentVal != val) {
420
- this.currentVal = val;
416
+ const currentVal = this._currentValSignal();
417
+ if (currentVal != val) {
418
+ this._currentValSignal.set(val);
421
419
  this._onModelChange(val);
422
420
  this.onInputChange.emit(val);
423
421
  }
424
422
  }
425
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: CmatOtpInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
426
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: CmatOtpInputComponent, isStandalone: true, selector: "cmat-otp-input", inputs: { id: "id", config: "config", placeholder: "placeholder", value: "value", required: "required", disabled: "disabled" }, outputs: { onBlur: "onBlur", onInputChange: "onInputChange" }, host: { properties: { "attr.id": "this.id" } }, providers: [{ provide: MatFormFieldControl, useExisting: CmatOtpInputComponent }], exportAs: ["cmatOtpInput"], usesOnChanges: true, ngImport: i0, template: "@if(otpForm.controls){\r\n<div class=\"cmat-otp-input-wrapper wrapper {{config.containerClass}}\" id=\"c_{{componentKey}}\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" [ngStyle]=\"config.containerStyles\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut()\">\r\n <div class=\"n-o-c\">\r\n @for (item of controlKeys; track item) {\r\n <input #inp class=\"cmat-otp-input {{config.inputClass}}\" autocomplete=\"one-time-code\" [pattern]=\"config.allowNumbersOnly ? '\\\\d*' : ''\"\r\n [type]=\"inputType\" [placeholder]=\"config.placeholder || ''\"\r\n [ngStyle]=\"config.inputStyles\" [id]=\"getBoxId($index)\"\r\n [ngClass]=\"{'error-input': (config.showError && errorState)}\"\r\n [formControl]=\"getFormControl(item)\" (paste)=\"handlePaste($event)\" (keyup)=\"onKeyUp($event,$index)\"\r\n (input)=\"onInput($event,$index)\" (keydown)=\"onKeyDown($event,$index)\">\r\n @if(config.separator && !$last){\r\n {{config.separator}}\r\n }\r\n }\r\n </div>\r\n</div>\r\n}", styles: [".cmat-otp-input{width:50px;height:50px;border-radius:4px;border:solid 1px;border-color:rgba(var(--cmat-text-hint-rgb),.5);text-align:center;font-size:32px}.cmat-otp-input:focus{background-color:var(--cmat-divider);border:solid 2px var(--cmat-primary)}.cmat-otp-input-wrapper .cmat-otp-input{margin:0 .51rem}.cmat-otp-input-wrapper .cmat-otp-input:first-child{margin-left:0}.cmat-otp-input-wrapper .cmat-otp-input:last-child{margin-right:0}.n-o-c{display:flex;align-items:center}.error-input{border-color:var(--cmat-warn)}@media screen and (max-width:767px){.cmat-otp-input{width:40px;font-size:24px;height:40px}}@media screen and (max-width:420px){.cmat-otp-input{width:30px;font-size:18px;height:30px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
423
+ _rebuildForm() {
424
+ this._valueChangesSub?.unsubscribe();
425
+ this._valueChangesSub = null;
426
+ this.otpForm = this._formBuilder.group({});
427
+ for (let index = 0; index < this.config().length; index++) {
428
+ this.otpForm.addControl(this._getControlName(index), new FormControl());
429
+ }
430
+ this._valueChangesSub = this.otpForm.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {
431
+ Object.keys(this.otpForm.controls).forEach((k) => {
432
+ const val = this.otpForm.controls[k].value;
433
+ if (typeof val === 'string' && val.length > 1) {
434
+ if (val.length >= this.config().length) {
435
+ this.setValue(val);
436
+ }
437
+ else {
438
+ this._rebuildValue();
439
+ }
440
+ }
441
+ });
442
+ });
443
+ }
444
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: CmatOtpInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
445
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: CmatOtpInputComponent, isStandalone: true, selector: "cmat-otp-input", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { onBlur: "onBlur", onInputChange: "onInputChange" }, host: { properties: { "attr.id": "id" } }, providers: [{ provide: MatFormFieldControl, useExisting: CmatOtpInputComponent }], exportAs: ["cmatOtpInput"], ngImport: i0, template: "@if(otpForm.controls){\r\n<div class=\"cmat-otp-input-wrapper wrapper {{config().containerClass}}\" id=\"c_{{componentKey}}\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" [ngStyle]=\"config().containerStyles\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut()\">\r\n <div class=\"n-o-c\">\r\n @for (item of controlKeys(); track item) {\r\n <input #inp class=\"cmat-otp-input {{config().inputClass}}\" autocomplete=\"one-time-code\" [pattern]=\"config().allowNumbersOnly ? '\\\\d*' : ''\"\r\n [type]=\"inputType()\" [placeholder]=\"config().placeholder || ''\"\r\n [ngStyle]=\"config().inputStyles\" [id]=\"getBoxId($index)\"\r\n [ngClass]=\"{'error-input': (config().showError && errorState)}\"\r\n [formControl]=\"getFormControl(item)\" (paste)=\"handlePaste($event)\" (keyup)=\"onKeyUp($event,$index)\"\r\n (input)=\"onInput($event,$index)\" (keydown)=\"onKeyDown($event,$index)\">\r\n @if(config().separator && !$last){\r\n {{config().separator}}\r\n }\r\n }\r\n </div>\r\n</div>\r\n}", styles: [".cmat-otp-input{width:50px;height:50px;border-radius:4px;border:solid 1px;border-color:rgba(var(--cmat-text-hint-rgb),.5);text-align:center;font-size:32px}.cmat-otp-input:focus{background-color:var(--cmat-divider);border:solid 2px var(--cmat-primary)}.cmat-otp-input-wrapper .cmat-otp-input{margin:0 .51rem}.cmat-otp-input-wrapper .cmat-otp-input:first-child{margin-left:0}.cmat-otp-input-wrapper .cmat-otp-input:last-child{margin-right:0}.n-o-c{display:flex;align-items:center}.error-input{border-color:var(--cmat-warn)}@media screen and (max-width:767px){.cmat-otp-input{width:40px;font-size:24px;height:40px}}@media screen and (max-width:420px){.cmat-otp-input{width:30px;font-size:18px;height:30px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
427
446
  }
428
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: CmatOtpInputComponent, decorators: [{
447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: CmatOtpInputComponent, decorators: [{
429
448
  type: Component,
430
- args: [{ selector: 'cmat-otp-input', exportAs: 'cmatOtpInput', imports: [CommonModule, ReactiveFormsModule], providers: [{ provide: MatFormFieldControl, useExisting: CmatOtpInputComponent }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if(otpForm.controls){\r\n<div class=\"cmat-otp-input-wrapper wrapper {{config.containerClass}}\" id=\"c_{{componentKey}}\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" [ngStyle]=\"config.containerStyles\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut()\">\r\n <div class=\"n-o-c\">\r\n @for (item of controlKeys; track item) {\r\n <input #inp class=\"cmat-otp-input {{config.inputClass}}\" autocomplete=\"one-time-code\" [pattern]=\"config.allowNumbersOnly ? '\\\\d*' : ''\"\r\n [type]=\"inputType\" [placeholder]=\"config.placeholder || ''\"\r\n [ngStyle]=\"config.inputStyles\" [id]=\"getBoxId($index)\"\r\n [ngClass]=\"{'error-input': (config.showError && errorState)}\"\r\n [formControl]=\"getFormControl(item)\" (paste)=\"handlePaste($event)\" (keyup)=\"onKeyUp($event,$index)\"\r\n (input)=\"onInput($event,$index)\" (keydown)=\"onKeyDown($event,$index)\">\r\n @if(config.separator && !$last){\r\n {{config.separator}}\r\n }\r\n }\r\n </div>\r\n</div>\r\n}", styles: [".cmat-otp-input{width:50px;height:50px;border-radius:4px;border:solid 1px;border-color:rgba(var(--cmat-text-hint-rgb),.5);text-align:center;font-size:32px}.cmat-otp-input:focus{background-color:var(--cmat-divider);border:solid 2px var(--cmat-primary)}.cmat-otp-input-wrapper .cmat-otp-input{margin:0 .51rem}.cmat-otp-input-wrapper .cmat-otp-input:first-child{margin-left:0}.cmat-otp-input-wrapper .cmat-otp-input:last-child{margin-right:0}.n-o-c{display:flex;align-items:center}.error-input{border-color:var(--cmat-warn)}@media screen and (max-width:767px){.cmat-otp-input{width:40px;font-size:24px;height:40px}}@media screen and (max-width:420px){.cmat-otp-input{width:30px;font-size:18px;height:30px}}\n"] }]
431
- }], ctorParameters: () => [], propDecorators: { id: [{
432
- type: HostBinding,
433
- args: ['attr.id']
434
- }, {
435
- type: Input
436
- }], onBlur: [{
437
- type: Output
438
- }], onInputChange: [{
439
- type: Output
440
- }], config: [{
441
- type: Input
442
- }], placeholder: [{
443
- type: Input
444
- }], value: [{
449
+ args: [{ selector: 'cmat-otp-input', exportAs: 'cmatOtpInput', imports: [CommonModule, ReactiveFormsModule], providers: [{ provide: MatFormFieldControl, useExisting: CmatOtpInputComponent }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
450
+ // eslint-disable-next-line @typescript-eslint/naming-convention
451
+ '[attr.id]': 'id',
452
+ }, template: "@if(otpForm.controls){\r\n<div class=\"cmat-otp-input-wrapper wrapper {{config().containerClass}}\" id=\"c_{{componentKey}}\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" [ngStyle]=\"config().containerStyles\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut()\">\r\n <div class=\"n-o-c\">\r\n @for (item of controlKeys(); track item) {\r\n <input #inp class=\"cmat-otp-input {{config().inputClass}}\" autocomplete=\"one-time-code\" [pattern]=\"config().allowNumbersOnly ? '\\\\d*' : ''\"\r\n [type]=\"inputType()\" [placeholder]=\"config().placeholder || ''\"\r\n [ngStyle]=\"config().inputStyles\" [id]=\"getBoxId($index)\"\r\n [ngClass]=\"{'error-input': (config().showError && errorState)}\"\r\n [formControl]=\"getFormControl(item)\" (paste)=\"handlePaste($event)\" (keyup)=\"onKeyUp($event,$index)\"\r\n (input)=\"onInput($event,$index)\" (keydown)=\"onKeyDown($event,$index)\">\r\n @if(config().separator && !$last){\r\n {{config().separator}}\r\n }\r\n }\r\n </div>\r\n</div>\r\n}", styles: [".cmat-otp-input{width:50px;height:50px;border-radius:4px;border:solid 1px;border-color:rgba(var(--cmat-text-hint-rgb),.5);text-align:center;font-size:32px}.cmat-otp-input:focus{background-color:var(--cmat-divider);border:solid 2px var(--cmat-primary)}.cmat-otp-input-wrapper .cmat-otp-input{margin:0 .51rem}.cmat-otp-input-wrapper .cmat-otp-input:first-child{margin-left:0}.cmat-otp-input-wrapper .cmat-otp-input:last-child{margin-right:0}.n-o-c{display:flex;align-items:center}.error-input{border-color:var(--cmat-warn)}@media screen and (max-width:767px){.cmat-otp-input{width:40px;font-size:24px;height:40px}}@media screen and (max-width:420px){.cmat-otp-input{width:30px;font-size:18px;height:30px}}\n"] }]
453
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], onBlur: [{ type: i0.Output, args: ["onBlur"] }], onInputChange: [{ type: i0.Output, args: ["onInputChange"] }], placeholder: [{
445
454
  type: Input
446
455
  }], required: [{
447
456
  type: Input
448
457
  }], disabled: [{
449
458
  type: Input
459
+ }], value: [{
460
+ type: Input
450
461
  }] } });
451
462
 
452
463
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cmat-components-opt-input.mjs","sources":["../../../projects/cmat/components/opt-input/utils/keyboard-util.ts","../../../projects/cmat/components/opt-input/otp-input.component.ts","../../../projects/cmat/components/opt-input/otp-input.component.html","../../../projects/cmat/components/opt-input/cmat-components-opt-input.ts"],"sourcesContent":["export class KeyboardUtil {\r\n static ifTab(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Tab');\r\n }\r\n static ifDelete(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Delete;Del');\r\n }\r\n static ifBackspace(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Backspace');\r\n }\r\n static ifRightArrow(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'ArrowRight;Right')\r\n }\r\n static ifLeftArrow(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'ArrowLeft;Left')\r\n }\r\n static ifSpacebar(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Spacebar; ')//don't remove the space after ; as this will check for space key\r\n }\r\n static ifKey(event: KeyboardEvent, keys: string): boolean {\r\n let keysToCheck = keys.split(';');\r\n return keysToCheck.some(k => k === event.key);\r\n }\r\n}\r\n","/* eslint-disable @angular-eslint/no-output-on-prefix */\r\n/* eslint-disable @typescript-eslint/member-ordering */\r\nimport { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter, AfterViewInit, OnDestroy, OnChanges, SimpleChanges, ChangeDetectionStrategy, ViewEncapsulation, HostBinding, DOCUMENT, inject, DestroyRef } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControl, ReactiveFormsModule, ControlValueAccessor, FormBuilder, UntypedFormGroup, NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { isNil } from 'lodash';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { OptInputConfig } from './models/config';\r\nimport { KeyboardUtil } from './utils/keyboard-util';\r\n\r\nlet NEXT_ID = 1;\r\n\r\n@Component({\r\n selector: 'cmat-otp-input',\r\n templateUrl: './otp-input.component.html',\r\n styleUrls: ['./otp-input.component.scss'],\r\n exportAs: 'cmatOtpInput',\r\n imports: [CommonModule, ReactiveFormsModule],\r\n providers: [{ provide: MatFormFieldControl, useExisting: CmatOtpInputComponent }],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CmatOtpInputComponent implements MatFormFieldControl<string | null>, AfterViewInit, OnDestroy, OnChanges, ControlValueAccessor {\r\n @HostBinding('attr.id')\r\n @Input()\r\n public id = `cmat-otp-input-${NEXT_ID}`;\r\n\r\n @Output() onBlur = new EventEmitter<void>();\r\n @Output() onInputChange = new EventEmitter<string | null>();\r\n @Input() config: OptInputConfig = { length: 4 };\r\n\r\n otpForm: UntypedFormGroup;\r\n currentVal: string | null;\r\n\r\n componentKey = (NEXT_ID++).toString(36);\r\n\r\n readonly stateChanges: Subject<void> = new Subject<void>();\r\n focused: boolean = false;\r\n\r\n ngControl = inject(NgControl, { optional: true, self: true })!;\r\n private _document = inject<Document>(DOCUMENT);\r\n private _formBuilder = inject(FormBuilder);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n private _valueChangesSub: Subscription | null = null;\r\n private _activeFocusCount = 0;\r\n private _pendingTimeouts: ReturnType<typeof setTimeout>[] = [];\r\n\r\n constructor() {\r\n this.otpForm = this._formBuilder.group({});\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n get inputType(): string {\r\n return this.config?.isPasswordInput\r\n ? 'password'\r\n : this.config?.allowNumbersOnly\r\n ? 'tel'\r\n : 'text';\r\n }\r\n get controlKeys(): string[] { return Object.keys(this.otpForm?.controls ?? {}) };\r\n\r\n get errorState(): boolean {\r\n if (this.ngControl == null)\r\n return false;\r\n\r\n return (this.ngControl.invalid && ((this.ngControl.dirty ?? false) || this.ngControl.touched)) ?? false;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.config) {\r\n if (this.config.length !== Object.keys(this.otpForm?.controls ?? {}).length) {\r\n this._valueChangesSub?.unsubscribe();\r\n this._valueChangesSub = null;\r\n this.otpForm = this._formBuilder.group({});\r\n for (let index = 0; index < this.config.length; index++) {\r\n this.otpForm.addControl(this._getControlName(index), new FormControl());\r\n }\r\n this._valueChangesSub = this.otpForm.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\r\n Object.keys(this.otpForm.controls).forEach((k) => {\r\n const val = this.otpForm.controls[k].value as string | null;\r\n if (typeof val === 'string' && val.length > 1) {\r\n if (val.length >= this.config.length) {\r\n this.setValue(val);\r\n } else {\r\n this._rebuildValue();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n if (this.otpForm) {\r\n if (isDisabled) {\r\n this.otpForm.disable({ emitEvent: false });\r\n } else {\r\n this.otpForm.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n writeValue(value: string): void {\r\n this.currentVal = value || null;\r\n if (this.otpForm && this.currentVal) {\r\n this.setValue(this.currentVal);\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this._onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouchedChange = fn;\r\n }\r\n\r\n onFocusIn(): void {\r\n this._onTouchedChange();\r\n this._activeFocusCount++;\r\n\r\n if (!this.focused) {\r\n this.focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n onFocusOut(): void {\r\n const timeoutId = setTimeout(() => {\r\n this._removePendingTimeout(timeoutId);\r\n this._activeFocusCount--;\r\n if (this._activeFocusCount === 0) {\r\n this.focused = false;\r\n this._onTouchedChange();\r\n this.onBlur.next();\r\n this.stateChanges.next();\r\n }\r\n }, 0);\r\n this._pendingTimeouts.push(timeoutId);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.config.disableAutoFocus) {\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n if (containerItem) {\r\n const ele = containerItem.getElementsByClassName('cmat-otp-input')[0] as HTMLElement | null;\r\n if (ele?.focus) {\r\n ele.focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._pendingTimeouts.forEach(id => clearTimeout(id));\r\n this._pendingTimeouts = [];\r\n this._valueChangesSub?.unsubscribe();\r\n this._valueChangesSub = null;\r\n this.stateChanges.complete();\r\n this.otpForm.reset();\r\n }\r\n\r\n\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n private _placeholder: string = '';\r\n\r\n @Input()\r\n get value(): string | null {\r\n return this._value;\r\n }\r\n set value(value: string | null) {\r\n if (value !== this.value) {\r\n this._value = value;\r\n\r\n this.stateChanges.next();\r\n\r\n this._onModelChange(value);\r\n }\r\n }\r\n protected _value: string | null;\r\n\r\n get empty(): boolean {\r\n return !this._value;\r\n }\r\n\r\n get shouldLabelFloat(): boolean {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n @Input()\r\n get required(): boolean { return this._required; }\r\n set required(value: BooleanInput) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n protected _required = false;\r\n\r\n @Input()\r\n get disabled(): boolean {\r\n if (!isNil(this.ngControl?.disabled)) {\r\n return this.ngControl.disabled;\r\n }\r\n return this._disabled;\r\n }\r\n set disabled(value: BooleanInput) {\r\n this._disabled = coerceBooleanProperty(value);\r\n\r\n this.setDisabledState(this._disabled);\r\n\r\n if (this.focused) {\r\n this.focused = false;\r\n this.stateChanges.next();\r\n }\r\n }\r\n protected _disabled = false;\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n\r\n if (containerItem) {\r\n if (ids.length) {\r\n containerItem.setAttribute('aria-describedby', ids.join(' '));\r\n } else {\r\n containerItem.removeAttribute('aria-describedby');\r\n }\r\n }\r\n }\r\n\r\n onContainerClick(): void {\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n\r\n if (!this.focused && containerItem) {\r\n containerItem.focus();\r\n }\r\n }\r\n\r\n onKeyDown($event: KeyboardEvent, inputIdx: number): void {\r\n const inputTarget = $event.target as HTMLInputElement;\r\n const prevInputId = this.getBoxId(inputIdx - 1);\r\n const currentInputId = this.getBoxId(inputIdx);\r\n const nextInputId = this.getBoxId(inputIdx + 1);\r\n if (KeyboardUtil.ifSpacebar($event)) {\r\n $event.preventDefault();\r\n return;\r\n }\r\n if (KeyboardUtil.ifBackspace($event)) {\r\n if (!inputTarget.value) {\r\n this._clearInput(prevInputId, inputIdx - 1);\r\n this._setSelected(prevInputId);\r\n } else {\r\n this._clearInput(currentInputId, inputIdx);\r\n }\r\n this._rebuildValue();\r\n return;\r\n }\r\n if (KeyboardUtil.ifDelete($event)) {\r\n if (!inputTarget.value) {\r\n this._clearInput(prevInputId, inputIdx - 1);\r\n this._setSelected(prevInputId);\r\n } else {\r\n this._clearInput(currentInputId, inputIdx);\r\n }\r\n this._rebuildValue();\r\n return;\r\n }\r\n if (this.ifValidKeyCode($event)) {\r\n inputTarget.value = $event.key;\r\n const ctrlName = this._getControlName(inputIdx);\r\n this.otpForm.controls[ctrlName]?.setValue($event.key);\r\n $event.preventDefault();\r\n this._setSelected(nextInputId);\r\n this._rebuildValue();\r\n }\r\n }\r\n onInput($event: Event, inputIdx: number): void {\r\n const inputTarget = $event.target as HTMLInputElement;\r\n const newVal = this.currentVal ? `${this.currentVal}${inputTarget.value}` : inputTarget.value;\r\n if (this.config.allowNumbersOnly && !this.validateNumber(newVal)) {\r\n inputTarget.value = '';\r\n $event.stopPropagation();\r\n this._clearInput(null, inputIdx);\r\n this._rebuildValue();\r\n }\r\n }\r\n\r\n\r\n onKeyUp($event: KeyboardEvent, inputIdx: number): void {\r\n if (KeyboardUtil.ifTab($event)) {\r\n inputIdx -= 1;\r\n }\r\n const nextInputId = this.getBoxId(inputIdx + 1);\r\n const prevInputId = this.getBoxId(inputIdx - 1);\r\n if (KeyboardUtil.ifRightArrow($event)) {\r\n $event.preventDefault();\r\n this._setSelected(nextInputId);\r\n return;\r\n }\r\n if (KeyboardUtil.ifLeftArrow($event)) {\r\n $event.preventDefault();\r\n this._setSelected(prevInputId);\r\n return;\r\n }\r\n\r\n if (!($event.target as HTMLInputElement)?.value) {\r\n return;\r\n }\r\n }\r\n\r\n validateNumber(val: string): boolean {\r\n return !!val && /^[0-9]+$/.test(val);\r\n }\r\n\r\n getBoxId(idx: string | number): string {\r\n return `otp_${idx}_${this.componentKey}`;\r\n }\r\n\r\n focusTo(eleId: string): void {\r\n const ele = this._document.getElementById(eleId);\r\n if (ele) {\r\n ele.focus();\r\n }\r\n }\r\n\r\n setValue(value: string | null): void {\r\n if (this.config.allowNumbersOnly && isNaN(value as unknown as number)) {\r\n return;\r\n }\r\n this.otpForm.reset();\r\n if (!value) {\r\n this._rebuildValue();\r\n return;\r\n }\r\n value = value.toString().replace(/\\s/g, ''); // remove whitespace\r\n Array.from(value).forEach((c, idx) => {\r\n if (this.otpForm.get(this._getControlName(idx))) {\r\n this.otpForm.get(this._getControlName(idx))!.setValue(c);\r\n }\r\n });\r\n if (!this.config.disableAutoFocus) {\r\n const outerTimeoutId = setTimeout(() => {\r\n this._removePendingTimeout(outerTimeoutId);\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n if (!containerItem) return;\r\n const indexOfElementToFocus = value.length < this.config.length ? value.length : (this.config.length - 1);\r\n const ele: HTMLElement | null = containerItem.getElementsByClassName('cmat-otp-input')[indexOfElementToFocus] as HTMLElement | null;\r\n if (ele) {\r\n const innerTimeoutId = setTimeout(() => {\r\n this._removePendingTimeout(innerTimeoutId);\r\n ele.focus();\r\n }, 1);\r\n this._pendingTimeouts.push(innerTimeoutId);\r\n }\r\n }, 0);\r\n this._pendingTimeouts.push(outerTimeoutId);\r\n }\r\n this._rebuildValue();\r\n }\r\n\r\n handlePaste(e: ClipboardEvent): void {\r\n const clipboardData = e.clipboardData ?? (window as unknown as { clipboardData?: DataTransfer }).clipboardData;\r\n let pastedData = '';\r\n if (clipboardData) {\r\n pastedData = clipboardData.getData('Text');\r\n }\r\n e.stopPropagation();\r\n e.preventDefault();\r\n if (!pastedData || (this.config.allowNumbersOnly && !this.validateNumber(pastedData))) {\r\n return;\r\n }\r\n this.setValue(pastedData);\r\n }\r\n\r\n getFormControl(key: string): FormControl {\r\n return this.otpForm.controls[key] as FormControl;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n private _onModelChange: (value: string | null) => void = () => { };\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n private _onTouchedChange: () => void = () => { };\r\n\r\n private _removePendingTimeout(timeoutId: ReturnType<typeof setTimeout>): void {\r\n const idx = this._pendingTimeouts.indexOf(timeoutId);\r\n if (idx !== -1) {\r\n this._pendingTimeouts.splice(idx, 1);\r\n }\r\n }\r\n\r\n private _getControlName(idx: number): string {\r\n return `ctrl_${idx}`;\r\n }\r\n\r\n private _clearInput(eleId: string | null, inputIdx: number): void {\r\n const ctrlName = this._getControlName(inputIdx);\r\n this.otpForm.controls[ctrlName]?.setValue(null);\r\n if (eleId) {\r\n const ele = this._document.getElementById(eleId);\r\n if (ele && ele instanceof HTMLInputElement) {\r\n ele.value = '';\r\n }\r\n }\r\n }\r\n\r\n private _setSelected(eleId: string): void {\r\n this.focusTo(eleId);\r\n const ele = this._document.getElementById(eleId);\r\n if (ele instanceof HTMLInputElement) {\r\n const timeoutId = setTimeout(() => {\r\n this._removePendingTimeout(timeoutId);\r\n ele.setSelectionRange(0, 1);\r\n }, 0);\r\n this._pendingTimeouts.push(timeoutId);\r\n }\r\n }\r\n\r\n private ifValidKeyCode(event: KeyboardEvent): boolean {\r\n const inp: string = event.key;\r\n if (this.config?.allowNumbersOnly) {\r\n return this.validateNumber(inp);\r\n }\r\n const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\r\n return isMobile || (/^[a-zA-Z0-9%*_\\-@#$!]$/.test(inp) && inp.length === 1);\r\n }\r\n\r\n\r\n private _rebuildValue(): void {\r\n let val: string | null = null;\r\n Object.keys(this.otpForm.controls).forEach((k) => {\r\n let ctrlVal = this.otpForm.controls[k].value as string | null;\r\n if (typeof ctrlVal === 'string' && ctrlVal) {\r\n const isLengthExceed = ctrlVal.length > 1;\r\n ctrlVal = ctrlVal[0];\r\n const letterCase = this.config.letterCase?.toLocaleLowerCase();\r\n const isCaseTransformEnabled = !this.config.allowNumbersOnly && (letterCase === 'upper' || letterCase === 'lower');\r\n if (isCaseTransformEnabled) {\r\n ctrlVal = letterCase === 'upper' ? ctrlVal.toUpperCase() : ctrlVal.toLowerCase();\r\n this.otpForm.controls[k].setValue(ctrlVal);\r\n } else if (isLengthExceed) {\r\n this.otpForm.controls[k].setValue(ctrlVal);\r\n }\r\n val = val === null ? ctrlVal : val + ctrlVal;\r\n }\r\n });\r\n if (this.currentVal != val) {\r\n this.currentVal = val;\r\n this._onModelChange(val);\r\n this.onInputChange.emit(val);\r\n }\r\n }\r\n}","@if(otpForm.controls){\r\n<div class=\"cmat-otp-input-wrapper wrapper {{config.containerClass}}\" id=\"c_{{componentKey}}\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" [ngStyle]=\"config.containerStyles\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut()\">\r\n <div class=\"n-o-c\">\r\n @for (item of controlKeys; track item) {\r\n <input #inp class=\"cmat-otp-input {{config.inputClass}}\" autocomplete=\"one-time-code\" [pattern]=\"config.allowNumbersOnly ? '\\\\d*' : ''\"\r\n [type]=\"inputType\" [placeholder]=\"config.placeholder || ''\"\r\n [ngStyle]=\"config.inputStyles\" [id]=\"getBoxId($index)\"\r\n [ngClass]=\"{'error-input': (config.showError && errorState)}\"\r\n [formControl]=\"getFormControl(item)\" (paste)=\"handlePaste($event)\" (keyup)=\"onKeyUp($event,$index)\"\r\n (input)=\"onInput($event,$index)\" (keydown)=\"onKeyDown($event,$index)\">\r\n @if(config.separator && !$last){\r\n {{config.separator}}\r\n }\r\n }\r\n </div>\r\n</div>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cmat-components-opt-input.mjs","sources":["../../../projects/cmat/components/opt-input/utils/keyboard-util.ts","../../../projects/cmat/components/opt-input/otp-input.component.ts","../../../projects/cmat/components/opt-input/otp-input.component.html","../../../projects/cmat/components/opt-input/cmat-components-opt-input.ts"],"sourcesContent":["export class KeyboardUtil {\r\n static ifTab(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Tab');\r\n }\r\n static ifDelete(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Delete;Del');\r\n }\r\n static ifBackspace(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Backspace');\r\n }\r\n static ifRightArrow(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'ArrowRight;Right')\r\n }\r\n static ifLeftArrow(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'ArrowLeft;Left')\r\n }\r\n static ifSpacebar(event: KeyboardEvent): boolean {\r\n return this.ifKey(event, 'Spacebar; ')//don't remove the space after ; as this will check for space key\r\n }\r\n static ifKey(event: KeyboardEvent, keys: string): boolean {\r\n let keysToCheck = keys.split(';');\r\n return keysToCheck.some(k => k === event.key);\r\n }\r\n}\r\n"," \r\n/* eslint-disable @typescript-eslint/member-ordering */\r\nimport { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n AfterViewInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n DOCUMENT,\r\n inject,\r\n DestroyRef,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n Input,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControl, ReactiveFormsModule, ControlValueAccessor, FormBuilder, UntypedFormGroup, NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { OptInputConfig } from './models/config';\r\nimport { KeyboardUtil } from './utils/keyboard-util';\r\n\r\nlet NEXT_ID = 1;\r\n\r\n@Component({\r\n selector: 'cmat-otp-input',\r\n templateUrl: './otp-input.component.html',\r\n styleUrls: ['./otp-input.component.scss'],\r\n exportAs: 'cmatOtpInput',\r\n imports: [CommonModule, ReactiveFormsModule],\r\n providers: [{ provide: MatFormFieldControl, useExisting: CmatOtpInputComponent }],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n '[attr.id]': 'id',\r\n }\r\n})\r\nexport class CmatOtpInputComponent implements MatFormFieldControl<string | null>, AfterViewInit, OnDestroy, ControlValueAccessor {\r\n readonly config = input<OptInputConfig>({ length: 4 });\r\n\r\n readonly onBlur = output<void>();\r\n readonly onInputChange = output<string | null>();\r\n\r\n readonly id = `cmat-otp-input-${NEXT_ID}`;\r\n\r\n userAriaDescribedBy?: string;\r\n\r\n readonly stateChanges: Subject<void> = new Subject<void>();\r\n\r\n private readonly _placeholderSignal = signal<string>('');\r\n private readonly _requiredSignal = signal<boolean>(false);\r\n private readonly _disabledSignal = signal<boolean>(false);\r\n private readonly _valueSignal = signal<string | null>(null);\r\n private readonly _currentValSignal = signal<string | null>(null);\r\n\r\n private _focused = false;\r\n private _activeFocusCount = 0;\r\n\r\n readonly controlKeys = computed(() => Object.keys(this.otpForm?.controls ?? {}));\r\n\r\n readonly inputType = computed(() => {\r\n const cfg = this.config();\r\n return cfg?.isPasswordInput\r\n ? 'password'\r\n : cfg?.allowNumbersOnly\r\n ? 'tel'\r\n : 'text';\r\n });\r\n\r\n get errorState(): boolean {\r\n if (this.ngControl == null) return false;\r\n return (this.ngControl.invalid && ((this.ngControl.dirty ?? false) || this.ngControl.touched)) ?? false;\r\n }\r\n\r\n otpForm: UntypedFormGroup;\r\n componentKey = (NEXT_ID++).toString(36);\r\n\r\n ngControl = inject(NgControl, { optional: true, self: true })!;\r\n private readonly _document = inject<Document>(DOCUMENT);\r\n private readonly _formBuilder = inject(FormBuilder);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n private _valueChangesSub: Subscription | null = null;\r\n private _pendingTimeouts: ReturnType<typeof setTimeout>[] = [];\r\n\r\n constructor() {\r\n this.otpForm = this._formBuilder.group({});\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this._rebuildForm();\r\n }\r\n\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholderSignal();\r\n }\r\n\r\n set placeholder(value: string) {\r\n this._placeholderSignal.set(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get required(): boolean {\r\n return this._requiredSignal();\r\n }\r\n\r\n set required(value: BooleanInput) {\r\n this._requiredSignal.set(coerceBooleanProperty(value));\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get disabled(): boolean {\r\n if (!this.ngControl.disabled && this.ngControl.disabled !== null) {\r\n return this.ngControl.disabled;\r\n }\r\n return this._disabledSignal();\r\n }\r\n\r\n set disabled(value: BooleanInput) {\r\n const isDisabled = coerceBooleanProperty(value);\r\n this._disabledSignal.set(isDisabled);\r\n this.setDisabledState(isDisabled);\r\n\r\n if (isDisabled && this._focused) {\r\n this._focused = false;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n get focused(): boolean {\r\n return this._focused;\r\n }\r\n\r\n @Input()\r\n get value(): string | null {\r\n return this._valueSignal();\r\n }\r\n\r\n set value(val: string | null) {\r\n const current = this._valueSignal();\r\n if (val !== current) {\r\n this._valueSignal.set(val);\r\n this.stateChanges.next();\r\n this._onModelChange(val);\r\n }\r\n }\r\n\r\n get empty(): boolean {\r\n return !this._valueSignal();\r\n }\r\n\r\n get shouldLabelFloat(): boolean {\r\n return this._focused || !this.empty;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n if (this.otpForm) {\r\n if (isDisabled) {\r\n this.otpForm.disable({ emitEvent: false });\r\n } else {\r\n this.otpForm.enable({ emitEvent: false });\r\n }\r\n }\r\n this.stateChanges.next();\r\n }\r\n\r\n writeValue(value: string): void {\r\n this._currentValSignal.set(value || null);\r\n if (this.otpForm && this._currentValSignal()) {\r\n this.setValue(this._currentValSignal());\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this._onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouchedChange = fn;\r\n }\r\n\r\n onFocusIn(): void {\r\n this._onTouchedChange();\r\n this._activeFocusCount++;\r\n\r\n if (!this._focused) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n onFocusOut(): void {\r\n const timeoutId = setTimeout(() => {\r\n this._removePendingTimeout(timeoutId);\r\n this._activeFocusCount--;\r\n if (this._activeFocusCount === 0) {\r\n this._focused = false;\r\n this._onTouchedChange();\r\n this.onBlur.emit();\r\n this.stateChanges.next();\r\n }\r\n }, 0);\r\n this._pendingTimeouts.push(timeoutId);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.config().disableAutoFocus) {\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n if (containerItem) {\r\n const ele = containerItem.getElementsByClassName('cmat-otp-input')[0] as HTMLElement | null;\r\n if (ele?.focus) {\r\n ele.focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._pendingTimeouts.forEach(id => clearTimeout(id));\r\n this._pendingTimeouts = [];\r\n this._valueChangesSub?.unsubscribe();\r\n this._valueChangesSub = null;\r\n this.stateChanges.complete();\r\n this.otpForm.reset();\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n this.userAriaDescribedBy = ids.length ? ids.join(' ') : undefined;\r\n\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n if (containerItem) {\r\n if (ids.length) {\r\n containerItem.setAttribute('aria-describedby', ids.join(' '));\r\n } else {\r\n containerItem.removeAttribute('aria-describedby');\r\n }\r\n }\r\n this.stateChanges.next();\r\n }\r\n\r\n onContainerClick(): void {\r\n if (!this._focused) {\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n if (containerItem) {\r\n containerItem.focus();\r\n }\r\n }\r\n }\r\n\r\n onKeyDown($event: KeyboardEvent, inputIdx: number): void {\r\n const inputTarget = $event.target as HTMLInputElement;\r\n const prevInputId = this.getBoxId(inputIdx - 1);\r\n const currentInputId = this.getBoxId(inputIdx);\r\n const nextInputId = this.getBoxId(inputIdx + 1);\r\n\r\n if (KeyboardUtil.ifSpacebar($event)) {\r\n $event.preventDefault();\r\n return;\r\n }\r\n\r\n if (KeyboardUtil.ifBackspace($event)) {\r\n if (!inputTarget.value) {\r\n this._clearInput(prevInputId, inputIdx - 1);\r\n this._setSelected(prevInputId);\r\n } else {\r\n this._clearInput(currentInputId, inputIdx);\r\n }\r\n this._rebuildValue();\r\n return;\r\n }\r\n\r\n if (KeyboardUtil.ifDelete($event)) {\r\n if (!inputTarget.value) {\r\n this._clearInput(prevInputId, inputIdx - 1);\r\n this._setSelected(prevInputId);\r\n } else {\r\n this._clearInput(currentInputId, inputIdx);\r\n }\r\n this._rebuildValue();\r\n return;\r\n }\r\n\r\n if (this.ifValidKeyCode($event)) {\r\n inputTarget.value = $event.key;\r\n const ctrlName = this._getControlName(inputIdx);\r\n this.otpForm.controls[ctrlName]?.setValue($event.key);\r\n $event.preventDefault();\r\n this._setSelected(nextInputId);\r\n this._rebuildValue();\r\n }\r\n }\r\n\r\n onInput($event: Event, inputIdx: number): void {\r\n const inputTarget = $event.target as HTMLInputElement;\r\n const currentVal = this._currentValSignal();\r\n const newVal = currentVal ? `${currentVal}${inputTarget.value}` : inputTarget.value;\r\n\r\n if (this.config().allowNumbersOnly && !this.validateNumber(newVal)) {\r\n inputTarget.value = '';\r\n $event.stopPropagation();\r\n this._clearInput(null, inputIdx);\r\n this._rebuildValue();\r\n }\r\n }\r\n\r\n onKeyUp($event: KeyboardEvent, inputIdx: number): void {\r\n if (KeyboardUtil.ifTab($event)) {\r\n inputIdx -= 1;\r\n }\r\n\r\n const nextInputId = this.getBoxId(inputIdx + 1);\r\n const prevInputId = this.getBoxId(inputIdx - 1);\r\n\r\n if (KeyboardUtil.ifRightArrow($event)) {\r\n $event.preventDefault();\r\n this._setSelected(nextInputId);\r\n return;\r\n }\r\n\r\n if (KeyboardUtil.ifLeftArrow($event)) {\r\n $event.preventDefault();\r\n this._setSelected(prevInputId);\r\n return;\r\n }\r\n\r\n if (!($event.target as HTMLInputElement)?.value) {\r\n return;\r\n }\r\n }\r\n\r\n validateNumber(val: string): boolean {\r\n return !!val && /^[0-9]+$/.test(val);\r\n }\r\n\r\n getBoxId(idx: string | number): string {\r\n return `otp_${idx}_${this.componentKey}`;\r\n }\r\n\r\n focusTo(eleId: string): void {\r\n const ele = this._document.getElementById(eleId);\r\n if (ele) {\r\n ele.focus();\r\n }\r\n }\r\n\r\n setValue(value: string | null): void {\r\n const cfg = this.config();\r\n\r\n if (cfg.allowNumbersOnly && isNaN(value as unknown as number)) {\r\n return;\r\n }\r\n\r\n this.otpForm.reset();\r\n\r\n if (!value) {\r\n this._rebuildValue();\r\n return;\r\n }\r\n\r\n value = value.toString().replace(/\\s/g, '');\r\n\r\n Array.from(value).forEach((c, idx) => {\r\n if (this.otpForm.get(this._getControlName(idx))) {\r\n this.otpForm.get(this._getControlName(idx))!.setValue(c);\r\n }\r\n });\r\n\r\n if (!cfg.disableAutoFocus) {\r\n const outerTimeoutId = setTimeout(() => {\r\n this._removePendingTimeout(outerTimeoutId);\r\n const containerItem = this._document.getElementById(`c_${this.componentKey}`);\r\n if (!containerItem) return;\r\n\r\n const indexOfElementToFocus = value.length < cfg.length ? value.length : (cfg.length - 1);\r\n const ele: HTMLElement | null = containerItem.getElementsByClassName('cmat-otp-input')[indexOfElementToFocus] as HTMLElement | null;\r\n\r\n if (ele) {\r\n const innerTimeoutId = setTimeout(() => {\r\n this._removePendingTimeout(innerTimeoutId);\r\n ele.focus();\r\n }, 1);\r\n this._pendingTimeouts.push(innerTimeoutId);\r\n }\r\n }, 0);\r\n this._pendingTimeouts.push(outerTimeoutId);\r\n }\r\n\r\n this._rebuildValue();\r\n }\r\n\r\n handlePaste(e: ClipboardEvent): void {\r\n const clipboardData = e.clipboardData ?? (window as unknown as { clipboardData?: DataTransfer }).clipboardData;\r\n let pastedData = '';\r\n\r\n if (clipboardData) {\r\n pastedData = clipboardData.getData('Text');\r\n }\r\n\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n if (!pastedData || (this.config().allowNumbersOnly && !this.validateNumber(pastedData))) {\r\n return;\r\n }\r\n\r\n this.setValue(pastedData);\r\n }\r\n\r\n getFormControl(key: string): FormControl {\r\n return this.otpForm.controls[key] as FormControl;\r\n }\r\n\r\n\r\n private _onModelChange: (value: string | null) => void = () => { /* empty */ };\r\n\r\n private _onTouchedChange: () => void = () => { /* empty */ };\r\n\r\n private _removePendingTimeout(timeoutId: ReturnType<typeof setTimeout>): void {\r\n const idx = this._pendingTimeouts.indexOf(timeoutId);\r\n if (idx !== -1) {\r\n this._pendingTimeouts.splice(idx, 1);\r\n }\r\n }\r\n\r\n private _getControlName(idx: number): string {\r\n return `ctrl_${idx}`;\r\n }\r\n\r\n private _clearInput(eleId: string | null, inputIdx: number): void {\r\n const ctrlName = this._getControlName(inputIdx);\r\n this.otpForm.controls[ctrlName]?.setValue(null);\r\n\r\n if (eleId) {\r\n const ele = this._document.getElementById(eleId);\r\n if (ele && ele instanceof HTMLInputElement) {\r\n ele.value = '';\r\n }\r\n }\r\n }\r\n\r\n private _setSelected(eleId: string): void {\r\n this.focusTo(eleId);\r\n const ele = this._document.getElementById(eleId);\r\n\r\n if (ele instanceof HTMLInputElement) {\r\n const timeoutId = setTimeout(() => {\r\n this._removePendingTimeout(timeoutId);\r\n ele.setSelectionRange(0, 1);\r\n }, 0);\r\n this._pendingTimeouts.push(timeoutId);\r\n }\r\n }\r\n\r\n private ifValidKeyCode(event: KeyboardEvent): boolean {\r\n const inp: string = event.key;\r\n\r\n if (this.config()?.allowNumbersOnly) {\r\n return this.validateNumber(inp);\r\n }\r\n\r\n const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\r\n return isMobile || (/^[a-zA-Z0-9%*_\\-@#$!]$/.test(inp) && inp.length === 1);\r\n }\r\n\r\n private _rebuildValue(): void {\r\n let val: string | null = null;\r\n const cfg = this.config();\r\n\r\n Object.keys(this.otpForm.controls).forEach((k) => {\r\n let ctrlVal = this.otpForm.controls[k].value as string | null;\r\n\r\n if (typeof ctrlVal === 'string' && ctrlVal) {\r\n const isLengthExceed = ctrlVal.length > 1;\r\n ctrlVal = ctrlVal[0];\r\n\r\n const letterCase = cfg.letterCase?.toLocaleLowerCase();\r\n const isCaseTransformEnabled = !cfg.allowNumbersOnly && (letterCase === 'upper' || letterCase === 'lower');\r\n\r\n if (isCaseTransformEnabled) {\r\n ctrlVal = letterCase === 'upper' ? ctrlVal.toUpperCase() : ctrlVal.toLowerCase();\r\n this.otpForm.controls[k].setValue(ctrlVal);\r\n } else if (isLengthExceed) {\r\n this.otpForm.controls[k].setValue(ctrlVal);\r\n }\r\n\r\n val = val === null ? ctrlVal : val + ctrlVal;\r\n }\r\n });\r\n\r\n const currentVal = this._currentValSignal();\r\n if (currentVal != val) {\r\n this._currentValSignal.set(val);\r\n this._onModelChange(val);\r\n this.onInputChange.emit(val);\r\n }\r\n }\r\n\r\n private _rebuildForm(): void {\r\n this._valueChangesSub?.unsubscribe();\r\n this._valueChangesSub = null;\r\n this.otpForm = this._formBuilder.group({});\r\n\r\n for (let index = 0; index < this.config().length; index++) {\r\n this.otpForm.addControl(this._getControlName(index), new FormControl());\r\n }\r\n\r\n this._valueChangesSub = this.otpForm.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\r\n Object.keys(this.otpForm.controls).forEach((k) => {\r\n const val = this.otpForm.controls[k].value as string | null;\r\n if (typeof val === 'string' && val.length > 1) {\r\n if (val.length >= this.config().length) {\r\n this.setValue(val);\r\n } else {\r\n this._rebuildValue();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n}","@if(otpForm.controls){\r\n<div class=\"cmat-otp-input-wrapper wrapper {{config().containerClass}}\" id=\"c_{{componentKey}}\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" [ngStyle]=\"config().containerStyles\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut()\">\r\n <div class=\"n-o-c\">\r\n @for (item of controlKeys(); track item) {\r\n <input #inp class=\"cmat-otp-input {{config().inputClass}}\" autocomplete=\"one-time-code\" [pattern]=\"config().allowNumbersOnly ? '\\\\d*' : ''\"\r\n [type]=\"inputType()\" [placeholder]=\"config().placeholder || ''\"\r\n [ngStyle]=\"config().inputStyles\" [id]=\"getBoxId($index)\"\r\n [ngClass]=\"{'error-input': (config().showError && errorState)}\"\r\n [formControl]=\"getFormControl(item)\" (paste)=\"handlePaste($event)\" (keyup)=\"onKeyUp($event,$index)\"\r\n (input)=\"onInput($event,$index)\" (keydown)=\"onKeyDown($event,$index)\">\r\n @if(config().separator && !$last){\r\n {{config().separator}}\r\n }\r\n }\r\n </div>\r\n</div>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;MAAa,YAAY,CAAA;IACrB,OAAO,KAAK,CAAC,KAAoB,EAAA;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;IACnC;IACA,OAAO,QAAQ,CAAC,KAAoB,EAAA;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC;IAC1C;IACA,OAAO,WAAW,CAAC,KAAoB,EAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC;IACzC;IACA,OAAO,YAAY,CAAC,KAAoB,EAAA;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,kBAAkB,CAAC;IAChD;IACA,OAAO,WAAW,CAAC,KAAoB,EAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC;IAC9C;IACA,OAAO,UAAU,CAAC,KAAoB,EAAA;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;IAC1C;AACA,IAAA,OAAO,KAAK,CAAC,KAAoB,EAAE,IAAY,EAAA;QAC3C,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACjC,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC;IACjD;AACH;;ACtBD;AAyBA,IAAI,OAAO,GAAG,CAAC;MAgBF,qBAAqB,CAAA;AAgC9B,IAAA,IAAI,UAAU,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;AAAE,YAAA,OAAO,KAAK;QACxC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,KAAK;IAC3G;AAYA,IAAA,WAAA,GAAA;AA9CS,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAiB,EAAE,MAAM,EAAE,CAAC,EAAE;mFAAC;QAE7C,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QACvB,IAAA,CAAA,aAAa,GAAG,MAAM,EAAiB;AAEvC,QAAA,IAAA,CAAA,EAAE,GAAG,CAAA,eAAA,EAAkB,OAAO,CAAA,CAAE;AAIhC,QAAA,IAAA,CAAA,YAAY,GAAkB,IAAI,OAAO,EAAQ;QAEzC,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAS,EAAE;+FAAC;QACvC,IAAA,CAAA,eAAe,GAAG,MAAM,CAAU,KAAK;4FAAC;QACxC,IAAA,CAAA,eAAe,GAAG,MAAM,CAAU,KAAK;4FAAC;QACxC,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgB,IAAI;yFAAC;QAC1C,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI;8FAAC;QAExD,IAAA,CAAA,QAAQ,GAAG,KAAK;QAChB,IAAA,CAAA,iBAAiB,GAAG,CAAC;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;wFAAC;AAEvE,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC/B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;YACzB,OAAO,GAAG,EAAE;AACR,kBAAE;kBACA,GAAG,EAAE;AACH,sBAAE;sBACA,MAAM;QACpB,CAAC;sFAAC;QAQF,IAAA,CAAA,YAAY,GAAG,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;AAEvC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAE;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAW,QAAQ,CAAC;AACtC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;AAClC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACzC,IAAA,CAAA,gBAAgB,GAAwB,IAAI;QAC5C,IAAA,CAAA,gBAAgB,GAAoC,EAAE;AA+UtD,QAAA,IAAA,CAAA,cAAc,GAAmC,MAAK,EAAe,CAAC;AAEtE,QAAA,IAAA,CAAA,gBAAgB,GAAe,MAAK,EAAe,CAAC;QA9UxD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;AAE1C,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACvC;QAEA,IAAI,CAAC,YAAY,EAAE;IACvB;AAEA,IAAA,IACI,WAAW,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,kBAAkB,EAAE;IACpC;IAEA,IAAI,WAAW,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC5B;AAEA,IAAA,IACI,QAAQ,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE;IACjC;IAEA,IAAI,QAAQ,CAAC,KAAmB,EAAA;QAC5B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC5B;AAEA,IAAA,IACI,QAAQ,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,EAAE;AAC9D,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ;QAClC;AACA,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE;IACjC;IAEA,IAAI,QAAQ,CAAC,KAAmB,EAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC;AAC/C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AAEjC,QAAA,IAAI,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QAC5B;IACJ;AAEA,IAAA,IAAI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;AAEA,IAAA,IACI,KAAK,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;IAC9B;IAEA,IAAI,KAAK,CAAC,GAAkB,EAAA;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,IAAI,GAAG,KAAK,OAAO,EAAE;AACjB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QAC5B;IACJ;AAEA,IAAA,IAAI,KAAK,GAAA;AACL,QAAA,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE;IAC/B;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAChB,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK;IACvC;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,UAAU,EAAE;gBACZ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC9C;iBAAO;gBACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC7C;QACJ;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC5B;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACpB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;QACzC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC1C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3C;IACJ;AAEA,IAAA,gBAAgB,CAAC,EAAkC,EAAA;AAC/C,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;IAC5B;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;IAC9B;IAEA,SAAS,GAAA;QACL,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,iBAAiB,EAAE;AAExB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QAC5B;IACJ;IAEA,UAAU,GAAA;AACN,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAK;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;YACrC,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,CAAC,EAAE;AAC9B,gBAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;gBACrB,IAAI,CAAC,gBAAgB,EAAE;AACvB,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAClB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAC5B;QACJ,CAAC,EAAE,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;IACzC;IAEA,eAAe,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE;AACjC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,CAAA,CAAE,CAAC;YAC7E,IAAI,aAAa,EAAE;gBACf,MAAM,GAAG,GAAG,aAAa,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAuB;AAC3F,gBAAA,IAAI,GAAG,EAAE,KAAK,EAAE;oBACZ,GAAG,CAAC,KAAK,EAAE;gBACf;YACJ;QACJ;IACJ;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,QAAA,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE;AACpC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACxB;AAEA,IAAA,iBAAiB,CAAC,GAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS;AAEjE,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,CAAA,CAAE,CAAC;QAC7E,IAAI,aAAa,EAAE;AACf,YAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACZ,gBAAA,aAAa,CAAC,YAAY,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjE;iBAAO;AACH,gBAAA,aAAa,CAAC,eAAe,CAAC,kBAAkB,CAAC;YACrD;QACJ;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC5B;IAEA,gBAAgB,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChB,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,CAAA,CAAE,CAAC;YAC7E,IAAI,aAAa,EAAE;gBACf,aAAa,CAAC,KAAK,EAAE;YACzB;QACJ;IACJ;IAEA,SAAS,CAAC,MAAqB,EAAE,QAAgB,EAAA;AAC7C,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAA0B;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;AAE/C,QAAA,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,CAAC,cAAc,EAAE;YACvB;QACJ;AAEA,QAAA,IAAI,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;gBACpB,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,GAAG,CAAC,CAAC;AAC3C,gBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;YAClC;iBAAO;AACH,gBAAA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC;YAC9C;YACA,IAAI,CAAC,aAAa,EAAE;YACpB;QACJ;AAEA,QAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC/B,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;gBACpB,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,GAAG,CAAC,CAAC;AAC3C,gBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;YAClC;iBAAO;AACH,gBAAA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC;YAC9C;YACA,IAAI,CAAC,aAAa,EAAE;YACpB;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;AAC7B,YAAA,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC/C,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;YACrD,MAAM,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;YAC9B,IAAI,CAAC,aAAa,EAAE;QACxB;IACJ;IAEA,OAAO,CAAC,MAAa,EAAE,QAAgB,EAAA;AACnC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAA0B;AACrD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC3C,QAAA,MAAM,MAAM,GAAG,UAAU,GAAG,GAAG,UAAU,CAAA,EAAG,WAAW,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,KAAK;AAEnF,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;AAChE,YAAA,WAAW,CAAC,KAAK,GAAG,EAAE;YACtB,MAAM,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;YAChC,IAAI,CAAC,aAAa,EAAE;QACxB;IACJ;IAEA,OAAO,CAAC,MAAqB,EAAE,QAAgB,EAAA;AAC3C,QAAA,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAC5B,QAAQ,IAAI,CAAC;QACjB;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;AAE/C,QAAA,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YACnC,MAAM,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;YAC9B;QACJ;AAEA,QAAA,IAAI,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;YAClC,MAAM,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;YAC9B;QACJ;AAEA,QAAA,IAAI,CAAE,MAAM,CAAC,MAA2B,EAAE,KAAK,EAAE;YAC7C;QACJ;IACJ;AAEA,IAAA,cAAc,CAAC,GAAW,EAAA;QACtB,OAAO,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;IACxC;AAEA,IAAA,QAAQ,CAAC,GAAoB,EAAA;AACzB,QAAA,OAAO,OAAO,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,YAAY,EAAE;IAC5C;AAEA,IAAA,OAAO,CAAC,KAAa,EAAA;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC;QAChD,IAAI,GAAG,EAAE;YACL,GAAG,CAAC,KAAK,EAAE;QACf;IACJ;AAEA,IAAA,QAAQ,CAAC,KAAoB,EAAA;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QAEzB,IAAI,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAA0B,CAAC,EAAE;YAC3D;QACJ;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;QAEpB,IAAI,CAAC,KAAK,EAAE;YACR,IAAI,CAAC,aAAa,EAAE;YACpB;QACJ;AAEA,QAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAE3C,QAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;AACjC,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE;AAC7C,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE;AACvB,YAAA,MAAM,cAAc,GAAG,UAAU,CAAC,MAAK;AACnC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC;AAC1C,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,CAAA,CAAE,CAAC;AAC7E,gBAAA,IAAI,CAAC,aAAa;oBAAE;gBAEpB,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzF,MAAM,GAAG,GAAuB,aAAa,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAuB;gBAEnI,IAAI,GAAG,EAAE;AACL,oBAAA,MAAM,cAAc,GAAG,UAAU,CAAC,MAAK;AACnC,wBAAA,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC;wBAC1C,GAAG,CAAC,KAAK,EAAE;oBACf,CAAC,EAAE,CAAC,CAAC;AACL,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC;gBAC9C;YACJ,CAAC,EAAE,CAAC,CAAC;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC;QAC9C;QAEA,IAAI,CAAC,aAAa,EAAE;IACxB;AAEA,IAAA,WAAW,CAAC,CAAiB,EAAA;QACzB,MAAM,aAAa,GAAG,CAAC,CAAC,aAAa,IAAK,MAAsD,CAAC,aAAa;QAC9G,IAAI,UAAU,GAAG,EAAE;QAEnB,IAAI,aAAa,EAAE;AACf,YAAA,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9C;QAEA,CAAC,CAAC,eAAe,EAAE;QACnB,CAAC,CAAC,cAAc,EAAE;QAElB,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,EAAE;YACrF;QACJ;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC7B;AAEA,IAAA,cAAc,CAAC,GAAW,EAAA;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpD;AAOQ,IAAA,qBAAqB,CAAC,SAAwC,EAAA;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;AACpD,QAAA,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC;IACJ;AAEQ,IAAA,eAAe,CAAC,GAAW,EAAA;QAC/B,OAAO,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE;IACxB;IAEQ,WAAW,CAAC,KAAoB,EAAE,QAAgB,EAAA;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC/C,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;QAE/C,IAAI,KAAK,EAAE;YACP,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,YAAA,IAAI,GAAG,IAAI,GAAG,YAAY,gBAAgB,EAAE;AACxC,gBAAA,GAAG,CAAC,KAAK,GAAG,EAAE;YAClB;QACJ;IACJ;AAEQ,IAAA,YAAY,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC;AAEhD,QAAA,IAAI,GAAG,YAAY,gBAAgB,EAAE;AACjC,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAK;AAC9B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;AACrC,gBAAA,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC,EAAE,CAAC,CAAC;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC;IACJ;AAEQ,IAAA,cAAc,CAAC,KAAoB,EAAA;AACvC,QAAA,MAAM,GAAG,GAAW,KAAK,CAAC,GAAG;AAE7B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE;AACjC,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QACnC;QAEA,MAAM,QAAQ,GAAG,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AACtE,QAAA,OAAO,QAAQ,KAAK,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;IAC/E;IAEQ,aAAa,GAAA;QACjB,IAAI,GAAG,GAAkB,IAAI;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AAEzB,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAC7C,YAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAsB;AAE7D,YAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE;AACxC,gBAAA,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;AACzC,gBAAA,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;gBAEpB,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE;AACtD,gBAAA,MAAM,sBAAsB,GAAG,CAAC,GAAG,CAAC,gBAAgB,KAAK,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,OAAO,CAAC;gBAE1G,IAAI,sBAAsB,EAAE;AACxB,oBAAA,OAAO,GAAG,UAAU,KAAK,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE;AAChF,oBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC9C;qBAAO,IAAI,cAAc,EAAE;AACvB,oBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC9C;AAEA,gBAAA,GAAG,GAAG,GAAG,KAAK,IAAI,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO;YAChD;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC3C,QAAA,IAAI,UAAU,IAAI,GAAG,EAAE;AACnB,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAChC;IACJ;IAEQ,YAAY,GAAA;AAChB,QAAA,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE;AACpC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;AAE1C,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACvD,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,WAAW,EAAE,CAAC;QAC3E;QAEA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;AACxG,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAC7C,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAsB;gBAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3C,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;AACpC,wBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;oBACtB;yBAAO;wBACH,IAAI,CAAC,aAAa,EAAE;oBACxB;gBACJ;AACJ,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;8GAreS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,szBARnB,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClCrF,skCAiBC,EAAA,MAAA,EAAA,CAAA,msBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDgBa,YAAY,iNAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FASlC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;+BACI,gBAAgB,EAAA,QAAA,EAGhB,cAAc,EAAA,OAAA,EACf,CAAC,YAAY,EAAE,mBAAmB,CAAC,EAAA,SAAA,EACjC,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAA,qBAAuB,EAAE,CAAC,EAAA,aAAA,EAClE,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;;AAEF,wBAAA,WAAW,EAAE,IAAI;AACpB,qBAAA,EAAA,QAAA,EAAA,skCAAA,EAAA,MAAA,EAAA,CAAA,msBAAA,CAAA,EAAA;;sBA2DA;;sBAUA;;sBAUA;;sBAuBA;;;AE9IL;;AAEG;;;;"}