@magicx-eng/ai-autocomplete-angular 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +582 -0
- package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +365 -0
- package/esm2020/lib/ai-autocomplete/index.mjs +2 -0
- package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +81 -0
- package/esm2020/lib/ai-autocomplete-dropdown/index.mjs +2 -0
- package/esm2020/lib/ai-autocomplete.module.mjs +26 -0
- package/esm2020/lib/controller/ai-autocomplete.controller.mjs +226 -0
- package/esm2020/lib/controller/index.mjs +2 -0
- package/esm2020/lib/controller/observables.mjs +24 -0
- package/esm2020/lib/input/ai-autocomplete-input.directive.mjs +180 -0
- package/esm2020/lib/input/index.mjs +2 -0
- package/esm2020/lib/internal/editor-host/editor-host.directive.mjs +253 -0
- package/esm2020/lib/internal/pill-list/pill-list.component.mjs +65 -0
- package/esm2020/lib/internal/suggestion-grid/suggestion-grid.component.mjs +97 -0
- package/esm2020/lib/internal/suggestion-item/suggestion-item.component.mjs +76 -0
- package/esm2020/lib/shared/types.mjs +2 -0
- package/esm2020/magicx-eng-ai-autocomplete-angular.mjs +5 -0
- package/esm2020/public-api.mjs +18 -0
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +1386 -0
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -0
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +1370 -0
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/ai-autocomplete/ai-autocomplete.component.d.ts +113 -0
- package/lib/ai-autocomplete/ai-autocomplete.component.d.ts.map +1 -0
- package/lib/ai-autocomplete/index.d.ts +2 -0
- package/lib/ai-autocomplete/index.d.ts.map +1 -0
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +51 -0
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -0
- package/lib/ai-autocomplete-dropdown/index.d.ts +2 -0
- package/lib/ai-autocomplete-dropdown/index.d.ts.map +1 -0
- package/lib/ai-autocomplete.module.d.ts +18 -0
- package/lib/ai-autocomplete.module.d.ts.map +1 -0
- package/lib/controller/ai-autocomplete.controller.d.ts +131 -0
- package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -0
- package/lib/controller/index.d.ts +2 -0
- package/lib/controller/index.d.ts.map +1 -0
- package/lib/controller/observables.d.ts +22 -0
- package/lib/controller/observables.d.ts.map +1 -0
- package/lib/input/ai-autocomplete-input.directive.d.ts +60 -0
- package/lib/input/ai-autocomplete-input.directive.d.ts.map +1 -0
- package/lib/input/index.d.ts +2 -0
- package/lib/input/index.d.ts.map +1 -0
- package/lib/internal/editor-host/editor-host.directive.d.ts +46 -0
- package/lib/internal/editor-host/editor-host.directive.d.ts.map +1 -0
- package/lib/internal/pill-list/pill-list.component.d.ts +35 -0
- package/lib/internal/pill-list/pill-list.component.d.ts.map +1 -0
- package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts +37 -0
- package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts.map +1 -0
- package/lib/internal/suggestion-item/suggestion-item.component.d.ts +33 -0
- package/lib/internal/suggestion-item/suggestion-item.component.d.ts.map +1 -0
- package/lib/shared/types.d.ts +125 -0
- package/lib/shared/types.d.ts.map +1 -0
- package/magicx-eng-ai-autocomplete-angular.d.ts.map +1 -0
- package/package.json +46 -0
- package/public-api.d.ts +15 -0
- package/public-api.d.ts.map +1 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { CommonModule, isPlatformBrowser } from "@angular/common";
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, inject, NgZone, Output, PLATFORM_ID, ViewChild, ViewEncapsulation, } from "@angular/core";
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from "@angular/forms";
|
|
4
|
+
import { buildQuery, extractPlainText, ModeController, setCursorOffset, } from "@magicx-eng/ai-autocomplete-vanilla";
|
|
5
|
+
import { AIAutocompleteDropdownComponent } from "../ai-autocomplete-dropdown/ai-autocomplete-dropdown.component";
|
|
6
|
+
import { AIAutocompleteController } from "../controller/ai-autocomplete.controller";
|
|
7
|
+
import { AIAutocompleteEditorHostDirective } from "../internal/editor-host/editor-host.directive";
|
|
8
|
+
import { PillListComponent } from "../internal/pill-list/pill-list.component";
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common";
|
|
11
|
+
function resolveInitialMode(mode) {
|
|
12
|
+
if (mode !== "auto")
|
|
13
|
+
return mode;
|
|
14
|
+
if (typeof window === "undefined")
|
|
15
|
+
return "dark";
|
|
16
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Tier 1 component — `<ai-autocomplete>`. The Angular equivalent of React's
|
|
20
|
+
* `<AIAutocomplete />`. Owns the contentEditable editor, inline pills, mode
|
|
21
|
+
* controller, submit button slot, and an embedded
|
|
22
|
+
* {@link AIAutocompleteController} that drives the dropdown.
|
|
23
|
+
*
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export class AIAutocompleteComponent {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.maskCompletedText = false;
|
|
29
|
+
/** Where unfilled pills render. Default: "inline". */
|
|
30
|
+
this.pillPlacement = "inline";
|
|
31
|
+
/** Color mode. "auto" follows prefers-color-scheme. Default: "auto". */
|
|
32
|
+
this.mode = "auto";
|
|
33
|
+
this.optionsPosition = "below";
|
|
34
|
+
this.animations = true;
|
|
35
|
+
/** Focus the editor on mount. Default: true. */
|
|
36
|
+
this.autoFocus = true;
|
|
37
|
+
// === Outputs ===
|
|
38
|
+
/** Called on Enter or submit-button click. */
|
|
39
|
+
this.submitted = new EventEmitter();
|
|
40
|
+
this.errored = new EventEmitter();
|
|
41
|
+
this.valueChange = new EventEmitter();
|
|
42
|
+
this.completedParamsChange = new EventEmitter();
|
|
43
|
+
this.focused = new EventEmitter();
|
|
44
|
+
this.blurred = new EventEmitter();
|
|
45
|
+
this.resolvedMode = "dark";
|
|
46
|
+
this.onChangeFn = noop;
|
|
47
|
+
this.onTouchedFn = noop;
|
|
48
|
+
// §16.9: prefer `inject()` over constructor-parameter DI for components.
|
|
49
|
+
this.platformId = inject(PLATFORM_ID);
|
|
50
|
+
this.el = inject(ElementRef);
|
|
51
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
52
|
+
this.zone = inject(NgZone);
|
|
53
|
+
}
|
|
54
|
+
ngOnInit() {
|
|
55
|
+
if (!isPlatformBrowser(this.platformId))
|
|
56
|
+
return;
|
|
57
|
+
this.resolvedMode = resolveInitialMode(this.mode);
|
|
58
|
+
this.controller = new AIAutocompleteController({
|
|
59
|
+
apiConfig: this.apiConfig,
|
|
60
|
+
optionOverrides: this.optionOverrides,
|
|
61
|
+
maskCompletedText: this.maskCompletedText,
|
|
62
|
+
columns: this.columns,
|
|
63
|
+
dropdownTrigger: this.dropdownTrigger,
|
|
64
|
+
optionsPosition: this.optionsPosition,
|
|
65
|
+
closeDropdownOnBlur: this.closeDropdownOnBlur,
|
|
66
|
+
showNonTappableOptions: this.showNonTappableOptions,
|
|
67
|
+
source: "full-sdk",
|
|
68
|
+
value: this.value,
|
|
69
|
+
completedParams: this.completedParams,
|
|
70
|
+
onSubmit: (result) => this.handleSubmit(result),
|
|
71
|
+
onError: (error) => this.errored.emit(error),
|
|
72
|
+
onChange: (text) => {
|
|
73
|
+
this.valueChange.emit(text);
|
|
74
|
+
this.onChangeFn(text);
|
|
75
|
+
},
|
|
76
|
+
onParamsChange: (params) => this.completedParamsChange.emit(params),
|
|
77
|
+
onFocus: () => this.focused.emit(),
|
|
78
|
+
onBlur: () => {
|
|
79
|
+
this.blurred.emit();
|
|
80
|
+
this.onTouchedFn();
|
|
81
|
+
},
|
|
82
|
+
setCursor: (offset) => {
|
|
83
|
+
const editor = this.editorRef?.nativeElement;
|
|
84
|
+
if (!editor)
|
|
85
|
+
return;
|
|
86
|
+
editor.focus();
|
|
87
|
+
setCursorOffset(editor, offset);
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
ngAfterViewInit() {
|
|
92
|
+
if (!isPlatformBrowser(this.platformId))
|
|
93
|
+
return;
|
|
94
|
+
const container = this.el.nativeElement;
|
|
95
|
+
this.modeController = new ModeController(container, this.mode);
|
|
96
|
+
// Pill-wrap detection — when the pill list wraps below the editor's last
|
|
97
|
+
// line, drop its 8px left margin via a data attribute the CSS keys off.
|
|
98
|
+
// Mirrors the React component's useLayoutEffect.
|
|
99
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
100
|
+
this.zone.runOutsideAngular(() => {
|
|
101
|
+
this.resizeObserver = new ResizeObserver(() => this.measurePillWrap());
|
|
102
|
+
const editor = this.editorRef?.nativeElement;
|
|
103
|
+
if (editor)
|
|
104
|
+
this.resizeObserver.observe(editor);
|
|
105
|
+
});
|
|
106
|
+
this.measurePillWrap();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
ngOnChanges(changes) {
|
|
110
|
+
if (!this.controller)
|
|
111
|
+
return;
|
|
112
|
+
// Controlled-mode propagation
|
|
113
|
+
if (changes.value && this.value !== undefined) {
|
|
114
|
+
this.controller.setValue(this.value);
|
|
115
|
+
}
|
|
116
|
+
if (changes.completedParams && this.completedParams !== undefined) {
|
|
117
|
+
this.controller.setCompletedParams(this.completedParams);
|
|
118
|
+
}
|
|
119
|
+
// Reactive options
|
|
120
|
+
if (changes.apiConfig ||
|
|
121
|
+
changes.optionOverrides ||
|
|
122
|
+
changes.dropdownTrigger ||
|
|
123
|
+
changes.optionsPosition ||
|
|
124
|
+
changes.closeDropdownOnBlur ||
|
|
125
|
+
changes.showNonTappableOptions) {
|
|
126
|
+
this.controller.update({
|
|
127
|
+
apiConfig: this.apiConfig,
|
|
128
|
+
optionOverrides: this.optionOverrides,
|
|
129
|
+
dropdownTrigger: this.dropdownTrigger,
|
|
130
|
+
optionsPosition: this.optionsPosition,
|
|
131
|
+
closeDropdownOnBlur: this.closeDropdownOnBlur,
|
|
132
|
+
showNonTappableOptions: this.showNonTappableOptions,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (changes.mode) {
|
|
136
|
+
this.modeController?.setMode(this.mode);
|
|
137
|
+
this.resolvedMode = resolveInitialMode(this.mode);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
ngOnDestroy() {
|
|
141
|
+
this.resizeObserver?.disconnect();
|
|
142
|
+
this.modeController?.destroy();
|
|
143
|
+
this.controller?.destroy();
|
|
144
|
+
}
|
|
145
|
+
// === Imperative API (exposed on the component instance via @ViewChild) ===
|
|
146
|
+
/** Programmatically focus the editor. */
|
|
147
|
+
focus() {
|
|
148
|
+
this.editorRef?.nativeElement.focus();
|
|
149
|
+
}
|
|
150
|
+
/** Programmatically blur the editor. */
|
|
151
|
+
blur() {
|
|
152
|
+
this.editorRef?.nativeElement.blur();
|
|
153
|
+
}
|
|
154
|
+
/** Clear all state, rotate session, and re-fetch. */
|
|
155
|
+
reset() {
|
|
156
|
+
this.controller?.reset();
|
|
157
|
+
}
|
|
158
|
+
/** Switch color mode at runtime. */
|
|
159
|
+
setMode(mode) {
|
|
160
|
+
this.mode = mode;
|
|
161
|
+
this.modeController?.setMode(mode);
|
|
162
|
+
this.resolvedMode = resolveInitialMode(mode);
|
|
163
|
+
this.cdr.markForCheck();
|
|
164
|
+
}
|
|
165
|
+
// === Template helpers ===
|
|
166
|
+
/**
|
|
167
|
+
* 'default' → render the built-in arrow button.
|
|
168
|
+
* 'custom' → project the consumer-supplied TemplateRef.
|
|
169
|
+
* 'hidden' → no button.
|
|
170
|
+
*/
|
|
171
|
+
get submitButtonState() {
|
|
172
|
+
if (this.submitButton === null)
|
|
173
|
+
return "hidden";
|
|
174
|
+
if (this.submitButton === undefined)
|
|
175
|
+
return "default";
|
|
176
|
+
return "custom";
|
|
177
|
+
}
|
|
178
|
+
/** Narrowed accessor for *ngTemplateOutlet — never undefined. */
|
|
179
|
+
get customSubmitTemplate() {
|
|
180
|
+
return this.submitButton ?? null;
|
|
181
|
+
}
|
|
182
|
+
get showInlinePills() {
|
|
183
|
+
return this.pillPlacement === "inline";
|
|
184
|
+
}
|
|
185
|
+
get showDropdownPills() {
|
|
186
|
+
return this.pillPlacement === "dropdown";
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* `true` when there's something to submit — driven by current segments
|
|
190
|
+
* and completed params. Read off the live editor via the controller state.
|
|
191
|
+
*/
|
|
192
|
+
canSubmit(state) {
|
|
193
|
+
return state.segments.length > 0 || state.completedParams.length > 0;
|
|
194
|
+
}
|
|
195
|
+
onWrapperClick(event) {
|
|
196
|
+
// Clicking a pill should activate it without stealing focus elsewhere.
|
|
197
|
+
const target = event.target;
|
|
198
|
+
if (target?.closest("[data-aia-pill]"))
|
|
199
|
+
return;
|
|
200
|
+
this.focus();
|
|
201
|
+
}
|
|
202
|
+
onSubmitButtonClick(event) {
|
|
203
|
+
event.stopPropagation();
|
|
204
|
+
this.handleSubmitFromUserAction();
|
|
205
|
+
}
|
|
206
|
+
onSubmitSlotClick(event) {
|
|
207
|
+
event.stopPropagation();
|
|
208
|
+
this.handleSubmitFromUserAction();
|
|
209
|
+
}
|
|
210
|
+
onSelectPill(index) {
|
|
211
|
+
this.controller.setActivePill(index);
|
|
212
|
+
}
|
|
213
|
+
// === ControlValueAccessor ===
|
|
214
|
+
writeValue(value) {
|
|
215
|
+
if (!this.controller)
|
|
216
|
+
return;
|
|
217
|
+
this.controller.setValue(value ?? "");
|
|
218
|
+
}
|
|
219
|
+
registerOnChange(fn) {
|
|
220
|
+
this.onChangeFn = fn;
|
|
221
|
+
}
|
|
222
|
+
registerOnTouched(fn) {
|
|
223
|
+
this.onTouchedFn = fn;
|
|
224
|
+
}
|
|
225
|
+
setDisabledState(_disabled) {
|
|
226
|
+
// The contentEditable host doesn't have a native disabled attribute. For
|
|
227
|
+
// v0.1 we accept the call so Angular's forms layer doesn't throw, but
|
|
228
|
+
// the editor stays interactive. A future enhancement can toggle
|
|
229
|
+
// contentEditable + ARIA disabled here.
|
|
230
|
+
}
|
|
231
|
+
// === Submit flow ===
|
|
232
|
+
/**
|
|
233
|
+
* Called by the controller's onSubmit callback (which fires from the
|
|
234
|
+
* keyboard controller on Enter). Reads the live editor text — same trick
|
|
235
|
+
* the React component uses — so the emitted query reflects whatever's in
|
|
236
|
+
* the DOM right now, not a possibly-stale state snapshot.
|
|
237
|
+
*/
|
|
238
|
+
handleSubmit(_result) {
|
|
239
|
+
const editor = this.editorRef?.nativeElement;
|
|
240
|
+
if (!editor)
|
|
241
|
+
return;
|
|
242
|
+
const text = extractPlainText(editor);
|
|
243
|
+
const params = this.completedParams ?? this.controller.getState().completedParams;
|
|
244
|
+
const built = buildQuery(text, params);
|
|
245
|
+
this.submitted.emit({
|
|
246
|
+
query: text.trim(),
|
|
247
|
+
raw_query: built.rawQuery,
|
|
248
|
+
completed_params: built.completedParams,
|
|
249
|
+
});
|
|
250
|
+
this.controller.reset();
|
|
251
|
+
}
|
|
252
|
+
handleSubmitFromUserAction() {
|
|
253
|
+
const state = this.controller.getState();
|
|
254
|
+
if (!this.canSubmit(state))
|
|
255
|
+
return;
|
|
256
|
+
// Synthesize the result for the submit-button click path; same shape
|
|
257
|
+
// the controller would deliver from a keyboard Enter, so handleSubmit
|
|
258
|
+
// can take either entry point.
|
|
259
|
+
this.handleSubmit({
|
|
260
|
+
query: state.text.trim(),
|
|
261
|
+
raw_query: "",
|
|
262
|
+
completed_params: [],
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
measurePillWrap() {
|
|
266
|
+
const container = this.pillContainerRef?.nativeElement;
|
|
267
|
+
const editor = this.editorRef?.nativeElement;
|
|
268
|
+
if (!container || !editor)
|
|
269
|
+
return;
|
|
270
|
+
const inner = container.firstElementChild;
|
|
271
|
+
if (!inner)
|
|
272
|
+
return;
|
|
273
|
+
// Wrap detection: the pill row's top vs the editor's bottom. When the
|
|
274
|
+
// pills sit on (or above) the editor's last line they're NOT wrapped —
|
|
275
|
+
// keep the 8px margin so they don't butt against typed text or the
|
|
276
|
+
// placeholder. This handles the empty-editor + placeholder case
|
|
277
|
+
// naturally: the placeholder still occupies the editor's line box.
|
|
278
|
+
const cRect = inner.getBoundingClientRect();
|
|
279
|
+
const eRect = editor.getBoundingClientRect();
|
|
280
|
+
const wrapped = cRect.top >= eRect.bottom - 2;
|
|
281
|
+
this.zone.run(() => {
|
|
282
|
+
if (wrapped)
|
|
283
|
+
container.setAttribute("data-aia-pill-wrapped", "");
|
|
284
|
+
else
|
|
285
|
+
container.removeAttribute("data-aia-pill-wrapped");
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
AIAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
290
|
+
AIAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteComponent, isStandalone: true, selector: "ai-autocomplete", inputs: { apiConfig: "apiConfig", optionOverrides: "optionOverrides", maskCompletedText: "maskCompletedText", columns: "columns", pillPlacement: "pillPlacement", mode: "mode", optionsPosition: "optionsPosition", animations: "animations", dropdownTrigger: "dropdownTrigger", closeDropdownOnBlur: "closeDropdownOnBlur", showNonTappableOptions: "showNonTappableOptions", autoFocus: "autoFocus", value: "value", completedParams: "completedParams", submitButton: "submitButton" }, outputs: { submitted: "submitted", errored: "errored", valueChange: "valueChange", completedParamsChange: "completedParamsChange", focused: "focused", blurred: "blurred" }, providers: [
|
|
291
|
+
{
|
|
292
|
+
provide: NG_VALUE_ACCESSOR,
|
|
293
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
294
|
+
useExisting: forwardRef(() => AIAutocompleteComponent),
|
|
295
|
+
multi: true,
|
|
296
|
+
},
|
|
297
|
+
], viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true }, { propertyName: "pillContainerRef", first: true, predicate: ["pillContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"magicx-aia magicx-aia-container\"\n [attr.data-pill-placement]=\"pillPlacement\"\n [attr.data-options-position]=\"optionsPosition\"\n [attr.data-animations]=\"animations ? 'on' : 'off'\"\n [attr.data-mode]=\"resolvedMode\"\n>\n <ai-autocomplete-dropdown\n *ngIf=\"controller\"\n [controller]=\"controller\"\n [showPills]=\"showDropdownPills\"\n ></ai-autocomplete-dropdown>\n\n <div\n class=\"magicx-aia-input-wrapper\"\n (click)=\"onWrapperClick($event)\"\n (keyup)=\"$event.stopPropagation()\"\n >\n <div class=\"magicx-aia-editor-area\" data-aia-editor=\"\">\n <div\n #editor\n *ngIf=\"controller\"\n [aiaEditorHost]=\"controller\"\n [autoFocus]=\"autoFocus\"\n class=\"magicx-aia-input\"\n data-aia-input=\"\"\n ></div>\n\n <ng-container *ngIf=\"controller && showInlinePills\">\n <span\n #pillContainer\n class=\"magicx-aia-pill-list-container\"\n data-aia-pill-list-container=\"\"\n *ngIf=\"\n (controller.isLoading$ | async) ||\n ((controller.suggestionPills$ | async)?.length ?? 0) > 0\n \"\n >\n <aia-pill-list\n [pills]=\"(controller.suggestionPills$ | async) ?? []\"\n [activePillIndex]=\"0\"\n [loading]=\"(controller.isLoading$ | async) ?? false\"\n (selectPill)=\"onSelectPill($event)\"\n ></aia-pill-list>\n </span>\n </ng-container>\n </div>\n\n <ng-container [ngSwitch]=\"submitButtonState\">\n <button\n *ngSwitchCase=\"'default'\"\n type=\"button\"\n data-aia-submit=\"\"\n class=\"magicx-aia-submit-button\"\n [disabled]=\"\n !(\n controller &&\n canSubmit({\n segments: (controller.segments$ | async) ?? [],\n completedParams: (controller.completedParams$ | async) ?? []\n })\n )\n \"\n aria-label=\"Submit\"\n (click)=\"onSubmitButtonClick($event)\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n role=\"img\"\n aria-label=\"Submit\"\n >\n <path\n d=\"M9 14V4M9 4L4 9M9 4L14 9\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <span\n *ngSwitchCase=\"'custom'\"\n data-aia-submit=\"\"\n class=\"magicx-aia-submit-slot\"\n (click)=\"onSubmitSlotClick($event)\"\n >\n <ng-container *ngTemplateOutlet=\"customSubmitTemplate\"></ng-container>\n </span>\n </ng-container>\n </div>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-pill-bg: #bdbdbd;--aia-pill-color: #000000;--aia-pill-font-size: 19px;--aia-option-bg: transparent;--aia-option-color: #4f4f4f;--aia-option-color-selected: #000000;--aia-option-font-size: 19px;--aia-written-text-color: #000000;--aia-written-text-font-size: 19px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: #000000;--aia-submit-color: #ffffff;--aia-color-text-muted: #6b7280;--aia-skeleton-bg: rgba(189, 189, 189, .51);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-pill-bg: #bdbdbd;--aia-pill-color: #ffffff;--aia-pill-font-size: 19px;--aia-option-bg: transparent;--aia-option-color: #b0b0b0;--aia-option-color-selected: #ffffff;--aia-option-font-size: 19px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 19px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: #ffffff;--aia-submit-color: #000000;--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: #333539;--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1)}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{top:auto;bottom:100%;margin-top:0;margin-bottom:6px;flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-pillbar]{padding:0 27px 27px}:where(.magicx-aia[data-animations=\"off\"]) *,:where(.magicx-aia[data-animations=\"off\"]) *:before,:where(.magicx-aia[data-animations=\"off\"]) *:after{animation-duration:0s!important;transition-duration:0s!important}.magicx-aia-container{position:relative;font-family:var(--aia-font-family, inherit);container-type:inline-size}.magicx-aia-input-wrapper{padding:20px;border:1px solid var(--aia-color-border-default, #9ea5b2);border-radius:23px;background:transparent;overflow:hidden;display:flex;align-items:center;gap:4px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:26.6px;line-height:26.6px;font-family:inherit;font-size:var(--aia-written-text-font-size, 19px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.magicx-aia-input{display:inline;outline:none;background:transparent;color:var(--aia-written-text-color, var(--aia-color-text-default, #fff));caret-color:var( --aia-caret-color, var(--aia-written-text-color, var(--aia-color-text-default, #fff)) );font-weight:250;vertical-align:middle}:where(.magicx-aia-input) strong{font-weight:500;letter-spacing:-.01em}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background-color:color-mix(in srgb,var(--aia-edit-outline, currentColor) 20%,transparent);border-radius:6px;padding:2px 3px;margin:0 -1.5px;caret-color:transparent}.magicx-aia-input:has(strong[class~=\"magicx-aia-segment--editing\"]){caret-color:transparent}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::selection{background:transparent;color:inherit}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::-moz-selection{background:transparent;color:inherit}.magicx-aia-input[data-aia-empty=true][data-placeholder]:before{content:attr(data-placeholder);color:var(--aia-color-text-muted, #c1c4cb);opacity:.7;pointer-events:none}.magicx-aia-input[data-aia-empty=true]{display:inline-block;min-width:1px}.magicx-aia-pill-list-container{display:inline;margin-left:8px}.magicx-aia-pill-list-container:empty,.magicx-aia-pill-list-container[data-aia-pill-wrapped]{margin-left:0}.magicx-aia-submit-button{flex-shrink:0;width:36px;height:36px;border-radius:50%;border:none;background:var(--aia-submit-bg, var(--aia-color-text-default, #fff));color:var(--aia-submit-color, var(--aia-color-bg-default, #000));cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:opacity .2s ease}.magicx-aia-submit-button:hover{opacity:.85}.magicx-aia-submit-slot{display:contents}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-revealed]{color:transparent;background:linear-gradient(120deg,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 0%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 44%,#b0b0b0 48%,#b0b0b0 52%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 56%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 100%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-sweep]{animation:aiaTextShimmer .65s ease-out forwards}@keyframes aiaTextShimmer{0%{background-position:100% 0}to{background-position:-50% 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: AIAutocompleteDropdownComponent, selector: "ai-autocomplete-dropdown", inputs: ["controller", "showPills", "className"] }, { kind: "directive", type: AIAutocompleteEditorHostDirective, selector: "[aiaEditorHost]", inputs: ["aiaEditorHost", "autoFocus"] }, { kind: "component", type: PillListComponent, selector: "aia-pill-list", inputs: ["pills", "activePillIndex", "rounded", "loading"], outputs: ["selectPill"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
298
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteComponent, decorators: [{
|
|
299
|
+
type: Component,
|
|
300
|
+
args: [{ selector: "ai-autocomplete", standalone: true, imports: [
|
|
301
|
+
CommonModule,
|
|
302
|
+
AIAutocompleteDropdownComponent,
|
|
303
|
+
AIAutocompleteEditorHostDirective,
|
|
304
|
+
PillListComponent,
|
|
305
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
306
|
+
{
|
|
307
|
+
provide: NG_VALUE_ACCESSOR,
|
|
308
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
309
|
+
useExisting: forwardRef(() => AIAutocompleteComponent),
|
|
310
|
+
multi: true,
|
|
311
|
+
},
|
|
312
|
+
], template: "<div\n class=\"magicx-aia magicx-aia-container\"\n [attr.data-pill-placement]=\"pillPlacement\"\n [attr.data-options-position]=\"optionsPosition\"\n [attr.data-animations]=\"animations ? 'on' : 'off'\"\n [attr.data-mode]=\"resolvedMode\"\n>\n <ai-autocomplete-dropdown\n *ngIf=\"controller\"\n [controller]=\"controller\"\n [showPills]=\"showDropdownPills\"\n ></ai-autocomplete-dropdown>\n\n <div\n class=\"magicx-aia-input-wrapper\"\n (click)=\"onWrapperClick($event)\"\n (keyup)=\"$event.stopPropagation()\"\n >\n <div class=\"magicx-aia-editor-area\" data-aia-editor=\"\">\n <div\n #editor\n *ngIf=\"controller\"\n [aiaEditorHost]=\"controller\"\n [autoFocus]=\"autoFocus\"\n class=\"magicx-aia-input\"\n data-aia-input=\"\"\n ></div>\n\n <ng-container *ngIf=\"controller && showInlinePills\">\n <span\n #pillContainer\n class=\"magicx-aia-pill-list-container\"\n data-aia-pill-list-container=\"\"\n *ngIf=\"\n (controller.isLoading$ | async) ||\n ((controller.suggestionPills$ | async)?.length ?? 0) > 0\n \"\n >\n <aia-pill-list\n [pills]=\"(controller.suggestionPills$ | async) ?? []\"\n [activePillIndex]=\"0\"\n [loading]=\"(controller.isLoading$ | async) ?? false\"\n (selectPill)=\"onSelectPill($event)\"\n ></aia-pill-list>\n </span>\n </ng-container>\n </div>\n\n <ng-container [ngSwitch]=\"submitButtonState\">\n <button\n *ngSwitchCase=\"'default'\"\n type=\"button\"\n data-aia-submit=\"\"\n class=\"magicx-aia-submit-button\"\n [disabled]=\"\n !(\n controller &&\n canSubmit({\n segments: (controller.segments$ | async) ?? [],\n completedParams: (controller.completedParams$ | async) ?? []\n })\n )\n \"\n aria-label=\"Submit\"\n (click)=\"onSubmitButtonClick($event)\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n role=\"img\"\n aria-label=\"Submit\"\n >\n <path\n d=\"M9 14V4M9 4L4 9M9 4L14 9\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <span\n *ngSwitchCase=\"'custom'\"\n data-aia-submit=\"\"\n class=\"magicx-aia-submit-slot\"\n (click)=\"onSubmitSlotClick($event)\"\n >\n <ng-container *ngTemplateOutlet=\"customSubmitTemplate\"></ng-container>\n </span>\n </ng-container>\n </div>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-pill-bg: #bdbdbd;--aia-pill-color: #000000;--aia-pill-font-size: 19px;--aia-option-bg: transparent;--aia-option-color: #4f4f4f;--aia-option-color-selected: #000000;--aia-option-font-size: 19px;--aia-written-text-color: #000000;--aia-written-text-font-size: 19px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: #000000;--aia-submit-color: #ffffff;--aia-color-text-muted: #6b7280;--aia-skeleton-bg: rgba(189, 189, 189, .51);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-pill-bg: #bdbdbd;--aia-pill-color: #ffffff;--aia-pill-font-size: 19px;--aia-option-bg: transparent;--aia-option-color: #b0b0b0;--aia-option-color-selected: #ffffff;--aia-option-font-size: 19px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 19px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: #ffffff;--aia-submit-color: #000000;--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: #333539;--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1)}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{top:auto;bottom:100%;margin-top:0;margin-bottom:6px;flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-pillbar]{padding:0 27px 27px}:where(.magicx-aia[data-animations=\"off\"]) *,:where(.magicx-aia[data-animations=\"off\"]) *:before,:where(.magicx-aia[data-animations=\"off\"]) *:after{animation-duration:0s!important;transition-duration:0s!important}.magicx-aia-container{position:relative;font-family:var(--aia-font-family, inherit);container-type:inline-size}.magicx-aia-input-wrapper{padding:20px;border:1px solid var(--aia-color-border-default, #9ea5b2);border-radius:23px;background:transparent;overflow:hidden;display:flex;align-items:center;gap:4px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:26.6px;line-height:26.6px;font-family:inherit;font-size:var(--aia-written-text-font-size, 19px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.magicx-aia-input{display:inline;outline:none;background:transparent;color:var(--aia-written-text-color, var(--aia-color-text-default, #fff));caret-color:var( --aia-caret-color, var(--aia-written-text-color, var(--aia-color-text-default, #fff)) );font-weight:250;vertical-align:middle}:where(.magicx-aia-input) strong{font-weight:500;letter-spacing:-.01em}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background-color:color-mix(in srgb,var(--aia-edit-outline, currentColor) 20%,transparent);border-radius:6px;padding:2px 3px;margin:0 -1.5px;caret-color:transparent}.magicx-aia-input:has(strong[class~=\"magicx-aia-segment--editing\"]){caret-color:transparent}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::selection{background:transparent;color:inherit}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::-moz-selection{background:transparent;color:inherit}.magicx-aia-input[data-aia-empty=true][data-placeholder]:before{content:attr(data-placeholder);color:var(--aia-color-text-muted, #c1c4cb);opacity:.7;pointer-events:none}.magicx-aia-input[data-aia-empty=true]{display:inline-block;min-width:1px}.magicx-aia-pill-list-container{display:inline;margin-left:8px}.magicx-aia-pill-list-container:empty,.magicx-aia-pill-list-container[data-aia-pill-wrapped]{margin-left:0}.magicx-aia-submit-button{flex-shrink:0;width:36px;height:36px;border-radius:50%;border:none;background:var(--aia-submit-bg, var(--aia-color-text-default, #fff));color:var(--aia-submit-color, var(--aia-color-bg-default, #000));cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:opacity .2s ease}.magicx-aia-submit-button:hover{opacity:.85}.magicx-aia-submit-slot{display:contents}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-revealed]{color:transparent;background:linear-gradient(120deg,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 0%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 44%,#b0b0b0 48%,#b0b0b0 52%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 56%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 100%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-sweep]{animation:aiaTextShimmer .65s ease-out forwards}@keyframes aiaTextShimmer{0%{background-position:100% 0}to{background-position:-50% 0}}\n"] }]
|
|
313
|
+
}], propDecorators: { apiConfig: [{
|
|
314
|
+
type: Input
|
|
315
|
+
}], optionOverrides: [{
|
|
316
|
+
type: Input
|
|
317
|
+
}], maskCompletedText: [{
|
|
318
|
+
type: Input
|
|
319
|
+
}], columns: [{
|
|
320
|
+
type: Input
|
|
321
|
+
}], pillPlacement: [{
|
|
322
|
+
type: Input
|
|
323
|
+
}], mode: [{
|
|
324
|
+
type: Input
|
|
325
|
+
}], optionsPosition: [{
|
|
326
|
+
type: Input
|
|
327
|
+
}], animations: [{
|
|
328
|
+
type: Input
|
|
329
|
+
}], dropdownTrigger: [{
|
|
330
|
+
type: Input
|
|
331
|
+
}], closeDropdownOnBlur: [{
|
|
332
|
+
type: Input
|
|
333
|
+
}], showNonTappableOptions: [{
|
|
334
|
+
type: Input
|
|
335
|
+
}], autoFocus: [{
|
|
336
|
+
type: Input
|
|
337
|
+
}], value: [{
|
|
338
|
+
type: Input
|
|
339
|
+
}], completedParams: [{
|
|
340
|
+
type: Input
|
|
341
|
+
}], submitButton: [{
|
|
342
|
+
type: Input
|
|
343
|
+
}], submitted: [{
|
|
344
|
+
type: Output
|
|
345
|
+
}], errored: [{
|
|
346
|
+
type: Output
|
|
347
|
+
}], valueChange: [{
|
|
348
|
+
type: Output
|
|
349
|
+
}], completedParamsChange: [{
|
|
350
|
+
type: Output
|
|
351
|
+
}], focused: [{
|
|
352
|
+
type: Output
|
|
353
|
+
}], blurred: [{
|
|
354
|
+
type: Output
|
|
355
|
+
}], editorRef: [{
|
|
356
|
+
type: ViewChild,
|
|
357
|
+
args: ["editor", { static: false }]
|
|
358
|
+
}], pillContainerRef: [{
|
|
359
|
+
type: ViewChild,
|
|
360
|
+
args: ["pillContainer"]
|
|
361
|
+
}] } });
|
|
362
|
+
function noop() {
|
|
363
|
+
// Default no-op for CVA callbacks.
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9haS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFJTixNQUFNLEVBQ04sV0FBVyxFQUdYLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE2QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFJTCxVQUFVLEVBRVYsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFFZCxlQUFlLEdBQ2hCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDakgsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7OztBQUU5RSxTQUFTLGtCQUFrQixDQUFDLElBQW9CO0lBQzlDLElBQUksSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNqRCxP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T0FBTztzQkFBekIsTUFBTTtnQkFDWSxPQUFPO3NCQUF6QixNQUFNO2dCQUlpQyxTQUFTO3NCQUFoRCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ1YsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7O0FBZ1I1QixTQUFTLElBQUk7SUFDWCxtQ0FBbUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICB0eXBlIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgdHlwZSBTaW1wbGVDaGFuZ2VzLFxuICB0eXBlIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQVBJQ29uZmlnLFxuICB0eXBlIEFwcGVhcmFuY2VNb2RlLFxuICB0eXBlIEF1dG9jb21wbGV0ZVJlc3VsdCxcbiAgYnVpbGRRdWVyeSxcbiAgdHlwZSBDb21wbGV0ZWRQYXJhbVN0YXRlLFxuICBleHRyYWN0UGxhaW5UZXh0LFxuICBNb2RlQ29udHJvbGxlcixcbiAgdHlwZSBPcHRpb25PdmVycmlkZXMsXG4gIHNldEN1cnNvck9mZnNldCxcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlci9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlIH0gZnJvbSBcIi4uL2ludGVybmFsL2VkaXRvci1ob3N0L2VkaXRvci1ob3N0LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgUGlsbExpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnRcIjtcblxuZnVuY3Rpb24gcmVzb2x2ZUluaXRpYWxNb2RlKG1vZGU6IEFwcGVhcmFuY2VNb2RlKTogXCJsaWdodFwiIHwgXCJkYXJrXCIge1xuICBpZiAobW9kZSAhPT0gXCJhdXRvXCIpIHJldHVybiBtb2RlO1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIFwiZGFya1wiO1xuICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIpLm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbn1cblxuLyoqXG4gKiBUaWVyIDEgY29tcG9uZW50IOKAlCBgPGFpLWF1dG9jb21wbGV0ZT5gLiBUaGUgQW5ndWxhciBlcXVpdmFsZW50IG9mIFJlYWN0J3NcbiAqIGA8QUlBdXRvY29tcGxldGUgLz5gLiBPd25zIHRoZSBjb250ZW50RWRpdGFibGUgZWRpdG9yLCBpbmxpbmUgcGlsbHMsIG1vZGVcbiAqIGNvbnRyb2xsZXIsIHN1Ym1pdCBidXR0b24gc2xvdCwgYW5kIGFuIGVtYmVkZGVkXG4gKiB7QGxpbmsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyfSB0aGF0IGRyaXZlcyB0aGUgZHJvcGRvd24uXG4gKlxuICogQHB1YmxpY1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYWktYXV0b2NvbXBsZXRlXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQUlBdXRvY29tcGxldGVEcm9wZG93bkNvbXBvbmVudCxcbiAgICBBSUF1dG9jb21wbGV0ZUVkaXRvckhvc3REaXJlY3RpdmUsXG4gICAgUGlsbExpc3RDb21wb25lbnQsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogXCIuL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5jc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQUlBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQUlBdXRvY29tcGxldGVDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3Nvclxue1xuICAvLyA9PT0gSW5wdXRzIChtaXJyb3JzIFJlYWN0J3MgQUlBdXRvY29tcGxldGVQcm9wcykgPT09XG5cbiAgQElucHV0KCkgYXBpQ29uZmlnPzogQVBJQ29uZmlnO1xuICBASW5wdXQoKSBvcHRpb25PdmVycmlkZXM/OiBPcHRpb25PdmVycmlkZXM7XG4gIEBJbnB1dCgpIG1hc2tDb21wbGV0ZWRUZXh0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbHVtbnM/OiBudW1iZXI7XG4gIC8qKiBXaGVyZSB1bmZpbGxlZCBwaWxscyByZW5kZXIuIERlZmF1bHQ6IFwiaW5saW5lXCIuICovXG4gIEBJbnB1dCgpIHBpbGxQbGFjZW1lbnQ6IFwiaW5saW5lXCIgfCBcImRyb3Bkb3duXCIgfCBcImhpZGRlblwiID0gXCJpbmxpbmVcIjtcbiAgLyoqIENvbG9yIG1vZGUuIFwiYXV0b1wiIGZvbGxvd3MgcHJlZmVycy1jb2xvci1zY2hlbWUuIERlZmF1bHQ6IFwiYXV0b1wiLiAqL1xuICBASW5wdXQoKSBtb2RlOiBBcHBlYXJhbmNlTW9kZSA9IFwiYXV0b1wiO1xuICBASW5wdXQoKSBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgYW5pbWF0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIGRyb3Bkb3duVHJpZ2dlcj86IFwiYXV0b1wiIHwgXCJtYW51YWxcIiB8IFwiaGlkZGVuXCI7XG4gIEBJbnB1dCgpIGNsb3NlRHJvcGRvd25PbkJsdXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93Tm9uVGFwcGFibGVPcHRpb25zPzogYm9vbGVhbjtcbiAgLyoqIEZvY3VzIHRoZSBlZGl0b3Igb24gbW91bnQuIERlZmF1bHQ6IHRydWUuICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgdGV4dCB2YWx1ZS4gKi9cbiAgQElucHV0KCkgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgY29tcGxldGVkIHBhcmFtcy4gKi9cbiAgQElucHV0KCkgY29tcGxldGVkUGFyYW1zPzogQ29tcGxldGVkUGFyYW1TdGF0ZVtdO1xuICAvKipcbiAgICogQ3VzdG9tIHN1Ym1pdCBidXR0b24uIFBhc3MgYSBgPG5nLXRlbXBsYXRlPmAgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdCBhcnJvd1xuICAgKiBidXR0b24uIFBhc3MgYG51bGxgIHRvIHJlbmRlciBubyBidXR0b24uIERlZmF1bHQgKGB1bmRlZmluZWRgKSByZW5kZXJzXG4gICAqIHRoZSBidWlsdC1pbiBhcnJvdy5cbiAgICovXG4gIEBJbnB1dCgpIHN1Ym1pdEJ1dHRvbj86IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbDtcblxuICAvLyA9PT0gT3V0cHV0cyA9PT1cblxuICAvKiogQ2FsbGVkIG9uIEVudGVyIG9yIHN1Ym1pdC1idXR0b24gY2xpY2suICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZVJlc3VsdD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGVycm9yZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbXBsZXRlZFBhcmFtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVkUGFyYW1TdGF0ZVtdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gPT09IFZpZXcgcmVmcyA9PT1cblxuICBAVmlld0NoaWxkKFwiZWRpdG9yXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBlZGl0b3JSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcInBpbGxDb250YWluZXJcIikgcGlsbENvbnRhaW5lclJlZj86IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcblxuICAvLyA9PT0gUHVibGljIHN0YXRlIGZvciB0aGUgdGVtcGxhdGUgPT09XG5cbiAgY29udHJvbGxlciE6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcjtcbiAgcmVzb2x2ZWRNb2RlOiBcImxpZ2h0XCIgfCBcImRhcmtcIiA9IFwiZGFya1wiO1xuXG4gIC8vID09PSBJbnRlcm5hbCA9PT1cblxuICBwcml2YXRlIG1vZGVDb250cm9sbGVyPzogTW9kZUNvbnRyb2xsZXI7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSBub29wO1xuXG4gIC8vIMKnMTYuOTogcHJlZmVyIGBpbmplY3QoKWAgb3ZlciBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXIgREkgZm9yIGNvbXBvbmVudHMuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gcmVzb2x2ZUluaXRpYWxNb2RlKHRoaXMubW9kZSk7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQUlBdXRvY29tcGxldGVDb250cm9sbGVyKHtcbiAgICAgIGFwaUNvbmZpZzogdGhpcy5hcGlDb25maWcsXG4gICAgICBvcHRpb25PdmVycmlkZXM6IHRoaXMub3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgbWFza0NvbXBsZXRlZFRleHQ6IHRoaXMubWFza0NvbXBsZXRlZFRleHQsXG4gICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICBkcm9wZG93blRyaWdnZXI6IHRoaXMuZHJvcGRvd25UcmlnZ2VyLFxuICAgICAgb3B0aW9uc1Bvc2l0aW9uOiB0aGlzLm9wdGlvbnNQb3NpdGlvbixcbiAgICAgIGNsb3NlRHJvcGRvd25PbkJsdXI6IHRoaXMuY2xvc2VEcm9wZG93bk9uQmx1cixcbiAgICAgIHNob3dOb25UYXBwYWJsZU9wdGlvbnM6IHRoaXMuc2hvd05vblRhcHBhYmxlT3B0aW9ucyxcbiAgICAgIHNvdXJjZTogXCJmdWxsLXNka1wiLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBjb21wbGV0ZWRQYXJhbXM6IHRoaXMuY29tcGxldGVkUGFyYW1zLFxuICAgICAgb25TdWJtaXQ6IChyZXN1bHQpID0+IHRoaXMuaGFuZGxlU3VibWl0KHJlc3VsdCksXG4gICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHRoaXMuZXJyb3JlZC5lbWl0KGVycm9yKSxcbiAgICAgIG9uQ2hhbmdlOiAodGV4dCkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGV4dCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbih0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBvblBhcmFtc0NoYW5nZTogKHBhcmFtcykgPT4gdGhpcy5jb21wbGV0ZWRQYXJhbXNDaGFuZ2UuZW1pdChwYXJhbXMpLFxuICAgICAgb25Gb2N1czogKCkgPT4gdGhpcy5mb2N1c2VkLmVtaXQoKSxcbiAgICAgIG9uQmx1cjogKCkgPT4ge1xuICAgICAgICB0aGlzLmJsdXJyZWQuZW1pdCgpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gICAgICB9LFxuICAgICAgc2V0Q3Vyc29yOiAob2Zmc2V0KSA9PiB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xuICAgICAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICAgICAgc2V0Q3Vyc29yT2Zmc2V0KGVkaXRvciwgb2Zmc2V0KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMubW9kZUNvbnRyb2xsZXIgPSBuZXcgTW9kZUNvbnRyb2xsZXIoY29udGFpbmVyLCB0aGlzLm1vZGUpO1xuXG4gICAgLy8gUGlsbC13cmFwIGRldGVjdGlvbiDigJQgd2hlbiB0aGUgcGlsbCBsaXN0IHdyYXBzIGJlbG93IHRoZSBlZGl0b3IncyBsYXN0XG4gICAgLy8gbGluZSwgZHJvcCBpdHMgOHB4IGxlZnQgbWFyZ2luIHZpYSBhIGRhdGEgYXR0cmlidXRlIHRoZSBDU1Mga2V5cyBvZmYuXG4gICAgLy8gTWlycm9ycyB0aGUgUmVhY3QgY29tcG9uZW50J3MgdXNlTGF5b3V0RWZmZWN0LlxuICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5tZWFzdXJlUGlsbFdyYXAoKSk7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZWRpdG9yKSB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWRpdG9yKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tZWFzdXJlUGlsbFdyYXAoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHJldHVybjtcbiAgICAvLyBDb250cm9sbGVkLW1vZGUgcHJvcGFnYXRpb25cbiAgICBpZiAoY2hhbmdlcy52YWx1ZSAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuY29tcGxldGVkUGFyYW1zICYmIHRoaXMuY29tcGxldGVkUGFyYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRDb21wbGV0ZWRQYXJhbXModGhpcy5jb21wbGV0ZWRQYXJhbXMpO1xuICAgIH1cbiAgICAvLyBSZWFjdGl2ZSBvcHRpb25zXG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5hcGlDb25maWcgfHxcbiAgICAgIGNoYW5nZXMub3B0aW9uT3ZlcnJpZGVzIHx8XG4gICAgICBjaGFuZ2VzLmRyb3Bkb3duVHJpZ2dlciB8fFxuICAgICAgY2hhbmdlcy5vcHRpb25zUG9zaXRpb24gfHxcbiAgICAgIGNoYW5nZXMuY2xvc2VEcm9wZG93bk9uQmx1ciB8fFxuICAgICAgY2hhbmdlcy5zaG93Tm9uVGFwcGFibGVPcHRpb25zXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIudXBkYXRlKHtcbiAgICAgICAgYXBpQ29uZmlnOiB0aGlzLmFwaUNvbmZpZyxcbiAgICAgICAgb3B0aW9uT3ZlcnJpZGVzOiB0aGlzLm9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgZHJvcGRvd25UcmlnZ2VyOiB0aGlzLmRyb3Bkb3duVHJpZ2dlcixcbiAgICAgICAgb3B0aW9uc1Bvc2l0aW9uOiB0aGlzLm9wdGlvbnNQb3NpdGlvbixcbiAgICAgICAgY2xvc2VEcm9wZG93bk9uQmx1cjogdGhpcy5jbG9zZURyb3Bkb3duT25CbHVyLFxuICAgICAgICBzaG93Tm9uVGFwcGFibGVPcHRpb25zOiB0aGlzLnNob3dOb25UYXBwYWJsZU9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubW9kZSkge1xuICAgICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uc2V0TW9kZSh0aGlzLm1vZGUpO1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUodGhpcy5tb2RlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29udHJvbGxlcj8uZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gPT09IEltcGVyYXRpdmUgQVBJIChleHBvc2VkIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdmlhIEBWaWV3Q2hpbGQpID09PVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGZvY3VzIHRoZSBlZGl0b3IuICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogUHJvZ3JhbW1hdGljYWxseSBibHVyIHRoZSBlZGl0b3IuICovXG4gIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdGF0ZSwgcm90YXRlIHNlc3Npb24sIGFuZCByZS1mZXRjaC4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyPy5yZXNldCgpO1xuICB9XG5cbiAgLyoqIFN3aXRjaCBjb2xvciBtb2RlIGF0IHJ1bnRpbWUuICovXG4gIHNldE1vZGUobW9kZTogQXBwZWFyYW5jZU1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMubW9kZUNvbnRyb2xsZXI/LnNldE1vZGUobW9kZSk7XG4gICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUobW9kZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyA9PT0gVGVtcGxhdGUgaGVscGVycyA9PT1cblxuICAvKipcbiAgICogJ2RlZmF1bHQnIOKGkiByZW5kZXIgdGhlIGJ1aWx0LWluIGFycm93IGJ1dHRvbi5cbiAgICogJ2N1c3RvbScgIOKGkiBwcm9qZWN0IHRoZSBjb25zdW1lci1zdXBwbGllZCBUZW1wbGF0ZVJlZi5cbiAgICogJ2hpZGRlbicgIOKGkiBubyBidXR0b24uXG4gICAqL1xuICBnZXQgc3VibWl0QnV0dG9uU3RhdGUoKTogXCJkZWZhdWx0XCIgfCBcImN1c3RvbVwiIHwgXCJoaWRkZW5cIiB7XG4gICAgaWYgKHRoaXMuc3VibWl0QnV0dG9uID09PSBudWxsKSByZXR1cm4gXCJoaWRkZW5cIjtcbiAgICBpZiAodGhpcy5zdWJtaXRCdXR0b24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIFwiZGVmYXVsdFwiO1xuICAgIHJldHVybiBcImN1c3RvbVwiO1xuICB9XG5cbiAgLyoqIE5hcnJvd2VkIGFjY2Vzc29yIGZvciAqbmdUZW1wbGF0ZU91dGxldCDigJQgbmV2ZXIgdW5kZWZpbmVkLiAqL1xuICBnZXQgY3VzdG9tU3VibWl0VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zdWJtaXRCdXR0b24gPz8gbnVsbDtcbiAgfVxuXG4gIGdldCBzaG93SW5saW5lUGlsbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlsbFBsYWNlbWVudCA9PT0gXCJpbmxpbmVcIjtcbiAgfVxuXG4gIGdldCBzaG93RHJvcGRvd25QaWxscygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWxsUGxhY2VtZW50ID09PSBcImRyb3Bkb3duXCI7XG4gIH1cblxuICAvKipcbiAgICogYHRydWVgIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgdG8gc3VibWl0IOKAlCBkcml2ZW4gYnkgY3VycmVudCBzZWdtZW50c1xuICAgKiBhbmQgY29tcGxldGVkIHBhcmFtcy4gUmVhZCBvZmYgdGhlIGxpdmUgZWRpdG9yIHZpYSB0aGUgY29udHJvbGxlciBzdGF0ZS5cbiAgICovXG4gIGNhblN1Ym1pdChzdGF0ZTogeyBzZWdtZW50czogeyBsZW5ndGg6IG51bWJlciB9OyBjb21wbGV0ZWRQYXJhbXM6IHsgbGVuZ3RoOiBudW1iZXIgfSB9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0YXRlLnNlZ21lbnRzLmxlbmd0aCA+IDAgfHwgc3RhdGUuY29tcGxldGVkUGFyYW1zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBvbldyYXBwZXJDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIENsaWNraW5nIGEgcGlsbCBzaG91bGQgYWN0aXZhdGUgaXQgd2l0aG91dCBzdGVhbGluZyBmb2N1cyBlbHNld2hlcmUuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodGFyZ2V0Py5jbG9zZXN0KFwiW2RhdGEtYWlhLXBpbGxdXCIpKSByZXR1cm47XG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgb25TdWJtaXRCdXR0b25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaGFuZGxlU3VibWl0RnJvbVVzZXJBY3Rpb24oKTtcbiAgfVxuXG4gIG9uU3VibWl0U2xvdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5oYW5kbGVTdWJtaXRGcm9tVXNlckFjdGlvbigpO1xuICB9XG5cbiAgb25TZWxlY3RQaWxsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0QWN0aXZlUGlsbChpbmRleCk7XG4gIH1cblxuICAvLyA9PT0gQ29udHJvbFZhbHVlQWNjZXNzb3IgPT09XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250cm9sbGVyKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHZhbHVlID8/IFwiXCIpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShfZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBUaGUgY29udGVudEVkaXRhYmxlIGhvc3QgZG9lc24ndCBoYXZlIGEgbmF0aXZlIGRpc2FibGVkIGF0dHJpYnV0ZS4gRm9yXG4gICAgLy8gdjAuMSB3ZSBhY2NlcHQgdGhlIGNhbGwgc28gQW5ndWxhcidzIGZvcm1zIGxheWVyIGRvZXNuJ3QgdGhyb3csIGJ1dFxuICAgIC8vIHRoZSBlZGl0b3Igc3RheXMgaW50ZXJhY3RpdmUuIEEgZnV0dXJlIGVuaGFuY2VtZW50IGNhbiB0b2dnbGVcbiAgICAvLyBjb250ZW50RWRpdGFibGUgKyBBUklBIGRpc2FibGVkIGhlcmUuXG4gIH1cblxuICAvLyA9PT0gU3VibWl0IGZsb3cgPT09XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgY29udHJvbGxlcidzIG9uU3VibWl0IGNhbGxiYWNrICh3aGljaCBmaXJlcyBmcm9tIHRoZVxuICAgKiBrZXlib2FyZCBjb250cm9sbGVyIG9uIEVudGVyKS4gUmVhZHMgdGhlIGxpdmUgZWRpdG9yIHRleHQg4oCUIHNhbWUgdHJpY2tcbiAgICogdGhlIFJlYWN0IGNvbXBvbmVudCB1c2VzIOKAlCBzbyB0aGUgZW1pdHRlZCBxdWVyeSByZWZsZWN0cyB3aGF0ZXZlcidzIGluXG4gICAqIHRoZSBET00gcmlnaHQgbm93LCBub3QgYSBwb3NzaWJseS1zdGFsZSBzdGF0ZSBzbmFwc2hvdC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0KF9yZXN1bHQ6IEF1dG9jb21wbGV0ZVJlc3VsdCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IGV4dHJhY3RQbGFpblRleHQoZWRpdG9yKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmNvbXBsZXRlZFBhcmFtcyA/PyB0aGlzLmNvbnRyb2xsZXIuZ2V0U3RhdGUoKS5jb21wbGV0ZWRQYXJhbXM7XG4gICAgY29uc3QgYnVpbHQgPSBidWlsZFF1ZXJ5KHRleHQsIHBhcmFtcyk7XG4gICAgdGhpcy5zdWJtaXR0ZWQuZW1pdCh7XG4gICAgICBxdWVyeTogdGV4dC50cmltKCksXG4gICAgICByYXdfcXVlcnk6IGJ1aWx0LnJhd1F1ZXJ5LFxuICAgICAgY29tcGxldGVkX3BhcmFtczogYnVpbHQuY29tcGxldGVkUGFyYW1zLFxuICAgIH0pO1xuICAgIHRoaXMuY29udHJvbGxlci5yZXNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWJtaXRGcm9tVXNlckFjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQoc3RhdGUpKSByZXR1cm47XG4gICAgLy8gU3ludGhlc2l6ZSB0aGUgcmVzdWx0IGZvciB0aGUgc3VibWl0LWJ1dHRvbiBjbGljayBwYXRoOyBzYW1lIHNoYXBlXG4gICAgLy8gdGhlIGNvbnRyb2xsZXIgd291bGQgZGVsaXZlciBmcm9tIGEga2V5Ym9hcmQgRW50ZXIsIHNvIGhhbmRsZVN1Ym1pdFxuICAgIC8vIGNhbiB0YWtlIGVpdGhlciBlbnRyeSBwb2ludC5cbiAgICB0aGlzLmhhbmRsZVN1Ym1pdCh7XG4gICAgICBxdWVyeTogc3RhdGUudGV4dC50cmltKCksXG4gICAgICByYXdfcXVlcnk6IFwiXCIsXG4gICAgICBjb21wbGV0ZWRfcGFyYW1zOiBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVhc3VyZVBpbGxXcmFwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucGlsbENvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCAhZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgaW5uZXIgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghaW5uZXIpIHJldHVybjtcbiAgICAvLyBXcmFwIGRldGVjdGlvbjogdGhlIHBpbGwgcm93J3MgdG9wIHZzIHRoZSBlZGl0b3IncyBib3R0b20uIFdoZW4gdGhlXG4gICAgLy8gcGlsbHMgc2l0IG9uIChvciBhYm92ZSkgdGhlIGVkaXRvcidzIGxhc3QgbGluZSB0aGV5J3JlIE5PVCB3cmFwcGVkIOKAlFxuICAgIC8vIGtlZXAgdGhlIDhweCBtYXJnaW4gc28gdGhleSBkb24ndCBidXR0IGFnYWluc3QgdHlwZWQgdGV4dCBvciB0aGVcbiAgICAvLyBwbGFjZWhvbGRlci4gVGhpcyBoYW5kbGVzIHRoZSBlbXB0eS1lZGl0b3IgKyBwbGFjZWhvbGRlciBjYXNlXG4gICAgLy8gbmF0dXJhbGx5OiB0aGUgcGxhY2Vob2xkZXIgc3RpbGwgb2NjdXBpZXMgdGhlIGVkaXRvcidzIGxpbmUgYm94LlxuICAgIGNvbnN0IGNSZWN0ID0gaW5uZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZVJlY3QgPSBlZGl0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd3JhcHBlZCA9IGNSZWN0LnRvcCA+PSBlUmVjdC5ib3R0b20gLSAyO1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgaWYgKHdyYXBwZWQpIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIiwgXCJcIik7XG4gICAgICBlbHNlIGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcbiAgLy8gRGVmYXVsdCBuby1vcCBmb3IgQ1ZBIGNhbGxiYWNrcy5cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCJcbiAgW2F0dHIuZGF0YS1waWxsLXBsYWNlbWVudF09XCJwaWxsUGxhY2VtZW50XCJcbiAgW2F0dHIuZGF0YS1vcHRpb25zLXBvc2l0aW9uXT1cIm9wdGlvbnNQb3NpdGlvblwiXG4gIFthdHRyLmRhdGEtYW5pbWF0aW9uc109XCJhbmltYXRpb25zID8gJ29uJyA6ICdvZmYnXCJcbiAgW2F0dHIuZGF0YS1tb2RlXT1cInJlc29sdmVkTW9kZVwiXG4+XG4gIDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd25cbiAgICAqbmdJZj1cImNvbnRyb2xsZXJcIlxuICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXJcIlxuICAgIFtzaG93UGlsbHNdPVwic2hvd0Ryb3Bkb3duUGlsbHNcIlxuICA+PC9haS1hdXRvY29tcGxldGUtZHJvcGRvd24+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibWFnaWN4LWFpYS1pbnB1dC13cmFwcGVyXCJcbiAgICAoY2xpY2spPVwib25XcmFwcGVyQ2xpY2soJGV2ZW50KVwiXG4gICAgKGtleXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibWFnaWN4LWFpYS1lZGl0b3ItYXJlYVwiIGRhdGEtYWlhLWVkaXRvcj1cIlwiPlxuICAgICAgPGRpdlxuICAgICAgICAjZWRpdG9yXG4gICAgICAgICpuZ0lmPVwiY29udHJvbGxlclwiXG4gICAgICAgIFthaWFFZGl0b3JIb3N0XT1cImNvbnRyb2xsZXJcIlxuICAgICAgICBbYXV0b0ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1pbnB1dFwiXG4gICAgICAgIGRhdGEtYWlhLWlucHV0PVwiXCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2xsZXIgJiYgc2hvd0lubGluZVBpbGxzXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgI3BpbGxDb250YWluZXJcbiAgICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtcGlsbC1saXN0LWNvbnRhaW5lclwiXG4gICAgICAgICAgZGF0YS1haWEtcGlsbC1saXN0LWNvbnRhaW5lcj1cIlwiXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIChjb250cm9sbGVyLmlzTG9hZGluZyQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgKChjb250cm9sbGVyLnN1Z2dlc3Rpb25QaWxscyQgfCBhc3luYyk/Lmxlbmd0aCA/PyAwKSA+IDBcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGFpYS1waWxsLWxpc3RcbiAgICAgICAgICAgIFtwaWxsc109XCIoY29udHJvbGxlci5zdWdnZXN0aW9uUGlsbHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgICAgICAgIFthY3RpdmVQaWxsSW5kZXhdPVwiMFwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCIoY29udHJvbGxlci5pc0xvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgIChzZWxlY3RQaWxsKT1cIm9uU2VsZWN0UGlsbCgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9haWEtcGlsbC1saXN0PlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInN1Ym1pdEJ1dHRvblN0YXRlXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCInZGVmYXVsdCdcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgZGF0YS1haWEtc3VibWl0PVwiXCJcbiAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXN1Ym1pdC1idXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgIShcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgJiZcbiAgICAgICAgICAgIGNhblN1Ym1pdCh7XG4gICAgICAgICAgICAgIHNlZ21lbnRzOiAoY29udHJvbGxlci5zZWdtZW50cyQgfCBhc3luYykgPz8gW10sXG4gICAgICAgICAgICAgIGNvbXBsZXRlZFBhcmFtczogKGNvbnRyb2xsZXIuY29tcGxldGVkUGFyYW1zJCB8IGFzeW5jKSA/PyBbXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIFwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJTdWJtaXRcIlxuICAgICAgICAoY2xpY2spPVwib25TdWJtaXRCdXR0b25DbGljaygkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlN1Ym1pdFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk05IDE0VjRNOSA0TDQgOU05IDRMMTQgOVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8c3BhblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2N1c3RvbSdcIlxuICAgICAgICBkYXRhLWFpYS1zdWJtaXQ9XCJcIlxuICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtc3VibWl0LXNsb3RcIlxuICAgICAgICAoY2xpY2spPVwib25TdWJtaXRTbG90Q2xpY2soJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21TdWJtaXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { AIAutocompleteComponent } from "./ai-autocomplete.component";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEFJQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSBcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudFwiO1xuIl19
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { CommonModule } from "@angular/common";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from "@angular/core";
|
|
3
|
+
import { map } from "rxjs/operators";
|
|
4
|
+
import { PillListComponent } from "../internal/pill-list/pill-list.component";
|
|
5
|
+
import { SuggestionGridComponent } from "../internal/suggestion-grid/suggestion-grid.component";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
/**
|
|
9
|
+
* Tier 2 dropdown component — the Angular equivalent of React's
|
|
10
|
+
* `<AIAutocompleteDropdown />`. Renders the pillbar, options grid, and
|
|
11
|
+
* loading skeleton based on the supplied controller's `dropdown$` snapshot.
|
|
12
|
+
*
|
|
13
|
+
* ```html
|
|
14
|
+
* <ai-autocomplete-dropdown [controller]="ac"></ai-autocomplete-dropdown>
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* All actions (pill click, option select, option highlight) are forwarded to
|
|
18
|
+
* the controller. Consumers who need to observe these events can subscribe
|
|
19
|
+
* to the controller's per-field observables.
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export class AIAutocompleteDropdownComponent {
|
|
24
|
+
constructor() {
|
|
25
|
+
/** Whether to render the pillbar above the options grid. Default: true. */
|
|
26
|
+
this.showPills = true;
|
|
27
|
+
/** Fallback skeleton-bar widths used when loading with zero cached options. */
|
|
28
|
+
this.fallbackSkeletonBarWidths = [159, 119, 164];
|
|
29
|
+
this.trackByWidth = (_, w) => w;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* View-model derived from the controller's `dropdown$`. Adds three booleans
|
|
33
|
+
* (`showsPills`, `showsOptions`, `showsFallbackSkeleton`, `isVisible`) that
|
|
34
|
+
* keep template-level logic to a property read per §19.6.
|
|
35
|
+
*/
|
|
36
|
+
get vm$() {
|
|
37
|
+
return this.controller.dropdown$.pipe(map((dd) => {
|
|
38
|
+
const options = dd.suggestions[0]?.options ?? [];
|
|
39
|
+
const showsPills = this.showPills && (dd.pills.length > 0 || dd.isLoading);
|
|
40
|
+
const showsOptions = options.length > 0;
|
|
41
|
+
const showsFallbackSkeleton = dd.isLoading && !showsOptions;
|
|
42
|
+
const isVisible = dd.isOpen && (showsOptions || showsPills || dd.isLoading);
|
|
43
|
+
return {
|
|
44
|
+
pills: dd.pills,
|
|
45
|
+
options,
|
|
46
|
+
activeIndex: dd.activeIndex,
|
|
47
|
+
isLoading: dd.isLoading,
|
|
48
|
+
showsPills,
|
|
49
|
+
showsOptions,
|
|
50
|
+
showsFallbackSkeleton,
|
|
51
|
+
isVisible,
|
|
52
|
+
};
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
onPillClick(index) {
|
|
56
|
+
this.controller.setActivePill(index);
|
|
57
|
+
}
|
|
58
|
+
onSelect(option) {
|
|
59
|
+
this.controller.selectOption(option);
|
|
60
|
+
}
|
|
61
|
+
onHighlight(index) {
|
|
62
|
+
this.controller.setActiveDropdownIndex(index);
|
|
63
|
+
}
|
|
64
|
+
preventBlur(event) {
|
|
65
|
+
// Prevent the editor from losing focus when interacting with the dropdown.
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
AIAutocompleteDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
70
|
+
AIAutocompleteDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteDropdownComponent, isStandalone: true, selector: "ai-autocomplete-dropdown", inputs: { controller: "controller", showPills: "showPills", className: "className" }, ngImport: i0, template: "<div\n *ngIf=\"vm$ | async as vm\"\n [id]=\"controller.listboxId\"\n role=\"listbox\"\n data-aia-dropdown=\"\"\n [attr.data-aia-loading]=\"vm.isLoading ? '' : null\"\n class=\"magicx-aia-dropdown\"\n [class.magicx-aia-dropdown-visible]=\"vm.isVisible\"\n [class]=\"className ? 'magicx-aia-dropdown ' + className : 'magicx-aia-dropdown'\"\n (mousedown)=\"preventBlur($event)\"\n>\n <div\n *ngIf=\"vm.showsPills\"\n class=\"magicx-aia-dropdown-pillbar\"\n data-aia-pillbar=\"\"\n >\n <aia-pill-list\n [pills]=\"vm.pills\"\n [activePillIndex]=\"0\"\n [rounded]=\"true\"\n [loading]=\"vm.isLoading\"\n (selectPill)=\"onPillClick($event)\"\n ></aia-pill-list>\n </div>\n\n <aia-suggestion-grid\n *ngIf=\"vm.showsOptions\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [loading]=\"vm.isLoading\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n ></aia-suggestion-grid>\n\n <div\n *ngIf=\"vm.showsFallbackSkeleton\"\n class=\"magicx-aia-dropdown-skeleton-bars\"\n data-aia-skeleton-bars=\"\"\n >\n <span\n *ngFor=\"let w of fallbackSkeletonBarWidths; trackBy: trackByWidth\"\n class=\"magicx-aia-dropdown-skeleton-bar\"\n [style.width.px]=\"w\"\n ></span>\n </div>\n</div>\n", styles: [".magicx-aia-dropdown{position:absolute;left:0;right:0;top:100%;max-width:516px;margin-top:6px;display:flex;flex-direction:column;overflow:hidden;container-type:inline-size;z-index:10;opacity:0;pointer-events:none;transition:opacity .4s cubic-bezier(.4,0,.2,1);box-shadow:#fff -3.2px -3.2px 3.2px -3.2px inset,#fff 6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) -6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) 6.4px -6.4px 1.6px -8px inset,#ffffff26 -1.6px 0 0 -1.6px inset,#ffffff26 0 -1.6px 0 -1.6px inset,#ffffff4d 0 1.6px inset,#ffffff4d 1.6px 0 inset,inset 0 0 30px 5px #0000000d,#00000014 0 0 30px 2px;backdrop-filter:blur(30px);border-radius:28px}.magicx-aia-dropdown-visible{opacity:1;pointer-events:auto}.magicx-aia-dropdown-pillbar{padding:27px 27px 3px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%)}.magicx-aia-dropdown-pillbar::-webkit-scrollbar{display:none}.magicx-aia-dropdown-skeleton-bars{display:flex;flex-direction:column;gap:20px;padding:25px}.magicx-aia-dropdown-skeleton-bar{display:block;height:19px;border-radius:999px;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .51)));opacity:.5;animation:aiaDropdownSkeletonPulse 1.4s ease-in-out infinite}.magicx-aia-dropdown-skeleton-bar:nth-child(2){animation-delay:.15s}.magicx-aia-dropdown-skeleton-bar:nth-child(3){animation-delay:.3s}@keyframes aiaDropdownSkeletonPulse{0%,to{opacity:.5}50%{opacity:.25}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: PillListComponent, selector: "aia-pill-list", inputs: ["pills", "activePillIndex", "rounded", "loading"], outputs: ["selectPill"] }, { kind: "component", type: SuggestionGridComponent, selector: "aia-suggestion-grid", inputs: ["options", "activeIndex", "listboxId", "loading"], outputs: ["select", "highlight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteDropdownComponent, decorators: [{
|
|
72
|
+
type: Component,
|
|
73
|
+
args: [{ selector: "ai-autocomplete-dropdown", standalone: true, imports: [CommonModule, PillListComponent, SuggestionGridComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n *ngIf=\"vm$ | async as vm\"\n [id]=\"controller.listboxId\"\n role=\"listbox\"\n data-aia-dropdown=\"\"\n [attr.data-aia-loading]=\"vm.isLoading ? '' : null\"\n class=\"magicx-aia-dropdown\"\n [class.magicx-aia-dropdown-visible]=\"vm.isVisible\"\n [class]=\"className ? 'magicx-aia-dropdown ' + className : 'magicx-aia-dropdown'\"\n (mousedown)=\"preventBlur($event)\"\n>\n <div\n *ngIf=\"vm.showsPills\"\n class=\"magicx-aia-dropdown-pillbar\"\n data-aia-pillbar=\"\"\n >\n <aia-pill-list\n [pills]=\"vm.pills\"\n [activePillIndex]=\"0\"\n [rounded]=\"true\"\n [loading]=\"vm.isLoading\"\n (selectPill)=\"onPillClick($event)\"\n ></aia-pill-list>\n </div>\n\n <aia-suggestion-grid\n *ngIf=\"vm.showsOptions\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [loading]=\"vm.isLoading\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n ></aia-suggestion-grid>\n\n <div\n *ngIf=\"vm.showsFallbackSkeleton\"\n class=\"magicx-aia-dropdown-skeleton-bars\"\n data-aia-skeleton-bars=\"\"\n >\n <span\n *ngFor=\"let w of fallbackSkeletonBarWidths; trackBy: trackByWidth\"\n class=\"magicx-aia-dropdown-skeleton-bar\"\n [style.width.px]=\"w\"\n ></span>\n </div>\n</div>\n", styles: [".magicx-aia-dropdown{position:absolute;left:0;right:0;top:100%;max-width:516px;margin-top:6px;display:flex;flex-direction:column;overflow:hidden;container-type:inline-size;z-index:10;opacity:0;pointer-events:none;transition:opacity .4s cubic-bezier(.4,0,.2,1);box-shadow:#fff -3.2px -3.2px 3.2px -3.2px inset,#fff 6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) -6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) 6.4px -6.4px 1.6px -8px inset,#ffffff26 -1.6px 0 0 -1.6px inset,#ffffff26 0 -1.6px 0 -1.6px inset,#ffffff4d 0 1.6px inset,#ffffff4d 1.6px 0 inset,inset 0 0 30px 5px #0000000d,#00000014 0 0 30px 2px;backdrop-filter:blur(30px);border-radius:28px}.magicx-aia-dropdown-visible{opacity:1;pointer-events:auto}.magicx-aia-dropdown-pillbar{padding:27px 27px 3px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%)}.magicx-aia-dropdown-pillbar::-webkit-scrollbar{display:none}.magicx-aia-dropdown-skeleton-bars{display:flex;flex-direction:column;gap:20px;padding:25px}.magicx-aia-dropdown-skeleton-bar{display:block;height:19px;border-radius:999px;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .51)));opacity:.5;animation:aiaDropdownSkeletonPulse 1.4s ease-in-out infinite}.magicx-aia-dropdown-skeleton-bar:nth-child(2){animation-delay:.15s}.magicx-aia-dropdown-skeleton-bar:nth-child(3){animation-delay:.3s}@keyframes aiaDropdownSkeletonPulse{0%,to{opacity:.5}50%{opacity:.25}}\n"] }]
|
|
74
|
+
}], propDecorators: { controller: [{
|
|
75
|
+
type: Input
|
|
76
|
+
}], showPills: [{
|
|
77
|
+
type: Input
|
|
78
|
+
}], className: [{
|
|
79
|
+
type: Input
|
|
80
|
+
}] } });
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQzs7O0FBRWhHOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBVUgsTUFBTSxPQUFPLCtCQUErQjtJQVQ1QztRQVlFLDJFQUEyRTtRQUNsRSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBSTFCLCtFQUErRTtRQUN0RSw4QkFBeUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUE2QnJELGlCQUFZLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FrQnBEO0lBN0NDOzs7O09BSUc7SUFDSCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDbkMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDVCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0UsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDeEMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUMsU0FBUyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzVELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RSxPQUFPO2dCQUNMLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztnQkFDZixPQUFPO2dCQUNQLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztnQkFDM0IsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTO2dCQUN2QixVQUFVO2dCQUNWLFlBQVk7Z0JBQ1oscUJBQXFCO2dCQUNyQixTQUFTO2FBQ1YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBSUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUF3QjtRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVk7UUFDdEIsMkVBQTJFO1FBQzNFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QixDQUFDOzs2SEF2RFUsK0JBQStCO2lIQUEvQiwrQkFBK0IsMEtDaEM1Qyw2MENBK0NBLCtvRERyQlksWUFBWSxxVEFBRSxpQkFBaUIsK0lBQUUsdUJBQXVCOzRGQU12RCwrQkFBK0I7a0JBVDNDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQyxtQkFDbEQsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTs4QkFNNUIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWdnZXN0aW9uT3B0aW9uIH0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFBpbGxMaXN0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL3BpbGwtbGlzdC9waWxsLWxpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdWdnZXN0aW9uR3JpZENvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9zdWdnZXN0aW9uLWdyaWQvc3VnZ2VzdGlvbi1ncmlkLmNvbXBvbmVudFwiO1xuXG4vKipcbiAqIFRpZXIgMiBkcm9wZG93biBjb21wb25lbnQg4oCUIHRoZSBBbmd1bGFyIGVxdWl2YWxlbnQgb2YgUmVhY3Qnc1xuICogYDxBSUF1dG9jb21wbGV0ZURyb3Bkb3duIC8+YC4gUmVuZGVycyB0aGUgcGlsbGJhciwgb3B0aW9ucyBncmlkLCBhbmRcbiAqIGxvYWRpbmcgc2tlbGV0b24gYmFzZWQgb24gdGhlIHN1cHBsaWVkIGNvbnRyb2xsZXIncyBgZHJvcGRvd24kYCBzbmFwc2hvdC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8YWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duIFtjb250cm9sbGVyXT1cImFjXCI+PC9haS1hdXRvY29tcGxldGUtZHJvcGRvd24+XG4gKiBgYGBcbiAqXG4gKiBBbGwgYWN0aW9ucyAocGlsbCBjbGljaywgb3B0aW9uIHNlbGVjdCwgb3B0aW9uIGhpZ2hsaWdodCkgYXJlIGZvcndhcmRlZCB0b1xuICogdGhlIGNvbnRyb2xsZXIuIENvbnN1bWVycyB3aG8gbmVlZCB0byBvYnNlcnZlIHRoZXNlIGV2ZW50cyBjYW4gc3Vic2NyaWJlXG4gKiB0byB0aGUgY29udHJvbGxlcidzIHBlci1maWVsZCBvYnNlcnZhYmxlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhaS1hdXRvY29tcGxldGUtZHJvcGRvd25cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUGlsbExpc3RDb21wb25lbnQsIFN1Z2dlc3Rpb25HcmlkQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50LmNzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgQUlBdXRvY29tcGxldGVEcm9wZG93bkNvbXBvbmVudCB7XG4gIC8qKiBUaGUgY29udHJvbGxlciB0aGF0IG93bnMgdGhlIGF1dG9jb21wbGV0ZSBzdGF0ZS4gUmVxdWlyZWQuICovXG4gIEBJbnB1dCgpIGNvbnRyb2xsZXIhOiBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXI7XG4gIC8qKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgcGlsbGJhciBhYm92ZSB0aGUgb3B0aW9ucyBncmlkLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBASW5wdXQoKSBzaG93UGlsbHMgPSB0cnVlO1xuICAvKiogT3B0aW9uYWwgQ1NTIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGRyb3Bkb3duIHJvb3QuICovXG4gIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKiogRmFsbGJhY2sgc2tlbGV0b24tYmFyIHdpZHRocyB1c2VkIHdoZW4gbG9hZGluZyB3aXRoIHplcm8gY2FjaGVkIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrU2tlbGV0b25CYXJXaWR0aHMgPSBbMTU5LCAxMTksIDE2NF07XG5cbiAgLyoqXG4gICAqIFZpZXctbW9kZWwgZGVyaXZlZCBmcm9tIHRoZSBjb250cm9sbGVyJ3MgYGRyb3Bkb3duJGAuIEFkZHMgdGhyZWUgYm9vbGVhbnNcbiAgICogKGBzaG93c1BpbGxzYCwgYHNob3dzT3B0aW9uc2AsIGBzaG93c0ZhbGxiYWNrU2tlbGV0b25gLCBgaXNWaXNpYmxlYCkgdGhhdFxuICAgKiBrZWVwIHRlbXBsYXRlLWxldmVsIGxvZ2ljIHRvIGEgcHJvcGVydHkgcmVhZCBwZXIgwqcxOS42LlxuICAgKi9cbiAgZ2V0IHZtJCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmRyb3Bkb3duJC5waXBlKFxuICAgICAgbWFwKChkZCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZGQuc3VnZ2VzdGlvbnNbMF0/Lm9wdGlvbnMgPz8gW107XG4gICAgICAgIGNvbnN0IHNob3dzUGlsbHMgPSB0aGlzLnNob3dQaWxscyAmJiAoZGQucGlsbHMubGVuZ3RoID4gMCB8fCBkZC5pc0xvYWRpbmcpO1xuICAgICAgICBjb25zdCBzaG93c09wdGlvbnMgPSBvcHRpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IHNob3dzRmFsbGJhY2tTa2VsZXRvbiA9IGRkLmlzTG9hZGluZyAmJiAhc2hvd3NPcHRpb25zO1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBkZC5pc09wZW4gJiYgKHNob3dzT3B0aW9ucyB8fCBzaG93c1BpbGxzIHx8IGRkLmlzTG9hZGluZyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGlsbHM6IGRkLnBpbGxzLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgYWN0aXZlSW5kZXg6IGRkLmFjdGl2ZUluZGV4LFxuICAgICAgICAgIGlzTG9hZGluZzogZGQuaXNMb2FkaW5nLFxuICAgICAgICAgIHNob3dzUGlsbHMsXG4gICAgICAgICAgc2hvd3NPcHRpb25zLFxuICAgICAgICAgIHNob3dzRmFsbGJhY2tTa2VsZXRvbixcbiAgICAgICAgICBpc1Zpc2libGUsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgdHJhY2tCeVdpZHRoID0gKF86IG51bWJlciwgdzogbnVtYmVyKTogbnVtYmVyID0+IHc7XG5cbiAgb25QaWxsQ2xpY2soaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRBY3RpdmVQaWxsKGluZGV4KTtcbiAgfVxuXG4gIG9uU2VsZWN0KG9wdGlvbjogU3VnZ2VzdGlvbk9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZWxlY3RPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIG9uSGlnaGxpZ2h0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0QWN0aXZlRHJvcGRvd25JbmRleChpbmRleCk7XG4gIH1cblxuICBwcmV2ZW50Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IHRoZSBlZGl0b3IgZnJvbSBsb3NpbmcgZm9jdXMgd2hlbiBpbnRlcmFjdGluZyB3aXRoIHRoZSBkcm9wZG93bi5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwidm0kIHwgYXN5bmMgYXMgdm1cIlxuICBbaWRdPVwiY29udHJvbGxlci5saXN0Ym94SWRcIlxuICByb2xlPVwibGlzdGJveFwiXG4gIGRhdGEtYWlhLWRyb3Bkb3duPVwiXCJcbiAgW2F0dHIuZGF0YS1haWEtbG9hZGluZ109XCJ2bS5pc0xvYWRpbmcgPyAnJyA6IG51bGxcIlxuICBjbGFzcz1cIm1hZ2ljeC1haWEtZHJvcGRvd25cIlxuICBbY2xhc3MubWFnaWN4LWFpYS1kcm9wZG93bi12aXNpYmxlXT1cInZtLmlzVmlzaWJsZVwiXG4gIFtjbGFzc109XCJjbGFzc05hbWUgPyAnbWFnaWN4LWFpYS1kcm9wZG93biAnICsgY2xhc3NOYW1lIDogJ21hZ2ljeC1haWEtZHJvcGRvd24nXCJcbiAgKG1vdXNlZG93bik9XCJwcmV2ZW50Qmx1cigkZXZlbnQpXCJcbj5cbiAgPGRpdlxuICAgICpuZ0lmPVwidm0uc2hvd3NQaWxsc1wiXG4gICAgY2xhc3M9XCJtYWdpY3gtYWlhLWRyb3Bkb3duLXBpbGxiYXJcIlxuICAgIGRhdGEtYWlhLXBpbGxiYXI9XCJcIlxuICA+XG4gICAgPGFpYS1waWxsLWxpc3RcbiAgICAgIFtwaWxsc109XCJ2bS5waWxsc1wiXG4gICAgICBbYWN0aXZlUGlsbEluZGV4XT1cIjBcIlxuICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICBbbG9hZGluZ109XCJ2bS5pc0xvYWRpbmdcIlxuICAgICAgKHNlbGVjdFBpbGwpPVwib25QaWxsQ2xpY2soJGV2ZW50KVwiXG4gICAgPjwvYWlhLXBpbGwtbGlzdD5cbiAgPC9kaXY+XG5cbiAgPGFpYS1zdWdnZXN0aW9uLWdyaWRcbiAgICAqbmdJZj1cInZtLnNob3dzT3B0aW9uc1wiXG4gICAgW29wdGlvbnNdPVwidm0ub3B0aW9uc1wiXG4gICAgW2FjdGl2ZUluZGV4XT1cInZtLmFjdGl2ZUluZGV4XCJcbiAgICBbbGlzdGJveElkXT1cImNvbnRyb2xsZXIubGlzdGJveElkXCJcbiAgICBbbG9hZGluZ109XCJ2bS5pc0xvYWRpbmdcIlxuICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgKGhpZ2hsaWdodCk9XCJvbkhpZ2hsaWdodCgkZXZlbnQpXCJcbiAgPjwvYWlhLXN1Z2dlc3Rpb24tZ3JpZD5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJ2bS5zaG93c0ZhbGxiYWNrU2tlbGV0b25cIlxuICAgIGNsYXNzPVwibWFnaWN4LWFpYS1kcm9wZG93bi1za2VsZXRvbi1iYXJzXCJcbiAgICBkYXRhLWFpYS1za2VsZXRvbi1iYXJzPVwiXCJcbiAgPlxuICAgIDxzcGFuXG4gICAgICAqbmdGb3I9XCJsZXQgdyBvZiBmYWxsYmFja1NrZWxldG9uQmFyV2lkdGhzOyB0cmFja0J5OiB0cmFja0J5V2lkdGhcIlxuICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLWRyb3Bkb3duLXNrZWxldG9uLWJhclwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwid1wiXG4gICAgPjwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { AIAutocompleteDropdownComponent } from "./ai-autocomplete-dropdown.component";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnQgfSBmcm9tIFwiLi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50XCI7XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { NgModule } from "@angular/core";
|
|
2
|
+
import { AIAutocompleteComponent } from "./ai-autocomplete/ai-autocomplete.component";
|
|
3
|
+
import { AIAutocompleteDropdownComponent } from "./ai-autocomplete-dropdown/ai-autocomplete-dropdown.component";
|
|
4
|
+
import { AIAutocompleteInputDirective } from "./input/ai-autocomplete-input.directive";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Convenience NgModule that re-exports every public component and directive
|
|
8
|
+
* in this package. Standalone-first consumers can import the individual
|
|
9
|
+
* symbols directly; legacy NgModule-based codebases import this once and
|
|
10
|
+
* get everything.
|
|
11
|
+
*
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
export class AIAutocompleteModule {
|
|
15
|
+
}
|
|
16
|
+
AIAutocompleteModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
17
|
+
AIAutocompleteModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteModule, imports: [AIAutocompleteComponent, AIAutocompleteDropdownComponent, AIAutocompleteInputDirective], exports: [AIAutocompleteComponent, AIAutocompleteDropdownComponent, AIAutocompleteInputDirective] });
|
|
18
|
+
AIAutocompleteModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteModule, imports: [AIAutocompleteComponent, AIAutocompleteDropdownComponent] });
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteModule, decorators: [{
|
|
20
|
+
type: NgModule,
|
|
21
|
+
args: [{
|
|
22
|
+
imports: [AIAutocompleteComponent, AIAutocompleteDropdownComponent, AIAutocompleteInputDirective],
|
|
23
|
+
exports: [AIAutocompleteComponent, AIAutocompleteDropdownComponent, AIAutocompleteInputDirective],
|
|
24
|
+
}]
|
|
25
|
+
}] });
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQUV2Rjs7Ozs7OztHQU9HO0FBS0gsTUFBTSxPQUFPLG9CQUFvQjs7a0hBQXBCLG9CQUFvQjttSEFBcEIsb0JBQW9CLFlBSHJCLHVCQUF1QixFQUFFLCtCQUErQixFQUFFLDRCQUE0QixhQUN0Rix1QkFBdUIsRUFBRSwrQkFBK0IsRUFBRSw0QkFBNEI7bUhBRXJGLG9CQUFvQixZQUhyQix1QkFBdUIsRUFBRSwrQkFBK0I7NEZBR3ZELG9CQUFvQjtrQkFKaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSwrQkFBK0IsRUFBRSw0QkFBNEIsQ0FBQztvQkFDakcsT0FBTyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsK0JBQStCLEVBQUUsNEJBQTRCLENBQUM7aUJBQ2xHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tIFwiLi9haS1hdXRvY29tcGxldGUvYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gXCIuL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlIH0gZnJvbSBcIi4vaW5wdXQvYWktYXV0b2NvbXBsZXRlLWlucHV0LmRpcmVjdGl2ZVwiO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIE5nTW9kdWxlIHRoYXQgcmUtZXhwb3J0cyBldmVyeSBwdWJsaWMgY29tcG9uZW50IGFuZCBkaXJlY3RpdmVcbiAqIGluIHRoaXMgcGFja2FnZS4gU3RhbmRhbG9uZS1maXJzdCBjb25zdW1lcnMgY2FuIGltcG9ydCB0aGUgaW5kaXZpZHVhbFxuICogc3ltYm9scyBkaXJlY3RseTsgbGVnYWN5IE5nTW9kdWxlLWJhc2VkIGNvZGViYXNlcyBpbXBvcnQgdGhpcyBvbmNlIGFuZFxuICogZ2V0IGV2ZXJ5dGhpbmcuXG4gKlxuICogQHB1YmxpY1xuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQUlBdXRvY29tcGxldGVDb21wb25lbnQsIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnQsIEFJQXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbQUlBdXRvY29tcGxldGVDb21wb25lbnQsIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnQsIEFJQXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZU1vZHVsZSB7fVxuIl19
|