@mhmo91/schmancy 0.4.51 → 0.4.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/autocomplete-CkycjWy4.js +267 -0
  2. package/dist/autocomplete-CkycjWy4.js.map +1 -0
  3. package/dist/autocomplete-CrhgxhFI.cjs +73 -0
  4. package/dist/autocomplete-CrhgxhFI.cjs.map +1 -0
  5. package/dist/autocomplete.cjs +1 -1
  6. package/dist/autocomplete.js +1 -1
  7. package/dist/{avatar-DUhxMuv0.js → avatar-BXx1oJMG.js} +7 -7
  8. package/dist/{avatar-DUhxMuv0.js.map → avatar-BXx1oJMG.js.map} +1 -1
  9. package/dist/{avatar-QK4twwTM.cjs → avatar-nwqyt3uc.cjs} +2 -2
  10. package/dist/{avatar-QK4twwTM.cjs.map → avatar-nwqyt3uc.cjs.map} +1 -1
  11. package/dist/badge.cjs +1 -1
  12. package/dist/badge.js +1 -1
  13. package/dist/{checkbox-BSYgpRsc.js → checkbox-c3DzDvWH.js} +5 -5
  14. package/dist/{checkbox-BSYgpRsc.js.map → checkbox-c3DzDvWH.js.map} +1 -1
  15. package/dist/checkbox.js +1 -1
  16. package/dist/content-drawer.cjs +1 -1
  17. package/dist/content-drawer.js +1 -1
  18. package/dist/{delay-D415_oVH.js → delay-DtVBjjLV.js} +11 -11
  19. package/dist/{delay-D415_oVH.js.map → delay-DtVBjjLV.js.map} +1 -1
  20. package/dist/delay.js +1 -1
  21. package/dist/{dropdown-content-DOnGrBxV.js → dropdown-content-DNJhJCdV.js} +4 -4
  22. package/dist/{dropdown-content-DOnGrBxV.js.map → dropdown-content-DNJhJCdV.js.map} +1 -1
  23. package/dist/dropdown.js +1 -1
  24. package/dist/index.cjs +1 -1
  25. package/dist/index.js +46 -42
  26. package/dist/index.js.map +1 -1
  27. package/dist/nav-drawer.cjs +1 -1
  28. package/dist/nav-drawer.js +1 -1
  29. package/dist/number-B7aCRYnH.cjs +2 -0
  30. package/dist/number-B7aCRYnH.cjs.map +1 -0
  31. package/dist/number-BhTiptLA.js +99 -0
  32. package/dist/number-BhTiptLA.js.map +1 -0
  33. package/dist/search-6Hr7K1gh.js +53 -0
  34. package/dist/search-6Hr7K1gh.js.map +1 -0
  35. package/dist/search-DWW8IoOp.cjs +2 -0
  36. package/dist/search-DWW8IoOp.cjs.map +1 -0
  37. package/dist/{tabs-compatibility-DsOH4PSw.js → tabs-compatibility-BEXurIiZ.js} +6 -6
  38. package/dist/{tabs-compatibility-DsOH4PSw.js.map → tabs-compatibility-BEXurIiZ.js.map} +1 -1
  39. package/dist/tabs.js +1 -1
  40. package/dist/teleport.cjs +1 -1
  41. package/dist/teleport.js +1 -1
  42. package/dist/{typewriter-CnloNIdN.js → typewriter-CXadCi-4.js} +7 -7
  43. package/dist/{typewriter-CnloNIdN.js.map → typewriter-CXadCi-4.js.map} +1 -1
  44. package/dist/{typewriter-DwLZUKKQ.cjs → typewriter-Fq4uV6Gm.cjs} +2 -2
  45. package/dist/{typewriter-DwLZUKKQ.cjs.map → typewriter-Fq4uV6Gm.cjs.map} +1 -1
  46. package/dist/typewriter.cjs +1 -1
  47. package/dist/typewriter.js +1 -1
  48. package/dist/utils.cjs +1 -1
  49. package/dist/utils.js +6 -2
  50. package/dist/utils.js.map +1 -1
  51. package/package.json +1 -1
  52. package/types/src/index.d.ts +0 -1
  53. package/types/src/utils/index.d.ts +2 -0
  54. package/types/src/utils/number.d.ts +105 -0
  55. package/dist/autocomplete-CHObbMzK.js +0 -315
  56. package/dist/autocomplete-CHObbMzK.js.map +0 -1
  57. package/dist/autocomplete-PHnzqAII.cjs +0 -73
  58. package/dist/autocomplete-PHnzqAII.cjs.map +0 -1
@@ -0,0 +1,267 @@
1
+ import { BehaviorSubject as f, Subject as k, fromEvent as y, combineLatest as C, timer as _, of as R, EMPTY as O, merge as q } from "rxjs";
2
+ import { classMap as T } from "lit/directives/class-map.js";
3
+ import "lit/directives/style-map.js";
4
+ import { $ as j } from "./litElement.mixin-BH9PTyUD.js";
5
+ import "./tailwind.mixin-CaIkmP6j.js";
6
+ import { property as c, state as x, query as A, queryAssignedElements as L, customElement as M } from "lit/decorators.js";
7
+ import { html as w } from "lit";
8
+ import { createRef as I, ref as P } from "lit/directives/ref.js";
9
+ import { tap as a, takeUntil as d, distinctUntilChanged as S, debounceTime as N, withLatestFrom as v, take as b, filter as m, switchMap as g, startWith as z, map as E } from "rxjs/operators";
10
+ import { s as V } from "./search-6Hr7K1gh.js";
11
+ var H = Object.defineProperty, B = Object.getOwnPropertyDescriptor, u = (e, t, s, n) => {
12
+ for (var i, l = n > 1 ? void 0 : n ? B(t, s) : t, p = e.length - 1; p >= 0; p--) (i = e[p]) && (l = (n ? i(t, s, l) : i(l)) || l);
13
+ return n && l && H(t, s, l), l;
14
+ };
15
+ let o = class extends j(":host{display:block;border:unset!important;line-height:unset!important;background:unset!important;padding:unset!important;font-size:unset!important;box-shadow:unset!important}:host:focus{box-shadow:unset!important}") {
16
+ constructor() {
17
+ super(...arguments), this.required = !1, this.placeholder = "", this.label = "", this.name = "", this.maxHeight = "300px", this.multi = !1, this.description = "", this.size = "md", this.autocomplete = "on", this.debounceMs = 200, this.similarityThreshold = 0.3, this._open = !1, this._inputValue = "", this._visibleOptionsCount = 0, this._hasResults = !0, this._inputElementRef = I(), this._selectedValue$ = new f(""), this._selectedValues$ = new f([]), this._inputValue$ = new f(""), this._open$ = new f(!1), this._options$ = new f([]), this._optionSelect$ = new k(), this._documentClick$ = new k(), this._checkAutofill$ = new k();
18
+ }
19
+ get values() {
20
+ return [...this._selectedValues$.value];
21
+ }
22
+ set values(e) {
23
+ this._selectedValues$.next(Array.isArray(e) ? [...e] : []);
24
+ }
25
+ get value() {
26
+ return this.multi ? this._selectedValues$.value.join(",") : this._selectedValue$.value;
27
+ }
28
+ set value(e) {
29
+ this.multi ? this._selectedValues$.next(e ? e.split(",").map((t) => t.trim()).filter(Boolean) : []) : this._selectedValue$.next(e);
30
+ }
31
+ connectedCallback() {
32
+ super.connectedCallback(), this.id || (this.id = `sch-autocomplete-${Math.random().toString(36).slice(2, 9)}`), this._setupAutocompleteLogic(), this._setupDocumentClickHandler(), this._setupAutofillDetection();
33
+ }
34
+ _setupAutocompleteLogic() {
35
+ this._options$.pipe(a((e) => {
36
+ e.forEach((t, s) => {
37
+ t.setAttribute("role", "option"), t.tabIndex = -1, t.id || (t.id = `${this.id}-option-${s}`), t.hasAttribute("data-event-bound") || (y(t, "click").pipe(a((n) => n.stopPropagation()), d(this.disconnecting)).subscribe(() => this._optionSelect$.next(t)), t.setAttribute("data-event-bound", "true"));
38
+ });
39
+ }), d(this.disconnecting)).subscribe(), C([this._selectedValue$, this._selectedValues$, this._options$]).pipe(a(([e, t, s]) => {
40
+ s.forEach((n) => {
41
+ n.selected = this.multi ? t.includes(n.value) : n.value === e, n.setAttribute("aria-selected", String(n.selected));
42
+ });
43
+ }), d(this.disconnecting)).subscribe(), this._inputValue$.pipe(S(), N(this.debounceMs), v(this._options$, this._open$), a(([e, t, s]) => {
44
+ if (!s) return;
45
+ const n = e.trim();
46
+ if (n) {
47
+ const i = t.map((p) => {
48
+ const r = p.label || p.textContent || "", h = p.value, $ = V(n, r), D = V(n, h);
49
+ return { option: p, score: Math.max(1.1 * $, D) };
50
+ });
51
+ i.sort((p, r) => r.score - p.score);
52
+ let l = 0;
53
+ i.forEach((p, r) => {
54
+ const { option: h, score: $ } = p;
55
+ $ < this.similarityThreshold ? h.hidden = !0 : (h.hidden = !1, l++, h.style.order = String(r));
56
+ }), this._visibleOptionsCount = l, this._hasResults = l > 0;
57
+ } else t.forEach((i) => {
58
+ i.hidden = !1, i.style.order = "0";
59
+ }), this._visibleOptionsCount = t.length, this._hasResults = !0;
60
+ this._announceToScreenReader(this._visibleOptionsCount > 0 ? `${this._visibleOptionsCount} option${this._visibleOptionsCount === 1 ? "" : "s"} available.` : "No results found.");
61
+ }), d(this.disconnecting)).subscribe(), this._optionSelect$.pipe(v(this._selectedValue$, this._selectedValues$), a(([e, t, s]) => {
62
+ if (this.multi) {
63
+ const n = s.indexOf(e.value), i = n > -1 ? [...s.slice(0, n), ...s.slice(n + 1)] : [...s, e.value];
64
+ this._selectedValues$.next(i), this._inputValue$.next(""), this._inputValue = "";
65
+ const l = this._getSelectedLabels();
66
+ this._announceToScreenReader(l.length > 0 ? `Selected: ${l.join(", ")}` : "No options selected");
67
+ } else this._selectedValue$.next(e.value), this._open$.next(!1), this._open = !1, this._inputValue = e.label || e.textContent || "", this._inputValue$.next(this._inputValue), _(100).pipe(a(() => this._inputElementRef.value?.blur()), b(1)).subscribe(), this._announceToScreenReader(`Selected: ${e.label || e.textContent}`);
68
+ }), a(() => this._fireChangeEvent()), d(this.disconnecting)).subscribe(), C([this._open$, this._selectedValue$, this._selectedValues$, this._options$]).pipe(m(() => !this._open$.value), a(([, e, t, s]) => {
69
+ if (this.multi) {
70
+ const n = s.filter((i) => t.includes(i.value)).map((i) => i.label || i.textContent || "");
71
+ this._inputValue = n.join(", ");
72
+ } else {
73
+ const n = s.find((i) => i.value === e);
74
+ this._inputValue = n && (n.label || n.textContent) || "";
75
+ }
76
+ this._inputValue$.next(this._inputValue);
77
+ }), d(this.disconnecting)).subscribe(), this._open$.pipe(a((e) => this._open = e), d(this.disconnecting)).subscribe();
78
+ }
79
+ _setupDocumentClickHandler() {
80
+ this._documentClick$.pipe(m((e) => !e.composedPath().includes(this)), m((e) => !this._options.some((t) => e.composedPath().includes(t))), m(() => this._open), a(() => {
81
+ this._open$.next(!1), this._updateInputDisplay();
82
+ }), d(this.disconnecting)).subscribe(), this._open$.pipe(S(), g((e) => e ? _(10).pipe(a(() => document.addEventListener("click", (t) => this._documentClick$.next(t))), g(() => O)) : R(null).pipe(a(() => document.removeEventListener("click", (t) => this._documentClick$.next(t))))), d(this.disconnecting)).subscribe();
83
+ }
84
+ _setupAutofillDetection() {
85
+ q(_(100, 500).pipe(b(10)), this._checkAutofill$, _(100).pipe(g(() => y(window, "load").pipe(z(null))))).pipe(E(() => {
86
+ const e = this._inputElementRef.value;
87
+ return e ? e.shadowRoot?.querySelector("input") || e.querySelector("input") || e._inputRef?.value : null;
88
+ }), m((e) => !!e), E((e) => e.value), m((e) => !!e && e.trim().length > 0), S(), v(this._options$), a(([e, t]) => {
89
+ let s = null, n = 0;
90
+ if (t.forEach((i) => {
91
+ const l = i.label || i.textContent || "", p = i.value, r = V(e, l), h = V(e, p), $ = Math.max(r, h);
92
+ $ > n && $ >= this.similarityThreshold && (n = $, s = i);
93
+ }), s) {
94
+ this.multi ? this._selectedValues$.next([s.value]) : this._selectedValue$.next(s.value);
95
+ const i = s.label || s.textContent || "";
96
+ this._inputValue = i, this._inputValue$.next(i);
97
+ const l = this._inputElementRef.value;
98
+ l && (l.value = i), this._open$.next(!1), this._fireChangeEvent(), this._announceToScreenReader(`Autofilled: ${i}`);
99
+ }
100
+ }), d(this.disconnecting)).subscribe(), _(100).pipe(E(() => {
101
+ const e = this._inputElementRef.value;
102
+ return e ? e.shadowRoot?.querySelector("input") || e.querySelector("input") || e._inputRef?.value : null;
103
+ }), m((e) => !!e), g((e) => y(e, "animationstart").pipe(m((t) => t.animationName === "onAutoFillStart"), a(() => {
104
+ _(100).pipe(a(() => this._checkAutofill$.next()), b(1)).subscribe();
105
+ }))), d(this.disconnecting)).subscribe();
106
+ }
107
+ _updateInputDisplay() {
108
+ R(null).pipe(v(this._selectedValue$, this._selectedValues$, this._options$, this._open$), a(([, e, t, s, n]) => {
109
+ if (this._inputElementRef.value && (!n || !this.multi)) {
110
+ if (this.multi) {
111
+ const i = s.filter((l) => t.includes(l.value)).map((l) => l.label || l.textContent || "");
112
+ this._inputValue = i.join(", ");
113
+ } else {
114
+ const i = s.find((l) => l.value === e);
115
+ this._inputValue = i && (i.label || i.textContent) || "";
116
+ }
117
+ this._inputValue$.next(this._inputValue), this._inputElementRef.value.value = this._inputValue;
118
+ }
119
+ }), b(1)).subscribe();
120
+ }
121
+ _getSelectedLabels() {
122
+ return this._options.filter((e) => this.multi ? this._selectedValues$.value.includes(e.value) : e.value === this._selectedValue$.value).map((e) => e.label || e.textContent || "");
123
+ }
124
+ _announceToScreenReader(e) {
125
+ const t = this.shadowRoot?.querySelector("#live-status");
126
+ t && (t.textContent = e);
127
+ }
128
+ _fireChangeEvent() {
129
+ const e = { value: this.value };
130
+ this.multi && (e.values = [...this._selectedValues$.value]), this.dispatchEvent(new CustomEvent("change", { detail: e, bubbles: !0, composed: !0 }));
131
+ }
132
+ checkValidity() {
133
+ return !this.required || (this.multi ? this._selectedValues$.value.length > 0 : !!this._selectedValue$.value);
134
+ }
135
+ reportValidity() {
136
+ return this._inputElementRef.value ? this._inputElementRef.value.reportValidity() : this.checkValidity();
137
+ }
138
+ firstUpdated() {
139
+ _(200).pipe(a(() => this._checkAutofill$.next()), b(1)).subscribe(), this._options$.pipe(m((e) => e.length > 0), a(() => this._checkAutofill$.next()), d(this.disconnecting)).subscribe();
140
+ }
141
+ render() {
142
+ const e = `${this.id}-desc`;
143
+ return w`
144
+ <div class="relative">
145
+ <!-- Screen reader live region -->
146
+ <div id="live-status" role="status" aria-live="polite" class="sr-only"></div>
147
+
148
+ <!-- Description -->
149
+ ${this.description ? w`<div id="${e}" class="sr-only">${this.description}</div>` : ""}
150
+
151
+ <!-- Input -->
152
+ <slot name="trigger">
153
+ <schmancy-input
154
+ .size=${this.size}
155
+ ${P(this._inputElementRef)}
156
+ id="autocomplete-input"
157
+ class="w-full"
158
+ .name=${this.name || this.label?.toLowerCase().replace(/\s+/g, "-")}
159
+ .label=${this.label}
160
+ .placeholder=${this.placeholder}
161
+ .required=${this.required}
162
+ .value=${this._inputValue}
163
+ type="text"
164
+ autocomplete=${this.autocomplete}
165
+ clickable
166
+ role="combobox"
167
+ aria-autocomplete="list"
168
+ aria-haspopup="listbox"
169
+ aria-controls="options"
170
+ aria-expanded=${this._open}
171
+ aria-describedby=${this.description ? e : void 0}
172
+ @input=${(t) => {
173
+ const s = t.target.value;
174
+ this._inputValue = s, this._inputValue$.next(s);
175
+ }}
176
+ @focus=${(t) => {
177
+ t.stopPropagation();
178
+ const s = this.multi ? this._selectedValues$.value.length > 0 : !!this._selectedValue$.value;
179
+ this.multi && !s && (this._inputValue = "", this._inputValue$.next(""), this._inputElementRef.value && (this._inputElementRef.value.value = "")), this._open$.next(!0);
180
+ }}
181
+ @click=${(t) => {
182
+ t.stopPropagation(), this._open$.next(!0);
183
+ }}
184
+ @keydown=${(t) => {
185
+ this._handleKeyDown(t);
186
+ }}
187
+ >
188
+ </schmancy-input>
189
+ </slot>
190
+
191
+ <!-- Options dropdown -->
192
+ <ul
193
+ id="options"
194
+ class=${T({ absolute: !0, "z-[1000]": !0, "mt-1": !0, "w-full": !0, "rounded-md": !0, "shadow-md": !0, "overflow-auto": !0, "min-w-full": !0, "bg-surface-low": !0, flex: !0, "flex-col": !0 })}
195
+ role="listbox"
196
+ aria-multiselectable=${this.multi ? "true" : "false"}
197
+ aria-label=${`${this.label || "Options"} dropdown`}
198
+ ?hidden=${!this._open}
199
+ style="max-height: ${this.maxHeight}; display: ${this._open ? "flex" : "none"};"
200
+ @slotchange=${() => {
201
+ this._options$.next(this._options), _(100).pipe(a(() => this._checkAutofill$.next()), b(1)).subscribe();
202
+ }}
203
+ >
204
+ <slot></slot>
205
+ ${this._hasResults ? "" : w`
206
+ <li class="px-3 py-2 text-sm text-muted">No results found</li>
207
+ `}
208
+ </ul>
209
+ </div>
210
+
211
+ <style>
212
+ :host {
213
+ display: block;
214
+ }
215
+
216
+ @keyframes onAutoFillStart {
217
+ from {/**/}
218
+ to {/**/}
219
+ }
220
+
221
+ sch-input::part(input):-webkit-autofill,
222
+ sch-input input:-webkit-autofill {
223
+ animation-name: onAutoFillStart;
224
+ animation-duration: 1ms;
225
+ }
226
+ </style>
227
+ `;
228
+ }
229
+ _handleKeyDown(e) {
230
+ y(document, "keydown").pipe(b(1), v(this._open$, this._options$), a(([t, s, n]) => {
231
+ if (!s && (t.key === "ArrowDown" || t.key === "Enter")) return t.preventDefault(), this._open$.next(!0), void _(10).pipe(a(() => {
232
+ n.find((h) => !h.hidden)?.focus();
233
+ }), b(1)).subscribe();
234
+ if (!s) return;
235
+ const i = n.filter((r) => !r.hidden).sort((r, h) => parseInt(r.style.order || "0") - parseInt(h.style.order || "0")), l = i.find((r) => r === document.activeElement), p = l ? i.indexOf(l) : -1;
236
+ switch (t.key) {
237
+ case "Escape":
238
+ t.preventDefault(), this._open$.next(!1), this._updateInputDisplay(), this._inputElementRef.value?.focus();
239
+ break;
240
+ case "Tab":
241
+ this._open$.next(!1), this._updateInputDisplay();
242
+ break;
243
+ case "ArrowDown":
244
+ t.preventDefault();
245
+ const r = p < i.length - 1 ? p + 1 : 0;
246
+ i[r]?.focus();
247
+ break;
248
+ case "ArrowUp":
249
+ t.preventDefault();
250
+ const h = p > 0 ? p - 1 : i.length - 1;
251
+ i[h]?.focus();
252
+ break;
253
+ case "Home":
254
+ t.preventDefault(), i[0]?.focus();
255
+ break;
256
+ case "End":
257
+ t.preventDefault(), i[i.length - 1]?.focus();
258
+ break;
259
+ case "Enter":
260
+ case " ":
261
+ l && (t.preventDefault(), this._optionSelect$.next(l));
262
+ }
263
+ })).subscribe();
264
+ }
265
+ };
266
+ u([c({ type: Boolean })], o.prototype, "required", 2), u([c({ type: String })], o.prototype, "placeholder", 2), u([c({ type: String, reflect: !0 })], o.prototype, "label", 2), u([c({ type: String })], o.prototype, "name", 2), u([c({ type: String })], o.prototype, "maxHeight", 2), u([c({ type: Boolean })], o.prototype, "multi", 2), u([c({ type: String })], o.prototype, "description", 2), u([c({ type: String, reflect: !0 })], o.prototype, "size", 2), u([c({ type: String })], o.prototype, "autocomplete", 2), u([c({ type: Number })], o.prototype, "debounceMs", 2), u([c({ type: Number })], o.prototype, "similarityThreshold", 2), u([c({ type: Array })], o.prototype, "values", 1), u([c({ type: String, reflect: !0 })], o.prototype, "value", 1), u([x()], o.prototype, "_open", 2), u([x()], o.prototype, "_inputValue", 2), u([x()], o.prototype, "_visibleOptionsCount", 2), u([x()], o.prototype, "_hasResults", 2), u([A("#options")], o.prototype, "_listbox", 2), u([A("sch-input")], o.prototype, "_input", 2), u([L({ flatten: !0 })], o.prototype, "_options", 2), o = u([M("schmancy-autocomplete")], o);
267
+ //# sourceMappingURL=autocomplete-CkycjWy4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete-CkycjWy4.js","sources":["../src/autocomplete/autocomplete.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { InputSize, SchmancyInput } from '@schmancy/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n fromEvent,\n merge,\n of,\n Subject,\n timer\n} from 'rxjs'\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\n// Import the similarity function (or include it inline)\nimport { similarity } from '../utils/search'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n value: string | string[]\n values?: string[]\n}>\n\ninterface FilteredOption {\n option: SchmancyOption\n score: number\n}\n\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends $LitElement(style) {\n // Public API properties\n @property({ type: Boolean }) required = false\n @property({ type: String }) placeholder = ''\n @property({ type: String, reflect: true }) label = ''\n @property({ type: String }) name = ''\n @property({ type: String }) maxHeight = '300px'\n @property({ type: Boolean }) multi = false\n @property({ type: String }) description = ''\n @property({ type: String, reflect: true }) size: InputSize = 'md'\n @property({ type: String }) autocomplete = 'on'\n @property({ type: Number }) debounceMs = 200\n @property({ type: Number }) similarityThreshold = 0.3 // Minimum similarity score to show option\n\n // Values property for multi-select mode\n @property({ type: Array })\n get values() {\n return [...this._selectedValues$.value]\n }\n set values(vals: string[]) {\n this._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n }\n\n // Value property\n @property({ type: String, reflect: true })\n get value() {\n return this.multi \n ? this._selectedValues$.value.join(',')\n : this._selectedValue$.value\n }\n set value(val: string) {\n if (this.multi) {\n this._selectedValues$.next(\n val ? val.split(',').map(v => v.trim()).filter(Boolean) : []\n )\n } else {\n this._selectedValue$.next(val)\n }\n }\n\n // State\n @state() private _open = false\n @state() private _inputValue = ''\n @state() private _visibleOptionsCount = 0\n @state() private _hasResults = true\n\n // DOM references\n @query('#options') _listbox!: HTMLUListElement\n @query('sch-input') _input!: SchmancyInput\n @queryAssignedElements({ flatten: true }) private _options!: SchmancyOption[]\n private _inputElementRef = createRef<HTMLInputElement>()\n\n // RxJS Subjects\n private _selectedValue$ = new BehaviorSubject<string>('')\n private _selectedValues$ = new BehaviorSubject<string[]>([])\n private _inputValue$ = new BehaviorSubject<string>('')\n private _open$ = new BehaviorSubject<boolean>(false)\n private _options$ = new BehaviorSubject<SchmancyOption[]>([])\n private _optionSelect$ = new Subject<SchmancyOption>()\n private _documentClick$ = new Subject<MouseEvent>()\n private _checkAutofill$ = new Subject<void>()\n\n connectedCallback() {\n super.connectedCallback()\n \n if (!this.id) {\n this.id = `sch-autocomplete-${Math.random().toString(36).slice(2, 9)}`\n }\n\n this._setupAutocompleteLogic()\n this._setupDocumentClickHandler()\n this._setupAutofillDetection()\n }\n\n private _setupAutocompleteLogic() {\n // Options management pipeline\n this._options$.pipe(\n tap(options => {\n options.forEach((option, index) => {\n option.setAttribute('role', 'option')\n option.tabIndex = -1\n if (!option.id) {\n option.id = `${this.id}-option-${index}`\n }\n if (!option.hasAttribute('data-event-bound')) {\n fromEvent(option, 'click').pipe(\n tap(e => e.stopPropagation()),\n takeUntil(this.disconnecting)\n ).subscribe(() => this._optionSelect$.next(option))\n option.setAttribute('data-event-bound', 'true')\n }\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Selection sync pipeline\n combineLatest([\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n tap(([selectedValue, selectedValues, options]) => {\n options.forEach(option => {\n option.selected = this.multi \n ? selectedValues.includes(option.value)\n : option.value === selectedValue\n option.setAttribute('aria-selected', String(option.selected))\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Enhanced fuzzy filtering pipeline\n this._inputValue$.pipe(\n distinctUntilChanged(),\n debounceTime(this.debounceMs),\n withLatestFrom(this._options$, this._open$),\n tap(([searchTerm, options, isOpen]) => {\n if (!isOpen) return\n\n const term = searchTerm.trim()\n \n if (!term) {\n // Show all options if no search term\n options.forEach(option => {\n option.hidden = false\n option.style.order = '0' // Reset order\n })\n this._visibleOptionsCount = options.length\n this._hasResults = true\n } else {\n // Calculate similarity scores for all options\n const scoredOptions: FilteredOption[] = options.map(option => {\n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(term, optionLabel)\n const valueScore = similarity(term, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n return { option, score }\n })\n \n // Sort by score (highest first)\n scoredOptions.sort((a, b) => b.score - a.score)\n \n // Apply visibility and ordering\n let visibleCount = 0\n scoredOptions.forEach((item, index) => {\n const { option, score } = item\n \n // Hide options below threshold\n if (score < this.similarityThreshold) {\n option.hidden = true\n } else {\n option.hidden = false\n visibleCount++\n // Use CSS order to sort visible options by relevance\n option.style.order = String(index)\n }\n })\n \n this._visibleOptionsCount = visibleCount\n this._hasResults = visibleCount > 0\n }\n \n this._announceToScreenReader(\n this._visibleOptionsCount > 0 \n ? `${this._visibleOptionsCount} option${this._visibleOptionsCount === 1 ? '' : 's'} available.`\n : 'No results found.'\n )\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Option selection pipeline\n this._optionSelect$.pipe(\n withLatestFrom(this._selectedValue$, this._selectedValues$),\n tap(([option, _, currentValues]) => {\n if (this.multi) {\n const index = currentValues.indexOf(option.value)\n const newValues = index > -1\n ? [...currentValues.slice(0, index), ...currentValues.slice(index + 1)]\n : [...currentValues, option.value]\n this._selectedValues$.next(newValues)\n \n this._inputValue$.next('')\n this._inputValue = ''\n \n const labels = this._getSelectedLabels()\n this._announceToScreenReader(\n labels.length > 0 \n ? `Selected: ${labels.join(', ')}`\n : 'No options selected'\n )\n } else {\n this._selectedValue$.next(option.value)\n this._open$.next(false)\n this._open = false\n \n this._inputValue = option.label || option.textContent || ''\n this._inputValue$.next(this._inputValue)\n \n timer(100).pipe(\n tap(() => this._inputElementRef.value?.blur()),\n take(1)\n ).subscribe()\n \n this._announceToScreenReader(`Selected: ${option.label || option.textContent}`)\n }\n }),\n tap(() => this._fireChangeEvent()),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Display update pipeline\n combineLatest([\n this._open$,\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n filter(() => !this._open$.value),\n tap(([, selectedValue, selectedValues, options]) => {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Open state sync\n this._open$.pipe(\n tap(open => this._open = open),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupDocumentClickHandler() {\n this._documentClick$.pipe(\n filter(e => !e.composedPath().includes(this)),\n filter(e => !this._options.some(opt => e.composedPath().includes(opt))),\n filter(() => this._open),\n tap(() => {\n this._open$.next(false)\n this._updateInputDisplay()\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n this._open$.pipe(\n distinctUntilChanged(),\n switchMap(open => \n open \n ? timer(10).pipe(\n tap(() => document.addEventListener('click', e => this._documentClick$.next(e))),\n switchMap(() => EMPTY)\n )\n : of(null).pipe(\n tap(() => document.removeEventListener('click', e => this._documentClick$.next(e)))\n )\n ),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupAutofillDetection() {\n // Enhanced autofill detection with fuzzy matching\n merge(\n timer(100, 500).pipe(take(10)),\n this._checkAutofill$,\n timer(100).pipe(\n switchMap(() => \n fromEvent(window, 'load').pipe(startWith(null))\n )\n )\n ).pipe(\n map(() => {\n const schInput = this._inputElementRef.value\n if (!schInput) return null\n return schInput.shadowRoot?.querySelector('input') || \n schInput.querySelector('input') ||\n (schInput as any)._inputRef?.value\n }),\n filter(input => !!input),\n map(input => (input as HTMLInputElement).value),\n filter(value => !!value && value.trim().length > 0),\n distinctUntilChanged(),\n withLatestFrom(this._options$),\n tap(([autofilledValue, options]) => {\n console.log('Autofill detected:', autofilledValue)\n \n // Use fuzzy matching to find best matching option\n let bestMatch: SchmancyOption | null = null\n let bestScore = 0\n \n options.forEach(option => {\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores\n const labelScore = similarity(autofilledValue, optionLabel)\n const valueScore = similarity(autofilledValue, optionValue)\n \n // Use the higher score\n const score = Math.max(labelScore, valueScore)\n \n // Keep track of best match\n if (score > bestScore && score >= this.similarityThreshold) {\n bestScore = score\n bestMatch = option\n }\n })\n\n if (bestMatch) {\n console.log('Found matching option:', bestMatch.value, 'with score:', bestScore)\n \n // Select the option\n if (this.multi) {\n this._selectedValues$.next([bestMatch.value])\n } else {\n this._selectedValue$.next(bestMatch.value)\n }\n \n // Update input to show the label\n const displayValue = bestMatch.label || bestMatch.textContent || ''\n this._inputValue = displayValue\n this._inputValue$.next(displayValue)\n \n // Update the actual input element\n const input = this._inputElementRef.value\n if (input) {\n input.value = displayValue\n }\n \n // Close dropdown if open\n this._open$.next(false)\n \n // Fire change event\n this._fireChangeEvent()\n \n // Announce to screen reader\n this._announceToScreenReader(`Autofilled: ${displayValue}`)\n }\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Chrome autofill animation detection\n timer(100).pipe(\n map(() => {\n const schInput = this._inputElementRef.value\n if (!schInput) return null\n return schInput.shadowRoot?.querySelector('input') || \n schInput.querySelector('input') ||\n (schInput as any)._inputRef?.value\n }),\n filter(input => !!input),\n switchMap(input => {\n return fromEvent<AnimationEvent>(input!, 'animationstart').pipe(\n filter(e => e.animationName === 'onAutoFillStart'),\n tap(() => {\n console.log('Chrome autofill animation detected')\n timer(100).pipe(\n tap(() => this._checkAutofill$.next()),\n take(1)\n ).subscribe()\n })\n )\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _updateInputDisplay() {\n of(null).pipe(\n withLatestFrom(\n this._selectedValue$,\n this._selectedValues$,\n this._options$,\n this._open$\n ),\n tap(([, selectedValue, selectedValues, options, isOpen]) => {\n if (!this._inputElementRef.value) return\n\n if (!isOpen || !this.multi) {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n this._inputElementRef.value.value = this._inputValue\n }\n }),\n take(1)\n ).subscribe()\n }\n\n private _getSelectedLabels(): string[] {\n return this._options\n .filter(option => \n this.multi \n ? this._selectedValues$.value.includes(option.value)\n : option.value === this._selectedValue$.value\n )\n .map(option => option.label || option.textContent || '')\n }\n\n private _announceToScreenReader(message: string) {\n const liveRegion = this.shadowRoot?.querySelector('#live-status')\n if (liveRegion) {\n liveRegion.textContent = message\n }\n }\n\n private _fireChangeEvent() {\n const detail: SchmancyAutocompleteChangeEvent['detail'] = {\n value: this.value,\n }\n\n if (this.multi) {\n detail.values = [...this._selectedValues$.value]\n }\n\n this.dispatchEvent(\n new CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n detail,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n public checkValidity(): boolean {\n if (!this.required) return true\n return this.multi \n ? this._selectedValues$.value.length > 0 \n : Boolean(this._selectedValue$.value)\n }\n\n public reportValidity(): boolean {\n if (this._inputElementRef.value) {\n return this._inputElementRef.value.reportValidity()\n }\n return this.checkValidity()\n }\n\n firstUpdated() {\n timer(200).pipe(\n tap(() => this._checkAutofill$.next()),\n take(1)\n ).subscribe()\n \n this._options$.pipe(\n filter(options => options.length > 0),\n tap(() => this._checkAutofill$.next()),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n render() {\n const descriptionId = `${this.id}-desc`\n\n return html`\n <div class=\"relative\">\n <!-- Screen reader live region -->\n <div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n <!-- Description -->\n ${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n <!-- Input -->\n <slot name=\"trigger\">\n <schmancy-input\n .size=${this.size}\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n class=\"w-full\"\n .name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-')}\n .label=${this.label}\n .placeholder=${this.placeholder}\n .required=${this.required}\n .value=${this._inputValue}\n type=\"text\"\n autocomplete=${this.autocomplete}\n clickable\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n aria-describedby=${this.description ? descriptionId : undefined}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n \n const hasSelection = this.multi \n ? this._selectedValues$.value.length > 0\n : !!this._selectedValue$.value\n \n if (this.multi && !hasSelection) {\n this._inputValue = ''\n this._inputValue$.next('')\n if (this._inputElementRef.value) {\n this._inputElementRef.value.value = ''\n }\n }\n \n this._open$.next(true)\n }}\n @click=${(e: MouseEvent) => {\n e.stopPropagation()\n this._open$.next(true)\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n >\n </schmancy-input>\n </slot>\n\n <!-- Options dropdown -->\n <ul\n id=\"options\"\n class=${classMap({\n 'absolute': true,\n 'z-[1000]': true,\n 'mt-1': true,\n 'w-full': true,\n 'rounded-md': true,\n 'shadow-md': true,\n 'overflow-auto': true,\n 'min-w-full': true,\n 'bg-surface-low': true,\n 'flex': true,\n 'flex-col': true, // Enable flexbox for ordering\n })}\n role=\"listbox\"\n aria-multiselectable=${this.multi ? 'true' : 'false'}\n aria-label=${`${this.label || 'Options'} dropdown`}\n ?hidden=${!this._open}\n style=\"max-height: ${this.maxHeight}; display: ${this._open ? 'flex' : 'none'};\"\n @slotchange=${() => {\n this._options$.next(this._options)\n timer(100).pipe(\n tap(() => this._checkAutofill$.next()),\n take(1)\n ).subscribe()\n }}\n >\n <slot></slot>\n ${!this._hasResults ? html`\n <li class=\"px-3 py-2 text-sm text-muted\">No results found</li>\n ` : ''}\n </ul>\n </div>\n\n <style>\n :host {\n display: block;\n }\n\n @keyframes onAutoFillStart {\n from {/**/}\n to {/**/}\n }\n\n sch-input::part(input):-webkit-autofill,\n sch-input input:-webkit-autofill {\n animation-name: onAutoFillStart;\n animation-duration: 1ms;\n }\n </style>\n `\n }\n\n private _handleKeyDown(_e: KeyboardEvent) {\n fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n take(1),\n withLatestFrom(this._open$, this._options$),\n tap(([event, isOpen, options]) => {\n if (!isOpen && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault()\n this._open$.next(true)\n \n timer(10).pipe(\n tap(() => {\n const firstVisible = options.find(opt => !opt.hidden)\n firstVisible?.focus()\n }),\n take(1)\n ).subscribe()\n return\n }\n\n if (!isOpen) return\n\n const visibleOptions = options.filter(opt => !opt.hidden)\n .sort((a, b) => parseInt(a.style.order || '0') - parseInt(b.style.order || '0'))\n \n const focusedOption = visibleOptions.find(opt => opt === document.activeElement)\n const currentIndex = focusedOption ? visibleOptions.indexOf(focusedOption) : -1\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault()\n this._open$.next(false)\n this._updateInputDisplay()\n this._inputElementRef.value?.focus()\n break\n\n case 'Tab':\n this._open$.next(false)\n this._updateInputDisplay()\n break\n\n case 'ArrowDown':\n event.preventDefault()\n const nextIndex = currentIndex < visibleOptions.length - 1 ? currentIndex + 1 : 0\n visibleOptions[nextIndex]?.focus()\n break\n\n case 'ArrowUp':\n event.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : visibleOptions.length - 1\n visibleOptions[prevIndex]?.focus()\n break\n\n case 'Home':\n event.preventDefault()\n visibleOptions[0]?.focus()\n break\n\n case 'End':\n event.preventDefault()\n visibleOptions[visibleOptions.length - 1]?.focus()\n break\n\n case 'Enter':\n case ' ':\n if (focusedOption) {\n event.preventDefault()\n this._optionSelect$.next(focusedOption)\n }\n break\n }\n })\n ).subscribe()\n }\n}\n\n\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'schmancy-autocomplete': SchmancyAutocomplete\n }\n}"],"names":["SchmancyAutocomplete","$LitElement","constructor","super","arguments","this","required","placeholder","label","name","maxHeight","multi","description","size","autocomplete","debounceMs","similarityThreshold","_open","_inputValue","_visibleOptionsCount","_hasResults","_inputElementRef","createRef","_selectedValue$","BehaviorSubject","_selectedValues$","_inputValue$","_open$","_options$","_optionSelect$","Subject","_documentClick$","_checkAutofill$","value","vals","next","Array","isArray","join","val","split","map","v","trim","filter","Boolean","connectedCallback","id","Math","random","toString","slice","_setupAutocompleteLogic","_setupDocumentClickHandler","_setupAutofillDetection","pipe","tap","options","forEach","option","index","setAttribute","tabIndex","hasAttribute","fromEvent","e","stopPropagation","takeUntil","disconnecting","subscribe","combineLatest","selectedValue","selectedValues","selected","includes","String","distinctUntilChanged","debounceTime","withLatestFrom","searchTerm","isOpen","term","scoredOptions","optionLabel","textContent","optionValue","labelScore","similarity","valueScore","score","max","sort","a","b","visibleCount","item","hidden","style","order","length","_announceToScreenReader","_","currentValues","indexOf","newValues","labels","_getSelectedLabels","timer","blur","take","_fireChangeEvent","opt","find","open","composedPath","_options","some","_updateInputDisplay","switchMap","document","addEventListener","EMPTY","of","removeEventListener","merge","window","startWith","schInput","shadowRoot","querySelector","_inputRef","input","autofilledValue","bestMatch","bestScore","displayValue","animationName","message","liveRegion","detail","values","dispatchEvent","CustomEvent","bubbles","composed","checkValidity","reportValidity","firstUpdated","render","descriptionId","html","ref","toLowerCase","replace","target","hasSelection","_handleKeyDown","classMap","absolute","flex","_e","event","key","preventDefault","firstVisible","focus","visibleOptions","parseInt","focusedOption","activeElement","currentIndex","nextIndex","prevIndex","__decorateClass","property","type","prototype","reflect","Number","state","query","queryAssignedElements","flatten","customElement"],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ "use strict";const a=require("rxjs"),v=require("lit/directives/class-map.js");require("lit/directives/style-map.js");const y=require("./litElement.mixin-B01R2oT7.cjs");require("./tailwind.mixin-DVKI3qb9.cjs");const p=require("lit/decorators.js"),b=require("lit"),$=require("lit/directives/ref.js"),e=require("rxjs/operators"),m=require("./search-DWW8IoOp.cjs");var g=Object.defineProperty,x=Object.getOwnPropertyDescriptor,r=(t,i,n,l)=>{for(var s,o=l>1?void 0:l?x(i,n):i,h=t.length-1;h>=0;h--)(s=t[h])&&(o=(l?s(i,n,o):s(o))||o);return l&&o&&g(i,n,o),o};let u=class extends y.$LitElement(":host{display:block;border:unset!important;line-height:unset!important;background:unset!important;padding:unset!important;font-size:unset!important;box-shadow:unset!important}:host:focus{box-shadow:unset!important}"){constructor(){super(...arguments),this.required=!1,this.placeholder="",this.label="",this.name="",this.maxHeight="300px",this.multi=!1,this.description="",this.size="md",this.autocomplete="on",this.debounceMs=200,this.similarityThreshold=.3,this._open=!1,this._inputValue="",this._visibleOptionsCount=0,this._hasResults=!0,this._inputElementRef=$.createRef(),this._selectedValue$=new a.BehaviorSubject(""),this._selectedValues$=new a.BehaviorSubject([]),this._inputValue$=new a.BehaviorSubject(""),this._open$=new a.BehaviorSubject(!1),this._options$=new a.BehaviorSubject([]),this._optionSelect$=new a.Subject,this._documentClick$=new a.Subject,this._checkAutofill$=new a.Subject}get values(){return[...this._selectedValues$.value]}set values(t){this._selectedValues$.next(Array.isArray(t)?[...t]:[])}get value(){return this.multi?this._selectedValues$.value.join(","):this._selectedValue$.value}set value(t){this.multi?this._selectedValues$.next(t?t.split(",").map(i=>i.trim()).filter(Boolean):[]):this._selectedValue$.next(t)}connectedCallback(){super.connectedCallback(),this.id||(this.id=`sch-autocomplete-${Math.random().toString(36).slice(2,9)}`),this._setupAutocompleteLogic(),this._setupDocumentClickHandler(),this._setupAutofillDetection()}_setupAutocompleteLogic(){this._options$.pipe(e.tap(t=>{t.forEach((i,n)=>{i.setAttribute("role","option"),i.tabIndex=-1,i.id||(i.id=`${this.id}-option-${n}`),i.hasAttribute("data-event-bound")||(a.fromEvent(i,"click").pipe(e.tap(l=>l.stopPropagation()),e.takeUntil(this.disconnecting)).subscribe(()=>this._optionSelect$.next(i)),i.setAttribute("data-event-bound","true"))})}),e.takeUntil(this.disconnecting)).subscribe(),a.combineLatest([this._selectedValue$,this._selectedValues$,this._options$]).pipe(e.tap(([t,i,n])=>{n.forEach(l=>{l.selected=this.multi?i.includes(l.value):l.value===t,l.setAttribute("aria-selected",String(l.selected))})}),e.takeUntil(this.disconnecting)).subscribe(),this._inputValue$.pipe(e.distinctUntilChanged(),e.debounceTime(this.debounceMs),e.withLatestFrom(this._options$,this._open$),e.tap(([t,i,n])=>{if(!n)return;const l=t.trim();if(l){const s=i.map(h=>{const c=h.label||h.textContent||"",d=h.value,_=m.similarity(l,c),f=m.similarity(l,d);return{option:h,score:Math.max(1.1*_,f)}});s.sort((h,c)=>c.score-h.score);let o=0;s.forEach((h,c)=>{const{option:d,score:_}=h;_<this.similarityThreshold?d.hidden=!0:(d.hidden=!1,o++,d.style.order=String(c))}),this._visibleOptionsCount=o,this._hasResults=o>0}else i.forEach(s=>{s.hidden=!1,s.style.order="0"}),this._visibleOptionsCount=i.length,this._hasResults=!0;this._announceToScreenReader(this._visibleOptionsCount>0?`${this._visibleOptionsCount} option${this._visibleOptionsCount===1?"":"s"} available.`:"No results found.")}),e.takeUntil(this.disconnecting)).subscribe(),this._optionSelect$.pipe(e.withLatestFrom(this._selectedValue$,this._selectedValues$),e.tap(([t,i,n])=>{if(this.multi){const l=n.indexOf(t.value),s=l>-1?[...n.slice(0,l),...n.slice(l+1)]:[...n,t.value];this._selectedValues$.next(s),this._inputValue$.next(""),this._inputValue="";const o=this._getSelectedLabels();this._announceToScreenReader(o.length>0?`Selected: ${o.join(", ")}`:"No options selected")}else this._selectedValue$.next(t.value),this._open$.next(!1),this._open=!1,this._inputValue=t.label||t.textContent||"",this._inputValue$.next(this._inputValue),a.timer(100).pipe(e.tap(()=>this._inputElementRef.value?.blur()),e.take(1)).subscribe(),this._announceToScreenReader(`Selected: ${t.label||t.textContent}`)}),e.tap(()=>this._fireChangeEvent()),e.takeUntil(this.disconnecting)).subscribe(),a.combineLatest([this._open$,this._selectedValue$,this._selectedValues$,this._options$]).pipe(e.filter(()=>!this._open$.value),e.tap(([,t,i,n])=>{if(this.multi){const l=n.filter(s=>i.includes(s.value)).map(s=>s.label||s.textContent||"");this._inputValue=l.join(", ")}else{const l=n.find(s=>s.value===t);this._inputValue=l&&(l.label||l.textContent)||""}this._inputValue$.next(this._inputValue)}),e.takeUntil(this.disconnecting)).subscribe(),this._open$.pipe(e.tap(t=>this._open=t),e.takeUntil(this.disconnecting)).subscribe()}_setupDocumentClickHandler(){this._documentClick$.pipe(e.filter(t=>!t.composedPath().includes(this)),e.filter(t=>!this._options.some(i=>t.composedPath().includes(i))),e.filter(()=>this._open),e.tap(()=>{this._open$.next(!1),this._updateInputDisplay()}),e.takeUntil(this.disconnecting)).subscribe(),this._open$.pipe(e.distinctUntilChanged(),e.switchMap(t=>t?a.timer(10).pipe(e.tap(()=>document.addEventListener("click",i=>this._documentClick$.next(i))),e.switchMap(()=>a.EMPTY)):a.of(null).pipe(e.tap(()=>document.removeEventListener("click",i=>this._documentClick$.next(i))))),e.takeUntil(this.disconnecting)).subscribe()}_setupAutofillDetection(){a.merge(a.timer(100,500).pipe(e.take(10)),this._checkAutofill$,a.timer(100).pipe(e.switchMap(()=>a.fromEvent(window,"load").pipe(e.startWith(null))))).pipe(e.map(()=>{const t=this._inputElementRef.value;return t?t.shadowRoot?.querySelector("input")||t.querySelector("input")||t._inputRef?.value:null}),e.filter(t=>!!t),e.map(t=>t.value),e.filter(t=>!!t&&t.trim().length>0),e.distinctUntilChanged(),e.withLatestFrom(this._options$),e.tap(([t,i])=>{let n=null,l=0;if(i.forEach(s=>{const o=s.label||s.textContent||"",h=s.value,c=m.similarity(t,o),d=m.similarity(t,h),_=Math.max(c,d);_>l&&_>=this.similarityThreshold&&(l=_,n=s)}),n){this.multi?this._selectedValues$.next([n.value]):this._selectedValue$.next(n.value);const s=n.label||n.textContent||"";this._inputValue=s,this._inputValue$.next(s);const o=this._inputElementRef.value;o&&(o.value=s),this._open$.next(!1),this._fireChangeEvent(),this._announceToScreenReader(`Autofilled: ${s}`)}}),e.takeUntil(this.disconnecting)).subscribe(),a.timer(100).pipe(e.map(()=>{const t=this._inputElementRef.value;return t?t.shadowRoot?.querySelector("input")||t.querySelector("input")||t._inputRef?.value:null}),e.filter(t=>!!t),e.switchMap(t=>a.fromEvent(t,"animationstart").pipe(e.filter(i=>i.animationName==="onAutoFillStart"),e.tap(()=>{a.timer(100).pipe(e.tap(()=>this._checkAutofill$.next()),e.take(1)).subscribe()}))),e.takeUntil(this.disconnecting)).subscribe()}_updateInputDisplay(){a.of(null).pipe(e.withLatestFrom(this._selectedValue$,this._selectedValues$,this._options$,this._open$),e.tap(([,t,i,n,l])=>{if(this._inputElementRef.value&&(!l||!this.multi)){if(this.multi){const s=n.filter(o=>i.includes(o.value)).map(o=>o.label||o.textContent||"");this._inputValue=s.join(", ")}else{const s=n.find(o=>o.value===t);this._inputValue=s&&(s.label||s.textContent)||""}this._inputValue$.next(this._inputValue),this._inputElementRef.value.value=this._inputValue}}),e.take(1)).subscribe()}_getSelectedLabels(){return this._options.filter(t=>this.multi?this._selectedValues$.value.includes(t.value):t.value===this._selectedValue$.value).map(t=>t.label||t.textContent||"")}_announceToScreenReader(t){const i=this.shadowRoot?.querySelector("#live-status");i&&(i.textContent=t)}_fireChangeEvent(){const t={value:this.value};this.multi&&(t.values=[...this._selectedValues$.value]),this.dispatchEvent(new CustomEvent("change",{detail:t,bubbles:!0,composed:!0}))}checkValidity(){return!this.required||(this.multi?this._selectedValues$.value.length>0:!!this._selectedValue$.value)}reportValidity(){return this._inputElementRef.value?this._inputElementRef.value.reportValidity():this.checkValidity()}firstUpdated(){a.timer(200).pipe(e.tap(()=>this._checkAutofill$.next()),e.take(1)).subscribe(),this._options$.pipe(e.filter(t=>t.length>0),e.tap(()=>this._checkAutofill$.next()),e.takeUntil(this.disconnecting)).subscribe()}render(){const t=`${this.id}-desc`;return b.html`
2
+ <div class="relative">
3
+ <!-- Screen reader live region -->
4
+ <div id="live-status" role="status" aria-live="polite" class="sr-only"></div>
5
+
6
+ <!-- Description -->
7
+ ${this.description?b.html`<div id="${t}" class="sr-only">${this.description}</div>`:""}
8
+
9
+ <!-- Input -->
10
+ <slot name="trigger">
11
+ <schmancy-input
12
+ .size=${this.size}
13
+ ${$.ref(this._inputElementRef)}
14
+ id="autocomplete-input"
15
+ class="w-full"
16
+ .name=${this.name||this.label?.toLowerCase().replace(/\s+/g,"-")}
17
+ .label=${this.label}
18
+ .placeholder=${this.placeholder}
19
+ .required=${this.required}
20
+ .value=${this._inputValue}
21
+ type="text"
22
+ autocomplete=${this.autocomplete}
23
+ clickable
24
+ role="combobox"
25
+ aria-autocomplete="list"
26
+ aria-haspopup="listbox"
27
+ aria-controls="options"
28
+ aria-expanded=${this._open}
29
+ aria-describedby=${this.description?t:void 0}
30
+ @input=${i=>{const n=i.target.value;this._inputValue=n,this._inputValue$.next(n)}}
31
+ @focus=${i=>{i.stopPropagation();const n=this.multi?this._selectedValues$.value.length>0:!!this._selectedValue$.value;this.multi&&!n&&(this._inputValue="",this._inputValue$.next(""),this._inputElementRef.value&&(this._inputElementRef.value.value="")),this._open$.next(!0)}}
32
+ @click=${i=>{i.stopPropagation(),this._open$.next(!0)}}
33
+ @keydown=${i=>{this._handleKeyDown(i)}}
34
+ >
35
+ </schmancy-input>
36
+ </slot>
37
+
38
+ <!-- Options dropdown -->
39
+ <ul
40
+ id="options"
41
+ class=${v.classMap({absolute:!0,"z-[1000]":!0,"mt-1":!0,"w-full":!0,"rounded-md":!0,"shadow-md":!0,"overflow-auto":!0,"min-w-full":!0,"bg-surface-low":!0,flex:!0,"flex-col":!0})}
42
+ role="listbox"
43
+ aria-multiselectable=${this.multi?"true":"false"}
44
+ aria-label=${`${this.label||"Options"} dropdown`}
45
+ ?hidden=${!this._open}
46
+ style="max-height: ${this.maxHeight}; display: ${this._open?"flex":"none"};"
47
+ @slotchange=${()=>{this._options$.next(this._options),a.timer(100).pipe(e.tap(()=>this._checkAutofill$.next()),e.take(1)).subscribe()}}
48
+ >
49
+ <slot></slot>
50
+ ${this._hasResults?"":b.html`
51
+ <li class="px-3 py-2 text-sm text-muted">No results found</li>
52
+ `}
53
+ </ul>
54
+ </div>
55
+
56
+ <style>
57
+ :host {
58
+ display: block;
59
+ }
60
+
61
+ @keyframes onAutoFillStart {
62
+ from {/**/}
63
+ to {/**/}
64
+ }
65
+
66
+ sch-input::part(input):-webkit-autofill,
67
+ sch-input input:-webkit-autofill {
68
+ animation-name: onAutoFillStart;
69
+ animation-duration: 1ms;
70
+ }
71
+ </style>
72
+ `}_handleKeyDown(t){a.fromEvent(document,"keydown").pipe(e.take(1),e.withLatestFrom(this._open$,this._options$),e.tap(([i,n,l])=>{if(!n&&(i.key==="ArrowDown"||i.key==="Enter"))return i.preventDefault(),this._open$.next(!0),void a.timer(10).pipe(e.tap(()=>{l.find(d=>!d.hidden)?.focus()}),e.take(1)).subscribe();if(!n)return;const s=l.filter(c=>!c.hidden).sort((c,d)=>parseInt(c.style.order||"0")-parseInt(d.style.order||"0")),o=s.find(c=>c===document.activeElement),h=o?s.indexOf(o):-1;switch(i.key){case"Escape":i.preventDefault(),this._open$.next(!1),this._updateInputDisplay(),this._inputElementRef.value?.focus();break;case"Tab":this._open$.next(!1),this._updateInputDisplay();break;case"ArrowDown":i.preventDefault();const c=h<s.length-1?h+1:0;s[c]?.focus();break;case"ArrowUp":i.preventDefault();const d=h>0?h-1:s.length-1;s[d]?.focus();break;case"Home":i.preventDefault(),s[0]?.focus();break;case"End":i.preventDefault(),s[s.length-1]?.focus();break;case"Enter":case" ":o&&(i.preventDefault(),this._optionSelect$.next(o))}})).subscribe()}};r([p.property({type:Boolean})],u.prototype,"required",2),r([p.property({type:String})],u.prototype,"placeholder",2),r([p.property({type:String,reflect:!0})],u.prototype,"label",2),r([p.property({type:String})],u.prototype,"name",2),r([p.property({type:String})],u.prototype,"maxHeight",2),r([p.property({type:Boolean})],u.prototype,"multi",2),r([p.property({type:String})],u.prototype,"description",2),r([p.property({type:String,reflect:!0})],u.prototype,"size",2),r([p.property({type:String})],u.prototype,"autocomplete",2),r([p.property({type:Number})],u.prototype,"debounceMs",2),r([p.property({type:Number})],u.prototype,"similarityThreshold",2),r([p.property({type:Array})],u.prototype,"values",1),r([p.property({type:String,reflect:!0})],u.prototype,"value",1),r([p.state()],u.prototype,"_open",2),r([p.state()],u.prototype,"_inputValue",2),r([p.state()],u.prototype,"_visibleOptionsCount",2),r([p.state()],u.prototype,"_hasResults",2),r([p.query("#options")],u.prototype,"_listbox",2),r([p.query("sch-input")],u.prototype,"_input",2),r([p.queryAssignedElements({flatten:!0})],u.prototype,"_options",2),u=r([p.customElement("schmancy-autocomplete")],u);
73
+ //# sourceMappingURL=autocomplete-CrhgxhFI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete-CrhgxhFI.cjs","sources":["../src/autocomplete/autocomplete.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { InputSize, SchmancyInput } from '@schmancy/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n fromEvent,\n merge,\n of,\n Subject,\n timer\n} from 'rxjs'\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\n// Import the similarity function (or include it inline)\nimport { similarity } from '../utils/search'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n value: string | string[]\n values?: string[]\n}>\n\ninterface FilteredOption {\n option: SchmancyOption\n score: number\n}\n\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends $LitElement(style) {\n // Public API properties\n @property({ type: Boolean }) required = false\n @property({ type: String }) placeholder = ''\n @property({ type: String, reflect: true }) label = ''\n @property({ type: String }) name = ''\n @property({ type: String }) maxHeight = '300px'\n @property({ type: Boolean }) multi = false\n @property({ type: String }) description = ''\n @property({ type: String, reflect: true }) size: InputSize = 'md'\n @property({ type: String }) autocomplete = 'on'\n @property({ type: Number }) debounceMs = 200\n @property({ type: Number }) similarityThreshold = 0.3 // Minimum similarity score to show option\n\n // Values property for multi-select mode\n @property({ type: Array })\n get values() {\n return [...this._selectedValues$.value]\n }\n set values(vals: string[]) {\n this._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n }\n\n // Value property\n @property({ type: String, reflect: true })\n get value() {\n return this.multi \n ? this._selectedValues$.value.join(',')\n : this._selectedValue$.value\n }\n set value(val: string) {\n if (this.multi) {\n this._selectedValues$.next(\n val ? val.split(',').map(v => v.trim()).filter(Boolean) : []\n )\n } else {\n this._selectedValue$.next(val)\n }\n }\n\n // State\n @state() private _open = false\n @state() private _inputValue = ''\n @state() private _visibleOptionsCount = 0\n @state() private _hasResults = true\n\n // DOM references\n @query('#options') _listbox!: HTMLUListElement\n @query('sch-input') _input!: SchmancyInput\n @queryAssignedElements({ flatten: true }) private _options!: SchmancyOption[]\n private _inputElementRef = createRef<HTMLInputElement>()\n\n // RxJS Subjects\n private _selectedValue$ = new BehaviorSubject<string>('')\n private _selectedValues$ = new BehaviorSubject<string[]>([])\n private _inputValue$ = new BehaviorSubject<string>('')\n private _open$ = new BehaviorSubject<boolean>(false)\n private _options$ = new BehaviorSubject<SchmancyOption[]>([])\n private _optionSelect$ = new Subject<SchmancyOption>()\n private _documentClick$ = new Subject<MouseEvent>()\n private _checkAutofill$ = new Subject<void>()\n\n connectedCallback() {\n super.connectedCallback()\n \n if (!this.id) {\n this.id = `sch-autocomplete-${Math.random().toString(36).slice(2, 9)}`\n }\n\n this._setupAutocompleteLogic()\n this._setupDocumentClickHandler()\n this._setupAutofillDetection()\n }\n\n private _setupAutocompleteLogic() {\n // Options management pipeline\n this._options$.pipe(\n tap(options => {\n options.forEach((option, index) => {\n option.setAttribute('role', 'option')\n option.tabIndex = -1\n if (!option.id) {\n option.id = `${this.id}-option-${index}`\n }\n if (!option.hasAttribute('data-event-bound')) {\n fromEvent(option, 'click').pipe(\n tap(e => e.stopPropagation()),\n takeUntil(this.disconnecting)\n ).subscribe(() => this._optionSelect$.next(option))\n option.setAttribute('data-event-bound', 'true')\n }\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Selection sync pipeline\n combineLatest([\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n tap(([selectedValue, selectedValues, options]) => {\n options.forEach(option => {\n option.selected = this.multi \n ? selectedValues.includes(option.value)\n : option.value === selectedValue\n option.setAttribute('aria-selected', String(option.selected))\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Enhanced fuzzy filtering pipeline\n this._inputValue$.pipe(\n distinctUntilChanged(),\n debounceTime(this.debounceMs),\n withLatestFrom(this._options$, this._open$),\n tap(([searchTerm, options, isOpen]) => {\n if (!isOpen) return\n\n const term = searchTerm.trim()\n \n if (!term) {\n // Show all options if no search term\n options.forEach(option => {\n option.hidden = false\n option.style.order = '0' // Reset order\n })\n this._visibleOptionsCount = options.length\n this._hasResults = true\n } else {\n // Calculate similarity scores for all options\n const scoredOptions: FilteredOption[] = options.map(option => {\n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(term, optionLabel)\n const valueScore = similarity(term, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n return { option, score }\n })\n \n // Sort by score (highest first)\n scoredOptions.sort((a, b) => b.score - a.score)\n \n // Apply visibility and ordering\n let visibleCount = 0\n scoredOptions.forEach((item, index) => {\n const { option, score } = item\n \n // Hide options below threshold\n if (score < this.similarityThreshold) {\n option.hidden = true\n } else {\n option.hidden = false\n visibleCount++\n // Use CSS order to sort visible options by relevance\n option.style.order = String(index)\n }\n })\n \n this._visibleOptionsCount = visibleCount\n this._hasResults = visibleCount > 0\n }\n \n this._announceToScreenReader(\n this._visibleOptionsCount > 0 \n ? `${this._visibleOptionsCount} option${this._visibleOptionsCount === 1 ? '' : 's'} available.`\n : 'No results found.'\n )\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Option selection pipeline\n this._optionSelect$.pipe(\n withLatestFrom(this._selectedValue$, this._selectedValues$),\n tap(([option, _, currentValues]) => {\n if (this.multi) {\n const index = currentValues.indexOf(option.value)\n const newValues = index > -1\n ? [...currentValues.slice(0, index), ...currentValues.slice(index + 1)]\n : [...currentValues, option.value]\n this._selectedValues$.next(newValues)\n \n this._inputValue$.next('')\n this._inputValue = ''\n \n const labels = this._getSelectedLabels()\n this._announceToScreenReader(\n labels.length > 0 \n ? `Selected: ${labels.join(', ')}`\n : 'No options selected'\n )\n } else {\n this._selectedValue$.next(option.value)\n this._open$.next(false)\n this._open = false\n \n this._inputValue = option.label || option.textContent || ''\n this._inputValue$.next(this._inputValue)\n \n timer(100).pipe(\n tap(() => this._inputElementRef.value?.blur()),\n take(1)\n ).subscribe()\n \n this._announceToScreenReader(`Selected: ${option.label || option.textContent}`)\n }\n }),\n tap(() => this._fireChangeEvent()),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Display update pipeline\n combineLatest([\n this._open$,\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n filter(() => !this._open$.value),\n tap(([, selectedValue, selectedValues, options]) => {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Open state sync\n this._open$.pipe(\n tap(open => this._open = open),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupDocumentClickHandler() {\n this._documentClick$.pipe(\n filter(e => !e.composedPath().includes(this)),\n filter(e => !this._options.some(opt => e.composedPath().includes(opt))),\n filter(() => this._open),\n tap(() => {\n this._open$.next(false)\n this._updateInputDisplay()\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n this._open$.pipe(\n distinctUntilChanged(),\n switchMap(open => \n open \n ? timer(10).pipe(\n tap(() => document.addEventListener('click', e => this._documentClick$.next(e))),\n switchMap(() => EMPTY)\n )\n : of(null).pipe(\n tap(() => document.removeEventListener('click', e => this._documentClick$.next(e)))\n )\n ),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupAutofillDetection() {\n // Enhanced autofill detection with fuzzy matching\n merge(\n timer(100, 500).pipe(take(10)),\n this._checkAutofill$,\n timer(100).pipe(\n switchMap(() => \n fromEvent(window, 'load').pipe(startWith(null))\n )\n )\n ).pipe(\n map(() => {\n const schInput = this._inputElementRef.value\n if (!schInput) return null\n return schInput.shadowRoot?.querySelector('input') || \n schInput.querySelector('input') ||\n (schInput as any)._inputRef?.value\n }),\n filter(input => !!input),\n map(input => (input as HTMLInputElement).value),\n filter(value => !!value && value.trim().length > 0),\n distinctUntilChanged(),\n withLatestFrom(this._options$),\n tap(([autofilledValue, options]) => {\n console.log('Autofill detected:', autofilledValue)\n \n // Use fuzzy matching to find best matching option\n let bestMatch: SchmancyOption | null = null\n let bestScore = 0\n \n options.forEach(option => {\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores\n const labelScore = similarity(autofilledValue, optionLabel)\n const valueScore = similarity(autofilledValue, optionValue)\n \n // Use the higher score\n const score = Math.max(labelScore, valueScore)\n \n // Keep track of best match\n if (score > bestScore && score >= this.similarityThreshold) {\n bestScore = score\n bestMatch = option\n }\n })\n\n if (bestMatch) {\n console.log('Found matching option:', bestMatch.value, 'with score:', bestScore)\n \n // Select the option\n if (this.multi) {\n this._selectedValues$.next([bestMatch.value])\n } else {\n this._selectedValue$.next(bestMatch.value)\n }\n \n // Update input to show the label\n const displayValue = bestMatch.label || bestMatch.textContent || ''\n this._inputValue = displayValue\n this._inputValue$.next(displayValue)\n \n // Update the actual input element\n const input = this._inputElementRef.value\n if (input) {\n input.value = displayValue\n }\n \n // Close dropdown if open\n this._open$.next(false)\n \n // Fire change event\n this._fireChangeEvent()\n \n // Announce to screen reader\n this._announceToScreenReader(`Autofilled: ${displayValue}`)\n }\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Chrome autofill animation detection\n timer(100).pipe(\n map(() => {\n const schInput = this._inputElementRef.value\n if (!schInput) return null\n return schInput.shadowRoot?.querySelector('input') || \n schInput.querySelector('input') ||\n (schInput as any)._inputRef?.value\n }),\n filter(input => !!input),\n switchMap(input => {\n return fromEvent<AnimationEvent>(input!, 'animationstart').pipe(\n filter(e => e.animationName === 'onAutoFillStart'),\n tap(() => {\n console.log('Chrome autofill animation detected')\n timer(100).pipe(\n tap(() => this._checkAutofill$.next()),\n take(1)\n ).subscribe()\n })\n )\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _updateInputDisplay() {\n of(null).pipe(\n withLatestFrom(\n this._selectedValue$,\n this._selectedValues$,\n this._options$,\n this._open$\n ),\n tap(([, selectedValue, selectedValues, options, isOpen]) => {\n if (!this._inputElementRef.value) return\n\n if (!isOpen || !this.multi) {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n this._inputElementRef.value.value = this._inputValue\n }\n }),\n take(1)\n ).subscribe()\n }\n\n private _getSelectedLabels(): string[] {\n return this._options\n .filter(option => \n this.multi \n ? this._selectedValues$.value.includes(option.value)\n : option.value === this._selectedValue$.value\n )\n .map(option => option.label || option.textContent || '')\n }\n\n private _announceToScreenReader(message: string) {\n const liveRegion = this.shadowRoot?.querySelector('#live-status')\n if (liveRegion) {\n liveRegion.textContent = message\n }\n }\n\n private _fireChangeEvent() {\n const detail: SchmancyAutocompleteChangeEvent['detail'] = {\n value: this.value,\n }\n\n if (this.multi) {\n detail.values = [...this._selectedValues$.value]\n }\n\n this.dispatchEvent(\n new CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n detail,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n public checkValidity(): boolean {\n if (!this.required) return true\n return this.multi \n ? this._selectedValues$.value.length > 0 \n : Boolean(this._selectedValue$.value)\n }\n\n public reportValidity(): boolean {\n if (this._inputElementRef.value) {\n return this._inputElementRef.value.reportValidity()\n }\n return this.checkValidity()\n }\n\n firstUpdated() {\n timer(200).pipe(\n tap(() => this._checkAutofill$.next()),\n take(1)\n ).subscribe()\n \n this._options$.pipe(\n filter(options => options.length > 0),\n tap(() => this._checkAutofill$.next()),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n render() {\n const descriptionId = `${this.id}-desc`\n\n return html`\n <div class=\"relative\">\n <!-- Screen reader live region -->\n <div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n <!-- Description -->\n ${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n <!-- Input -->\n <slot name=\"trigger\">\n <schmancy-input\n .size=${this.size}\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n class=\"w-full\"\n .name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-')}\n .label=${this.label}\n .placeholder=${this.placeholder}\n .required=${this.required}\n .value=${this._inputValue}\n type=\"text\"\n autocomplete=${this.autocomplete}\n clickable\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n aria-describedby=${this.description ? descriptionId : undefined}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n \n const hasSelection = this.multi \n ? this._selectedValues$.value.length > 0\n : !!this._selectedValue$.value\n \n if (this.multi && !hasSelection) {\n this._inputValue = ''\n this._inputValue$.next('')\n if (this._inputElementRef.value) {\n this._inputElementRef.value.value = ''\n }\n }\n \n this._open$.next(true)\n }}\n @click=${(e: MouseEvent) => {\n e.stopPropagation()\n this._open$.next(true)\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n >\n </schmancy-input>\n </slot>\n\n <!-- Options dropdown -->\n <ul\n id=\"options\"\n class=${classMap({\n 'absolute': true,\n 'z-[1000]': true,\n 'mt-1': true,\n 'w-full': true,\n 'rounded-md': true,\n 'shadow-md': true,\n 'overflow-auto': true,\n 'min-w-full': true,\n 'bg-surface-low': true,\n 'flex': true,\n 'flex-col': true, // Enable flexbox for ordering\n })}\n role=\"listbox\"\n aria-multiselectable=${this.multi ? 'true' : 'false'}\n aria-label=${`${this.label || 'Options'} dropdown`}\n ?hidden=${!this._open}\n style=\"max-height: ${this.maxHeight}; display: ${this._open ? 'flex' : 'none'};\"\n @slotchange=${() => {\n this._options$.next(this._options)\n timer(100).pipe(\n tap(() => this._checkAutofill$.next()),\n take(1)\n ).subscribe()\n }}\n >\n <slot></slot>\n ${!this._hasResults ? html`\n <li class=\"px-3 py-2 text-sm text-muted\">No results found</li>\n ` : ''}\n </ul>\n </div>\n\n <style>\n :host {\n display: block;\n }\n\n @keyframes onAutoFillStart {\n from {/**/}\n to {/**/}\n }\n\n sch-input::part(input):-webkit-autofill,\n sch-input input:-webkit-autofill {\n animation-name: onAutoFillStart;\n animation-duration: 1ms;\n }\n </style>\n `\n }\n\n private _handleKeyDown(_e: KeyboardEvent) {\n fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n take(1),\n withLatestFrom(this._open$, this._options$),\n tap(([event, isOpen, options]) => {\n if (!isOpen && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault()\n this._open$.next(true)\n \n timer(10).pipe(\n tap(() => {\n const firstVisible = options.find(opt => !opt.hidden)\n firstVisible?.focus()\n }),\n take(1)\n ).subscribe()\n return\n }\n\n if (!isOpen) return\n\n const visibleOptions = options.filter(opt => !opt.hidden)\n .sort((a, b) => parseInt(a.style.order || '0') - parseInt(b.style.order || '0'))\n \n const focusedOption = visibleOptions.find(opt => opt === document.activeElement)\n const currentIndex = focusedOption ? visibleOptions.indexOf(focusedOption) : -1\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault()\n this._open$.next(false)\n this._updateInputDisplay()\n this._inputElementRef.value?.focus()\n break\n\n case 'Tab':\n this._open$.next(false)\n this._updateInputDisplay()\n break\n\n case 'ArrowDown':\n event.preventDefault()\n const nextIndex = currentIndex < visibleOptions.length - 1 ? currentIndex + 1 : 0\n visibleOptions[nextIndex]?.focus()\n break\n\n case 'ArrowUp':\n event.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : visibleOptions.length - 1\n visibleOptions[prevIndex]?.focus()\n break\n\n case 'Home':\n event.preventDefault()\n visibleOptions[0]?.focus()\n break\n\n case 'End':\n event.preventDefault()\n visibleOptions[visibleOptions.length - 1]?.focus()\n break\n\n case 'Enter':\n case ' ':\n if (focusedOption) {\n event.preventDefault()\n this._optionSelect$.next(focusedOption)\n }\n break\n }\n })\n ).subscribe()\n }\n}\n\n\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'schmancy-autocomplete': SchmancyAutocomplete\n }\n}"],"names":["SchmancyAutocomplete","$LitElement","constructor","super","arguments","this","required","placeholder","label","name","maxHeight","multi","description","size","autocomplete","debounceMs","similarityThreshold","_open","_inputValue","_visibleOptionsCount","_hasResults","_inputElementRef","createRef","_selectedValue$","BehaviorSubject","_selectedValues$","_inputValue$","_open$","_options$","_optionSelect$","Subject","_documentClick$","_checkAutofill$","value","vals","next","Array","isArray","join","val","split","map","v","trim","filter","Boolean","connectedCallback","id","Math","random","toString","slice","_setupAutocompleteLogic","_setupDocumentClickHandler","_setupAutofillDetection","pipe","tap","options","forEach","option","index","setAttribute","tabIndex","hasAttribute","fromEvent","e","stopPropagation","takeUntil","disconnecting","subscribe","combineLatest","selectedValue","selectedValues","selected","includes","String","distinctUntilChanged","debounceTime","withLatestFrom","searchTerm","isOpen","term","scoredOptions","optionLabel","textContent","optionValue","labelScore","similarity","valueScore","score","max","sort","a","b","visibleCount","item","hidden","style","order","length","_announceToScreenReader","_","currentValues","indexOf","newValues","labels","_getSelectedLabels","timer","blur","take","_fireChangeEvent","opt","find","open","composedPath","_options","some","_updateInputDisplay","switchMap","document","addEventListener","EMPTY","of","removeEventListener","merge","window","startWith","schInput","shadowRoot","querySelector","_inputRef","input","autofilledValue","bestMatch","bestScore","displayValue","animationName","message","liveRegion","detail","values","dispatchEvent","CustomEvent","bubbles","composed","checkValidity","reportValidity","render","descriptionId","html","ref","toLowerCase","replace","target","hasSelection","_handleKeyDown","classMap","absolute","flex","_e","event","key","preventDefault","focus","visibleOptions","parseInt","focusedOption","activeElement","currentIndex","nextIndex","prevIndex","__decorateClass","property","type","prototype","reflect","Number","state","query","queryAssignedElements","flatten","customElement"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";require("./autocomplete-PHnzqAII.cjs");
1
+ "use strict";require("./autocomplete-CrhgxhFI.cjs");
2
2
  //# sourceMappingURL=autocomplete.cjs.map
@@ -1,2 +1,2 @@
1
- import "./autocomplete-CHObbMzK.js";
1
+ import "./autocomplete-CkycjWy4.js";
2
2
  //# sourceMappingURL=autocomplete.js.map