@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,253 @@
|
|
|
1
|
+
import { Directive, ElementRef, Input, inject, NgZone, Renderer2, } from "@angular/core";
|
|
2
|
+
import { extractPlainText, getCursorOffset, plainTextLength, renderEditableContent, setCursorOffset, } from "@magicx-eng/ai-autocomplete-vanilla";
|
|
3
|
+
import { Subject, takeUntil } from "rxjs";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Module-level cache for the one-time plaintext-only feature detection.
|
|
7
|
+
* Mirrors `supportsPlaintextOnly` in useContentEditableEditor.ts.
|
|
8
|
+
*/
|
|
9
|
+
let plaintextOnlyCache;
|
|
10
|
+
function supportsPlaintextOnly() {
|
|
11
|
+
if (plaintextOnlyCache !== undefined)
|
|
12
|
+
return plaintextOnlyCache;
|
|
13
|
+
if (typeof document === "undefined")
|
|
14
|
+
return false;
|
|
15
|
+
const probe = document.createElement("div");
|
|
16
|
+
probe.setAttribute("contenteditable", "plaintext-only");
|
|
17
|
+
plaintextOnlyCache = probe.contentEditable === "plaintext-only";
|
|
18
|
+
return plaintextOnlyCache;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Internal directive that owns every concern specific to running the
|
|
22
|
+
* autocomplete on top of a contentEditable host: composition state, caret
|
|
23
|
+
* tracking, selectionchange handling, `beforeinput` interception, paste
|
|
24
|
+
* sanitization, plaintext-only feature detection, segment rendering,
|
|
25
|
+
* post-promote refocus, and re-edit caret park.
|
|
26
|
+
*
|
|
27
|
+
* Mirrors `packages/react/src/hooks/useContentEditableEditor.ts` one-for-one.
|
|
28
|
+
* Used only by the Tier 1 `<ai-autocomplete>` component — never exported.
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export class AIAutocompleteEditorHostDirective {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.autoFocus = true;
|
|
35
|
+
this.el = inject(ElementRef);
|
|
36
|
+
this.renderer = inject(Renderer2);
|
|
37
|
+
this.zone = inject(NgZone);
|
|
38
|
+
this.destroy$ = new Subject();
|
|
39
|
+
this.composing = false;
|
|
40
|
+
this.lastInputAt = 0;
|
|
41
|
+
this.lastSeenParamId = "";
|
|
42
|
+
this.lastEditingId = "";
|
|
43
|
+
this.editingParamId = null;
|
|
44
|
+
}
|
|
45
|
+
ngOnInit() {
|
|
46
|
+
if (!this.controller) {
|
|
47
|
+
throw new Error("[aiaEditorHost] requires a controller");
|
|
48
|
+
}
|
|
49
|
+
const el = this.el.nativeElement;
|
|
50
|
+
const ceMode = supportsPlaintextOnly() ? "plaintext-only" : "true";
|
|
51
|
+
this.renderer.setAttribute(el, "contenteditable", ceMode);
|
|
52
|
+
this.renderer.setAttribute(el, "aria-controls", this.controller.listboxId);
|
|
53
|
+
this.renderer.setAttribute(el, "suppress-content-editable-warning", "true");
|
|
54
|
+
// Auto-focus on mount. If the editor already has focus (e.g. from a
|
|
55
|
+
// click that fired before our lifecycle ran), notify the controller
|
|
56
|
+
// instead of stealing focus.
|
|
57
|
+
if (this.autoFocus) {
|
|
58
|
+
queueMicrotask(() => {
|
|
59
|
+
if (typeof document === "undefined")
|
|
60
|
+
return;
|
|
61
|
+
if (document.activeElement === el) {
|
|
62
|
+
this.controller.setFocused(true);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
el.focus();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
this.bindDocumentSelectionListener();
|
|
70
|
+
this.bindBeforeInputListener();
|
|
71
|
+
this.bindStateSubscription();
|
|
72
|
+
}
|
|
73
|
+
ngOnDestroy() {
|
|
74
|
+
this.destroy$.next();
|
|
75
|
+
this.destroy$.complete();
|
|
76
|
+
if (this.documentSelectionListener && typeof document !== "undefined") {
|
|
77
|
+
document.removeEventListener("selectionchange", this.documentSelectionListener);
|
|
78
|
+
}
|
|
79
|
+
if (this.beforeInputListener) {
|
|
80
|
+
this.el.nativeElement.removeEventListener("beforeinput", this.beforeInputListener);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// === Host event handlers ===
|
|
84
|
+
onCompositionStart() {
|
|
85
|
+
this.composing = true;
|
|
86
|
+
}
|
|
87
|
+
onCompositionEnd() {
|
|
88
|
+
this.composing = false;
|
|
89
|
+
this.fireInput();
|
|
90
|
+
}
|
|
91
|
+
onInput() {
|
|
92
|
+
this.lastInputAt = performance.now();
|
|
93
|
+
this.fireInput();
|
|
94
|
+
this.controller.handleCaretAfterInput(getCursorOffset(this.el.nativeElement));
|
|
95
|
+
}
|
|
96
|
+
onKeyDown(event) {
|
|
97
|
+
this.controller.handleKeyDown(event);
|
|
98
|
+
}
|
|
99
|
+
onPaste(event) {
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
const el = this.el.nativeElement;
|
|
102
|
+
const text = (event.clipboardData?.getData("text/plain") ?? "").replace(/\r?\n/g, " ");
|
|
103
|
+
if (!text)
|
|
104
|
+
return;
|
|
105
|
+
const doc = el.ownerDocument ?? document;
|
|
106
|
+
const sel = doc.getSelection();
|
|
107
|
+
if (!sel || sel.rangeCount === 0)
|
|
108
|
+
return;
|
|
109
|
+
const range = sel.getRangeAt(0);
|
|
110
|
+
if (!el.contains(range.startContainer))
|
|
111
|
+
return;
|
|
112
|
+
range.deleteContents();
|
|
113
|
+
const node = doc.createTextNode(text);
|
|
114
|
+
range.insertNode(node);
|
|
115
|
+
range.setStartAfter(node);
|
|
116
|
+
range.collapse(true);
|
|
117
|
+
sel.removeAllRanges();
|
|
118
|
+
sel.addRange(range);
|
|
119
|
+
this.fireInput();
|
|
120
|
+
}
|
|
121
|
+
onFocus() {
|
|
122
|
+
this.controller.setFocused(true);
|
|
123
|
+
}
|
|
124
|
+
onBlur() {
|
|
125
|
+
this.controller.setFocused(false);
|
|
126
|
+
}
|
|
127
|
+
// === Internal helpers ===
|
|
128
|
+
fireInput() {
|
|
129
|
+
if (this.composing)
|
|
130
|
+
return;
|
|
131
|
+
const el = this.el.nativeElement;
|
|
132
|
+
const raw = extractPlainText(el);
|
|
133
|
+
const shouldCapitalize = raw.length > 0 && raw[0] !== raw[0].toUpperCase();
|
|
134
|
+
const next = shouldCapitalize ? raw[0].toUpperCase() + raw.slice(1) : raw;
|
|
135
|
+
this.controller.handleTextChange(next);
|
|
136
|
+
}
|
|
137
|
+
bindDocumentSelectionListener() {
|
|
138
|
+
if (typeof document === "undefined")
|
|
139
|
+
return;
|
|
140
|
+
const el = this.el.nativeElement;
|
|
141
|
+
// selectionchange fires on every keystroke and caret move — run outside
|
|
142
|
+
// Angular's zone (§16.1) and re-enter only when we actually need to
|
|
143
|
+
// notify the controller of a meaningful change.
|
|
144
|
+
this.zone.runOutsideAngular(() => {
|
|
145
|
+
const handler = () => {
|
|
146
|
+
const sel = document.getSelection();
|
|
147
|
+
if (!sel || sel.rangeCount === 0)
|
|
148
|
+
return;
|
|
149
|
+
if (!sel.anchorNode || !el.contains(sel.anchorNode))
|
|
150
|
+
return;
|
|
151
|
+
const anchor = sel.anchorNode;
|
|
152
|
+
const startEl = anchor.nodeType === Node.ELEMENT_NODE ? anchor : anchor.parentElement;
|
|
153
|
+
const strong = startEl?.closest('strong[data-seg="completed"][data-param-id]');
|
|
154
|
+
const enclosing = strong?.dataset.paramId ?? null;
|
|
155
|
+
if (enclosing && enclosing !== this.editingParamId) {
|
|
156
|
+
this.zone.run(() => this.controller.startEditingParam(enclosing));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (performance.now() - this.lastInputAt < 50)
|
|
160
|
+
return;
|
|
161
|
+
this.zone.run(() => this.controller.handleCaretMove(getCursorOffset(el)));
|
|
162
|
+
};
|
|
163
|
+
this.documentSelectionListener = handler;
|
|
164
|
+
document.addEventListener("selectionchange", handler);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
bindBeforeInputListener() {
|
|
168
|
+
const el = this.el.nativeElement;
|
|
169
|
+
// Native beforeinput — React's synthetic onBeforeInput is wired to the
|
|
170
|
+
// legacy textInput event and doesn't fire reliably for delete* types.
|
|
171
|
+
const handler = (event) => {
|
|
172
|
+
const inputEvent = event;
|
|
173
|
+
const t = inputEvent.inputType;
|
|
174
|
+
if (t === "insertParagraph" || t === "insertLineBreak" || t === "insertFromDrop") {
|
|
175
|
+
event.preventDefault();
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (t.startsWith("insert") || t.startsWith("delete")) {
|
|
179
|
+
const replacement = t.startsWith("delete") ? "" : (inputEvent.data ?? "");
|
|
180
|
+
if (this.controller.replaceEditingRange(replacement)) {
|
|
181
|
+
event.preventDefault();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
this.beforeInputListener = handler;
|
|
186
|
+
el.addEventListener("beforeinput", handler);
|
|
187
|
+
}
|
|
188
|
+
bindStateSubscription() {
|
|
189
|
+
const el = this.el.nativeElement;
|
|
190
|
+
this.controller.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {
|
|
191
|
+
this.editingParamId = state.editingParam?.id ?? null;
|
|
192
|
+
renderEditableContent({
|
|
193
|
+
input: el,
|
|
194
|
+
segments: state.segments,
|
|
195
|
+
newParamId: state.newParamId,
|
|
196
|
+
editingParamId: state.editingParam?.id ?? null,
|
|
197
|
+
placeholderText: state.placeholderText,
|
|
198
|
+
isFocused: state.isFocused,
|
|
199
|
+
});
|
|
200
|
+
// Post-promote refocus + caret-after-bold placement (mirrors React's
|
|
201
|
+
// useLayoutEffect on newParamId).
|
|
202
|
+
const currentParamId = state.newParamId ?? "";
|
|
203
|
+
if (currentParamId && currentParamId !== this.lastSeenParamId) {
|
|
204
|
+
this.lastSeenParamId = currentParamId;
|
|
205
|
+
el.focus();
|
|
206
|
+
const desired = state.caretOffset ?? plainTextLength(el);
|
|
207
|
+
setCursorOffset(el, desired);
|
|
208
|
+
}
|
|
209
|
+
else if (!currentParamId) {
|
|
210
|
+
this.lastSeenParamId = "";
|
|
211
|
+
}
|
|
212
|
+
// Re-edit caret park (mirrors React's useLayoutEffect on editingParam).
|
|
213
|
+
const editingId = state.editingParam?.id ?? "";
|
|
214
|
+
if (editingId && editingId !== this.lastEditingId && state.editingAnchor != null) {
|
|
215
|
+
this.lastEditingId = editingId;
|
|
216
|
+
setCursorOffset(el, state.editingAnchor);
|
|
217
|
+
}
|
|
218
|
+
else if (!editingId) {
|
|
219
|
+
this.lastEditingId = "";
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
AIAutocompleteEditorHostDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteEditorHostDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
225
|
+
AIAutocompleteEditorHostDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteEditorHostDirective, isStandalone: true, selector: "[aiaEditorHost]", inputs: { controller: ["aiaEditorHost", "controller"], autoFocus: "autoFocus" }, host: { attributes: { "role": "combobox", "aria-autocomplete": "list", "aria-haspopup": "listbox", "spellcheck": "true", "enterkeyhint": "send", "tabindex": "0" }, listeners: { "input": "onInput()", "keydown": "onKeyDown($event)", "compositionstart": "onCompositionStart()", "compositionend": "onCompositionEnd()", "paste": "onPaste($event)", "focus": "onFocus()", "blur": "onBlur()" } }, ngImport: i0 });
|
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteEditorHostDirective, decorators: [{
|
|
227
|
+
type: Directive,
|
|
228
|
+
args: [{
|
|
229
|
+
selector: "[aiaEditorHost]",
|
|
230
|
+
standalone: true,
|
|
231
|
+
host: {
|
|
232
|
+
role: "combobox",
|
|
233
|
+
"aria-autocomplete": "list",
|
|
234
|
+
"aria-haspopup": "listbox",
|
|
235
|
+
spellcheck: "true",
|
|
236
|
+
enterkeyhint: "send",
|
|
237
|
+
tabindex: "0",
|
|
238
|
+
"(input)": "onInput()",
|
|
239
|
+
"(keydown)": "onKeyDown($event)",
|
|
240
|
+
"(compositionstart)": "onCompositionStart()",
|
|
241
|
+
"(compositionend)": "onCompositionEnd()",
|
|
242
|
+
"(paste)": "onPaste($event)",
|
|
243
|
+
"(focus)": "onFocus()",
|
|
244
|
+
"(blur)": "onBlur()",
|
|
245
|
+
},
|
|
246
|
+
}]
|
|
247
|
+
}], propDecorators: { controller: [{
|
|
248
|
+
type: Input,
|
|
249
|
+
args: ["aiaEditorHost"]
|
|
250
|
+
}], autoFocus: [{
|
|
251
|
+
type: Input
|
|
252
|
+
}] } });
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLWhvc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnRlcm5hbC9lZGl0b3ItaG9zdC9lZGl0b3ItaG9zdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBR04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGVBQWUsRUFDZixxQkFBcUIsRUFDckIsZUFBZSxHQUNoQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUcxQzs7O0dBR0c7QUFDSCxJQUFJLGtCQUF1QyxDQUFDO0FBQzVDLFNBQVMscUJBQXFCO0lBQzVCLElBQUksa0JBQWtCLEtBQUssU0FBUztRQUFFLE9BQU8sa0JBQWtCLENBQUM7SUFDaEUsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxLQUFLLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEQsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGVBQWUsS0FBSyxnQkFBZ0IsQ0FBQztJQUNoRSxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQW9CSCxNQUFNLE9BQU8saUNBQWlDO0lBbkI5QztRQXFCVyxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRVQsT0FBRSxHQUFHLE1BQU0sQ0FBNkIsVUFBVSxDQUFDLENBQUM7UUFDcEQsYUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENB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QUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRTtnQkFDaEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7Z0JBQy9CLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzFDO2lCQUFNLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO2FBQ3pCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzsrSEE1TVUsaUNBQWlDO21IQUFqQyxpQ0FBaUM7NEZBQWpDLGlDQUFpQztrQkFuQjdDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUUsVUFBVTt3QkFDaEIsbUJBQW1CLEVBQUUsTUFBTTt3QkFDM0IsZUFBZSxFQUFFLFNBQVM7d0JBQzFCLFVBQVUsRUFBRSxNQUFNO3dCQUNsQixZQUFZLEVBQUUsTUFBTTt3QkFDcEIsUUFBUSxFQUFFLEdBQUc7d0JBQ2IsU0FBUyxFQUFFLFdBQVc7d0JBQ3RCLFdBQVcsRUFBRSxtQkFBbUI7d0JBQ2hDLG9CQUFvQixFQUFFLHNCQUFzQjt3QkFDNUMsa0JBQWtCLEVBQUUsb0JBQW9CO3dCQUN4QyxTQUFTLEVBQUUsaUJBQWlCO3dCQUM1QixTQUFTLEVBQUUsV0FBVzt3QkFDdEIsUUFBUSxFQUFFLFVBQVU7cUJBQ3JCO2lCQUNGOzhCQUV5QixVQUFVO3NCQUFqQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ2IsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIGluamVjdCxcbiAgTmdab25lLFxuICB0eXBlIE9uRGVzdHJveSxcbiAgdHlwZSBPbkluaXQsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIGV4dHJhY3RQbGFpblRleHQsXG4gIGdldEN1cnNvck9mZnNldCxcbiAgcGxhaW5UZXh0TGVuZ3RoLFxuICByZW5kZXJFZGl0YWJsZUNvbnRlbnQsXG4gIHNldEN1cnNvck9mZnNldCxcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHR5cGUgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vLi4vY29udHJvbGxlci9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuXG4vKipcbiAqIE1vZHVsZS1sZXZlbCBjYWNoZSBmb3IgdGhlIG9uZS10aW1lIHBsYWludGV4dC1vbmx5IGZlYXR1cmUgZGV0ZWN0aW9uLlxuICogTWlycm9ycyBgc3VwcG9ydHNQbGFpbnRleHRPbmx5YCBpbiB1c2VDb250ZW50RWRpdGFibGVFZGl0b3IudHMuXG4gKi9cbmxldCBwbGFpbnRleHRPbmx5Q2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBzdXBwb3J0c1BsYWludGV4dE9ubHkoKTogYm9vbGVhbiB7XG4gIGlmIChwbGFpbnRleHRPbmx5Q2FjaGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBsYWludGV4dE9ubHlDYWNoZTtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm9iZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHByb2JlLnNldEF0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiLCBcInBsYWludGV4dC1vbmx5XCIpO1xuICBwbGFpbnRleHRPbmx5Q2FjaGUgPSBwcm9iZS5jb250ZW50RWRpdGFibGUgPT09IFwicGxhaW50ZXh0LW9ubHlcIjtcbiAgcmV0dXJuIHBsYWludGV4dE9ubHlDYWNoZTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBkaXJlY3RpdmUgdGhhdCBvd25zIGV2ZXJ5IGNvbmNlcm4gc3BlY2lmaWMgdG8gcnVubmluZyB0aGVcbiAqIGF1dG9jb21wbGV0ZSBvbiB0b3Agb2YgYSBjb250ZW50RWRpdGFibGUgaG9zdDogY29tcG9zaXRpb24gc3RhdGUsIGNhcmV0XG4gKiB0cmFja2luZywgc2VsZWN0aW9uY2hhbmdlIGhhbmRsaW5nLCBgYmVmb3JlaW5wdXRgIGludGVyY2VwdGlvbiwgcGFzdGVcbiAqIHNhbml0aXphdGlvbiwgcGxhaW50ZXh0LW9ubHkgZmVhdHVyZSBkZXRlY3Rpb24sIHNlZ21lbnQgcmVuZGVyaW5nLFxuICogcG9zdC1wcm9tb3RlIHJlZm9jdXMsIGFuZCByZS1lZGl0IGNhcmV0IHBhcmsuXG4gKlxuICogTWlycm9ycyBgcGFja2FnZXMvcmVhY3Qvc3JjL2hvb2tzL3VzZUNvbnRlbnRFZGl0YWJsZUVkaXRvci50c2Agb25lLWZvci1vbmUuXG4gKiBVc2VkIG9ubHkgYnkgdGhlIFRpZXIgMSBgPGFpLWF1dG9jb21wbGV0ZT5gIGNvbXBvbmVudCDigJQgbmV2ZXIgZXhwb3J0ZWQuXG4gKlxuICogQGludGVybmFsXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbYWlhRWRpdG9ySG9zdF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaG9zdDoge1xuICAgIHJvbGU6IFwiY29tYm9ib3hcIixcbiAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibGlzdFwiLFxuICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcImxpc3Rib3hcIixcbiAgICBzcGVsbGNoZWNrOiBcInRydWVcIixcbiAgICBlbnRlcmtleWhpbnQ6IFwic2VuZFwiLFxuICAgIHRhYmluZGV4OiBcIjBcIixcbiAgICBcIihpbnB1dClcIjogXCJvbklucHV0KClcIixcbiAgICBcIihrZXlkb3duKVwiOiBcIm9uS2V5RG93bigkZXZlbnQpXCIsXG4gICAgXCIoY29tcG9zaXRpb25zdGFydClcIjogXCJvbkNvbXBvc2l0aW9uU3RhcnQoKVwiLFxuICAgIFwiKGNvbXBvc2l0aW9uZW5kKVwiOiBcIm9uQ29tcG9zaXRpb25FbmQoKVwiLFxuICAgIFwiKHBhc3RlKVwiOiBcIm9uUGFzdGUoJGV2ZW50KVwiLFxuICAgIFwiKGZvY3VzKVwiOiBcIm9uRm9jdXMoKVwiLFxuICAgIFwiKGJsdXIpXCI6IFwib25CbHVyKClcIixcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoXCJhaWFFZGl0b3JIb3N0XCIpIGNvbnRyb2xsZXIhOiBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXI7XG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgY29tcG9zaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdElucHV0QXQgPSAwO1xuICBwcml2YXRlIGxhc3RTZWVuUGFyYW1JZCA9IFwiXCI7XG4gIHByaXZhdGUgbGFzdEVkaXRpbmdJZCA9IFwiXCI7XG4gIHByaXZhdGUgZWRpdGluZ1BhcmFtSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgZG9jdW1lbnRTZWxlY3Rpb25MaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgYmVmb3JlSW5wdXRMaXN0ZW5lcj86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlthaWFFZGl0b3JIb3N0XSByZXF1aXJlcyBhIGNvbnRyb2xsZXJcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2VNb2RlID0gc3VwcG9ydHNQbGFpbnRleHRPbmx5KCkgPyBcInBsYWludGV4dC1vbmx5XCIgOiBcInRydWVcIjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbCwgXCJjb250ZW50ZWRpdGFibGVcIiwgY2VNb2RlKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbCwgXCJhcmlhLWNvbnRyb2xzXCIsIHRoaXMuY29udHJvbGxlci5saXN0Ym94SWQpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCBcInN1cHByZXNzLWNvbnRlbnQtZWRpdGFibGUtd2FybmluZ1wiLCBcInRydWVcIik7XG5cbiAgICAvLyBBdXRvLWZvY3VzIG9uIG1vdW50LiBJZiB0aGUgZWRpdG9yIGFscmVhZHkgaGFzIGZvY3VzIChlLmcuIGZyb20gYVxuICAgIC8vIGNsaWNrIHRoYXQgZmlyZWQgYmVmb3JlIG91ciBsaWZlY3ljbGUgcmFuKSwgbm90aWZ5IHRoZSBjb250cm9sbGVyXG4gICAgLy8gaW5zdGVhZCBvZiBzdGVhbGluZyBmb2N1cy5cbiAgICBpZiAodGhpcy5hdXRvRm9jdXMpIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0Rm9jdXNlZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmREb2N1bWVudFNlbGVjdGlvbkxpc3RlbmVyKCk7XG4gICAgdGhpcy5iaW5kQmVmb3JlSW5wdXRMaXN0ZW5lcigpO1xuICAgIHRoaXMuYmluZFN0YXRlU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnRTZWxlY3Rpb25MaXN0ZW5lciAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5kb2N1bWVudFNlbGVjdGlvbkxpc3RlbmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmVmb3JlSW5wdXRMaXN0ZW5lcikge1xuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCB0aGlzLmJlZm9yZUlucHV0TGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PSBIb3N0IGV2ZW50IGhhbmRsZXJzID09PVxuXG4gIG9uQ29tcG9zaXRpb25TdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvc2luZyA9IHRydWU7XG4gIH1cblxuICBvbkNvbXBvc2l0aW9uRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9zaW5nID0gZmFsc2U7XG4gICAgdGhpcy5maXJlSW5wdXQoKTtcbiAgfVxuXG4gIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5sYXN0SW5wdXRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIHRoaXMuZmlyZUlucHV0KCk7XG4gICAgdGhpcy5jb250cm9sbGVyLmhhbmRsZUNhcmV0QWZ0ZXJJbnB1dChnZXRDdXJzb3JPZmZzZXQodGhpcy5lbC5uYXRpdmVFbGVtZW50KSk7XG4gIH1cblxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlS2V5RG93bihldmVudCk7XG4gIH1cblxuICBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGV4dCA9IChldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKSA/PyBcIlwiKS5yZXBsYWNlKC9cXHI/XFxuL2csIFwiIFwiKTtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICBjb25zdCBkb2MgPSBlbC5vd25lckRvY3VtZW50ID8/IGRvY3VtZW50O1xuICAgIGNvbnN0IHNlbCA9IGRvYy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbCB8fCBzZWwucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgaWYgKCFlbC5jb250YWlucyhyYW5nZS5zdGFydENvbnRhaW5lcikpIHJldHVybjtcbiAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgIGNvbnN0IG5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG4gICAgcmFuZ2UuaW5zZXJ0Tm9kZShub2RlKTtcbiAgICByYW5nZS5zZXRTdGFydEFmdGVyKG5vZGUpO1xuICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgIHRoaXMuZmlyZUlucHV0KCk7XG4gIH1cblxuICBvbkZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRGb2N1c2VkKHRydWUpO1xuICB9XG5cbiAgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRGb2N1c2VkKGZhbHNlKTtcbiAgfVxuXG4gIC8vID09PSBJbnRlcm5hbCBoZWxwZXJzID09PVxuXG4gIHByaXZhdGUgZmlyZUlucHV0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBvc2luZykgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJhdyA9IGV4dHJhY3RQbGFpblRleHQoZWwpO1xuICAgIGNvbnN0IHNob3VsZENhcGl0YWxpemUgPSByYXcubGVuZ3RoID4gMCAmJiByYXdbMF0gIT09IHJhd1swXS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IG5leHQgPSBzaG91bGRDYXBpdGFsaXplID8gcmF3WzBdLnRvVXBwZXJDYXNlKCkgKyByYXcuc2xpY2UoMSkgOiByYXc7XG4gICAgdGhpcy5jb250cm9sbGVyLmhhbmRsZVRleHRDaGFuZ2UobmV4dCk7XG4gIH1cblxuICBwcml2YXRlIGJpbmREb2N1bWVudFNlbGVjdGlvbkxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICAvLyBzZWxlY3Rpb25jaGFuZ2UgZmlyZXMgb24gZXZlcnkga2V5c3Ryb2tlIGFuZCBjYXJldCBtb3ZlIOKAlCBydW4gb3V0c2lkZVxuICAgIC8vIEFuZ3VsYXIncyB6b25lICjCpzE2LjEpIGFuZCByZS1lbnRlciBvbmx5IHdoZW4gd2UgYWN0dWFsbHkgbmVlZCB0b1xuICAgIC8vIG5vdGlmeSB0aGUgY29udHJvbGxlciBvZiBhIG1lYW5pbmdmdWwgY2hhbmdlLlxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWwgfHwgc2VsLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcbiAgICAgICAgaWYgKCFzZWwuYW5jaG9yTm9kZSB8fCAhZWwuY29udGFpbnMoc2VsLmFuY2hvck5vZGUpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHNlbC5hbmNob3JOb2RlO1xuICAgICAgICBjb25zdCBzdGFydEVsID1cbiAgICAgICAgICBhbmNob3Iubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFID8gKGFuY2hvciBhcyBFbGVtZW50KSA6IGFuY2hvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBzdHJvbmcgPSBzdGFydEVsPy5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3Ryb25nW2RhdGEtc2VnPVwiY29tcGxldGVkXCJdW2RhdGEtcGFyYW0taWRdJyk7XG4gICAgICAgIGNvbnN0IGVuY2xvc2luZyA9IHN0cm9uZz8uZGF0YXNldC5wYXJhbUlkID8/IG51bGw7XG4gICAgICAgIGlmIChlbmNsb3NpbmcgJiYgZW5jbG9zaW5nICE9PSB0aGlzLmVkaXRpbmdQYXJhbUlkKSB7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmNvbnRyb2xsZXIuc3RhcnRFZGl0aW5nUGFyYW0oZW5jbG9zaW5nKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMubGFzdElucHV0QXQgPCA1MCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuY29udHJvbGxlci5oYW5kbGVDYXJldE1vdmUoZ2V0Q3Vyc29yT2Zmc2V0KGVsKSkpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZG9jdW1lbnRTZWxlY3Rpb25MaXN0ZW5lciA9IGhhbmRsZXI7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIGhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kQmVmb3JlSW5wdXRMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICAvLyBOYXRpdmUgYmVmb3JlaW5wdXQg4oCUIFJlYWN0J3Mgc3ludGhldGljIG9uQmVmb3JlSW5wdXQgaXMgd2lyZWQgdG8gdGhlXG4gICAgLy8gbGVnYWN5IHRleHRJbnB1dCBldmVudCBhbmQgZG9lc24ndCBmaXJlIHJlbGlhYmx5IGZvciBkZWxldGUqIHR5cGVzLlxuICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBpbnB1dEV2ZW50ID0gZXZlbnQgYXMgSW5wdXRFdmVudDtcbiAgICAgIGNvbnN0IHQgPSBpbnB1dEV2ZW50LmlucHV0VHlwZTtcbiAgICAgIGlmICh0ID09PSBcImluc2VydFBhcmFncmFwaFwiIHx8IHQgPT09IFwiaW5zZXJ0TGluZUJyZWFrXCIgfHwgdCA9PT0gXCJpbnNlcnRGcm9tRHJvcFwiKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0LnN0YXJ0c1dpdGgoXCJpbnNlcnRcIikgfHwgdC5zdGFydHNXaXRoKFwiZGVsZXRlXCIpKSB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdC5zdGFydHNXaXRoKFwiZGVsZXRlXCIpID8gXCJcIiA6IChpbnB1dEV2ZW50LmRhdGEgPz8gXCJcIik7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIucmVwbGFjZUVkaXRpbmdSYW5nZShyZXBsYWNlbWVudCkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmJlZm9yZUlucHV0TGlzdGVuZXIgPSBoYW5kbGVyO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCBoYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZFN0YXRlU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuY29udHJvbGxlci5zdGF0ZSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgIHRoaXMuZWRpdGluZ1BhcmFtSWQgPSBzdGF0ZS5lZGl0aW5nUGFyYW0/LmlkID8/IG51bGw7XG5cbiAgICAgIHJlbmRlckVkaXRhYmxlQ29udGVudCh7XG4gICAgICAgIGlucHV0OiBlbCxcbiAgICAgICAgc2VnbWVudHM6IHN0YXRlLnNlZ21lbnRzLFxuICAgICAgICBuZXdQYXJhbUlkOiBzdGF0ZS5uZXdQYXJhbUlkLFxuICAgICAgICBlZGl0aW5nUGFyYW1JZDogc3RhdGUuZWRpdGluZ1BhcmFtPy5pZCA/PyBudWxsLFxuICAgICAgICBwbGFjZWhvbGRlclRleHQ6IHN0YXRlLnBsYWNlaG9sZGVyVGV4dCxcbiAgICAgICAgaXNGb2N1c2VkOiBzdGF0ZS5pc0ZvY3VzZWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gUG9zdC1wcm9tb3RlIHJlZm9jdXMgKyBjYXJldC1hZnRlci1ib2xkIHBsYWNlbWVudCAobWlycm9ycyBSZWFjdCdzXG4gICAgICAvLyB1c2VMYXlvdXRFZmZlY3Qgb24gbmV3UGFyYW1JZCkuXG4gICAgICBjb25zdCBjdXJyZW50UGFyYW1JZCA9IHN0YXRlLm5ld1BhcmFtSWQgPz8gXCJcIjtcbiAgICAgIGlmIChjdXJyZW50UGFyYW1JZCAmJiBjdXJyZW50UGFyYW1JZCAhPT0gdGhpcy5sYXN0U2VlblBhcmFtSWQpIHtcbiAgICAgICAgdGhpcy5sYXN0U2VlblBhcmFtSWQgPSBjdXJyZW50UGFyYW1JZDtcbiAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgY29uc3QgZGVzaXJlZCA9IHN0YXRlLmNhcmV0T2Zmc2V0ID8/IHBsYWluVGV4dExlbmd0aChlbCk7XG4gICAgICAgIHNldEN1cnNvck9mZnNldChlbCwgZGVzaXJlZCk7XG4gICAgICB9IGVsc2UgaWYgKCFjdXJyZW50UGFyYW1JZCkge1xuICAgICAgICB0aGlzLmxhc3RTZWVuUGFyYW1JZCA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLWVkaXQgY2FyZXQgcGFyayAobWlycm9ycyBSZWFjdCdzIHVzZUxheW91dEVmZmVjdCBvbiBlZGl0aW5nUGFyYW0pLlxuICAgICAgY29uc3QgZWRpdGluZ0lkID0gc3RhdGUuZWRpdGluZ1BhcmFtPy5pZCA/PyBcIlwiO1xuICAgICAgaWYgKGVkaXRpbmdJZCAmJiBlZGl0aW5nSWQgIT09IHRoaXMubGFzdEVkaXRpbmdJZCAmJiBzdGF0ZS5lZGl0aW5nQW5jaG9yICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5sYXN0RWRpdGluZ0lkID0gZWRpdGluZ0lkO1xuICAgICAgICBzZXRDdXJzb3JPZmZzZXQoZWwsIHN0YXRlLmVkaXRpbmdBbmNob3IpO1xuICAgICAgfSBlbHNlIGlmICghZWRpdGluZ0lkKSB7XG4gICAgICAgIHRoaXMubGFzdEVkaXRpbmdJZCA9IFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { CommonModule } from "@angular/common";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from "@angular/core";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
/**
|
|
6
|
+
* Internal pill list used by both the dropdown and Tier 1's inline pillbar.
|
|
7
|
+
* Mirrors `packages/react/src/components/PillList.tsx` one-for-one — including
|
|
8
|
+
* the per-index opacity ramp (0.4 / 0.3 / 0.15) and the skeleton-loading
|
|
9
|
+
* fallback that preserves layout while the next fetch is in flight.
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export class PillListComponent {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.pills = [];
|
|
16
|
+
this.activePillIndex = 0;
|
|
17
|
+
this.rounded = false;
|
|
18
|
+
/**
|
|
19
|
+
* When true, pills become non-interactive shimmering skeletons. Real pills
|
|
20
|
+
* (with their text) are rendered when provided so widths/positions match
|
|
21
|
+
* the previous state; with no pills, fixed-width fallback placeholders are
|
|
22
|
+
* rendered instead.
|
|
23
|
+
*/
|
|
24
|
+
this.loading = false;
|
|
25
|
+
this.selectPill = new EventEmitter();
|
|
26
|
+
/** Fallback widths when loading with zero cached pills (matches React). */
|
|
27
|
+
this.fallbackSkeletonWidths = [125, 69];
|
|
28
|
+
this.trackByType = (_, pill) => pill.type;
|
|
29
|
+
this.trackByWidth = (_, w) => w;
|
|
30
|
+
}
|
|
31
|
+
/** Per-index opacity ramp — mirrors PillList.tsx `getPillOpacity`. */
|
|
32
|
+
pillOpacity(index) {
|
|
33
|
+
if (index === 0)
|
|
34
|
+
return 0.4;
|
|
35
|
+
if (index === 1)
|
|
36
|
+
return 0.3;
|
|
37
|
+
return 0.15;
|
|
38
|
+
}
|
|
39
|
+
onPillClick(index) {
|
|
40
|
+
if (this.loading)
|
|
41
|
+
return;
|
|
42
|
+
this.selectPill.emit(index);
|
|
43
|
+
}
|
|
44
|
+
onPillMouseDown(event) {
|
|
45
|
+
// Prevent the editor from losing focus when a pill is tapped.
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
PillListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PillListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
50
|
+
PillListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PillListComponent, isStandalone: true, selector: "aia-pill-list", inputs: { pills: "pills", activePillIndex: "activePillIndex", rounded: "rounded", loading: "loading" }, outputs: { selectPill: "selectPill" }, ngImport: i0, template: "<ng-container *ngIf=\"loading && pills.length === 0; else realPills\">\n <span class=\"aia-pill-list\" data-aia-pill-list-loading=\"\">\n <span\n *ngFor=\"let w of fallbackSkeletonWidths; trackBy: trackByWidth; let i = index\"\n data-aia-pill-skeleton=\"\"\n class=\"aia-pill aia-pill-skeleton\"\n [class.aia-pill-rounded]=\"rounded\"\n [style.width.px]=\"w\"\n [style.opacity]=\"pillOpacity(i)\"\n ></span>\n </span>\n</ng-container>\n\n<ng-template #realPills>\n <span\n class=\"aia-pill-list\"\n [attr.data-aia-pill-list-loading]=\"loading ? '' : null\"\n >\n <button\n *ngFor=\"let pill of pills; trackBy: trackByType; let i = index\"\n type=\"button\"\n data-aia-pill=\"\"\n [attr.data-aia-loading]=\"loading ? '' : null\"\n tabindex=\"-1\"\n class=\"aia-pill\"\n [class.aia-pill-rounded]=\"rounded\"\n [class.aia-pill-active]=\"i === activePillIndex && !loading\"\n [class.aia-pill-skeleton]=\"loading\"\n [style.opacity]=\"pillOpacity(i)\"\n [disabled]=\"loading\"\n (mousedown)=\"onPillMouseDown($event)\"\n (click)=\"onPillClick(i)\"\n >\n {{ pill.text }}\n </button>\n </span>\n</ng-template>\n", styles: [".aia-pill-list{position:relative;z-index:1;pointer-events:auto;display:inline-flex;gap:5px;align-items:center;vertical-align:middle}.aia-pill{display:inline-flex;align-items:center;justify-content:center;height:36px;padding:13px;border:none;border-radius:999px;background:rgba(49,50,85,.25);background:color-mix(in srgb,var(--aia-pill-bg, var(--aia-color-background-supportive, #313255)) 25%,transparent);color:var(--aia-pill-color, var(--aia-color-text-muted, #c1c4cb));font-family:inherit;font-size:var(--aia-pill-font-size, 19px);line-height:30px;cursor:pointer;white-space:nowrap;animation:aiaPillFadeIn .4s cubic-bezier(.4,0,.2,1) forwards;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)}.aia-pill-rounded{border-radius:999px}.aia-pill-skeleton{pointer-events:none;cursor:default;color:transparent;animation:aiaPillSkeletonPulse 1.4s ease-in-out infinite}.aia-pill:hover{filter:brightness(1.2)}.aia-pill-active{outline:1px solid #5a5b8a}@keyframes aiaPillFadeIn{0%{opacity:0}}@keyframes aiaPillSkeletonPulse{0%,to{filter:brightness(1)}50%{filter:brightness(.55)}}\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PillListComponent, decorators: [{
|
|
52
|
+
type: Component,
|
|
53
|
+
args: [{ selector: "aia-pill-list", standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"loading && pills.length === 0; else realPills\">\n <span class=\"aia-pill-list\" data-aia-pill-list-loading=\"\">\n <span\n *ngFor=\"let w of fallbackSkeletonWidths; trackBy: trackByWidth; let i = index\"\n data-aia-pill-skeleton=\"\"\n class=\"aia-pill aia-pill-skeleton\"\n [class.aia-pill-rounded]=\"rounded\"\n [style.width.px]=\"w\"\n [style.opacity]=\"pillOpacity(i)\"\n ></span>\n </span>\n</ng-container>\n\n<ng-template #realPills>\n <span\n class=\"aia-pill-list\"\n [attr.data-aia-pill-list-loading]=\"loading ? '' : null\"\n >\n <button\n *ngFor=\"let pill of pills; trackBy: trackByType; let i = index\"\n type=\"button\"\n data-aia-pill=\"\"\n [attr.data-aia-loading]=\"loading ? '' : null\"\n tabindex=\"-1\"\n class=\"aia-pill\"\n [class.aia-pill-rounded]=\"rounded\"\n [class.aia-pill-active]=\"i === activePillIndex && !loading\"\n [class.aia-pill-skeleton]=\"loading\"\n [style.opacity]=\"pillOpacity(i)\"\n [disabled]=\"loading\"\n (mousedown)=\"onPillMouseDown($event)\"\n (click)=\"onPillClick(i)\"\n >\n {{ pill.text }}\n </button>\n </span>\n</ng-template>\n", styles: [".aia-pill-list{position:relative;z-index:1;pointer-events:auto;display:inline-flex;gap:5px;align-items:center;vertical-align:middle}.aia-pill{display:inline-flex;align-items:center;justify-content:center;height:36px;padding:13px;border:none;border-radius:999px;background:rgba(49,50,85,.25);background:color-mix(in srgb,var(--aia-pill-bg, var(--aia-color-background-supportive, #313255)) 25%,transparent);color:var(--aia-pill-color, var(--aia-color-text-muted, #c1c4cb));font-family:inherit;font-size:var(--aia-pill-font-size, 19px);line-height:30px;cursor:pointer;white-space:nowrap;animation:aiaPillFadeIn .4s cubic-bezier(.4,0,.2,1) forwards;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)}.aia-pill-rounded{border-radius:999px}.aia-pill-skeleton{pointer-events:none;cursor:default;color:transparent;animation:aiaPillSkeletonPulse 1.4s ease-in-out infinite}.aia-pill:hover{filter:brightness(1.2)}.aia-pill-active{outline:1px solid #5a5b8a}@keyframes aiaPillFadeIn{0%{opacity:0}}@keyframes aiaPillSkeletonPulse{0%,to{filter:brightness(1)}50%{filter:brightness(.55)}}\n"] }]
|
|
54
|
+
}], propDecorators: { pills: [{
|
|
55
|
+
type: Input
|
|
56
|
+
}], activePillIndex: [{
|
|
57
|
+
type: Input
|
|
58
|
+
}], rounded: [{
|
|
59
|
+
type: Input
|
|
60
|
+
}], loading: [{
|
|
61
|
+
type: Input
|
|
62
|
+
}], selectPill: [{
|
|
63
|
+
type: Output
|
|
64
|
+
}] } });
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlsbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVybmFsL3BpbGwtbGlzdC9waWxsLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBR3ZCOzs7Ozs7O0dBT0c7QUFVSCxNQUFNLE9BQU8saUJBQWlCO0lBVDlCO1FBVVcsVUFBSyxHQUFpQixFQUFFLENBQUM7UUFDekIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUN6Qjs7Ozs7V0FLRztRQUNNLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFTixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUzRCwyRUFBMkU7UUFDbEUsMkJBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFTNUMsZ0JBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxJQUFnQixFQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2pFLGlCQUFZLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FXcEQ7SUFuQkMsc0VBQXNFO0lBQ3RFLFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksS0FBSyxLQUFLLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUM1QixJQUFJLEtBQUssS0FBSyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS0QsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFZO1FBQzFCLDhEQUE4RDtRQUM5RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7K0dBbkNVLGlCQUFpQjttR0FBakIsaUJBQWlCLHdOQzVCOUIsZ3RDQXFDQSxpOUNEZlksWUFBWTs0RkFNWCxpQkFBaUI7a0JBVDdCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJOzhCQUs1QixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQUVhLFVBQVU7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWdnZXN0aW9uIH0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5cbi8qKlxuICogSW50ZXJuYWwgcGlsbCBsaXN0IHVzZWQgYnkgYm90aCB0aGUgZHJvcGRvd24gYW5kIFRpZXIgMSdzIGlubGluZSBwaWxsYmFyLlxuICogTWlycm9ycyBgcGFja2FnZXMvcmVhY3Qvc3JjL2NvbXBvbmVudHMvUGlsbExpc3QudHN4YCBvbmUtZm9yLW9uZSDigJQgaW5jbHVkaW5nXG4gKiB0aGUgcGVyLWluZGV4IG9wYWNpdHkgcmFtcCAoMC40IC8gMC4zIC8gMC4xNSkgYW5kIHRoZSBza2VsZXRvbi1sb2FkaW5nXG4gKiBmYWxsYmFjayB0aGF0IHByZXNlcnZlcyBsYXlvdXQgd2hpbGUgdGhlIG5leHQgZmV0Y2ggaXMgaW4gZmxpZ2h0LlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYWlhLXBpbGwtbGlzdFwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vcGlsbC1saXN0LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9waWxsLWxpc3QuY29tcG9uZW50LmNzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgUGlsbExpc3RDb21wb25lbnQge1xuICBASW5wdXQoKSBwaWxsczogU3VnZ2VzdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGFjdGl2ZVBpbGxJbmRleCA9IDA7XG4gIEBJbnB1dCgpIHJvdW5kZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgcGlsbHMgYmVjb21lIG5vbi1pbnRlcmFjdGl2ZSBzaGltbWVyaW5nIHNrZWxldG9ucy4gUmVhbCBwaWxsc1xuICAgKiAod2l0aCB0aGVpciB0ZXh0KSBhcmUgcmVuZGVyZWQgd2hlbiBwcm92aWRlZCBzbyB3aWR0aHMvcG9zaXRpb25zIG1hdGNoXG4gICAqIHRoZSBwcmV2aW91cyBzdGF0ZTsgd2l0aCBubyBwaWxscywgZml4ZWQtd2lkdGggZmFsbGJhY2sgcGxhY2Vob2xkZXJzIGFyZVxuICAgKiByZW5kZXJlZCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RQaWxsID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqIEZhbGxiYWNrIHdpZHRocyB3aGVuIGxvYWRpbmcgd2l0aCB6ZXJvIGNhY2hlZCBwaWxscyAobWF0Y2hlcyBSZWFjdCkuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrU2tlbGV0b25XaWR0aHMgPSBbMTI1LCA2OV07XG5cbiAgLyoqIFBlci1pbmRleCBvcGFjaXR5IHJhbXAg4oCUIG1pcnJvcnMgUGlsbExpc3QudHN4IGBnZXRQaWxsT3BhY2l0eWAuICovXG4gIHBpbGxPcGFjaXR5KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PT0gMCkgcmV0dXJuIDAuNDtcbiAgICBpZiAoaW5kZXggPT09IDEpIHJldHVybiAwLjM7XG4gICAgcmV0dXJuIDAuMTU7XG4gIH1cblxuICB0cmFja0J5VHlwZSA9IChfOiBudW1iZXIsIHBpbGw6IFN1Z2dlc3Rpb24pOiBzdHJpbmcgPT4gcGlsbC50eXBlO1xuICB0cmFja0J5V2lkdGggPSAoXzogbnVtYmVyLCB3OiBudW1iZXIpOiBudW1iZXIgPT4gdztcblxuICBvblBpbGxDbGljayhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0UGlsbC5lbWl0KGluZGV4KTtcbiAgfVxuXG4gIG9uUGlsbE1vdXNlRG93bihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IHRoZSBlZGl0b3IgZnJvbSBsb3NpbmcgZm9jdXMgd2hlbiBhIHBpbGwgaXMgdGFwcGVkLlxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nICYmIHBpbGxzLmxlbmd0aCA9PT0gMDsgZWxzZSByZWFsUGlsbHNcIj5cbiAgPHNwYW4gY2xhc3M9XCJhaWEtcGlsbC1saXN0XCIgZGF0YS1haWEtcGlsbC1saXN0LWxvYWRpbmc9XCJcIj5cbiAgICA8c3BhblxuICAgICAgKm5nRm9yPVwibGV0IHcgb2YgZmFsbGJhY2tTa2VsZXRvbldpZHRoczsgdHJhY2tCeTogdHJhY2tCeVdpZHRoOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgIGRhdGEtYWlhLXBpbGwtc2tlbGV0b249XCJcIlxuICAgICAgY2xhc3M9XCJhaWEtcGlsbCBhaWEtcGlsbC1za2VsZXRvblwiXG4gICAgICBbY2xhc3MuYWlhLXBpbGwtcm91bmRlZF09XCJyb3VuZGVkXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJ3XCJcbiAgICAgIFtzdHlsZS5vcGFjaXR5XT1cInBpbGxPcGFjaXR5KGkpXCJcbiAgICA+PC9zcGFuPlxuICA8L3NwYW4+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNyZWFsUGlsbHM+XG4gIDxzcGFuXG4gICAgY2xhc3M9XCJhaWEtcGlsbC1saXN0XCJcbiAgICBbYXR0ci5kYXRhLWFpYS1waWxsLWxpc3QtbG9hZGluZ109XCJsb2FkaW5nID8gJycgOiBudWxsXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0Zvcj1cImxldCBwaWxsIG9mIHBpbGxzOyB0cmFja0J5OiB0cmFja0J5VHlwZTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtYWlhLXBpbGw9XCJcIlxuICAgICAgW2F0dHIuZGF0YS1haWEtbG9hZGluZ109XCJsb2FkaW5nID8gJycgOiBudWxsXCJcbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgY2xhc3M9XCJhaWEtcGlsbFwiXG4gICAgICBbY2xhc3MuYWlhLXBpbGwtcm91bmRlZF09XCJyb3VuZGVkXCJcbiAgICAgIFtjbGFzcy5haWEtcGlsbC1hY3RpdmVdPVwiaSA9PT0gYWN0aXZlUGlsbEluZGV4ICYmICFsb2FkaW5nXCJcbiAgICAgIFtjbGFzcy5haWEtcGlsbC1za2VsZXRvbl09XCJsb2FkaW5nXCJcbiAgICAgIFtzdHlsZS5vcGFjaXR5XT1cInBpbGxPcGFjaXR5KGkpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25QaWxsTW91c2VEb3duKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIm9uUGlsbENsaWNrKGkpXCJcbiAgICA+XG4gICAgICB7eyBwaWxsLnRleHQgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { CommonModule } from "@angular/common";
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, inject, NgZone, Output, ViewChild, ViewEncapsulation, } from "@angular/core";
|
|
3
|
+
import { SuggestionItemComponent } from "../suggestion-item/suggestion-item.component";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
/**
|
|
7
|
+
* Internal scrollable grid of suggestion options. Mirrors
|
|
8
|
+
* `packages/react/src/components/SuggestionGrid.tsx` — including the bottom
|
|
9
|
+
* fade overlay that appears when there's vertical overflow, driven by a
|
|
10
|
+
* ResizeObserver + scroll listener. ResizeObserver runs outside Angular's
|
|
11
|
+
* zone (§16.1) so high-frequency layout events don't trip change detection.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export class SuggestionGridComponent {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.options = [];
|
|
18
|
+
this.activeIndex = -1;
|
|
19
|
+
this.listboxId = "";
|
|
20
|
+
this.loading = false;
|
|
21
|
+
this.select = new EventEmitter();
|
|
22
|
+
this.highlight = new EventEmitter();
|
|
23
|
+
this.hasBottomOverflow = false;
|
|
24
|
+
this.zone = inject(NgZone);
|
|
25
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
26
|
+
this.trackByOptionText = (_, opt) => opt.text;
|
|
27
|
+
}
|
|
28
|
+
ngAfterViewInit() {
|
|
29
|
+
this.bindOverflowTracking();
|
|
30
|
+
this.measureOverflow();
|
|
31
|
+
}
|
|
32
|
+
ngOnChanges() {
|
|
33
|
+
// Synchronously re-measure when options change — matches React's
|
|
34
|
+
// useLayoutEffect on [options]. ResizeObserver alone misses this case
|
|
35
|
+
// because the observed box doesn't grow when the grid hits max-height.
|
|
36
|
+
queueMicrotask(() => this.measureOverflow());
|
|
37
|
+
}
|
|
38
|
+
ngOnDestroy() {
|
|
39
|
+
this.resizeObserver?.disconnect();
|
|
40
|
+
if (this.scrollListener && this.gridRef) {
|
|
41
|
+
this.gridRef.nativeElement.removeEventListener("scroll", this.scrollListener);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
onSelectItem(option) {
|
|
45
|
+
this.select.emit(option);
|
|
46
|
+
}
|
|
47
|
+
onHighlightItem(index) {
|
|
48
|
+
this.highlight.emit(index);
|
|
49
|
+
}
|
|
50
|
+
bindOverflowTracking() {
|
|
51
|
+
const grid = this.gridRef?.nativeElement;
|
|
52
|
+
if (!grid)
|
|
53
|
+
return;
|
|
54
|
+
this.zone.runOutsideAngular(() => {
|
|
55
|
+
this.scrollListener = () => this.measureOverflow();
|
|
56
|
+
grid.addEventListener("scroll", this.scrollListener, { passive: true });
|
|
57
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
58
|
+
this.resizeObserver = new ResizeObserver(() => this.measureOverflow());
|
|
59
|
+
this.resizeObserver.observe(grid);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
measureOverflow() {
|
|
64
|
+
const grid = this.gridRef?.nativeElement;
|
|
65
|
+
if (!grid)
|
|
66
|
+
return;
|
|
67
|
+
const next = grid.scrollHeight - grid.scrollTop - grid.clientHeight > 1;
|
|
68
|
+
if (next !== this.hasBottomOverflow) {
|
|
69
|
+
this.zone.run(() => {
|
|
70
|
+
this.hasBottomOverflow = next;
|
|
71
|
+
this.cdr.markForCheck();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
SuggestionGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SuggestionGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
77
|
+
SuggestionGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SuggestionGridComponent, isStandalone: true, selector: "aia-suggestion-grid", inputs: { options: "options", activeIndex: "activeIndex", listboxId: "listboxId", loading: "loading" }, outputs: { select: "select", highlight: "highlight" }, viewQueries: [{ propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"aia-suggestion-grid-scroll\"\n [attr.data-fade]=\"hasBottomOverflow ? '' : null\"\n>\n <div #grid class=\"aia-suggestion-grid\">\n <aia-suggestion-item\n *ngFor=\"let option of options; trackBy: trackByOptionText; let i = index\"\n [option]=\"option\"\n [isHighlighted]=\"i === activeIndex\"\n [id]=\"listboxId + '-option-' + i\"\n [loading]=\"loading\"\n (select)=\"onSelectItem($event)\"\n (highlight)=\"onHighlightItem(i)\"\n >\n </aia-suggestion-item>\n </div>\n</div>\n", styles: [".aia-suggestion-grid-scroll{position:relative}.aia-suggestion-grid-scroll:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:50%;pointer-events:none;opacity:0;transition:opacity .15s ease-out;backdrop-filter:blur(12px);mask-image:linear-gradient(to bottom,transparent,white)}.aia-suggestion-grid-scroll[data-fade]:after{opacity:1}.aia-suggestion-grid{display:grid;grid-template-columns:minmax(0,250px);grid-auto-rows:min-content;align-content:start;max-width:100cqi;padding:8px;max-height:200px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--aia-scrollbar-thumb, rgba(0, 0, 0, .3)) transparent}@container (min-width: 516px){.aia-suggestion-grid{grid-template-columns:repeat(2,minmax(0,250px));justify-content:start}}.aia-suggestion-grid::-webkit-scrollbar{width:6px}.aia-suggestion-grid::-webkit-scrollbar-track{background:transparent}.aia-suggestion-grid::-webkit-scrollbar-thumb{background:var(--aia-scrollbar-thumb, rgba(0, 0, 0, .3));border-radius:3px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: SuggestionItemComponent, selector: "aia-suggestion-item", inputs: ["option", "isHighlighted", "id", "loading"], outputs: ["select", "highlight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SuggestionGridComponent, decorators: [{
|
|
79
|
+
type: Component,
|
|
80
|
+
args: [{ selector: "aia-suggestion-grid", standalone: true, imports: [CommonModule, SuggestionItemComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"aia-suggestion-grid-scroll\"\n [attr.data-fade]=\"hasBottomOverflow ? '' : null\"\n>\n <div #grid class=\"aia-suggestion-grid\">\n <aia-suggestion-item\n *ngFor=\"let option of options; trackBy: trackByOptionText; let i = index\"\n [option]=\"option\"\n [isHighlighted]=\"i === activeIndex\"\n [id]=\"listboxId + '-option-' + i\"\n [loading]=\"loading\"\n (select)=\"onSelectItem($event)\"\n (highlight)=\"onHighlightItem(i)\"\n >\n </aia-suggestion-item>\n </div>\n</div>\n", styles: [".aia-suggestion-grid-scroll{position:relative}.aia-suggestion-grid-scroll:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:50%;pointer-events:none;opacity:0;transition:opacity .15s ease-out;backdrop-filter:blur(12px);mask-image:linear-gradient(to bottom,transparent,white)}.aia-suggestion-grid-scroll[data-fade]:after{opacity:1}.aia-suggestion-grid{display:grid;grid-template-columns:minmax(0,250px);grid-auto-rows:min-content;align-content:start;max-width:100cqi;padding:8px;max-height:200px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--aia-scrollbar-thumb, rgba(0, 0, 0, .3)) transparent}@container (min-width: 516px){.aia-suggestion-grid{grid-template-columns:repeat(2,minmax(0,250px));justify-content:start}}.aia-suggestion-grid::-webkit-scrollbar{width:6px}.aia-suggestion-grid::-webkit-scrollbar-track{background:transparent}.aia-suggestion-grid::-webkit-scrollbar-thumb{background:var(--aia-scrollbar-thumb, rgba(0, 0, 0, .3));border-radius:3px}\n"] }]
|
|
81
|
+
}], propDecorators: { options: [{
|
|
82
|
+
type: Input
|
|
83
|
+
}], activeIndex: [{
|
|
84
|
+
type: Input
|
|
85
|
+
}], listboxId: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], loading: [{
|
|
88
|
+
type: Input
|
|
89
|
+
}], select: [{
|
|
90
|
+
type: Output
|
|
91
|
+
}], highlight: [{
|
|
92
|
+
type: Output
|
|
93
|
+
}], gridRef: [{
|
|
94
|
+
type: ViewChild,
|
|
95
|
+
args: ["grid", { static: false }]
|
|
96
|
+
}] } });
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VnZ2VzdGlvbi1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW50ZXJuYWwvc3VnZ2VzdGlvbi1ncmlkL3N1Z2dlc3Rpb24tZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVybmFsL3N1Z2dlc3Rpb24tZ3JpZC9zdWdnZXN0aW9uLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7OztBQUV2Rjs7Ozs7Ozs7R0FRRztBQVVILE1BQU0sT0FBTyx1QkFBdUI7SUFUcEM7UUFVVyxZQUFPLEdBQXVCLEVBQUUsQ0FBQztRQUNqQyxnQkFBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRU4sV0FBTSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBQzlDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBSTFELHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUVULFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBdUJqRCxzQkFBaUIsR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFxQixFQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxD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WSxTQUFTO3NCQUEzQixNQUFNO2dCQUUrQixPQUFPO3NCQUE1QyxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICB0eXBlIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICB0eXBlIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIGluamVjdCxcbiAgTmdab25lLFxuICB0eXBlIE9uQ2hhbmdlcyxcbiAgdHlwZSBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgU3VnZ2VzdGlvbk9wdGlvbiB9IGZyb20gXCJAbWFnaWN4LWVuZy9haS1hdXRvY29tcGxldGUtdmFuaWxsYVwiO1xuaW1wb3J0IHsgU3VnZ2VzdGlvbkl0ZW1Db21wb25lbnQgfSBmcm9tIFwiLi4vc3VnZ2VzdGlvbi1pdGVtL3N1Z2dlc3Rpb24taXRlbS5jb21wb25lbnRcIjtcblxuLyoqXG4gKiBJbnRlcm5hbCBzY3JvbGxhYmxlIGdyaWQgb2Ygc3VnZ2VzdGlvbiBvcHRpb25zLiBNaXJyb3JzXG4gKiBgcGFja2FnZXMvcmVhY3Qvc3JjL2NvbXBvbmVudHMvU3VnZ2VzdGlvbkdyaWQudHN4YCDigJQgaW5jbHVkaW5nIHRoZSBib3R0b21cbiAqIGZhZGUgb3ZlcmxheSB0aGF0IGFwcGVhcnMgd2hlbiB0aGVyZSdzIHZlcnRpY2FsIG92ZXJmbG93LCBkcml2ZW4gYnkgYVxuICogUmVzaXplT2JzZXJ2ZXIgKyBzY3JvbGwgbGlzdGVuZXIuIFJlc2l6ZU9ic2VydmVyIHJ1bnMgb3V0c2lkZSBBbmd1bGFyJ3NcbiAqIHpvbmUgKMKnMTYuMSkgc28gaGlnaC1mcmVxdWVuY3kgbGF5b3V0IGV2ZW50cyBkb24ndCB0cmlwIGNoYW5nZSBkZXRlY3Rpb24uXG4gKlxuICogQGludGVybmFsXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhaWEtc3VnZ2VzdGlvbi1ncmlkXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFN1Z2dlc3Rpb25JdGVtQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vc3VnZ2VzdGlvbi1ncmlkLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9zdWdnZXN0aW9uLWdyaWQuY29tcG9uZW50LmNzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VnZ2VzdGlvbkdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFN1Z2dlc3Rpb25PcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBhY3RpdmVJbmRleCA9IC0xO1xuICBASW5wdXQoKSBsaXN0Ym94SWQgPSBcIlwiO1xuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8U3VnZ2VzdGlvbk9wdGlvbj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGhpZ2hsaWdodCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIEBWaWV3Q2hpbGQoXCJncmlkXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBncmlkUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgaGFzQm90dG9tT3ZlcmZsb3cgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgc2Nyb2xsTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJpbmRPdmVyZmxvd1RyYWNraW5nKCk7XG4gICAgdGhpcy5tZWFzdXJlT3ZlcmZsb3coKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIC8vIFN5bmNocm9ub3VzbHkgcmUtbWVhc3VyZSB3aGVuIG9wdGlvbnMgY2hhbmdlIOKAlCBtYXRjaGVzIFJlYWN0J3NcbiAgICAvLyB1c2VMYXlvdXRFZmZlY3Qgb24gW29wdGlvbnNdLiBSZXNpemVPYnNlcnZlciBhbG9uZSBtaXNzZXMgdGhpcyBjYXNlXG4gICAgLy8gYmVjYXVzZSB0aGUgb2JzZXJ2ZWQgYm94IGRvZXNuJ3QgZ3JvdyB3aGVuIHRoZSBncmlkIGhpdHMgbWF4LWhlaWdodC5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLm1lYXN1cmVPdmVyZmxvdygpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxMaXN0ZW5lciAmJiB0aGlzLmdyaWRSZWYpIHtcbiAgICAgIHRoaXMuZ3JpZFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5zY3JvbGxMaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeU9wdGlvblRleHQgPSAoXzogbnVtYmVyLCBvcHQ6IFN1Z2dlc3Rpb25PcHRpb24pOiBzdHJpbmcgPT4gb3B0LnRleHQ7XG5cbiAgb25TZWxlY3RJdGVtKG9wdGlvbjogU3VnZ2VzdGlvbk9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0LmVtaXQob3B0aW9uKTtcbiAgfVxuXG4gIG9uSGlnaGxpZ2h0SXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHQuZW1pdChpbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRPdmVyZmxvd1RyYWNraW5nKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG5cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5zY3JvbGxMaXN0ZW5lciA9ICgpID0+IHRoaXMubWVhc3VyZU92ZXJmbG93KCk7XG4gICAgICBncmlkLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5zY3JvbGxMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5tZWFzdXJlT3ZlcmZsb3coKSk7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShncmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVhc3VyZU92ZXJmbG93KCk6IHZvaWQge1xuICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGdyaWQuc2Nyb2xsSGVpZ2h0IC0gZ3JpZC5zY3JvbGxUb3AgLSBncmlkLmNsaWVudEhlaWdodCA+IDE7XG4gICAgaWYgKG5leHQgIT09IHRoaXMuaGFzQm90dG9tT3ZlcmZsb3cpIHtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmhhc0JvdHRvbU92ZXJmbG93ID0gbmV4dDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJhaWEtc3VnZ2VzdGlvbi1ncmlkLXNjcm9sbFwiXG4gIFthdHRyLmRhdGEtZmFkZV09XCJoYXNCb3R0b21PdmVyZmxvdyA/ICcnIDogbnVsbFwiXG4+XG4gIDxkaXYgI2dyaWQgY2xhc3M9XCJhaWEtc3VnZ2VzdGlvbi1ncmlkXCI+XG4gICAgPGFpYS1zdWdnZXN0aW9uLWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeU9wdGlvblRleHQ7IGxldCBpID0gaW5kZXhcIlxuICAgICAgW29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgW2lzSGlnaGxpZ2h0ZWRdPVwiaSA9PT0gYWN0aXZlSW5kZXhcIlxuICAgICAgW2lkXT1cImxpc3Rib3hJZCArICctb3B0aW9uLScgKyBpXCJcbiAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgKHNlbGVjdCk9XCJvblNlbGVjdEl0ZW0oJGV2ZW50KVwiXG4gICAgICAoaGlnaGxpZ2h0KT1cIm9uSGlnaGxpZ2h0SXRlbShpKVwiXG4gICAgPlxuICAgIDwvYWlhLXN1Z2dlc3Rpb24taXRlbT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { CommonModule } from "@angular/common";
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, inject, Output, ViewEncapsulation, } from "@angular/core";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
/**
|
|
6
|
+
* Internal single-option cell used inside the suggestion grid. Mirrors
|
|
7
|
+
* `packages/react/src/components/SuggestionItem.tsx`. Handles:
|
|
8
|
+
*
|
|
9
|
+
* - Tappable vs non-tappable cursor + hover styling
|
|
10
|
+
* - Pressed-state streak animation (500ms, single-flight)
|
|
11
|
+
* - Keyboard activation (Enter/Space)
|
|
12
|
+
* - ARIA `role="option"` + `aria-selected` for the listbox pattern
|
|
13
|
+
* - Loading skeleton when `loading=true`
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export class SuggestionItemComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.isHighlighted = false;
|
|
20
|
+
this.id = "";
|
|
21
|
+
this.loading = false;
|
|
22
|
+
this.select = new EventEmitter();
|
|
23
|
+
this.highlight = new EventEmitter();
|
|
24
|
+
this.pressed = false;
|
|
25
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
26
|
+
}
|
|
27
|
+
ngOnDestroy() {
|
|
28
|
+
if (this.pressedTimer !== undefined)
|
|
29
|
+
clearTimeout(this.pressedTimer);
|
|
30
|
+
}
|
|
31
|
+
onSelect() {
|
|
32
|
+
if (this.loading || !this.option.is_tappable || this.pressed)
|
|
33
|
+
return;
|
|
34
|
+
this.pressed = true;
|
|
35
|
+
this.cdr.markForCheck();
|
|
36
|
+
this.select.emit(this.option);
|
|
37
|
+
if (this.pressedTimer !== undefined)
|
|
38
|
+
clearTimeout(this.pressedTimer);
|
|
39
|
+
this.pressedTimer = setTimeout(() => {
|
|
40
|
+
this.pressed = false;
|
|
41
|
+
this.cdr.markForCheck();
|
|
42
|
+
}, 500);
|
|
43
|
+
}
|
|
44
|
+
onMouseEnter() {
|
|
45
|
+
if (this.loading || !this.option.is_tappable)
|
|
46
|
+
return;
|
|
47
|
+
this.highlight.emit();
|
|
48
|
+
}
|
|
49
|
+
onKeyDown(event) {
|
|
50
|
+
if (this.loading || !this.option.is_tappable)
|
|
51
|
+
return;
|
|
52
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
53
|
+
event.preventDefault();
|
|
54
|
+
this.onSelect();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
SuggestionItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SuggestionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
59
|
+
SuggestionItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SuggestionItemComponent, isStandalone: true, selector: "aia-suggestion-item", inputs: { option: "option", isHighlighted: "isHighlighted", id: "id", loading: "loading" }, outputs: { select: "select", highlight: "highlight" }, ngImport: i0, template: "<div\n [id]=\"id\"\n role=\"option\"\n data-aia-option=\"\"\n [attr.data-aia-loading]=\"loading ? '' : null\"\n [attr.aria-selected]=\"isHighlighted\"\n class=\"aia-suggestion-item\"\n [class.aia-suggestion-item-highlighted]=\"isHighlighted && !loading\"\n [class.aia-suggestion-item-tappable]=\"option.is_tappable\"\n [class.aia-suggestion-item-non-tappable]=\"!option.is_tappable\"\n [class.aia-suggestion-item-pressed]=\"pressed\"\n [attr.tabindex]=\"loading || !option.is_tappable ? -1 : 0\"\n (click)=\"onSelect()\"\n (keydown)=\"onKeyDown($event)\"\n (mouseenter)=\"onMouseEnter()\"\n>\n <div class=\"aia-suggestion-streaks\"></div>\n <div class=\"aia-suggestion-streaks-vert\"></div>\n <span class=\"aia-suggestion-content\">\n <span class=\"aia-suggestion-text\">\n <ng-container *ngIf=\"option.icon; else noIcon\"\n >{{ option.icon }} {{ option.text }}</ng-container\n >\n <ng-template #noIcon>{{ option.text }}</ng-template>\n </span>\n <span *ngIf=\"option.tag\" class=\"aia-suggestion-tag\">{{ option.tag }}</span>\n </span>\n</div>\n", styles: [".aia-suggestion-item{position:relative;overflow:visible;display:flex;align-items:flex-start;font-family:inherit;font-size:var(--aia-option-font-size, 19px);font-weight:250;line-height:24px;color:var(--aia-option-color, var(--aia-color-text-muted, #c1c4cb));white-space:normal;word-break:break-word;border-radius:12px;padding:13px;animation:aiaSuggestionFadeIn .5s cubic-bezier(.4,0,.2,1) forwards}@keyframes aiaSuggestionFadeIn{0%{opacity:0}}.aia-suggestion-content{position:relative;z-index:2}.aia-suggestion-item-tappable{cursor:pointer}.aia-suggestion-item-tappable:hover{color:var(--aia-option-color-selected, var(--aia-color-text-default, #fff))}.aia-suggestion-item-non-tappable{cursor:default}.aia-suggestion-item-highlighted{color:var(--aia-option-color-selected, var(--aia-color-text-default, #fff));background:var(--aia-option-bg, transparent)}.aia-suggestion-tag{font-size:11px;margin-left:6px;opacity:.5}.aia-suggestion-item-pressed{opacity:.8;color:var(--aia-color-text-default, #fff);background:rgba(var(--aia-streak-rgb, 255, 255, 255),.06);animation:aiaGlassFade .5s ease forwards,aiaTapDown .5s ease forwards}@keyframes aiaTapDown{0%{transform:scale(1)}30%{transform:scale(.97)}to{transform:scale(1)}}@keyframes aiaGlassFade{0%{background:var(--aia-streak-glass-bg, rgba(255, 255, 255, .1))}to{background:transparent}}.aia-suggestion-streaks{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit;overflow:hidden}.aia-suggestion-streaks:before{content:\"\";position:absolute;bottom:-3px;left:60%;width:0;height:6px;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.5) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.2) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.2);filter:blur(1px);border-radius:50%}.aia-suggestion-streaks:after{content:\"\";position:absolute;top:-3px;right:60%;width:0;height:6px;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.5) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.2) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.2);filter:blur(1px);border-radius:50%}.aia-suggestion-streaks-vert{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit;overflow:hidden}.aia-suggestion-streaks-vert:before{content:\"\";position:absolute;bottom:0;right:-3px;width:6px;height:0;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.4) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.15) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.15);filter:blur(1px);border-radius:50%}.aia-suggestion-streaks-vert:after{content:\"\";position:absolute;top:0;left:-3px;width:6px;height:0;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.4) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.15) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.15);filter:blur(1px);border-radius:50%}.aia-suggestion-item-pressed .aia-suggestion-streaks:before{animation:aiaStreakHorizRight .5s cubic-bezier(.4,0,.2,1) forwards}.aia-suggestion-item-pressed .aia-suggestion-streaks:after{animation:aiaStreakHorizLeft .5s cubic-bezier(.4,0,.2,1) forwards}.aia-suggestion-item-pressed .aia-suggestion-streaks-vert:before{animation:aiaStreakVertUp .3s cubic-bezier(.3,0,.2,1) .2s forwards}.aia-suggestion-item-pressed .aia-suggestion-streaks-vert:after{animation:aiaStreakVertDown .3s cubic-bezier(.3,0,.2,1) .2s forwards}@keyframes aiaStreakHorizRight{0%{width:0;height:4px;opacity:0;filter:blur(1px);box-shadow:0 0 8px 3px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}15%{height:4px;opacity:1;filter:blur(1px);box-shadow:0 0 10px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}80%{width:50%;height:10px;opacity:.8;filter:blur(3px);box-shadow:0 0 16px 6px rgba(var(--aia-streak-rgb, 255, 255, 255),.1)}to{width:50%;height:12px;opacity:0;filter:blur(5px);box-shadow:0 0 20px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.03)}}@keyframes aiaStreakHorizLeft{0%{width:0;height:4px;opacity:0;filter:blur(1px);box-shadow:0 0 8px 3px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}15%{height:4px;opacity:1;filter:blur(1px);box-shadow:0 0 10px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}80%{width:50%;height:10px;opacity:.8;filter:blur(3px);box-shadow:0 0 16px 6px rgba(var(--aia-streak-rgb, 255, 255, 255),.1)}to{width:50%;height:12px;opacity:0;filter:blur(5px);box-shadow:0 0 20px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.03)}}@keyframes aiaStreakVertUp{0%{height:0;width:6px;opacity:.9;filter:blur(1.8px);box-shadow:0 0 12px 5px rgba(var(--aia-streak-rgb, 255, 255, 255),.25)}75%{height:100%;width:10px;opacity:.4;filter:blur(3px);box-shadow:0 0 18px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.06)}to{height:100%;width:14px;opacity:0;filter:blur(5px);box-shadow:0 0 24px 10px rgba(var(--aia-streak-rgb, 255, 255, 255),.02)}}@keyframes aiaStreakVertDown{0%{height:0;width:6px;opacity:.9;filter:blur(1.8px);box-shadow:0 0 12px 5px rgba(var(--aia-streak-rgb, 255, 255, 255),.25)}75%{height:100%;width:10px;opacity:.4;filter:blur(3px);box-shadow:0 0 18px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.06)}to{height:100%;width:14px;opacity:0;filter:blur(5px);box-shadow:0 0 24px 10px rgba(var(--aia-streak-rgb, 255, 255, 255),.02)}}.aia-suggestion-item[data-aia-loading]{cursor:default;animation:aiaSuggestionSkeletonPulse 1.4s ease-in-out infinite}.aia-suggestion-item[data-aia-loading] .aia-suggestion-text{color:transparent;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .51)));border-radius:999px;-webkit-box-decoration-break:clone;box-decoration-break:clone}.aia-suggestion-item[data-aia-loading] .aia-suggestion-tag{display:none}@keyframes aiaSuggestionSkeletonPulse{0%,to{filter:brightness(1)}50%{filter:brightness(.55)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SuggestionItemComponent, decorators: [{
|
|
61
|
+
type: Component,
|
|
62
|
+
args: [{ selector: "aia-suggestion-item", standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n [id]=\"id\"\n role=\"option\"\n data-aia-option=\"\"\n [attr.data-aia-loading]=\"loading ? '' : null\"\n [attr.aria-selected]=\"isHighlighted\"\n class=\"aia-suggestion-item\"\n [class.aia-suggestion-item-highlighted]=\"isHighlighted && !loading\"\n [class.aia-suggestion-item-tappable]=\"option.is_tappable\"\n [class.aia-suggestion-item-non-tappable]=\"!option.is_tappable\"\n [class.aia-suggestion-item-pressed]=\"pressed\"\n [attr.tabindex]=\"loading || !option.is_tappable ? -1 : 0\"\n (click)=\"onSelect()\"\n (keydown)=\"onKeyDown($event)\"\n (mouseenter)=\"onMouseEnter()\"\n>\n <div class=\"aia-suggestion-streaks\"></div>\n <div class=\"aia-suggestion-streaks-vert\"></div>\n <span class=\"aia-suggestion-content\">\n <span class=\"aia-suggestion-text\">\n <ng-container *ngIf=\"option.icon; else noIcon\"\n >{{ option.icon }} {{ option.text }}</ng-container\n >\n <ng-template #noIcon>{{ option.text }}</ng-template>\n </span>\n <span *ngIf=\"option.tag\" class=\"aia-suggestion-tag\">{{ option.tag }}</span>\n </span>\n</div>\n", styles: [".aia-suggestion-item{position:relative;overflow:visible;display:flex;align-items:flex-start;font-family:inherit;font-size:var(--aia-option-font-size, 19px);font-weight:250;line-height:24px;color:var(--aia-option-color, var(--aia-color-text-muted, #c1c4cb));white-space:normal;word-break:break-word;border-radius:12px;padding:13px;animation:aiaSuggestionFadeIn .5s cubic-bezier(.4,0,.2,1) forwards}@keyframes aiaSuggestionFadeIn{0%{opacity:0}}.aia-suggestion-content{position:relative;z-index:2}.aia-suggestion-item-tappable{cursor:pointer}.aia-suggestion-item-tappable:hover{color:var(--aia-option-color-selected, var(--aia-color-text-default, #fff))}.aia-suggestion-item-non-tappable{cursor:default}.aia-suggestion-item-highlighted{color:var(--aia-option-color-selected, var(--aia-color-text-default, #fff));background:var(--aia-option-bg, transparent)}.aia-suggestion-tag{font-size:11px;margin-left:6px;opacity:.5}.aia-suggestion-item-pressed{opacity:.8;color:var(--aia-color-text-default, #fff);background:rgba(var(--aia-streak-rgb, 255, 255, 255),.06);animation:aiaGlassFade .5s ease forwards,aiaTapDown .5s ease forwards}@keyframes aiaTapDown{0%{transform:scale(1)}30%{transform:scale(.97)}to{transform:scale(1)}}@keyframes aiaGlassFade{0%{background:var(--aia-streak-glass-bg, rgba(255, 255, 255, .1))}to{background:transparent}}.aia-suggestion-streaks{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit;overflow:hidden}.aia-suggestion-streaks:before{content:\"\";position:absolute;bottom:-3px;left:60%;width:0;height:6px;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.5) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.2) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.2);filter:blur(1px);border-radius:50%}.aia-suggestion-streaks:after{content:\"\";position:absolute;top:-3px;right:60%;width:0;height:6px;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.5) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.2) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.2);filter:blur(1px);border-radius:50%}.aia-suggestion-streaks-vert{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit;overflow:hidden}.aia-suggestion-streaks-vert:before{content:\"\";position:absolute;bottom:0;right:-3px;width:6px;height:0;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.4) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.15) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.15);filter:blur(1px);border-radius:50%}.aia-suggestion-streaks-vert:after{content:\"\";position:absolute;top:0;left:-3px;width:6px;height:0;opacity:0;background:radial-gradient(ellipse at center,rgba(var(--aia-streak-rgb, 255, 255, 255),.4) 0%,rgba(var(--aia-streak-rgb, 255, 255, 255),.15) 40%,transparent 70%);box-shadow:0 0 12px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.15);filter:blur(1px);border-radius:50%}.aia-suggestion-item-pressed .aia-suggestion-streaks:before{animation:aiaStreakHorizRight .5s cubic-bezier(.4,0,.2,1) forwards}.aia-suggestion-item-pressed .aia-suggestion-streaks:after{animation:aiaStreakHorizLeft .5s cubic-bezier(.4,0,.2,1) forwards}.aia-suggestion-item-pressed .aia-suggestion-streaks-vert:before{animation:aiaStreakVertUp .3s cubic-bezier(.3,0,.2,1) .2s forwards}.aia-suggestion-item-pressed .aia-suggestion-streaks-vert:after{animation:aiaStreakVertDown .3s cubic-bezier(.3,0,.2,1) .2s forwards}@keyframes aiaStreakHorizRight{0%{width:0;height:4px;opacity:0;filter:blur(1px);box-shadow:0 0 8px 3px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}15%{height:4px;opacity:1;filter:blur(1px);box-shadow:0 0 10px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}80%{width:50%;height:10px;opacity:.8;filter:blur(3px);box-shadow:0 0 16px 6px rgba(var(--aia-streak-rgb, 255, 255, 255),.1)}to{width:50%;height:12px;opacity:0;filter:blur(5px);box-shadow:0 0 20px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.03)}}@keyframes aiaStreakHorizLeft{0%{width:0;height:4px;opacity:0;filter:blur(1px);box-shadow:0 0 8px 3px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}15%{height:4px;opacity:1;filter:blur(1px);box-shadow:0 0 10px 4px rgba(var(--aia-streak-rgb, 255, 255, 255),.3)}80%{width:50%;height:10px;opacity:.8;filter:blur(3px);box-shadow:0 0 16px 6px rgba(var(--aia-streak-rgb, 255, 255, 255),.1)}to{width:50%;height:12px;opacity:0;filter:blur(5px);box-shadow:0 0 20px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.03)}}@keyframes aiaStreakVertUp{0%{height:0;width:6px;opacity:.9;filter:blur(1.8px);box-shadow:0 0 12px 5px rgba(var(--aia-streak-rgb, 255, 255, 255),.25)}75%{height:100%;width:10px;opacity:.4;filter:blur(3px);box-shadow:0 0 18px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.06)}to{height:100%;width:14px;opacity:0;filter:blur(5px);box-shadow:0 0 24px 10px rgba(var(--aia-streak-rgb, 255, 255, 255),.02)}}@keyframes aiaStreakVertDown{0%{height:0;width:6px;opacity:.9;filter:blur(1.8px);box-shadow:0 0 12px 5px rgba(var(--aia-streak-rgb, 255, 255, 255),.25)}75%{height:100%;width:10px;opacity:.4;filter:blur(3px);box-shadow:0 0 18px 8px rgba(var(--aia-streak-rgb, 255, 255, 255),.06)}to{height:100%;width:14px;opacity:0;filter:blur(5px);box-shadow:0 0 24px 10px rgba(var(--aia-streak-rgb, 255, 255, 255),.02)}}.aia-suggestion-item[data-aia-loading]{cursor:default;animation:aiaSuggestionSkeletonPulse 1.4s ease-in-out infinite}.aia-suggestion-item[data-aia-loading] .aia-suggestion-text{color:transparent;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .51)));border-radius:999px;-webkit-box-decoration-break:clone;box-decoration-break:clone}.aia-suggestion-item[data-aia-loading] .aia-suggestion-tag{display:none}@keyframes aiaSuggestionSkeletonPulse{0%,to{filter:brightness(1)}50%{filter:brightness(.55)}}\n"] }]
|
|
63
|
+
}], propDecorators: { option: [{
|
|
64
|
+
type: Input
|
|
65
|
+
}], isHighlighted: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}], id: [{
|
|
68
|
+
type: Input
|
|
69
|
+
}], loading: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}], select: [{
|
|
72
|
+
type: Output
|
|
73
|
+
}], highlight: [{
|
|
74
|
+
type: Output
|
|
75
|
+
}] } });
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VnZ2VzdGlvbi1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW50ZXJuYWwvc3VnZ2VzdGlvbi1pdGVtL3N1Z2dlc3Rpb24taXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVybmFsL3N1Z2dlc3Rpb24taXRlbS9zdWdnZXN0aW9uLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7QUFHdkI7Ozs7Ozs7Ozs7O0dBV0c7QUFVSCxNQUFNLE9BQU8sdUJBQXVCO0lBVHBDO1FBV1csa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUNSLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFTixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDOUMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFeEQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVDLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQStCbEQ7SUE1QkMsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUNyRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUztZQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQ3JELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUU7WUFDOUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7O3FIQXpDVSx1QkFBdUI7eUdBQXZCLHVCQUF1QixrT0NuQ3BDLHlrQ0E0QkEsNjNMRENZLFlBQVk7NEZBTVgsdUJBQXVCO2tCQVRuQyxTQUFTOytCQUNFLHFCQUFxQixjQUNuQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBQ04sdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTs4QkFLNUIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFYSxNQUFNO3NCQUF4QixNQUFNO2dCQUNZLFNBQVM7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgaW5qZWN0LFxuICB0eXBlIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgU3VnZ2VzdGlvbk9wdGlvbiB9IGZyb20gXCJAbWFnaWN4LWVuZy9haS1hdXRvY29tcGxldGUtdmFuaWxsYVwiO1xuXG4vKipcbiAqIEludGVybmFsIHNpbmdsZS1vcHRpb24gY2VsbCB1c2VkIGluc2lkZSB0aGUgc3VnZ2VzdGlvbiBncmlkLiBNaXJyb3JzXG4gKiBgcGFja2FnZXMvcmVhY3Qvc3JjL2NvbXBvbmVudHMvU3VnZ2VzdGlvbkl0ZW0udHN4YC4gSGFuZGxlczpcbiAqXG4gKiAtIFRhcHBhYmxlIHZzIG5vbi10YXBwYWJsZSBjdXJzb3IgKyBob3ZlciBzdHlsaW5nXG4gKiAtIFByZXNzZWQtc3RhdGUgc3RyZWFrIGFuaW1hdGlvbiAoNTAwbXMsIHNpbmdsZS1mbGlnaHQpXG4gKiAtIEtleWJvYXJkIGFjdGl2YXRpb24gKEVudGVyL1NwYWNlKVxuICogLSBBUklBIGByb2xlPVwib3B0aW9uXCJgICsgYGFyaWEtc2VsZWN0ZWRgIGZvciB0aGUgbGlzdGJveCBwYXR0ZXJuXG4gKiAtIExvYWRpbmcgc2tlbGV0b24gd2hlbiBgbG9hZGluZz10cnVlYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYWlhLXN1Z2dlc3Rpb24taXRlbVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vc3VnZ2VzdGlvbi1pdGVtLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9zdWdnZXN0aW9uLWl0ZW0uY29tcG9uZW50LmNzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VnZ2VzdGlvbkl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBvcHRpb24hOiBTdWdnZXN0aW9uT3B0aW9uO1xuICBASW5wdXQoKSBpc0hpZ2hsaWdodGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlkID0gXCJcIjtcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFN1Z2dlc3Rpb25PcHRpb24+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBoaWdobGlnaHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJlc3NlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBwcmVzc2VkVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZXNzZWRUaW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGhpcy5wcmVzc2VkVGltZXIpO1xuICB9XG5cbiAgb25TZWxlY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCAhdGhpcy5vcHRpb24uaXNfdGFwcGFibGUgfHwgdGhpcy5wcmVzc2VkKSByZXR1cm47XG4gICAgdGhpcy5wcmVzc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnNlbGVjdC5lbWl0KHRoaXMub3B0aW9uKTtcbiAgICBpZiAodGhpcy5wcmVzc2VkVGltZXIgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRoaXMucHJlc3NlZFRpbWVyKTtcbiAgICB0aGlzLnByZXNzZWRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRpbmcgfHwgIXRoaXMub3B0aW9uLmlzX3RhcHBhYmxlKSByZXR1cm47XG4gICAgdGhpcy5oaWdobGlnaHQuZW1pdCgpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCAhdGhpcy5vcHRpb24uaXNfdGFwcGFibGUpIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgfHwgZXZlbnQua2V5ID09PSBcIiBcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub25TZWxlY3QoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgW2lkXT1cImlkXCJcbiAgcm9sZT1cIm9wdGlvblwiXG4gIGRhdGEtYWlhLW9wdGlvbj1cIlwiXG4gIFthdHRyLmRhdGEtYWlhLWxvYWRpbmddPVwibG9hZGluZyA/ICcnIDogbnVsbFwiXG4gIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gIGNsYXNzPVwiYWlhLXN1Z2dlc3Rpb24taXRlbVwiXG4gIFtjbGFzcy5haWEtc3VnZ2VzdGlvbi1pdGVtLWhpZ2hsaWdodGVkXT1cImlzSGlnaGxpZ2h0ZWQgJiYgIWxvYWRpbmdcIlxuICBbY2xhc3MuYWlhLXN1Z2dlc3Rpb24taXRlbS10YXBwYWJsZV09XCJvcHRpb24uaXNfdGFwcGFibGVcIlxuICBbY2xhc3MuYWlhLXN1Z2dlc3Rpb24taXRlbS1ub24tdGFwcGFibGVdPVwiIW9wdGlvbi5pc190YXBwYWJsZVwiXG4gIFtjbGFzcy5haWEtc3VnZ2VzdGlvbi1pdGVtLXByZXNzZWRdPVwicHJlc3NlZFwiXG4gIFthdHRyLnRhYmluZGV4XT1cImxvYWRpbmcgfHwgIW9wdGlvbi5pc190YXBwYWJsZSA/IC0xIDogMFwiXG4gIChjbGljayk9XCJvblNlbGVjdCgpXCJcbiAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAobW91c2VlbnRlcik9XCJvbk1vdXNlRW50ZXIoKVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJhaWEtc3VnZ2VzdGlvbi1zdHJlYWtzXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJhaWEtc3VnZ2VzdGlvbi1zdHJlYWtzLXZlcnRcIj48L2Rpdj5cbiAgPHNwYW4gY2xhc3M9XCJhaWEtc3VnZ2VzdGlvbi1jb250ZW50XCI+XG4gICAgPHNwYW4gY2xhc3M9XCJhaWEtc3VnZ2VzdGlvbi10ZXh0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLmljb247IGVsc2Ugbm9JY29uXCJcbiAgICAgICAgPnt7IG9wdGlvbi5pY29uIH19IHt7IG9wdGlvbi50ZXh0IH19PC9uZy1jb250YWluZXJcbiAgICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JY29uPnt7IG9wdGlvbi50ZXh0IH19PC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJvcHRpb24udGFnXCIgY2xhc3M9XCJhaWEtc3VnZ2VzdGlvbi10YWdcIj57eyBvcHRpb24udGFnIH19PC9zcGFuPlxuICA8L3NwYW4+XG48L2Rpdj5cbiJdfQ==
|