@tolle_/tolle-ui 18.2.20 → 18.2.21

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.
@@ -29,6 +29,7 @@ export class PhoneNumberInputComponent {
29
29
  displayValue = '';
30
30
  selectedIso = '';
31
31
  rawValue = '';
32
+ isFocused = false;
32
33
  cn = cn;
33
34
  onChange = () => { };
34
35
  onTouched = () => { };
@@ -38,23 +39,14 @@ export class PhoneNumberInputComponent {
38
39
  get computedLabelClass() {
39
40
  return cn('text-sm font-medium text-foreground leading-none transition-opacity duration-200', this.disabled && 'opacity-50');
40
41
  }
41
- get computedMergedClass() {
42
- return cn('group relative flex items-center w-full rounded-md border transition-all duration-200', 'bg-background border-input shadow-sm', this.size === 'xs' && 'h-8', this.size === 'sm' && 'h-9', this.size === 'default' && 'h-10', this.size === 'lg' && 'h-11',
43
- // Focus state
44
- !this.readonly &&
45
- !this.disabled && [
46
- 'focus-within:ring-4',
47
- 'focus-within:ring-ring/30',
48
- 'focus-within:ring-offset-0',
49
- 'focus-within:shadow-none',
50
- this.error ? 'focus-within:border-destructive/80' : 'focus-within:border-primary/80',
51
- ],
52
- // Error state
53
- this.error && 'border-destructive', this.error && !this.readonly && !this.disabled && 'focus-within:ring-destructive/30',
54
- // Disabled state
55
- this.disabled && ['cursor-not-allowed opacity-50', 'border-opacity-50'],
56
- // Readonly state
57
- this.readonly && 'cursor-default border-dashed', this.class);
42
+ onFocusIn() {
43
+ this.isFocused = true;
44
+ this.cdr.markForCheck();
45
+ }
46
+ onFocusOut() {
47
+ this.isFocused = false;
48
+ this.onTouched();
49
+ this.cdr.markForCheck();
58
50
  }
59
51
  writeValue(value) {
60
52
  if (value) {
@@ -137,16 +129,18 @@ export class PhoneNumberInputComponent {
137
129
  {{ label }}
138
130
  </label>
139
131
 
140
- <div [class]="computedMergedClass">
132
+ <div class="flex gap-2" (focusin)="onFocusIn()" (focusout)="onFocusOut()">
141
133
  <tolle-country-selector
142
134
  class="flex-shrink-0"
143
135
  [showName]="false"
144
136
  [size]="size"
145
137
  [disabled]="disabled || !enableCountrySelector"
146
138
  [readonly]="readonly"
147
- [mergedPosition]="'left'"
139
+ [externalFocused]="isFocused"
148
140
  [(ngModel)]="selectedIso"
149
- (ngModelChange)="onCountryChange($event)"></tolle-country-selector>
141
+ (ngModelChange)="onCountryChange($event)"
142
+ (onFocusChange)="onFocusIn()"
143
+ (onBlurChange)="onFocusOut()"></tolle-country-selector>
150
144
 
151
145
  <tolle-masked-input
152
146
  class="min-w-0 flex-1"
@@ -157,7 +151,7 @@ export class PhoneNumberInputComponent {
157
151
  [readonly]="readonly"
158
152
  [placeholder]="placeholder"
159
153
  [error]="error"
160
- [mergedPosition]="'right'"
154
+ [externalFocused]="isFocused"
161
155
  [(ngModel)]="displayValue"
162
156
  (ngModelChange)="onMaskInputChange($event)"></tolle-masked-input>
163
157
  </div>
@@ -165,7 +159,8 @@ export class PhoneNumberInputComponent {
165
159
  <ng-container *ngIf="!disabled">
166
160
  <p
167
161
  *ngIf="hint && !error"
168
- class="px-1 text-xs text-muted-foreground transition-opacity duration-200">
162
+ class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
163
+ [class.opacity-0]="isFocused && hideHintOnFocus">
169
164
  {{ hint }}
170
165
  </p>
171
166
  <p *ngIf="error && errorMessage" [id]="id + '-error'" class="px-1 text-xs text-destructive">
@@ -173,7 +168,7 @@ export class PhoneNumberInputComponent {
173
168
  </p>
174
169
  </ng-container>
175
170
  </div>
176
- `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CountrySelectorComponent, selector: "tolle-country-selector", inputs: ["id", "label", "hint", "errorMessage", "error", "hideHintOnFocus", "placeholder", "class", "disabled", "readonly", "size", "defaultCountryCode", "returnValue", "showName", "mergedPosition"], outputs: ["onSelect", "onFocusChange", "onBlurChange"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "mergedPosition"] }] });
171
+ `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CountrySelectorComponent, selector: "tolle-country-selector", inputs: ["id", "label", "hint", "errorMessage", "error", "hideHintOnFocus", "placeholder", "class", "disabled", "readonly", "size", "defaultCountryCode", "returnValue", "showName", "externalFocused"], outputs: ["onSelect", "onFocusChange", "onBlurChange"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "externalFocused"] }] });
177
172
  }
178
173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PhoneNumberInputComponent, decorators: [{
179
174
  type: Component,
@@ -183,16 +178,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
183
178
  {{ label }}
184
179
  </label>
185
180
 
186
- <div [class]="computedMergedClass">
181
+ <div class="flex gap-2" (focusin)="onFocusIn()" (focusout)="onFocusOut()">
187
182
  <tolle-country-selector
188
183
  class="flex-shrink-0"
189
184
  [showName]="false"
190
185
  [size]="size"
191
186
  [disabled]="disabled || !enableCountrySelector"
192
187
  [readonly]="readonly"
193
- [mergedPosition]="'left'"
188
+ [externalFocused]="isFocused"
194
189
  [(ngModel)]="selectedIso"
195
- (ngModelChange)="onCountryChange($event)"></tolle-country-selector>
190
+ (ngModelChange)="onCountryChange($event)"
191
+ (onFocusChange)="onFocusIn()"
192
+ (onBlurChange)="onFocusOut()"></tolle-country-selector>
196
193
 
197
194
  <tolle-masked-input
198
195
  class="min-w-0 flex-1"
@@ -203,7 +200,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
203
200
  [readonly]="readonly"
204
201
  [placeholder]="placeholder"
205
202
  [error]="error"
206
- [mergedPosition]="'right'"
203
+ [externalFocused]="isFocused"
207
204
  [(ngModel)]="displayValue"
208
205
  (ngModelChange)="onMaskInputChange($event)"></tolle-masked-input>
209
206
  </div>
@@ -211,7 +208,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
211
208
  <ng-container *ngIf="!disabled">
212
209
  <p
213
210
  *ngIf="hint && !error"
214
- class="px-1 text-xs text-muted-foreground transition-opacity duration-200">
211
+ class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
212
+ [class.opacity-0]="isFocused && hideHintOnFocus">
215
213
  {{ hint }}
216
214
  </p>
217
215
  <p *ngIf="error && errorMessage" [id]="id + '-error'" class="px-1 text-xs text-destructive">
@@ -259,4 +257,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
259
257
  }], onSelect: [{
260
258
  type: Output
261
259
  }] } });
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvcGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sZ0JBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7OztBQWlFaEMsTUFBTSxPQUFPLHlCQUF5QjtJQUM1QixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLElBQUksR0FBRyxFQUFFLENBQUM7SUFDVixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFDN0IsSUFBSSxHQUFtQyxTQUFTLENB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QixFQUFFLG9CQUFvQixDQUFDLFlBQzFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ1QsYUFTVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7d0RBS1EsRUFBRTtzQkFBVixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ291bnRyeVNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb3VudHJ5LXNlbGVjdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXNrZWRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vbWFza2VkLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgcGFyc2VQaG9uZU51bWJlciBmcm9tICdsaWJwaG9uZW51bWJlci1qcyc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1waG9uZS1udW1iZXItaW5wdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ291bnRyeVNlbGVjdG9yQ29tcG9uZW50LCBNYXNrZWRJbnB1dENvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGdhcC0xLjVcIj5cbiAgICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpZFwiIFtjbGFzc109XCJjb21wdXRlZExhYmVsQ2xhc3NcIj5cbiAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDwvbGFiZWw+XG5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImNvbXB1dGVkTWVyZ2VkQ2xhc3NcIj5cbiAgICAgICAgPHRvbGxlLWNvdW50cnktc2VsZWN0b3JcbiAgICAgICAgICBjbGFzcz1cImZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgIFtzaG93TmFtZV09XCJmYWxzZVwiXG4gICAgICAgICAgW3NpemVdPVwic2l6ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8ICFlbmFibGVDb3VudHJ5U2VsZWN0b3JcIlxuICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgW21lcmdlZFBvc2l0aW9uXT1cIidsZWZ0J1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZElzb1wiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db3VudHJ5Q2hhbmdlKCRldmVudClcIj48L3RvbGxlLWNvdW50cnktc2VsZWN0b3I+XG5cbiAgICAgICAgPHRvbGxlLW1hc2tlZC1pbnB1dFxuICAgICAgICAgIGNsYXNzPVwibWluLXctMCBmbGV4LTFcIlxuICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgW21hc2tdPVwibWFza1wiXG4gICAgICAgICAgW3NpemVdPVwic2l6ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW2Vycm9yXT1cImVycm9yXCJcbiAgICAgICAgICBbbWVyZ2VkUG9zaXRpb25dPVwiJ3JpZ2h0J1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJkaXNwbGF5VmFsdWVcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWFza0lucHV0Q2hhbmdlKCRldmVudClcIj48L3RvbGxlLW1hc2tlZC1pbnB1dD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRpc2FibGVkXCI+XG4gICAgICAgIDxwXG4gICAgICAgICAgKm5nSWY9XCJoaW50ICYmICFlcnJvclwiXG4gICAgICAgICAgY2xhc3M9XCJweC0xIHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tb3BhY2l0eSBkdXJhdGlvbi0yMDBcIj5cbiAgICAgICAgICB7eyBoaW50IH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgKm5nSWY9XCJlcnJvciAmJiBlcnJvck1lc3NhZ2VcIiBbaWRdPVwiaWQgKyAnLWVycm9yJ1wiIGNsYXNzPVwicHgtMSB0ZXh0LXhzIHRleHQtZGVzdHJ1Y3RpdmVcIj5cbiAgICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGhvbmVOdW1iZXJJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQaG9uZU51bWJlcklucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgQElucHV0KCkgaWQgPSBgcGhvbmUtaW5wdXQtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgaGludCA9ICcnO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2UgPSAnJztcbiAgQElucHV0KCkgZXJyb3IgPSBmYWxzZTtcbiAgQElucHV0KCkgaGlkZUhpbnRPbkZvY3VzID0gdHJ1ZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnUGhvbmUgbnVtYmVyJztcbiAgQElucHV0KCkgc2l6ZTogJ3hzJyB8ICdzbScgfCAnZGVmYXVsdCcgfCAnbGcnID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWZhdWx0Q291bnRyeUNvZGUgPSAnR0gnO1xuICBASW5wdXQoKSBkYXRhVHlwZTogJ051bWJlck9ubHknIHwgJ0Z1bGxPYmplY3QnID0gJ0Z1bGxPYmplY3QnO1xuICBASW5wdXQoKSBtYXNrID0gJygwMDApIDAwMC0wMDAwJztcbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgQElucHV0KCkgZW5hYmxlQ291bnRyeVNlbGVjdG9yID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBkaXNwbGF5VmFsdWUgPSAnJztcbiAgc2VsZWN0ZWRJc28gPSAnJztcbiAgcHJpdmF0ZSByYXdWYWx1ZSA9ICcnO1xuXG4gIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXNvID0gdGhpcy5kZWZhdWx0Q291bnRyeUNvZGU7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRMYWJlbENsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgICd0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCBsZWFkaW5nLW5vbmUgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMCcsXG4gICAgICB0aGlzLmRpc2FibGVkICYmICdvcGFjaXR5LTUwJ1xuICAgICk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRNZXJnZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAnZ3JvdXAgcmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAnYmctYmFja2dyb3VuZCBib3JkZXItaW5wdXQgc2hhZG93LXNtJyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ3hzJyAmJiAnaC04JyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ3NtJyAmJiAnaC05JyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ2RlZmF1bHQnICYmICdoLTEwJyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ2xnJyAmJiAnaC0xMScsXG4gICAgICAvLyBGb2N1cyBzdGF0ZVxuICAgICAgIXRoaXMucmVhZG9ubHkgJiZcbiAgICAgICAgIXRoaXMuZGlzYWJsZWQgJiYgW1xuICAgICAgICAgICdmb2N1cy13aXRoaW46cmluZy00JyxcbiAgICAgICAgICAnZm9jdXMtd2l0aGluOnJpbmctcmluZy8zMCcsXG4gICAgICAgICAgJ2ZvY3VzLXdpdGhpbjpyaW5nLW9mZnNldC0wJyxcbiAgICAgICAgICAnZm9jdXMtd2l0aGluOnNoYWRvdy1ub25lJyxcbiAgICAgICAgICB0aGlzLmVycm9yID8gJ2ZvY3VzLXdpdGhpbjpib3JkZXItZGVzdHJ1Y3RpdmUvODAnIDogJ2ZvY3VzLXdpdGhpbjpib3JkZXItcHJpbWFyeS84MCcsXG4gICAgICAgIF0sXG4gICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgdGhpcy5lcnJvciAmJiAnYm9yZGVyLWRlc3RydWN0aXZlJyxcbiAgICAgIHRoaXMuZXJyb3IgJiYgIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMuZGlzYWJsZWQgJiYgJ2ZvY3VzLXdpdGhpbjpyaW5nLWRlc3RydWN0aXZlLzMwJyxcbiAgICAgIC8vIERpc2FibGVkIHN0YXRlXG4gICAgICB0aGlzLmRpc2FibGVkICYmIFsnY3Vyc29yLW5vdC1hbGxvd2VkIG9wYWNpdHktNTAnLCAnYm9yZGVyLW9wYWNpdHktNTAnXSxcbiAgICAgIC8vIFJlYWRvbmx5IHN0YXRlXG4gICAgICB0aGlzLnJlYWRvbmx5ICYmICdjdXJzb3ItZGVmYXVsdCBib3JkZXItZGFzaGVkJyxcbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5udW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZElzbyA9IHZhbHVlLmNvdW50cnkgfHwgdGhpcy5kZWZhdWx0Q291bnRyeUNvZGU7XG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdmFsdWUubnVtYmVyO1xuICAgICAgICB0aGlzLnJhd1ZhbHVlID0gdmFsdWUubnVtYmVyLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnJhd1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlUGhvbmVOdW1iZXIodmFsdWUpO1xuICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJc28gPSBwYXJzZWQuY291bnRyeSB8fCB0aGlzLmRlZmF1bHRDb3VudHJ5Q29kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gJyc7XG4gICAgICB0aGlzLnJhd1ZhbHVlID0gJyc7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ291bnRyeUNoYW5nZShpc286IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRJc28gPSBpc287XG4gICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICB9XG5cbiAgb25NYXNrSW5wdXRDaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5yYXdWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb2RlbCgpIHtcbiAgICBpZiAoIXRoaXMucmF3VmFsdWUpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlUGhvbmVOdW1iZXIodGhpcy5yYXdWYWx1ZSwgdGhpcy5zZWxlY3RlZElzbyBhcyBhbnkpO1xuICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ0Z1bGxPYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZShwYXJzZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UocGFyc2VkLm51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHBhcnNlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucmF3VmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5yYXdWYWx1ZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvcGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sZ0JBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7OztBQW9FaEMsTUFBTSxPQUFPLHlCQUF5QjtJQUM1QixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLElBQUksR0FBRyxFQUFFLENBQUM7SUFDVixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFDN0IsSUFBSSxHQUFtQyxTQUFTLENB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S0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvdW50cnlTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4vY291bnRyeS1zZWxlY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFza2VkSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL21hc2tlZC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHBhcnNlUGhvbmVOdW1iZXIgZnJvbSAnbGlicGhvbmVudW1iZXItanMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtcGhvbmUtbnVtYmVyLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIENvdW50cnlTZWxlY3RvckNvbXBvbmVudCwgTWFza2VkSW5wdXRDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBmbGV4LWNvbCBnYXAtMS41XCI+XG4gICAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIiBbY2xhc3NdPVwiY29tcHV0ZWRMYWJlbENsYXNzXCI+XG4gICAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8L2xhYmVsPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiIChmb2N1c2luKT1cIm9uRm9jdXNJbigpXCIgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiPlxuICAgICAgICA8dG9sbGUtY291bnRyeS1zZWxlY3RvclxuICAgICAgICAgIGNsYXNzPVwiZmxleC1zaHJpbmstMFwiXG4gICAgICAgICAgW3Nob3dOYW1lXT1cImZhbHNlXCJcbiAgICAgICAgICBbc2l6ZV09XCJzaXplXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgIWVuYWJsZUNvdW50cnlTZWxlY3RvclwiXG4gICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICBbZXh0ZXJuYWxGb2N1c2VkXT1cImlzRm9jdXNlZFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZElzb1wiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db3VudHJ5Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChvbkZvY3VzQ2hhbmdlKT1cIm9uRm9jdXNJbigpXCJcbiAgICAgICAgICAob25CbHVyQ2hhbmdlKT1cIm9uRm9jdXNPdXQoKVwiPjwvdG9sbGUtY291bnRyeS1zZWxlY3Rvcj5cblxuICAgICAgICA8dG9sbGUtbWFza2VkLWlucHV0XG4gICAgICAgICAgY2xhc3M9XCJtaW4tdy0wIGZsZXgtMVwiXG4gICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICBbbWFza109XCJtYXNrXCJcbiAgICAgICAgICBbc2l6ZV09XCJzaXplXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICBbZXJyb3JdPVwiZXJyb3JcIlxuICAgICAgICAgIFtleHRlcm5hbEZvY3VzZWRdPVwiaXNGb2N1c2VkXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25NYXNrSW5wdXRDaGFuZ2UoJGV2ZW50KVwiPjwvdG9sbGUtbWFza2VkLWlucHV0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGlzYWJsZWRcIj5cbiAgICAgICAgPHBcbiAgICAgICAgICAqbmdJZj1cImhpbnQgJiYgIWVycm9yXCJcbiAgICAgICAgICBjbGFzcz1cInB4LTEgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmQgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMFwiXG4gICAgICAgICAgW2NsYXNzLm9wYWNpdHktMF09XCJpc0ZvY3VzZWQgJiYgaGlkZUhpbnRPbkZvY3VzXCI+XG4gICAgICAgICAge3sgaGludCB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwICpuZ0lmPVwiZXJyb3IgJiYgZXJyb3JNZXNzYWdlXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIiBjbGFzcz1cInB4LTEgdGV4dC14cyB0ZXh0LWRlc3RydWN0aXZlXCI+XG4gICAgICAgICAge3sgZXJyb3JNZXNzYWdlIH19XG4gICAgICAgIDwvcD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBob25lTnVtYmVySW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUGhvbmVOdW1iZXJJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIEBJbnB1dCgpIGlkID0gYHBob25lLWlucHV0LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIGhpbnQgPSAnJztcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlID0gJyc7XG4gIEBJbnB1dCgpIGVycm9yID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhpZGVIaW50T25Gb2N1cyA9IHRydWU7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1Bob25lIG51bWJlcic7XG4gIEBJbnB1dCgpIHNpemU6ICd4cycgfCAnc20nIHwgJ2RlZmF1bHQnIHwgJ2xnJyA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgZGVmYXVsdENvdW50cnlDb2RlID0gJ0dIJztcbiAgQElucHV0KCkgZGF0YVR5cGU6ICdOdW1iZXJPbmx5JyB8ICdGdWxsT2JqZWN0JyA9ICdGdWxsT2JqZWN0JztcbiAgQElucHV0KCkgbWFzayA9ICcoMDAwKSAwMDAtMDAwMCc7XG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIEBJbnB1dCgpIGVuYWJsZUNvdW50cnlTZWxlY3RvciA9IHRydWU7XG5cbiAgQE91dHB1dCgpIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZGlzcGxheVZhbHVlID0gJyc7XG4gIHNlbGVjdGVkSXNvID0gJyc7XG4gIHByaXZhdGUgcmF3VmFsdWUgPSAnJztcbiAgaXNGb2N1c2VkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGNuID0gY247XG5cbiAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xuICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRJc28gPSB0aGlzLmRlZmF1bHRDb3VudHJ5Q29kZTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZExhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3RleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIGxlYWRpbmctbm9uZSB0cmFuc2l0aW9uLW9wYWNpdHkgZHVyYXRpb24tMjAwJyxcbiAgICAgIHRoaXMuZGlzYWJsZWQgJiYgJ29wYWNpdHktNTAnXG4gICAgKTtcbiAgfVxuXG4gIG9uRm9jdXNJbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkZvY3VzT3V0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUubnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJc28gPSB2YWx1ZS5jb3VudHJ5IHx8IHRoaXMuZGVmYXVsdENvdW50cnlDb2RlO1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlLm51bWJlcjtcbiAgICAgICAgdGhpcy5yYXdWYWx1ZSA9IHZhbHVlLm51bWJlci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5yYXdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVBob25lTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXNvID0gcGFyc2VkLmNvdW50cnkgfHwgdGhpcy5kZWZhdWx0Q291bnRyeUNvZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5yYXdWYWx1ZSA9ICcnO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNvdW50cnlDaGFuZ2UoaXNvOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXNvID0gaXNvO1xuICAgIHRoaXMudXBkYXRlTW9kZWwoKTtcbiAgfVxuXG4gIG9uTWFza0lucHV0Q2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMucmF3VmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIHRoaXMudXBkYXRlTW9kZWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTW9kZWwoKSB7XG4gICAgaWYgKCF0aGlzLnJhd1ZhbHVlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVBob25lTnVtYmVyKHRoaXMucmF3VmFsdWUsIHRoaXMuc2VsZWN0ZWRJc28gYXMgYW55KTtcbiAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdGdWxsT2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHBhcnNlZC5udW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25TZWxlY3QuZW1pdChwYXJzZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnJhd1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucmF3VmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -2886,7 +2886,7 @@ class MaskedInputComponent {
2886
2886
  size = 'default';
2887
2887
  returnRaw = false;
2888
2888
  hideHintOnFocus = true;
2889
- mergedPosition = 'none';
2889
+ externalFocused;
2890
2890
  inputEl;
2891
2891
  hasPrefix = false;
2892
2892
  hasSuffix = false;
@@ -2918,13 +2918,14 @@ class MaskedInputComponent {
2918
2918
  return cn('text-sm font-medium text-foreground leading-none transition-opacity duration-200', this.disabled && 'opacity-50');
2919
2919
  }
2920
2920
  get computedContainerClass() {
2921
+ const focused = this.externalFocused !== undefined ? this.externalFocused : this.isFocused;
2921
2922
  return cn(
2922
2923
  // Base styles
2923
2924
  'group relative flex items-center w-full border transition-all duration-200', 'bg-background border-input shadow-sm',
2924
2925
  // Sizing
2925
2926
  this.size === 'xs' && 'h-8 px-2 gap-1.5 text-xs', this.size === 'sm' && 'h-9 px-3 gap-2 text-sm', this.size === 'default' && 'h-10 px-3 gap-2 text-sm', this.size === 'lg' && 'h-11 px-4 gap-3 text-base',
2926
- // Merged position - handle border radius
2927
- this.mergedPosition === 'left' && 'rounded-l-md rounded-r-none border-r-0 pr-0', this.mergedPosition === 'right' && 'rounded-r-md rounded-l-none border-l-0 pl-0 flex-1', this.mergedPosition === 'none' && 'rounded-md',
2927
+ // Rounded corners
2928
+ 'rounded-md',
2928
2929
  // Focus state
2929
2930
  !(this.readonly || this.disabled) && [
2930
2931
  'focus-within:ring-4',
@@ -3026,7 +3027,7 @@ class MaskedInputComponent {
3026
3027
  }
3027
3028
  cn = cn;
3028
3029
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MaskedInputComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
3029
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MaskedInputComponent, isStandalone: true, selector: "tolle-masked-input", inputs: { id: "id", label: "label", hint: "hint", errorMessage: "errorMessage", mask: "mask", placeholder: "placeholder", type: "type", disabled: "disabled", readonly: "readonly", class: "class", containerClass: "containerClass", error: "error", size: "size", returnRaw: "returnRaw", hideHintOnFocus: "hideHintOnFocus", mergedPosition: "mergedPosition" }, providers: [
3030
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MaskedInputComponent, isStandalone: true, selector: "tolle-masked-input", inputs: { id: "id", label: "label", hint: "hint", errorMessage: "errorMessage", mask: "mask", placeholder: "placeholder", type: "type", disabled: "disabled", readonly: "readonly", class: "class", containerClass: "containerClass", error: "error", size: "size", returnRaw: "returnRaw", hideHintOnFocus: "hideHintOnFocus", externalFocused: "externalFocused" }, providers: [
3030
3031
  {
3031
3032
  provide: NG_VALUE_ACCESSOR,
3032
3033
  useExisting: forwardRef(() => MaskedInputComponent),
@@ -3034,7 +3035,7 @@ class MaskedInputComponent {
3034
3035
  },
3035
3036
  ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, static: true }], ngImport: i0, template: `
3036
3037
  <div class="flex w-full flex-col gap-1.5">
3037
- <label *ngIf="label && mergedPosition === 'none'" [for]="id" [class]="computedLabelClass">
3038
+ <label *ngIf="label" [for]="id" [class]="computedLabelClass">
3038
3039
  {{ label }}
3039
3040
  </label>
3040
3041
 
@@ -3067,7 +3068,7 @@ class MaskedInputComponent {
3067
3068
  </div>
3068
3069
  </div>
3069
3070
 
3070
- <ng-container *ngIf="!disabled && mergedPosition === 'none'">
3071
+ <ng-container *ngIf="!disabled">
3071
3072
  <p
3072
3073
  *ngIf="hint && !error"
3073
3074
  class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
@@ -3096,7 +3097,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3096
3097
  ],
3097
3098
  template: `
3098
3099
  <div class="flex w-full flex-col gap-1.5">
3099
- <label *ngIf="label && mergedPosition === 'none'" [for]="id" [class]="computedLabelClass">
3100
+ <label *ngIf="label" [for]="id" [class]="computedLabelClass">
3100
3101
  {{ label }}
3101
3102
  </label>
3102
3103
 
@@ -3129,7 +3130,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3129
3130
  </div>
3130
3131
  </div>
3131
3132
 
3132
- <ng-container *ngIf="!disabled && mergedPosition === 'none'">
3133
+ <ng-container *ngIf="!disabled">
3133
3134
  <p
3134
3135
  *ngIf="hint && !error"
3135
3136
  class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
@@ -3173,7 +3174,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3173
3174
  type: Input
3174
3175
  }], hideHintOnFocus: [{
3175
3176
  type: Input
3176
- }], mergedPosition: [{
3177
+ }], externalFocused: [{
3177
3178
  type: Input
3178
3179
  }], inputEl: [{
3179
3180
  type: ViewChild,
@@ -3405,7 +3406,7 @@ class DatePickerComponent {
3405
3406
  ></tolle-calendar>
3406
3407
  </div>
3407
3408
  </div>
3408
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "mergedPosition"] }, { kind: "component", type: CalendarComponent, selector: "tolle-calendar", inputs: ["class", "mode", "disablePastDates", "showQuickActions", "minDate", "maxDate", "formatMonthFn", "formatYearFn", "formatDateFn"], outputs: ["dateSelect"] }] });
3409
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "externalFocused"] }, { kind: "component", type: CalendarComponent, selector: "tolle-calendar", inputs: ["class", "mode", "disablePastDates", "showQuickActions", "minDate", "maxDate", "formatMonthFn", "formatYearFn", "formatDateFn"], outputs: ["dateSelect"] }] });
3409
3410
  }
3410
3411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatePickerComponent, decorators: [{
3411
3412
  type: Component,
@@ -12905,7 +12906,7 @@ class CountrySelectorComponent {
12905
12906
  defaultCountryCode = 'GH';
12906
12907
  returnValue = 'isoAlpha2';
12907
12908
  showName = true;
12908
- mergedPosition = 'none';
12909
+ externalFocused;
12909
12910
  onSelect = new EventEmitter();
12910
12911
  onFocusChange = new EventEmitter();
12911
12912
  onBlurChange = new EventEmitter();
@@ -12932,12 +12933,22 @@ class CountrySelectorComponent {
12932
12933
  }
12933
12934
  }
12934
12935
  get computedTriggerClass() {
12936
+ const focused = this.externalFocused !== undefined ? this.externalFocused : this.isFocused;
12935
12937
  return cn('flex w-full items-center justify-between border transition-all duration-200', 'bg-background text-foreground', 'border-input shadow-sm', this.size === 'xs' && 'h-8 px-2 text-xs', this.size === 'sm' && 'h-9 px-3 text-sm', this.size === 'default' && 'h-10 px-3 text-sm', this.size === 'lg' && 'h-11 px-4 text-base',
12936
- // Merged position
12937
- this.mergedPosition === 'left' && 'rounded-l-md rounded-r-none border-r-0', this.mergedPosition === 'none' && 'rounded-md',
12938
+ // Rounded corners
12939
+ 'rounded-md',
12938
12940
  // Focus state
12941
+ !(this.readonly || this.disabled) && [
12942
+ 'focus:outline-none',
12943
+ 'focus:ring-4',
12944
+ 'focus:ring-ring/30',
12945
+ 'focus:ring-offset-0',
12946
+ 'shadow-none',
12947
+ this.error ? 'focus:border-destructive/80' : 'focus:border-primary/80',
12948
+ ],
12949
+ // External focus state (when controlled by parent)
12939
12950
  !(this.readonly || this.disabled) &&
12940
- this.isFocused && [
12951
+ focused && [
12941
12952
  'ring-4',
12942
12953
  'ring-ring/30',
12943
12954
  'ring-offset-0',
@@ -12945,7 +12956,10 @@ class CountrySelectorComponent {
12945
12956
  this.error ? 'border-destructive/80' : 'border-primary/80',
12946
12957
  ], !(this.readonly || this.disabled) && 'hover:border-accent',
12947
12958
  // Error state
12948
- this.error && ['border-destructive', this.isFocused && 'ring-destructive/30'], this.disabled && 'cursor-not-allowed opacity-50 border-opacity-50', this.readonly && 'cursor-default border-dashed', this.class);
12959
+ this.error && [
12960
+ 'border-destructive',
12961
+ !(this.readonly || this.disabled) && focused && 'ring-destructive/30',
12962
+ ], this.disabled && 'cursor-not-allowed opacity-50 border-opacity-50', this.readonly && 'cursor-default border-dashed', this.class);
12949
12963
  }
12950
12964
  get computedLabelClass() {
12951
12965
  return cn('text-sm font-medium text-foreground leading-none transition-opacity duration-200', this.disabled && 'opacity-50');
@@ -13036,7 +13050,7 @@ class CountrySelectorComponent {
13036
13050
  this.disabled = isDisabled;
13037
13051
  }
13038
13052
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CountrySelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13039
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CountrySelectorComponent, isStandalone: true, selector: "tolle-country-selector", inputs: { id: "id", label: "label", hint: "hint", errorMessage: "errorMessage", error: "error", hideHintOnFocus: "hideHintOnFocus", placeholder: "placeholder", class: "class", disabled: "disabled", readonly: "readonly", size: "size", defaultCountryCode: "defaultCountryCode", returnValue: "returnValue", showName: "showName", mergedPosition: "mergedPosition" }, outputs: { onSelect: "onSelect", onFocusChange: "onFocusChange", onBlurChange: "onBlurChange" }, providers: [
13053
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CountrySelectorComponent, isStandalone: true, selector: "tolle-country-selector", inputs: { id: "id", label: "label", hint: "hint", errorMessage: "errorMessage", error: "error", hideHintOnFocus: "hideHintOnFocus", placeholder: "placeholder", class: "class", disabled: "disabled", readonly: "readonly", size: "size", defaultCountryCode: "defaultCountryCode", returnValue: "returnValue", showName: "showName", externalFocused: "externalFocused" }, outputs: { onSelect: "onSelect", onFocusChange: "onFocusChange", onBlurChange: "onBlurChange" }, providers: [
13040
13054
  {
13041
13055
  provide: NG_VALUE_ACCESSOR,
13042
13056
  useExisting: forwardRef(() => CountrySelectorComponent),
@@ -13044,7 +13058,7 @@ class CountrySelectorComponent {
13044
13058
  },
13045
13059
  ], viewQueries: [{ propertyName: "popover", first: true, predicate: ["popover"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: `
13046
13060
  <div class="flex w-full flex-col gap-1.5">
13047
- <label *ngIf="label && mergedPosition === 'none'" [for]="id" [class]="computedLabelClass">
13061
+ <label *ngIf="label" [for]="id" [class]="computedLabelClass">
13048
13062
  {{ label }}
13049
13063
  </label>
13050
13064
 
@@ -13121,7 +13135,7 @@ class CountrySelectorComponent {
13121
13135
  </div>
13122
13136
  </tolle-popover>
13123
13137
 
13124
- <ng-container *ngIf="!disabled && mergedPosition === 'none'">
13138
+ <ng-container *ngIf="!disabled">
13125
13139
  <p
13126
13140
  *ngIf="hint && !error"
13127
13141
  class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
@@ -13153,7 +13167,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13153
13167
  ],
13154
13168
  template: `
13155
13169
  <div class="flex w-full flex-col gap-1.5">
13156
- <label *ngIf="label && mergedPosition === 'none'" [for]="id" [class]="computedLabelClass">
13170
+ <label *ngIf="label" [for]="id" [class]="computedLabelClass">
13157
13171
  {{ label }}
13158
13172
  </label>
13159
13173
 
@@ -13230,7 +13244,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13230
13244
  </div>
13231
13245
  </tolle-popover>
13232
13246
 
13233
- <ng-container *ngIf="!disabled && mergedPosition === 'none'">
13247
+ <ng-container *ngIf="!disabled">
13234
13248
  <p
13235
13249
  *ngIf="hint && !error"
13236
13250
  class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
@@ -13275,7 +13289,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13275
13289
  type: Input
13276
13290
  }], showName: [{
13277
13291
  type: Input
13278
- }], mergedPosition: [{
13292
+ }], externalFocused: [{
13279
13293
  type: Input
13280
13294
  }], onSelect: [{
13281
13295
  type: Output
@@ -13312,6 +13326,7 @@ class PhoneNumberInputComponent {
13312
13326
  displayValue = '';
13313
13327
  selectedIso = '';
13314
13328
  rawValue = '';
13329
+ isFocused = false;
13315
13330
  cn = cn;
13316
13331
  onChange = () => { };
13317
13332
  onTouched = () => { };
@@ -13321,23 +13336,14 @@ class PhoneNumberInputComponent {
13321
13336
  get computedLabelClass() {
13322
13337
  return cn('text-sm font-medium text-foreground leading-none transition-opacity duration-200', this.disabled && 'opacity-50');
13323
13338
  }
13324
- get computedMergedClass() {
13325
- return cn('group relative flex items-center w-full rounded-md border transition-all duration-200', 'bg-background border-input shadow-sm', this.size === 'xs' && 'h-8', this.size === 'sm' && 'h-9', this.size === 'default' && 'h-10', this.size === 'lg' && 'h-11',
13326
- // Focus state
13327
- !this.readonly &&
13328
- !this.disabled && [
13329
- 'focus-within:ring-4',
13330
- 'focus-within:ring-ring/30',
13331
- 'focus-within:ring-offset-0',
13332
- 'focus-within:shadow-none',
13333
- this.error ? 'focus-within:border-destructive/80' : 'focus-within:border-primary/80',
13334
- ],
13335
- // Error state
13336
- this.error && 'border-destructive', this.error && !this.readonly && !this.disabled && 'focus-within:ring-destructive/30',
13337
- // Disabled state
13338
- this.disabled && ['cursor-not-allowed opacity-50', 'border-opacity-50'],
13339
- // Readonly state
13340
- this.readonly && 'cursor-default border-dashed', this.class);
13339
+ onFocusIn() {
13340
+ this.isFocused = true;
13341
+ this.cdr.markForCheck();
13342
+ }
13343
+ onFocusOut() {
13344
+ this.isFocused = false;
13345
+ this.onTouched();
13346
+ this.cdr.markForCheck();
13341
13347
  }
13342
13348
  writeValue(value) {
13343
13349
  if (value) {
@@ -13420,16 +13426,18 @@ class PhoneNumberInputComponent {
13420
13426
  {{ label }}
13421
13427
  </label>
13422
13428
 
13423
- <div [class]="computedMergedClass">
13429
+ <div class="flex gap-2" (focusin)="onFocusIn()" (focusout)="onFocusOut()">
13424
13430
  <tolle-country-selector
13425
13431
  class="flex-shrink-0"
13426
13432
  [showName]="false"
13427
13433
  [size]="size"
13428
13434
  [disabled]="disabled || !enableCountrySelector"
13429
13435
  [readonly]="readonly"
13430
- [mergedPosition]="'left'"
13436
+ [externalFocused]="isFocused"
13431
13437
  [(ngModel)]="selectedIso"
13432
- (ngModelChange)="onCountryChange($event)"></tolle-country-selector>
13438
+ (ngModelChange)="onCountryChange($event)"
13439
+ (onFocusChange)="onFocusIn()"
13440
+ (onBlurChange)="onFocusOut()"></tolle-country-selector>
13433
13441
 
13434
13442
  <tolle-masked-input
13435
13443
  class="min-w-0 flex-1"
@@ -13440,7 +13448,7 @@ class PhoneNumberInputComponent {
13440
13448
  [readonly]="readonly"
13441
13449
  [placeholder]="placeholder"
13442
13450
  [error]="error"
13443
- [mergedPosition]="'right'"
13451
+ [externalFocused]="isFocused"
13444
13452
  [(ngModel)]="displayValue"
13445
13453
  (ngModelChange)="onMaskInputChange($event)"></tolle-masked-input>
13446
13454
  </div>
@@ -13448,7 +13456,8 @@ class PhoneNumberInputComponent {
13448
13456
  <ng-container *ngIf="!disabled">
13449
13457
  <p
13450
13458
  *ngIf="hint && !error"
13451
- class="px-1 text-xs text-muted-foreground transition-opacity duration-200">
13459
+ class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
13460
+ [class.opacity-0]="isFocused && hideHintOnFocus">
13452
13461
  {{ hint }}
13453
13462
  </p>
13454
13463
  <p *ngIf="error && errorMessage" [id]="id + '-error'" class="px-1 text-xs text-destructive">
@@ -13456,7 +13465,7 @@ class PhoneNumberInputComponent {
13456
13465
  </p>
13457
13466
  </ng-container>
13458
13467
  </div>
13459
- `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CountrySelectorComponent, selector: "tolle-country-selector", inputs: ["id", "label", "hint", "errorMessage", "error", "hideHintOnFocus", "placeholder", "class", "disabled", "readonly", "size", "defaultCountryCode", "returnValue", "showName", "mergedPosition"], outputs: ["onSelect", "onFocusChange", "onBlurChange"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "mergedPosition"] }] });
13468
+ `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CountrySelectorComponent, selector: "tolle-country-selector", inputs: ["id", "label", "hint", "errorMessage", "error", "hideHintOnFocus", "placeholder", "class", "disabled", "readonly", "size", "defaultCountryCode", "returnValue", "showName", "externalFocused"], outputs: ["onSelect", "onFocusChange", "onBlurChange"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "externalFocused"] }] });
13460
13469
  }
13461
13470
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PhoneNumberInputComponent, decorators: [{
13462
13471
  type: Component,
@@ -13466,16 +13475,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13466
13475
  {{ label }}
13467
13476
  </label>
13468
13477
 
13469
- <div [class]="computedMergedClass">
13478
+ <div class="flex gap-2" (focusin)="onFocusIn()" (focusout)="onFocusOut()">
13470
13479
  <tolle-country-selector
13471
13480
  class="flex-shrink-0"
13472
13481
  [showName]="false"
13473
13482
  [size]="size"
13474
13483
  [disabled]="disabled || !enableCountrySelector"
13475
13484
  [readonly]="readonly"
13476
- [mergedPosition]="'left'"
13485
+ [externalFocused]="isFocused"
13477
13486
  [(ngModel)]="selectedIso"
13478
- (ngModelChange)="onCountryChange($event)"></tolle-country-selector>
13487
+ (ngModelChange)="onCountryChange($event)"
13488
+ (onFocusChange)="onFocusIn()"
13489
+ (onBlurChange)="onFocusOut()"></tolle-country-selector>
13479
13490
 
13480
13491
  <tolle-masked-input
13481
13492
  class="min-w-0 flex-1"
@@ -13486,7 +13497,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13486
13497
  [readonly]="readonly"
13487
13498
  [placeholder]="placeholder"
13488
13499
  [error]="error"
13489
- [mergedPosition]="'right'"
13500
+ [externalFocused]="isFocused"
13490
13501
  [(ngModel)]="displayValue"
13491
13502
  (ngModelChange)="onMaskInputChange($event)"></tolle-masked-input>
13492
13503
  </div>
@@ -13494,7 +13505,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13494
13505
  <ng-container *ngIf="!disabled">
13495
13506
  <p
13496
13507
  *ngIf="hint && !error"
13497
- class="px-1 text-xs text-muted-foreground transition-opacity duration-200">
13508
+ class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
13509
+ [class.opacity-0]="isFocused && hideHintOnFocus">
13498
13510
  {{ hint }}
13499
13511
  </p>
13500
13512
  <p *ngIf="error && errorMessage" [id]="id + '-error'" class="px-1 text-xs text-destructive">