@emuanalytics/flow-rdf-ui 4.1.3 → 4.1.5

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.
@@ -0,0 +1,623 @@
1
+ import { html, nothing } from 'lit';
2
+ import { FlowRdfFormControl } from '../../internal/flow-ui-rdf-element.mjs';
3
+ import { property, state, query } from 'lit/decorators.js';
4
+ import { FormControlController } from '../../internal/form.mjs';
5
+ import { debounce } from '@emuanalytics/flow-rdf-core/utils';
6
+ import { watch } from '../../internal/watch.mjs';
7
+ import { boolean } from '../../internal/boolean.mjs';
8
+ import { classMap } from 'lit-html/directives/class-map.js';
9
+ import { HasSlotController } from '../../internal/slot.mjs';
10
+ import { LocalizeController as LocalizeController$1 } from '../../internal/localize.mjs';
11
+ import { ifDefined } from 'lit-html/directives/if-defined.js';
12
+ import FlowUiIcon from '../icon/icon.component.mjs';
13
+ import FlowUiPopup from '../popup/popup.component.mjs';
14
+ import styles from './autocomplete.styles.mjs';
15
+ import { getAnimation, setDefaultAnimation } from '../../utilities/animation-registry.mjs';
16
+ import { stopAnimations, animateTo } from '../../internal/animate.mjs';
17
+ import { waitForEvent } from '../../internal/event.mjs';
18
+
19
+ var __defProp = Object.defineProperty;
20
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
21
+ var __decorateClass = (decorators, target, key, kind) => {
22
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
23
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
24
+ if (decorator = decorators[i])
25
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
26
+ if (kind && result)
27
+ __defProp(target, key, result);
28
+ return result;
29
+ };
30
+ class FlowUiAutocomplete extends FlowRdfFormControl {
31
+ constructor() {
32
+ super(...arguments);
33
+ this.hasSlotController = new HasSlotController(this, "help-text", "label");
34
+ this.localize = new LocalizeController$1(this);
35
+ /** @internal Last time when the mousedown event was fired */
36
+ this.mouseDownAt = 0;
37
+ this.pendingChangeEvent = false;
38
+ this.pendingInputEvent = false;
39
+ this.hasOptions = false;
40
+ this.formControlController = new FormControlController(this, {
41
+ assumeInteractionOn: ["flow-ui-blur", "flow-ui-input"]
42
+ });
43
+ this.size = "medium";
44
+ this.filled = false;
45
+ this.pill = false;
46
+ this.label = "";
47
+ this.helpText = "";
48
+ this.placeholder = "";
49
+ this.disabled = false;
50
+ this.required = false;
51
+ this.inline = false;
52
+ this.divider = false;
53
+ this.hoist = false;
54
+ this.placement = "bottom";
55
+ this.value = "";
56
+ this.displayWith = (value) => value;
57
+ this.debounceDelay = 0;
58
+ this.clearable = false;
59
+ this.inputText = "";
60
+ this.open = false;
61
+ this.selectedOption = null;
62
+ this.currentOption = null;
63
+ this.hasFocus = false;
64
+ /** @internal Handle mouse and keyboard events in the document, outside the control. */
65
+ this.handleDocumentEvent = (event) => {
66
+ const path = event.composedPath();
67
+ if (this && !path.includes(this) && this.hasFocus) {
68
+ this.blur();
69
+ }
70
+ };
71
+ }
72
+ connectedCallback() {
73
+ super.connectedCallback();
74
+ this.disabled = boolean(this.disabled, true);
75
+ this.filled = boolean(this.filled, true);
76
+ this.pill = boolean(this.pill, true);
77
+ this.required = boolean(this.required, true);
78
+ this.inline = boolean(this.inline, true);
79
+ this.divider = boolean(this.divider, true);
80
+ this.clearable = boolean(this.clearable, true);
81
+ }
82
+ /** Gets the associated form, if one exists. */
83
+ getForm() {
84
+ return this.formControlController.getForm();
85
+ }
86
+ /** Gets the validity state object.*/
87
+ get validity() {
88
+ return this.input.validity;
89
+ }
90
+ /** Gets the validation message. */
91
+ get validationMessage() {
92
+ return this.input.validationMessage;
93
+ }
94
+ /** Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid. */
95
+ checkValidity() {
96
+ return this.input.checkValidity();
97
+ }
98
+ /** Checks for validity and shows the browser's validation message if the control is invalid. */
99
+ reportValidity() {
100
+ return this.input.reportValidity();
101
+ }
102
+ /** Sets a custom validation message. Pass an empty string to restore validity. */
103
+ setCustomValidity(_) {
104
+ this.formControlController.updateValidity();
105
+ }
106
+ /** @internal Gets an array of all <flow-ui-option> elements */
107
+ getAllOptions() {
108
+ return [...this.querySelectorAll("flow-ui-option")];
109
+ }
110
+ /** @internal Gets the first <flow-ui-option> element */
111
+ getFirstOption() {
112
+ return this.querySelector("flow-ui-option");
113
+ }
114
+ /**
115
+ * @internal
116
+ * Un-highlights currently highlighted option
117
+ * and highlights the given option
118
+ */
119
+ setCurrentOption(option) {
120
+ if (this.currentOption) {
121
+ this.currentOption.current = false;
122
+ }
123
+ option.current = true;
124
+ option.focus();
125
+ this.currentOption = option;
126
+ }
127
+ /**
128
+ * @internal
129
+ * Unselects currently selected option
130
+ * and selects the given option
131
+ */
132
+ setSelectedOption(option) {
133
+ if (this.selectedOption) {
134
+ this.selectedOption.selected = false;
135
+ }
136
+ if (!option) {
137
+ this.selectedOption = null;
138
+ return;
139
+ }
140
+ option.selected = true;
141
+ this.selectedOption = option;
142
+ }
143
+ /**
144
+ * @internal
145
+ * Sets the value of the control.
146
+ * Should trigger {@link handleValueChange} when value is set.
147
+ * By default, it will emit a `flow-ui-change` event.
148
+ *
149
+ * @param value - The value to set.
150
+ * @param emitChangeEvent - A change event will be emitted if true.
151
+ */
152
+ setValue(value, options) {
153
+ this.pendingChangeEvent = options?.emitChangeEvent ?? false;
154
+ this.pendingInputEvent = options?.emitInputEvent ?? false;
155
+ this.value = value;
156
+ }
157
+ updateDebounceDelay() {
158
+ this.debouncedInput = debounce(
159
+ (inputText) => {
160
+ this.inputText = inputText;
161
+ this.emit("flow-ui-input");
162
+ },
163
+ this.debounceDelay,
164
+ { leading: false, trailing: true, context: this }
165
+ );
166
+ }
167
+ /** @internal Handle the `flow-ui-input` event from the input box. */
168
+ handleInput(event) {
169
+ event.stopPropagation();
170
+ this.debouncedInput(this.input.value);
171
+ }
172
+ /** @internal Handle the `flow-ui-change` event from the input box */
173
+ handleInputChange(event) {
174
+ event.stopPropagation();
175
+ }
176
+ /** @internal Handle `flow-ui-focus` event from the input box. */
177
+ handleInputFocus(event) {
178
+ event.stopPropagation();
179
+ this.focus();
180
+ }
181
+ /** @internal Handle `flow-ui-focus` event from the input box. */
182
+ handleInputBlur(event) {
183
+ event.stopPropagation();
184
+ }
185
+ handleClearClick(event) {
186
+ event.stopPropagation();
187
+ event.preventDefault();
188
+ }
189
+ /** @internal Handle the `mousedown` event from the clear button */
190
+ handleClearMouseDown(event) {
191
+ event.stopPropagation();
192
+ event.preventDefault();
193
+ this.setValue("", { emitInputEvent: true });
194
+ this.input.focus({ preventScroll: true });
195
+ }
196
+ /** @internal Handle option selection when an option is clicked on */
197
+ async handleListboxClick(event) {
198
+ if (Date.now() - this.mouseDownAt < 200) {
199
+ return;
200
+ }
201
+ const target = event.target;
202
+ const option = target.closest("flow-ui-option");
203
+ if (option && !option.disabled) {
204
+ this.setValue(option.value, { emitChangeEvent: true });
205
+ this.input.focus();
206
+ await waitForEvent(this, "flow-ui-change");
207
+ this.blur();
208
+ }
209
+ }
210
+ /** @internal */
211
+ async handleKeyDown(event) {
212
+ if (event.key === "Escape" && this.open) {
213
+ event.preventDefault();
214
+ event.stopPropagation();
215
+ this.hide();
216
+ this.input.focus({ preventScroll: true });
217
+ }
218
+ if (["ArrowUp", "ArrowDown"].includes(event.key) && this.open) {
219
+ const allOptions = this.getAllOptions();
220
+ const currentIndex = this.currentOption ? allOptions.indexOf(this.currentOption) : 0;
221
+ let newIndex = Math.max(0, currentIndex);
222
+ event.preventDefault();
223
+ if (!this.open) {
224
+ this.show();
225
+ if (this.currentOption) {
226
+ return;
227
+ }
228
+ }
229
+ switch (event.key) {
230
+ case "ArrowDown": {
231
+ newIndex = currentIndex + 1;
232
+ if (newIndex >= allOptions.length) {
233
+ newIndex = 0;
234
+ }
235
+ break;
236
+ }
237
+ case "ArrowUp": {
238
+ newIndex = currentIndex - 1;
239
+ if (newIndex < 0) {
240
+ newIndex = allOptions.length - 1;
241
+ }
242
+ break;
243
+ }
244
+ }
245
+ this.setCurrentOption(allOptions[newIndex]);
246
+ }
247
+ if (event.key === "Enter" && this.open) {
248
+ event.preventDefault();
249
+ event.stopPropagation();
250
+ if (this.currentOption) {
251
+ this.setSelectedOption(this.currentOption);
252
+ this.setValue(this.currentOption.value, { emitChangeEvent: true });
253
+ }
254
+ await waitForEvent(this, "flow-ui-change");
255
+ this.blur();
256
+ }
257
+ }
258
+ /** @internal Add event listeners to the document when the dropdown is opened. */
259
+ addListenersForDropdown() {
260
+ document.addEventListener("mousedown", this.handleDocumentEvent);
261
+ document.addEventListener("focusin", this.handleDocumentEvent);
262
+ document.addEventListener("keydown", this.handleDocumentEvent);
263
+ }
264
+ /** @internal Remove event listeners from the document when the dropdown is closed. */
265
+ removeListenersForDropdown() {
266
+ document.removeEventListener("mousedown", this.handleDocumentEvent);
267
+ document.removeEventListener("focusin", this.handleDocumentEvent);
268
+ document.addEventListener("keydown", this.handleDocumentEvent);
269
+ }
270
+ /** @internal Handles changes in the default slot */
271
+ handleDefaultSlotChange() {
272
+ const options = this.getAllOptions();
273
+ this.hasOptions = options.length > 0;
274
+ this.toggleListbox();
275
+ const firstOption = this.getFirstOption();
276
+ if (firstOption) {
277
+ this.setCurrentOption(firstOption);
278
+ }
279
+ this.setSelectedOption(null);
280
+ for (const option of options) {
281
+ if (option.value === this.value) {
282
+ this.setSelectedOption(option);
283
+ this.setCurrentOption(option);
284
+ break;
285
+ }
286
+ }
287
+ }
288
+ /** @internal Toggles listbox based on focus and options in the default slot. */
289
+ toggleListbox() {
290
+ if (this.hasFocus && this.hasOptions) {
291
+ this.show();
292
+ } else {
293
+ this.hide();
294
+ }
295
+ }
296
+ /**
297
+ * @internal
298
+ * Syncs the {@link displayValue} by applying {@link displayWith} based on the current {@link value}.
299
+ */
300
+ async syncDisplayValue() {
301
+ await this.updateComplete.then(async () => {
302
+ this.inputText = await Promise.resolve(this.displayWith(this.value)) ?? "";
303
+ });
304
+ }
305
+ async handleValueChange(oldValue, value) {
306
+ if (value !== oldValue) {
307
+ await this.syncDisplayValue();
308
+ const options = this.getAllOptions();
309
+ this.setSelectedOption(null);
310
+ for (const option of options) {
311
+ if (option.value === this.value) {
312
+ this.setSelectedOption(option);
313
+ this.setCurrentOption(option);
314
+ break;
315
+ }
316
+ }
317
+ this.updateComplete.then(() => {
318
+ this.pendingChangeEvent && this.emit("flow-ui-change");
319
+ this.pendingInputEvent && this.emit("flow-ui-input");
320
+ this.pendingChangeEvent = false;
321
+ this.pendingInputEvent = false;
322
+ });
323
+ }
324
+ }
325
+ /** Focuses on the control */
326
+ focus() {
327
+ if (!this.hasFocus) {
328
+ this.hasFocus = true;
329
+ this.input.focus({ preventScroll: true });
330
+ this.emit("flow-ui-focus");
331
+ this.toggleListbox();
332
+ this.addListenersForDropdown();
333
+ }
334
+ }
335
+ /** Blurs from the control. */
336
+ blur() {
337
+ if (this.hasFocus) {
338
+ this.input.blur();
339
+ this.hasFocus = false;
340
+ this.toggleListbox();
341
+ this.removeListenersForDropdown();
342
+ this.emit("flow-ui-blur");
343
+ }
344
+ }
345
+ /** Shows the listbox. */
346
+ async show() {
347
+ if (!this.open) {
348
+ this.emit("flow-ui-show");
349
+ await stopAnimations(this);
350
+ this.open = true;
351
+ const { keyframes, options } = getAnimation(this, "autocomplete.show", { dir: this.localize.dir() });
352
+ await animateTo(this.popup.popup, keyframes, options);
353
+ this.emit("flow-ui-after-show");
354
+ }
355
+ }
356
+ /** Hides the listbox. */
357
+ async hide() {
358
+ if (this.open) {
359
+ this.emit("flow-ui-hide");
360
+ await stopAnimations(this);
361
+ const { keyframes, options } = getAnimation(this, "autocomplete.hide", { dir: this.localize.dir() });
362
+ await animateTo(this.popup.popup, keyframes, options);
363
+ this.open = false;
364
+ this.emit("flow-ui-after-hide");
365
+ }
366
+ }
367
+ /** Gets the current value of the text input */
368
+ getInputText() {
369
+ return this.inputText;
370
+ }
371
+ /** @internal */
372
+ render() {
373
+ const hasLabelSlot = this.hasSlotController.test("label");
374
+ const hasHelpTextSlot = this.hasSlotController.test("help-text");
375
+ const hasLabel = !!this.label || !!hasLabelSlot;
376
+ const hasHelpText = !!this.helpText || !!hasHelpTextSlot;
377
+ const hasClearIcon = this.clearable && this.value.length > 0;
378
+ const isPlaceholderVisible = this.placeholder && this.inputText.length === 0;
379
+ const horizontalPlacement = this.inline ? "end" : "start";
380
+ const placement = `${this.placement}-${horizontalPlacement}`;
381
+ const strategy = this.inline || this.hoist ? "fixed" : "absolute";
382
+ const sync = this.inline ? void 0 : "width";
383
+ return html`
384
+ <div
385
+ part="form-control"
386
+ class=${classMap({
387
+ "form-control": true,
388
+ "form-control--small": this.size === "small",
389
+ "form-control--medium": this.size === "medium",
390
+ "form-control--large": this.size === "large",
391
+ "form-control--inline": this.inline,
392
+ "form-control--disabled": this.disabled,
393
+ "form-control--focused": this.hasFocus,
394
+ "form-control--has-label": hasLabel,
395
+ "form-control--has-help-text": hasHelpText,
396
+ "form-control--has-divider": this.divider,
397
+ "form-control--filled": this.filled,
398
+ "form-control--pill": this.pill
399
+ })}
400
+ >
401
+ <label
402
+ id="label"
403
+ part="label"
404
+ class="form-control__label"
405
+ aria-hidden=${hasLabel ? "false" : "true"}
406
+ >
407
+ <slot name="label">${this.label}</slot>
408
+ </label>
409
+
410
+ <div
411
+ part="help-text"
412
+ id="help-text"
413
+ class="form-control__help-text"
414
+ aria-hidden=${hasHelpText ? "false" : "true"}
415
+ >
416
+ <slot name="help-text">${this.helpText}</slot>
417
+ </div>
418
+
419
+ <div
420
+ part="control"
421
+ class="form-control__input"
422
+ >
423
+ <flow-ui-popup
424
+ class=${classMap({
425
+ autocomplete: true,
426
+ "autocomplete--standard": true,
427
+ "autocomplete--pill": this.pill,
428
+ "autocomplete--open": this.open,
429
+ "autocomplete--disabled": this.disabled,
430
+ "autocomplete--inline": this.inline,
431
+ "autocomplete--focused": this.hasFocus,
432
+ "autocomplete--placeholder-visible": isPlaceholderVisible,
433
+ "autocomplete--top": this.placement === "top",
434
+ "autocomplete--bottom": this.placement === "bottom",
435
+ "autocomplete--small": this.size === "small",
436
+ "autocomplete--medium": this.size === "medium",
437
+ "autocomplete--large": this.size === "large"
438
+ })}
439
+ ?active=${this.open}
440
+ placement=${ifDefined(placement)}
441
+ strategy=${ifDefined(strategy)}
442
+ sync=${ifDefined(sync)}
443
+ flip
444
+ shift
445
+ auto-size="vertical"
446
+ auto-size-padding="10"
447
+ @keydown=${this.handleKeyDown}
448
+ >
449
+ <div
450
+ part="combobox"
451
+ class="autocomplete__combobox"
452
+ slot="anchor"
453
+ @keydown=${this.handleDocumentEvent}
454
+ @mousedown=${this.handleDocumentEvent}
455
+ >
456
+ <slot part="prefix" name="prefix" class="autocomplete__prefix"></slot>
457
+
458
+ <div class="autocomplete__input-wrapper">
459
+ <input
460
+ part="display-input"
461
+ class="autocomplete__input"
462
+ type="text"
463
+ autocomplete="off"
464
+ spellcheck="false"
465
+ autocapitalize="off"
466
+ aria-controls="listbox"
467
+ aria-expanded=${this.open ? "true" : "false"}
468
+ aria-haspopup="listbox"
469
+ aria-labelledby="label"
470
+ aria-disabled=${this.disabled ? "true" : "false"}
471
+ aria-describedby="help-text"
472
+ role="combobox"
473
+ tabindex="0"
474
+ placeholder=${this.placeholder}
475
+ .value=${this.inputText}
476
+ ?disabled=${this.disabled}
477
+ @focus=${this.handleInputFocus}
478
+ @blur=${this.handleInputBlur}
479
+ @input=${this.handleInput}
480
+ @change=${this.handleInputChange}
481
+ />
482
+ <span class="autocomplete__input-sizer">${this.inputText || this.placeholder}</span>
483
+ </div>
484
+
485
+ ${hasClearIcon ? html`
486
+ <button
487
+ part="clear-button"
488
+ class="autocomplete__clear"
489
+ type="button"
490
+ aria-label=${this.localize.term("clearEntry")}
491
+ @mousedown=${this.handleClearMouseDown}
492
+ @click=${this.handleClearClick}
493
+ tabindex="-1"
494
+ >
495
+ <slot name="clear-icon">
496
+ <flow-ui-icon name="x-circle-fill" library="system"></flow-ui-icon>
497
+ </slot>
498
+ </button>
499
+ ` : nothing}
500
+
501
+ <slot part="suffix" name="suffix" class="autocomplete__suffix"></slot>
502
+ </div>
503
+
504
+ <div
505
+ id="listbox"
506
+ role="listbox"
507
+ part="listbox"
508
+ class="autocomplete__listbox"
509
+ aria-labelledby="label"
510
+ aria-expanded=${this.open ? "true" : "false"}
511
+ aria-multiselectable="false"
512
+ @mouseup=${this.handleListboxClick}
513
+ @slotchange=${this.handleDefaultSlotChange}
514
+ >
515
+ <slot></slot>
516
+ </div>
517
+ </flow-ui-popup>
518
+ </div>
519
+
520
+ ${this.divider ? this.renderDivider() : nothing}
521
+ </div>
522
+ `;
523
+ }
524
+ }
525
+ FlowUiAutocomplete.styles = styles;
526
+ FlowUiAutocomplete.dependencies = {
527
+ "flow-ui-popup": FlowUiPopup,
528
+ "flow-ui-icon": FlowUiIcon
529
+ };
530
+ __decorateClass([
531
+ property({ reflect: true })
532
+ ], FlowUiAutocomplete.prototype, "size", 2);
533
+ __decorateClass([
534
+ property({ type: Boolean, reflect: true })
535
+ ], FlowUiAutocomplete.prototype, "filled", 2);
536
+ __decorateClass([
537
+ property({ type: Boolean, reflect: true })
538
+ ], FlowUiAutocomplete.prototype, "pill", 2);
539
+ __decorateClass([
540
+ property()
541
+ ], FlowUiAutocomplete.prototype, "label", 2);
542
+ __decorateClass([
543
+ property({ attribute: "help-text" })
544
+ ], FlowUiAutocomplete.prototype, "helpText", 2);
545
+ __decorateClass([
546
+ property()
547
+ ], FlowUiAutocomplete.prototype, "placeholder", 2);
548
+ __decorateClass([
549
+ property({ type: Boolean, reflect: true })
550
+ ], FlowUiAutocomplete.prototype, "disabled", 2);
551
+ __decorateClass([
552
+ property()
553
+ ], FlowUiAutocomplete.prototype, "form", 2);
554
+ __decorateClass([
555
+ property({ type: Boolean, reflect: true })
556
+ ], FlowUiAutocomplete.prototype, "required", 2);
557
+ __decorateClass([
558
+ property({ type: Boolean, reflect: true })
559
+ ], FlowUiAutocomplete.prototype, "inline", 2);
560
+ __decorateClass([
561
+ property({ type: Boolean, reflect: true })
562
+ ], FlowUiAutocomplete.prototype, "divider", 2);
563
+ __decorateClass([
564
+ property({ type: Boolean })
565
+ ], FlowUiAutocomplete.prototype, "hoist", 2);
566
+ __decorateClass([
567
+ property({ reflect: true })
568
+ ], FlowUiAutocomplete.prototype, "placement", 2);
569
+ __decorateClass([
570
+ property()
571
+ ], FlowUiAutocomplete.prototype, "value", 2);
572
+ __decorateClass([
573
+ property()
574
+ ], FlowUiAutocomplete.prototype, "displayWith", 2);
575
+ __decorateClass([
576
+ property({ reflect: true, attribute: "debounce-delay", type: Number })
577
+ ], FlowUiAutocomplete.prototype, "debounceDelay", 2);
578
+ __decorateClass([
579
+ property({ type: Boolean, reflect: true })
580
+ ], FlowUiAutocomplete.prototype, "clearable", 2);
581
+ __decorateClass([
582
+ state()
583
+ ], FlowUiAutocomplete.prototype, "inputText", 2);
584
+ __decorateClass([
585
+ state()
586
+ ], FlowUiAutocomplete.prototype, "open", 2);
587
+ __decorateClass([
588
+ state()
589
+ ], FlowUiAutocomplete.prototype, "selectedOption", 2);
590
+ __decorateClass([
591
+ state()
592
+ ], FlowUiAutocomplete.prototype, "currentOption", 2);
593
+ __decorateClass([
594
+ state()
595
+ ], FlowUiAutocomplete.prototype, "hasFocus", 2);
596
+ __decorateClass([
597
+ query(".autocomplete__input")
598
+ ], FlowUiAutocomplete.prototype, "input", 2);
599
+ __decorateClass([
600
+ query(".autocomplete")
601
+ ], FlowUiAutocomplete.prototype, "popup", 2);
602
+ __decorateClass([
603
+ watch("debounceDelay")
604
+ ], FlowUiAutocomplete.prototype, "updateDebounceDelay", 1);
605
+ __decorateClass([
606
+ watch("value")
607
+ ], FlowUiAutocomplete.prototype, "handleValueChange", 1);
608
+ setDefaultAnimation("autocomplete.show", {
609
+ keyframes: [
610
+ { opacity: 0, scale: 0.9 },
611
+ { opacity: 1, scale: 1 }
612
+ ],
613
+ options: { duration: 100, easing: "ease" }
614
+ });
615
+ setDefaultAnimation("autocomplete.hide", {
616
+ keyframes: [
617
+ { opacity: 1, scale: 1 },
618
+ { opacity: 0, scale: 0.9 }
619
+ ],
620
+ options: { duration: 100, easing: "ease" }
621
+ });
622
+
623
+ export { FlowUiAutocomplete as default };
@@ -0,0 +1,5 @@
1
+ import FlowUiAutocomplete from './autocomplete.component.mjs';
2
+
3
+
4
+
5
+ export { FlowUiAutocomplete as default };