@mhmo91/schmancy 0.2.129 → 0.2.130

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,58 @@
1
+ "use strict";const C=require("@floating-ui/dom"),O=require("rxjs");require("lit/directives/class-map.js"),require("lit/directives/style-map.js");const A=require("./litElement.mixin-CfkMd-bR.cjs");require("./tailwind.mixin-CjSVtdHt.cjs");const E=require("./ripple-C2BHbhcS.cjs"),D=require("./theme.interface-Xg5Zi46a.cjs"),x=require("lit"),c=require("lit/decorators.js"),$=require("lit/directives/ref.js"),b=require("rxjs/operators");function I(t,e){if(!t||!e)return 0;if(t===e)return 1;const i=t.toLowerCase().trim(),s=e.toLowerCase().trim();if(i===s)return 1;const r=s.includes(i)?1:0,o=function(p,d){let l=0,n=0;for(;l<p.length&&n<d.length;)p[l]===d[n]&&l++,n++;return l===p.length}(i,s)?.8:0,a=function(p,d){const l=y=>y.split("").reduce((v,g)=>(v[g]=(v[g]||0)+1,v),{}),n=l(p),m=l(d);return Object.keys(n).every(y=>(m[y]||0)>=n[y])}(i,s)?.7:0,w=function(p,d){if(p.length<2||d.length<2)return 0;const l=k(p),n=k(d);let m=0;const y=new Array(n.length).fill(!1);for(const v of l)for(let g=0;g<n.length;g++)if(!y[g]&&n[g]===v){m++,y[g]=!0;break}return 2*m/(l.length+n.length)}(i,s),f=Math.max(i.length,s.length),S=function(p,d){if(p.length===0)return d.length;if(d.length===0)return p.length;const l=[];for(let n=0;n<=d.length;n++)l[n]=[n];for(let n=0;n<=p.length;n++)l[0][n]=n;for(let n=1;n<=d.length;n++)for(let m=1;m<=p.length;m++){const y=p[m-1]===d[n-1]?0:1;l[n][m]=Math.min(l[n-1][m]+1,l[n][m-1]+1,l[n-1][m-1]+y)}return l[d.length][p.length]}(i,s),q=f?1-S/f:0;return Math.max(r,o,a,w,q)}function k(t){const e=[];for(let i=0;i<t.length-1;i++)e.push(t.substring(i,i+2));return e}var V=Object.defineProperty,M=Object.getOwnPropertyDescriptor,u=(t,e,i,s)=>{for(var r,o=s>1?void 0:s?M(e,i):e,a=t.length-1;a>=0;a--)(r=t[a])&&(o=(s?r(e,i,o):r(o))||o);return s&&o&&V(e,i,o),o};let h=class extends A.$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.value="",this.label="",this.maxHeight="25vh",this.multi=!1,this.description="",this.inputRef=$.createRef(),this.searchTerm$=new O.Subject,this.isOpen=!1,this.autocomplete="on",this.startY=0,this.statusMessage="",this.handleKeyDown=t=>{const e=this.options.filter(s=>!s.hidden);if(!this.isOpen)return void(["Enter","ArrowDown"].includes(t.key)&&(t.preventDefault(),this.showOptions().then(()=>{e.length>0&&this.focusOption(e,0)})));let i=e.findIndex(s=>s.matches(":focus"));switch(i===-1&&(i=0),t.key){case"Escape":t.preventDefault(),this.hideOptions(),this.input.focus();break;case"ArrowDown":t.preventDefault(),this.focusOption(e,Math.min(i+1,e.length-1));break;case"ArrowUp":t.preventDefault(),this.focusOption(e,Math.max(i-1,0));break;case"Home":t.preventDefault(),this.focusOption(e,0);break;case"End":t.preventDefault(),this.focusOption(e,e.length-1);break;case"Enter":if(t.preventDefault(),e[i]){const s=e[i].getAttribute("data-value")||e[i].getAttribute("value");s&&this.handleOptionClick(s)}break;case"Tab":this.hideOptions();break;default:if(t.key.length===1&&/[a-zA-Z0-9]/.test(t.key)){const s=t.key.toLowerCase(),r=e.findIndex(o=>(o.label||o.textContent||"").toLowerCase().startsWith(s));r!==-1&&(t.preventDefault(),this.focusOption(e,r))}}}}connectedCallback(){super.connectedCallback(),this.id||(this.id=`schmancy-autocomplete-${Math.random().toString(36).substr(2,9)}`),O.fromEvent(this,"keydown").pipe(b.takeUntil(this.disconnecting)).subscribe({next:t=>{this.handleKeyDown(t)}}),this.searchTerm$.pipe(b.distinctUntilChanged(),b.tap(t=>{var r;const e=t.trim().toLowerCase(),i=this.options.map(o=>{const a=(o.label||o.textContent||"").toLowerCase();return{option:o,score:I(e,a)}}).filter(({score:o})=>o>.8).sort((o,a)=>o.score-a.score);this.options.forEach(o=>o.hidden=!0);for(const{option:o}of i)o.hidden=!1;this.empty.hidden=i.length>0,this.statusMessage=i.length>0?`${i.length} option${i.length===1?"":"s"} available.`:"No results found.";const s=(r=this.shadowRoot)==null?void 0:r.querySelector("#live-status");s&&(s.textContent=this.statusMessage),this.setupOptionsAccessibility(),this.requestUpdate()}),b.takeUntil(this.disconnecting)).subscribe(()=>{this.showOptions()}),O.fromEvent(this,"focusout").pipe(b.takeUntil(this.disconnecting),b.filter(t=>{const e=t.relatedTarget;return!this.contains(e)&&(e==null?void 0:e.tagName)!=="SCHMANCY-OPTION"}),b.switchMap(()=>{this.options.forEach(e=>e.hidden=!1);const t=this.optionsContainer.animate([{opacity:1},{opacity:0}],{duration:150,easing:"cubic-bezier(0.5, 0.01, 0.25, 1)"});return O.from(new Promise(e=>{t.onfinish=()=>{this.optionsContainer.style.display="none",this.optionsContainer.style.opacity="1",this.isOpen=!1,e()}}))})).subscribe({next:()=>{var t;if(this.multi){const e=this.options.filter(i=>i.selected).map(i=>i.label);this.input.value=e.join(", ")}else this.input.value=((t=this.options.find(e=>e.value===this.value))==null?void 0:t.label)??""}})}firstUpdated(){this.updateInputValue()}updated(t){super.updated(t),t.has("value")&&(this.syncSelectionFromValue(),this.updateInputValue())}handleSlotChange(){this.empty.hidden=this.options.some(t=>!t.hidden),this.syncSelectionFromValue(),this.updateInputValue(),this.setupOptionsAccessibility()}setupOptionsAccessibility(){this.options.forEach((t,e)=>{t.setAttribute("role","option"),t.id||(t.id=`${this.id}-option-${e}`),t.tabIndex=-1,t.setAttribute("aria-selected",String(this.multi?t.selected:t.value===this.value))})}syncSelectionFromValue(){if(this.multi){const t=this.value.split(",").map(e=>e.trim()).filter(Boolean);this.options.forEach(e=>{e.selected=t.includes(e.value)})}else this.options.forEach(t=>{t.selected=t.value===this.value})}updateInputValue(){requestAnimationFrame(()=>{var t;if(this.multi){const e=this.options.filter(i=>i.selected).map(i=>i.label);this.input.value=e.join(", ")}else{const e=(t=this.options.find(i=>i.value===this.value))==null?void 0:t.label;this.input.value=e??""}})}async showOptions(){if(!this.optionsContainer)return;this.optionsContainer.removeAttribute("hidden"),this.optionsContainer.style.display="block",this.isOpen=!0;const{x:t,y:e}=await C.computePosition(this.input,this.optionsContainer,{placement:"bottom-start",middleware:[C.offset(5),C.shift({padding:5}),C.size({apply({availableWidth:i,availableHeight:s,elements:r,rects:o}){const a=o.reference.width;r.floating.style.minWidth=`${a}px`,r.floating.style.maxWidth=`${i}px`,r.floating.style.maxHeight=`${s}px`}})]});Object.assign(this.optionsContainer.style,{left:`${t}px`,top:`${e}px`,position:"absolute",zIndex:"9999",overflowY:"auto"})}hideOptions(){var e,i;(e=this.optionsContainer)==null||e.setAttribute("hidden","true"),this.optionsContainer&&(this.optionsContainer.style.display="none"),this.isOpen=!1;const t=(i=this.shadowRoot)==null?void 0:i.querySelector("#live-status");t&&(t.textContent="Dropdown closed.")}handleInputChange(t){t.preventDefault(),t.stopPropagation();const e=t.detail.value;this.searchTerm$.next(e)}handleOptionClick(t){var e,i;if(this.multi){const s=this.options.find(f=>f.value===t);s&&(s.selected=!s.selected);const r=this.options.filter(f=>f.selected).map(f=>f.value);this.value=r.join(","),this.updateInputValue();const o=this.options.filter(f=>f.selected).map(f=>f.label),a=o.length>0?`Selected: ${o.join(", ")}`:"No options selected",w=(e=this.shadowRoot)==null?void 0:e.querySelector("#live-status");w&&(w.textContent=a),this.dispatchEvent(new CustomEvent("change",{detail:{value:r},bubbles:!0,composed:!0}))}else{const s=this.options.find(a=>a.value===t),r=(s==null?void 0:s.label)||"";this.hideOptions(),this.value=t,this.updateInputValue();const o=(i=this.shadowRoot)==null?void 0:i.querySelector("#live-status");o&&(o.textContent=`Selected: ${r}`),this.dispatchEvent(new CustomEvent("change",{detail:{value:t},bubbles:!0,composed:!0}))}}checkValidity(){return this.multi?this.options.some(t=>t.selected):!!this.value}reportValidity(){var t;return(t=this.inputRef.value)==null?void 0:t.reportValidity()}handleTouchStart(t){var e,i;this.startY=((i=(e=t.touches)==null?void 0:e[0])==null?void 0:i.clientY)??0}preventScroll(t){var o,a;const e=t.target;if(!this.optionsContainer.contains(e))return;const i=this.optionsContainer.scrollTop,s=this.optionsContainer.scrollHeight-this.optionsContainer.offsetHeight,r=((a=(o=t.touches)==null?void 0:o[0])==null?void 0:a.clientY)??0;(i<=0&&r>this.startY||i>=s&&r<this.startY)&&t.preventDefault()}focusOption(t,e){if(!t.length)return;const i=t[e];i&&(i.focus(),this.input.setAttribute("aria-activedescendant",i.id),i.scrollIntoView&&i.scrollIntoView({block:"nearest"}))}render(){const t=`${this.id}-desc`;return x.html`
2
+ <div class="relative">
3
+ <!-- Live region for screen reader announcements -->
4
+ <div id="live-status" role="status" aria-live="polite" class="sr-only"></div>
5
+
6
+ <!-- Optional description for the autocomplete -->
7
+ ${this.description?x.html`<div id="${t}" class="sr-only">${this.description}</div>`:""}
8
+
9
+ <!-- The trigger slot (if any) overrides the default SchmancyInput -->
10
+ <slot name="trigger">
11
+ <sch-input
12
+ .autocomplete=${this.autocomplete}
13
+ ${$.ref(this.inputRef)}
14
+ id="input"
15
+ class="w-full"
16
+ .label=${this.label}
17
+ .placeholder=${this.placeholder}
18
+ .required=${this.required}
19
+ type="search"
20
+ inputmode="text"
21
+ autocomplete="off"
22
+ clickable
23
+ role="combobox"
24
+ aria-autocomplete="list"
25
+ aria-haspopup="listbox"
26
+ aria-controls="options"
27
+ aria-expanded=${this.isOpen}
28
+ aria-describedby=${this.description?t:void 0}
29
+ @focus=${()=>this.showOptions()}
30
+ @change=${this.handleInputChange}
31
+ >
32
+ </sch-input>
33
+ </slot>
34
+
35
+ <ul
36
+ id="options"
37
+ tabindex="-1"
38
+ class="absolute z-30 mt-1 w-full overflow-auto rounded-md shadow-sm"
39
+ role="listbox"
40
+ aria-multiselectable=${this.multi?"true":"false"}
41
+ aria-label=${`${this.label||"Options"} dropdown`}
42
+ hidden
43
+ @click=${e=>{var s;const i=(s=e.detail)==null?void 0:s.value;i&&this.handleOptionClick(i)}}
44
+ @touchstart=${this.handleTouchStart}
45
+ @touchmove=${this.preventScroll}
46
+ ${E.color({bgColor:D.SchmancyTheme.sys.color.surface.container})}
47
+ @slotchange=${this.handleSlotChange}
48
+ >
49
+ <!-- "No results" option -->
50
+ <li id="empty" tabindex="-1" role="option" aria-disabled="true" class="p-2 text-center">
51
+ <schmancy-typography type="label">No results found</schmancy-typography>
52
+ </li>
53
+ <!-- Slot for the <schmancy-option> elements -->
54
+ <slot></slot>
55
+ </ul>
56
+ </div>
57
+ `}};u([c.property({type:Boolean})],h.prototype,"required",2),u([c.property({type:String})],h.prototype,"placeholder",2),u([c.property({type:String,reflect:!0})],h.prototype,"value",2),u([c.property({type:String,reflect:!0})],h.prototype,"label",2),u([c.property({type:String})],h.prototype,"maxHeight",2),u([c.property({type:Boolean})],h.prototype,"multi",2),u([c.property({type:String})],h.prototype,"description",2),u([c.query("#options")],h.prototype,"optionsContainer",2),u([c.query("#empty")],h.prototype,"empty",2),u([c.query("sch-input")],h.prototype,"input",2),u([c.queryAssignedElements({flatten:!0})],h.prototype,"options",2),u([c.property({type:Boolean,reflect:!0})],h.prototype,"isOpen",2),u([c.property({type:String,reflect:!0})],h.prototype,"autocomplete",2),u([c.eventOptions({passive:!0})],h.prototype,"handleOptionClick",1),h=u([c.customElement("schmancy-autocomplete")],h);
58
+ //# sourceMappingURL=autocomplete-CVTRldW1.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete-CVTRldW1.cjs","sources":["../src/utils/search.ts","../src/autocomplete/autocomplete.ts"],"sourcesContent":["/**\n * Calculate similarity score between two strings.\n * Returns a value between 0 (no match) and 1 (exact match).\n * Includes all similarity methods from the original filter directive.\n *\n * @param query The search query string\n * @param target The target string to compare against\n * @returns A similarity score from 0 to 1\n */\nexport function similarity(query: string, target: string): number {\n\t// Handle edge cases\n\tif (!query || !target) return 0\n\tif (query === target) return 1\n\n\t// Normalize strings for comparison\n\tconst normalizedQuery = query.toLowerCase().trim()\n\tconst normalizedTarget = target.toLowerCase().trim()\n\n\t// Simple exact match check\n\tif (normalizedQuery === normalizedTarget) return 1\n\n\t// Calculate different similarity metrics using all methods from the original filter\n\n\t// 1. Direct substring match\n\tconst substringScore = normalizedTarget.includes(normalizedQuery) ? 1 : 0\n\n\t// 2. Subsequence check\n\tconst subsequenceScore = isSubsequence(normalizedQuery, normalizedTarget) ? 0.8 : 0\n\n\t// 3. Anagram/character frequency match\n\tconst anagramScore = hasAllCharacters(normalizedQuery, normalizedTarget) ? 0.7 : 0\n\n\t// 4. Dice coefficient based on bigrams\n\tconst diceScore = diceCoefficient(normalizedQuery, normalizedTarget)\n\n\t// 5. Levenshtein distance\n\tconst maxLength = Math.max(normalizedQuery.length, normalizedTarget.length)\n\tconst levenshteinDistance = calculateLevenshtein(normalizedQuery, normalizedTarget)\n\tconst levenshteinScore = maxLength ? 1 - levenshteinDistance / maxLength : 0\n\n\t// Return the maximum score from all methods\n\treturn Math.max(substringScore, subsequenceScore, anagramScore, diceScore, levenshteinScore)\n}\n\n/**\n * Check if string 'sub' is a subsequence of string 'str'.\n * All characters in 'sub' must appear in order in 'str'.\n */\nfunction isSubsequence(sub: string, str: string): boolean {\n\tlet i = 0,\n\t\tj = 0\n\twhile (i < sub.length && j < str.length) {\n\t\tif (sub[i] === str[j]) i++\n\t\tj++\n\t}\n\treturn i === sub.length\n}\n\n/**\n * Check if all characters in 'query' are present in 'target'.\n * For example, \"aovc\" matches \"avocados\" (anagram subset matching).\n */\nfunction hasAllCharacters(query: string, target: string): boolean {\n\tconst countChars = (s: string): Record<string, number> => {\n\t\treturn s.split('').reduce(\n\t\t\t(acc, char) => {\n\t\t\t\tacc[char] = (acc[char] || 0) + 1\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{} as Record<string, number>,\n\t\t)\n\t}\n\n\tconst queryCount = countChars(query)\n\tconst targetCount = countChars(target)\n\n\treturn Object.keys(queryCount).every(char => (targetCount[char] || 0) >= queryCount[char])\n}\n\n/**\n * Generate bigrams for a string.\n * A bigram is a sequence of two adjacent characters.\n */\nfunction getBigrams(s: string): string[] {\n\tconst bigrams = []\n\tfor (let i = 0; i < s.length - 1; i++) {\n\t\tbigrams.push(s.substring(i, i + 2))\n\t}\n\treturn bigrams\n}\n\n/**\n * Compute Dice's coefficient for two strings based on bigrams.\n * Returns a value between 0 (no similarity) and 1 (perfect match).\n */\nfunction diceCoefficient(s1: string, s2: string): number {\n\tif (s1.length < 2 || s2.length < 2) return 0\n\n\tconst bigrams1 = getBigrams(s1)\n\tconst bigrams2 = getBigrams(s2)\n\n\tlet intersection = 0\n\tconst used = new Array(bigrams2.length).fill(false)\n\n\tfor (const bigram of bigrams1) {\n\t\tfor (let i = 0; i < bigrams2.length; i++) {\n\t\t\tif (!used[i] && bigrams2[i] === bigram) {\n\t\t\t\tintersection++\n\t\t\t\tused[i] = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn (2 * intersection) / (bigrams1.length + bigrams2.length)\n}\n\n/**\n * Calculate Levenshtein distance between two strings.\n */\nfunction calculateLevenshtein(a: string, b: string): number {\n\tif (a.length === 0) return b.length\n\tif (b.length === 0) return a.length\n\n\tconst matrix: number[][] = []\n\n\t// Initialize the matrix\n\tfor (let i = 0; i <= b.length; i++) {\n\t\tmatrix[i] = [i]\n\t}\n\tfor (let j = 0; j <= a.length; j++) {\n\t\tmatrix[0][j] = j\n\t}\n\n\t// Calculate distances\n\tfor (let i = 1; i <= b.length; i++) {\n\t\tfor (let j = 1; j <= a.length; j++) {\n\t\t\tconst cost = a[j - 1] === b[i - 1] ? 0 : 1\n\t\t\tmatrix[i][j] = Math.min(\n\t\t\t\tmatrix[i - 1][j] + 1, // deletion\n\t\t\t\tmatrix[i][j - 1] + 1, // insertion\n\t\t\t\tmatrix[i - 1][j - 1] + cost, // substitution\n\t\t\t)\n\t\t}\n\t}\n\n\treturn matrix[b.length][a.length]\n}\n","import { computePosition, offset, shift, size } from '@floating-ui/dom'\nimport { $LitElement } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport SchmancyInput from '@schmancy/input/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { html } from 'lit'\nimport { customElement, eventOptions, property, query, queryAssignedElements } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { from, fromEvent, Subject } from 'rxjs'\nimport { distinctUntilChanged, filter, switchMap, takeUntil, tap } from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\nimport type { SchmancyInputInputEvent } from '@schmancy/input/input'\nimport { similarity } from '@schmancy/utils/search'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n\tvalue: string | string[]\n}>\n\n/**\n * The SchmancyAutocomplete component provides an accessible autocomplete field with keyboard navigation.\n * @element schmancy-autocomplete\n * @fires change - Emitted when a selection is made\n * @slot - Default slot for schmancy-option elements\n * @slot trigger - Optional slot to override the default input\n */\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends $LitElement(style) {\n\t// Public API properties\n\t@property({ type: Boolean }) required = false\n\t@property({ type: String }) placeholder = ''\n\t@property({ type: String, reflect: true }) value = ''\n\t@property({ type: String, reflect: true }) label = ''\n\t@property({ type: String }) maxHeight = '25vh'\n\t@property({ type: Boolean }) multi = false\n\n\t/**\n\t * Optional description for the autocomplete to improve accessibility.\n\t * Will be associated with the input via aria-describedby.\n\t */\n\t@property({ type: String }) description = ''\n\n\t/** Direct reference to the <input> inside <sch-input> */\n\tinputRef = createRef<HTMLInputElement>()\n\n\t// Query selectors for elements in the shadow DOM\n\t@query('#options') private optionsContainer!: HTMLUListElement\n\t@query('#empty') private empty!: HTMLLIElement\n\t@query('sch-input') private input!: SchmancyInput\n\t@queryAssignedElements({ flatten: true }) private options!: SchmancyOption[]\n\n\t// Subject for search term changes\n\tprivate readonly searchTerm$ = new Subject<string>()\n\n\t// Flag to track dropdown state\n\t@property({ type: Boolean, reflect: true }) isOpen = false\n\n\t/** Autocomplete/autofill hints. */\n\t@property({ type: String, reflect: true })\n\tpublic autocomplete: AutoFill = 'on'\n\n\t// iOS scroll-blocking logic\n\tprivate startY = 0\n\n\t// Store status message for screen readers\n\tprivate statusMessage = ''\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Ensure the component has an ID (used for generating option IDs)\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-autocomplete-${Math.random().toString(36).substr(2, 9)}`\n\t\t}\n\n\t\t// Listen for keydown events on the input to enable keyboard navigation\n\t\tfromEvent(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe({\n\t\t\t\tnext: (e: KeyboardEvent) => {\n\t\t\t\t\tthis.handleKeyDown(e)\n\t\t\t\t},\n\t\t\t})\n\n\t\t// Search filtering logic\n\t\tthis.searchTerm$\n\t\t\t.pipe(\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(term => {\n\t\t\t\t\tconst searchTerm = term.trim().toLowerCase()\n\n\t\t\t\t\t// Filter options using Levenshtein distance\n\t\t\t\t\tconst matches = this.options\n\t\t\t\t\t\t.map(option => {\n\t\t\t\t\t\t\tconst optionText = (option.label || option.textContent || '').toLowerCase()\n\t\t\t\t\t\t\tconst score = similarity(searchTerm, optionText)\n\t\t\t\t\t\t\treturn { option, score }\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.filter(({ score }) => {\n\t\t\t\t\t\t\t// For short search terms, be lenient\n\t\t\t\t\t\t\treturn score > 0.8\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => a.score - b.score)\n\n\t\t\t\t\t// Show/hide options based on filtering\n\t\t\t\t\tthis.options.forEach(o => (o.hidden = true))\n\t\t\t\t\tfor (const { option } of matches) {\n\t\t\t\t\t\toption.hidden = false\n\t\t\t\t\t}\n\n\t\t\t\t\t// \"No results found\"\n\t\t\t\t\tthis.empty.hidden = matches.length > 0\n\n\t\t\t\t\t// Update status message for screen readers\n\t\t\t\t\tthis.statusMessage =\n\t\t\t\t\t\tmatches.length > 0\n\t\t\t\t\t\t\t? `${matches.length} option${matches.length === 1 ? '' : 's'} available.`\n\t\t\t\t\t\t\t: 'No results found.'\n\n\t\t\t\t\t// Update the live region to announce the results\n\t\t\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\t\t\tif (liveRegion) {\n\t\t\t\t\t\tliveRegion.textContent = this.statusMessage\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update accessibility attributes on options\n\t\t\t\t\tthis.setupOptionsAccessibility()\n\n\t\t\t\t\tthis.requestUpdate()\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\t// Show dropdown on each new search term\n\t\t\t\tthis.showOptions()\n\t\t\t})\n\n\t\t// Focus-out animation (fade out)\n\t\tfromEvent<FocusEvent>(this, 'focusout')\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t\tfilter(e => {\n\t\t\t\t\t// Don't close if focus moved to an option\n\t\t\t\t\tconst relatedTarget = e.relatedTarget as Element\n\t\t\t\t\treturn !this.contains(relatedTarget) && relatedTarget?.tagName !== 'SCHMANCY-OPTION'\n\t\t\t\t}),\n\t\t\t\tswitchMap(() => {\n\t\t\t\t\t// reset options to show all\n\t\t\t\t\tthis.options.forEach(o => (o.hidden = false))\n\t\t\t\t\tconst animation = this.optionsContainer.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\t\t\tduration: 150,\n\t\t\t\t\t\teasing: 'cubic-bezier(0.5, 0.01, 0.25, 1)',\n\t\t\t\t\t})\n\t\t\t\t\treturn from(\n\t\t\t\t\t\tnew Promise<void>(resolve => {\n\t\t\t\t\t\t\tanimation.onfinish = () => {\n\t\t\t\t\t\t\t\tthis.optionsContainer.style.display = 'none'\n\t\t\t\t\t\t\t\tthis.optionsContainer.style.opacity = '1'\n\t\t\t\t\t\t\t\tthis.isOpen = false\n\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: () => {\n\t\t\t\t\t// After closing, resync the input's value\n\t\t\t\t\tif (this.multi) {\n\t\t\t\t\t\tconst selected = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\t\t\t\tthis.input.value = selected.join(', ')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.input.value = this.options.find(o => o.value === this.value)?.label ?? ''\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t}\n\n\tfirstUpdated() {\n\t\tthis.updateInputValue()\n\t}\n\n\tprotected updated(changedProps: Map<string | number | symbol, unknown>) {\n\t\tsuper.updated(changedProps)\n\t\tif (changedProps.has('value')) {\n\t\t\tthis.syncSelectionFromValue()\n\t\t\tthis.updateInputValue()\n\t\t}\n\t}\n\n\t/**\n\t * When the <slot> changes (i.e. options are added/removed), update the following:\n\t * 1. Show or hide the \"No results found\" option.\n\t * 2. Sync the selection state.\n\t * 3. Setup accessibility attributes on the options.\n\t */\n\tprivate handleSlotChange() {\n\t\tthis.empty.hidden = this.options.some(option => !option.hidden)\n\t\tthis.syncSelectionFromValue()\n\t\tthis.updateInputValue()\n\t\tthis.setupOptionsAccessibility()\n\t}\n\n\t/**\n\t * Loops through assigned options and sets accessibility attributes:\n\t * - role=\"option\"\n\t * - A unique ID (if not already set)\n\t * - tabindex=\"-1\"\n\t * - aria-selected (based on whether the option is selected)\n\t */\n\tprivate setupOptionsAccessibility() {\n\t\tthis.options.forEach((option, index) => {\n\t\t\toption.setAttribute('role', 'option')\n\t\t\tif (!option.id) {\n\t\t\t\toption.id = `${this.id}-option-${index}`\n\t\t\t}\n\t\t\toption.tabIndex = -1\n\t\t\toption.setAttribute('aria-selected', String(this.multi ? option.selected : option.value === this.value))\n\t\t})\n\t}\n\n\tprivate syncSelectionFromValue() {\n\t\tif (this.multi) {\n\t\t\tconst values = this.value\n\t\t\t\t.split(',')\n\t\t\t\t.map(v => v.trim())\n\t\t\t\t.filter(Boolean)\n\t\t\tthis.options.forEach(o => {\n\t\t\t\to.selected = values.includes(o.value)\n\t\t\t})\n\t\t} else {\n\t\t\tthis.options.forEach(o => {\n\t\t\t\to.selected = o.value === this.value\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate updateInputValue() {\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.multi) {\n\t\t\t\tconst selected = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\t\tthis.input.value = selected.join(', ')\n\t\t\t} else {\n\t\t\t\tconst found = this.options.find(o => o.value === this.value)?.label\n\t\t\t\tthis.input.value = found ?? ''\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t * MAIN: Show the dropdown. Uses Floating UI to position and size the options container.\n\t */\n\tprivate async showOptions() {\n\t\tif (!this.optionsContainer) return\n\n\t\tthis.optionsContainer.removeAttribute('hidden')\n\t\tthis.optionsContainer.style.display = 'block'\n\t\tthis.isOpen = true\n\n\t\tconst { x, y } = await computePosition(this.input, this.optionsContainer, {\n\t\t\tplacement: 'bottom-start',\n\t\t\tmiddleware: [\n\t\t\t\toffset(5),\n\t\t\t\tshift({ padding: 5 }),\n\t\t\t\tsize({\n\t\t\t\t\tapply({ availableWidth, availableHeight, elements, rects }) {\n\t\t\t\t\t\t// At least match input width\n\t\t\t\t\t\tconst referenceWidth = rects.reference.width\n\t\t\t\t\t\telements.floating.style.minWidth = `${referenceWidth}px`\n\t\t\t\t\t\t// Cap to available viewport space\n\t\t\t\t\t\telements.floating.style.maxWidth = `${availableWidth}px`\n\t\t\t\t\t\telements.floating.style.maxHeight = `${availableHeight}px`\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t})\n\n\t\tObject.assign(this.optionsContainer.style, {\n\t\t\tleft: `${x}px`,\n\t\t\ttop: `${y}px`,\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '9999',\n\t\t\toverflowY: 'auto',\n\t\t})\n\t}\n\n\tprivate hideOptions() {\n\t\tthis.optionsContainer?.setAttribute('hidden', 'true')\n\t\tif (this.optionsContainer) {\n\t\t\tthis.optionsContainer.style.display = 'none'\n\t\t}\n\t\tthis.isOpen = false\n\n\t\t// Announce that the dropdown is closed to screen readers\n\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\tif (liveRegion) {\n\t\t\tliveRegion.textContent = 'Dropdown closed.'\n\t\t}\n\t}\n\n\tprivate handleInputChange(event: SchmancyInputInputEvent) {\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t\tconst term = event.detail.value\n\t\tthis.searchTerm$.next(term)\n\t}\n\n\t@eventOptions({ passive: true })\n\tprivate handleOptionClick(value: string) {\n\t\tif (this.multi) {\n\t\t\tconst option = this.options.find(o => o.value === value)\n\t\t\tif (option) option.selected = !option.selected\n\t\t\tconst selectedValues = this.options.filter(o => o.selected).map(o => o.value)\n\t\t\tthis.value = selectedValues.join(',')\n\t\t\tthis.updateInputValue()\n\n\t\t\t// Announce selection to screen readers\n\t\t\tconst selectedLabels = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\tconst announcement = selectedLabels.length > 0 ? `Selected: ${selectedLabels.join(', ')}` : 'No options selected'\n\n\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\tif (liveRegion) {\n\t\t\t\tliveRegion.textContent = announcement\n\t\t\t}\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n\t\t\t\t\tdetail: { value: selectedValues },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t} else {\n\t\t\tconst selectedOption = this.options.find(o => o.value === value)\n\t\t\tconst selectedLabel = selectedOption?.label || ''\n\n\t\t\tthis.hideOptions()\n\t\t\tthis.value = value\n\t\t\tthis.updateInputValue()\n\n\t\t\t// Announce selection to screen readers\n\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\tif (liveRegion) {\n\t\t\t\tliveRegion.textContent = `Selected: ${selectedLabel}`\n\t\t\t}\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n\t\t\t\t\tdetail: { value },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic checkValidity() {\n\t\treturn this.multi ? this.options.some(o => o.selected) : Boolean(this.value)\n\t}\n\n\tpublic reportValidity() {\n\t\treturn this.inputRef.value?.reportValidity()\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent) {\n\t\tthis.startY = event.touches?.[0]?.clientY ?? 0\n\t}\n\n\tprivate preventScroll(event: TouchEvent) {\n\t\tconst target = event.target as HTMLElement\n\t\tif (!this.optionsContainer.contains(target)) return\n\n\t\tconst scrollTop = this.optionsContainer.scrollTop\n\t\tconst scrollHeight = this.optionsContainer.scrollHeight\n\t\tconst offsetHeight = this.optionsContainer.offsetHeight\n\t\tconst contentHeight = scrollHeight - offsetHeight\n\n\t\tconst currentY = event.touches?.[0]?.clientY ?? 0\n\t\tif ((scrollTop <= 0 && currentY > this.startY) || (scrollTop >= contentHeight && currentY < this.startY)) {\n\t\t\tevent.preventDefault()\n\t\t}\n\t}\n\n\t/**\n\t * Keyboard navigation for the autocomplete.\n\t * – When the dropdown is closed, ArrowDown (or Enter/Space) opens it.\n\t * – When open, ArrowDown/ArrowUp move focus between options (which must have role=\"option\").\n\t * – Enter or Space selects the active option.\n\t * – Escape (or Tab) hides the dropdown.\n\t * - Home/End to navigate to first/last option\n\t */\n\tprivate handleKeyDown = (e: KeyboardEvent) => {\n\t\t// Get the visible options (i.e. those not hidden)\n\t\tconst options = this.options.filter(o => !o.hidden)\n\n\t\t// If the dropdown is closed, open it on Enter, Space, or ArrowDown\n\t\tif (!this.isOpen) {\n\t\t\tif (['Enter', 'ArrowDown'].includes(e.key)) {\n\t\t\t\t// Removed ' ' (space) here\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.showOptions().then(() => {\n\t\t\t\t\tif (options.length > 0) {\n\t\t\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Dropdown is open; determine the currently focused option\n\t\tlet currentIndex = options.findIndex(o => o.matches(':focus'))\n\t\tif (currentIndex === -1) {\n\t\t\t// If no option is focused, default to the first\n\t\t\tcurrentIndex = 0\n\t\t}\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.hideOptions()\n\t\t\t\tthis.input.focus()\n\t\t\t\tbreak\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.min(currentIndex + 1, options.length - 1))\n\t\t\t\tbreak\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.max(currentIndex - 1, 0))\n\t\t\t\tbreak\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\tbreak\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, options.length - 1)\n\t\t\t\tbreak\n\t\t\tcase 'Enter': // Removed ' ' (space) case here\n\t\t\t\te.preventDefault()\n\t\t\t\tif (options[currentIndex]) {\n\t\t\t\t\tconst value = options[currentIndex].getAttribute('data-value') || options[currentIndex].getAttribute('value')\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tthis.handleOptionClick(value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'Tab':\n\t\t\t\t// Close the dropdown on Tab\n\t\t\t\tthis.hideOptions()\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\t// For letter key presses, find and focus the first option that starts with that letter\n\t\t\t\tif (e.key.length === 1 && /[a-zA-Z0-9]/.test(e.key)) {\n\t\t\t\t\tconst searchKey = e.key.toLowerCase()\n\t\t\t\t\tconst matchIndex = options.findIndex(option =>\n\t\t\t\t\t\t(option.label || option.textContent || '').toLowerCase().startsWith(searchKey),\n\t\t\t\t\t)\n\n\t\t\t\t\tif (matchIndex !== -1) {\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\tthis.focusOption(options, matchIndex)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * Helper to focus an option by index and update the combobox's aria-activedescendant.\n\t */\n\tprivate focusOption(options: HTMLElement[], index: number) {\n\t\tif (!options.length) return\n\n\t\tconst option = options[index]\n\t\tif (option) {\n\t\t\toption.focus()\n\t\t\t// Update the input's aria-activedescendant to match the newly focused option\n\t\t\tthis.input.setAttribute('aria-activedescendant', option.id)\n\n\t\t\t// Ensure the focused option is visible in the dropdown (scroll if needed)\n\t\t\tif (option.scrollIntoView) {\n\t\t\t\toption.scrollIntoView({ block: 'nearest' })\n\t\t\t}\n\t\t}\n\t}\n\n\trender() {\n\t\t// Create a unique ID for the description\n\t\tconst descriptionId = `${this.id}-desc`\n\n\t\treturn html`\n\t\t\t<div class=\"relative\">\n\t\t\t\t<!-- Live region for screen reader announcements -->\n\t\t\t\t<div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n\t\t\t\t<!-- Optional description for the autocomplete -->\n\t\t\t\t${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n\t\t\t\t<!-- The trigger slot (if any) overrides the default SchmancyInput -->\n\t\t\t\t<slot name=\"trigger\">\n\t\t\t\t\t<sch-input\n\t\t\t\t\t\t.autocomplete=${this.autocomplete}\n\t\t\t\t\t\t${ref(this.inputRef)}\n\t\t\t\t\t\tid=\"input\"\n\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t.label=${this.label}\n\t\t\t\t\t\t.placeholder=${this.placeholder}\n\t\t\t\t\t\t.required=${this.required}\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tinputmode=\"text\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\tclickable\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\taria-controls=\"options\"\n\t\t\t\t\t\taria-expanded=${this.isOpen}\n\t\t\t\t\t\taria-describedby=${this.description ? descriptionId : undefined}\n\t\t\t\t\t\t@focus=${() => this.showOptions()}\n\t\t\t\t\t\t@change=${this.handleInputChange}\n\t\t\t\t\t>\n\t\t\t\t\t</sch-input>\n\t\t\t\t</slot>\n\n\t\t\t\t<ul\n\t\t\t\t\tid=\"options\"\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\tclass=\"absolute z-30 mt-1 w-full overflow-auto rounded-md shadow-sm\"\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=${this.multi ? 'true' : 'false'}\n\t\t\t\t\taria-label=${`${this.label || 'Options'} dropdown`}\n\t\t\t\t\thidden\n\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t// Each <schmancy-option> should dispatch a CustomEvent('click', { detail: { value } })\n\t\t\t\t\t\tconst detailVal = (e as CustomEvent).detail?.value\n\t\t\t\t\t\tif (detailVal) this.handleOptionClick(detailVal)\n\t\t\t\t\t}}\n\t\t\t\t\t@touchstart=${this.handleTouchStart}\n\t\t\t\t\t@touchmove=${this.preventScroll}\n\t\t\t\t\t${color({ bgColor: SchmancyTheme.sys.color.surface.container })}\n\t\t\t\t\t@slotchange=${this.handleSlotChange}\n\t\t\t\t>\n\t\t\t\t\t<!-- \"No results\" option -->\n\t\t\t\t\t<li id=\"empty\" tabindex=\"-1\" role=\"option\" aria-disabled=\"true\" class=\"p-2 text-center\">\n\t\t\t\t\t\t<schmancy-typography type=\"label\">No results found</schmancy-typography>\n\t\t\t\t\t</li>\n\t\t\t\t\t<!-- Slot for the <schmancy-option> elements -->\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-autocomplete': SchmancyAutocomplete\n\t}\n}\n"],"names":["similarity","query","target","normalizedQuery","toLowerCase","trim","normalizedTarget","substringScore","includes","subsequenceScore","sub","str","i","j","length","anagramScore","countChars","s","split","reduce","acc","char","queryCount","targetCount","Object","keys","every","diceScore","s1","s2","bigrams1","getBigrams","bigrams2","intersection","used","Array","fill","bigram","maxLength","Math","max","levenshteinDistance","a","b","matrix","cost","min","levenshteinScore","bigrams","push","substring","SchmancyAutocomplete","$LitElement","super","arguments","this","required","placeholder","value","label","maxHeight","multi","description","inputRef","createRef","searchTerm$","Subject","isOpen","autocomplete","startY","statusMessage","handleKeyDown","e","options","filter","o","hidden","key","preventDefault","showOptions","then","focusOption","currentIndex","findIndex","matches","hideOptions","input","focus","getAttribute","handleOptionClick","test","searchKey","matchIndex","option","textContent","startsWith","connectedCallback","id","random","toString","substr","fromEvent","pipe","takeUntil","disconnecting","subscribe","next","distinctUntilChanged","tap","term","searchTerm","map","optionText","score","sort","forEach","empty","liveRegion","shadowRoot","querySelector","setupOptionsAccessibility","requestUpdate","relatedTarget","contains","tagName","switchMap","animation","optionsContainer","animate","opacity","duration","easing","from","Promise","resolve","onfinish","style","display","selected","join","find","updateInputValue","changedProps","updated","has","syncSelectionFromValue","some","index","setAttribute","tabIndex","String","values","v","Boolean","requestAnimationFrame","found","removeAttribute","x","y","computePosition","placement","middleware","offset","shift","padding","size","availableWidth","availableHeight","elements","rects","referenceWidth","reference","width","floating","minWidth","maxWidth","assign","left","top","position","zIndex","overflowY","event","stopPropagation","detail","selectedValues","selectedLabels","announcement","dispatchEvent","CustomEvent","bubbles","composed","selectedOption","selectedLabel","reportValidity","touches","clientY","scrollTop","contentHeight","scrollHeight","offsetHeight","currentY","scrollIntoView","block","render","descriptionId","html","ref","handleInputChange","detailVal","handleTouchStart","preventScroll","color","bgColor","SchmancyTheme","sys","surface","container","handleSlotChange","__decorateClass","property","type","prototype","reflect","queryAssignedElements","flatten","eventOptions","passive","customElement"],"mappings":"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"}
@@ -7,71 +7,71 @@ import "./tailwind.mixin-Cxj7n9Jd.js";
7
7
  import { c as j } from "./ripple-BumgqsDT.js";
8
8
  import { S as T } from "./theme.interface-C5Kj6WjD.js";
9
9
  import { html as x } from "lit";
10
- import { property as g, query as w, queryAssignedElements as H, eventOptions as R, customElement as Y } from "lit/decorators.js";
10
+ import { property as y, query as w, queryAssignedElements as H, eventOptions as R, customElement as Y } from "lit/decorators.js";
11
11
  import { createRef as L, ref as N } from "lit/directives/ref.js";
12
12
  import { takeUntil as C, distinctUntilChanged as z, tap as P, filter as B, switchMap as U } from "rxjs/operators";
13
13
  function F(t, e) {
14
14
  if (!t || !e) return 0;
15
15
  if (t === e) return 1;
16
- const i = t.toLowerCase().trim(), s = e.toLowerCase().trim();
17
- if (i === s) return 1;
18
- const a = s.includes(i) ? 1 : 0, o = function(h, c) {
16
+ const s = t.toLowerCase().trim(), i = e.toLowerCase().trim();
17
+ if (s === i) return 1;
18
+ const a = i.includes(s) ? 1 : 0, o = function(p, u) {
19
19
  let l = 0, n = 0;
20
- for (; l < h.length && n < c.length; ) h[l] === c[n] && l++, n++;
21
- return l === h.length;
22
- }(i, s) ? 0.8 : 0, r = function(h, c) {
23
- const l = (m) => m.split("").reduce((b, y) => (b[y] = (b[y] || 0) + 1, b), {}), n = l(h), f = l(c);
20
+ for (; l < p.length && n < u.length; ) p[l] === u[n] && l++, n++;
21
+ return l === p.length;
22
+ }(s, i) ? 0.8 : 0, r = function(p, u) {
23
+ const l = (m) => m.split("").reduce((b, g) => (b[g] = (b[g] || 0) + 1, b), {}), n = l(p), f = l(u);
24
24
  return Object.keys(n).every((m) => (f[m] || 0) >= n[m]);
25
- }(i, s) ? 0.7 : 0, v = function(h, c) {
26
- if (h.length < 2 || c.length < 2) return 0;
27
- const l = $(h), n = $(c);
25
+ }(s, i) ? 0.7 : 0, v = function(p, u) {
26
+ if (p.length < 2 || u.length < 2) return 0;
27
+ const l = $(p), n = $(u);
28
28
  let f = 0;
29
29
  const m = new Array(n.length).fill(!1);
30
- for (const b of l) for (let y = 0; y < n.length; y++) if (!m[y] && n[y] === b) {
31
- f++, m[y] = !0;
30
+ for (const b of l) for (let g = 0; g < n.length; g++) if (!m[g] && n[g] === b) {
31
+ f++, m[g] = !0;
32
32
  break;
33
33
  }
34
34
  return 2 * f / (l.length + n.length);
35
- }(i, s), d = Math.max(i.length, s.length), k = function(h, c) {
36
- if (h.length === 0) return c.length;
37
- if (c.length === 0) return h.length;
35
+ }(s, i), d = Math.max(s.length, i.length), k = function(p, u) {
36
+ if (p.length === 0) return u.length;
37
+ if (u.length === 0) return p.length;
38
38
  const l = [];
39
- for (let n = 0; n <= c.length; n++) l[n] = [n];
40
- for (let n = 0; n <= h.length; n++) l[0][n] = n;
41
- for (let n = 1; n <= c.length; n++) for (let f = 1; f <= h.length; f++) {
42
- const m = h[f - 1] === c[n - 1] ? 0 : 1;
39
+ for (let n = 0; n <= u.length; n++) l[n] = [n];
40
+ for (let n = 0; n <= p.length; n++) l[0][n] = n;
41
+ for (let n = 1; n <= u.length; n++) for (let f = 1; f <= p.length; f++) {
42
+ const m = p[f - 1] === u[n - 1] ? 0 : 1;
43
43
  l[n][f] = Math.min(l[n - 1][f] + 1, l[n][f - 1] + 1, l[n - 1][f - 1] + m);
44
44
  }
45
- return l[c.length][h.length];
46
- }(i, s), S = d ? 1 - k / d : 0;
45
+ return l[u.length][p.length];
46
+ }(s, i), S = d ? 1 - k / d : 0;
47
47
  return Math.max(a, o, r, v, S);
48
48
  }
49
49
  function $(t) {
50
50
  const e = [];
51
- for (let i = 0; i < t.length - 1; i++) e.push(t.substring(i, i + 2));
51
+ for (let s = 0; s < t.length - 1; s++) e.push(t.substring(s, s + 2));
52
52
  return e;
53
53
  }
54
- var W = Object.defineProperty, K = Object.getOwnPropertyDescriptor, u = (t, e, i, s) => {
55
- for (var a, o = s > 1 ? void 0 : s ? K(e, i) : e, r = t.length - 1; r >= 0; r--) (a = t[r]) && (o = (s ? a(e, i, o) : a(o)) || o);
56
- return s && o && W(e, i, o), o;
54
+ var W = Object.defineProperty, K = Object.getOwnPropertyDescriptor, c = (t, e, s, i) => {
55
+ for (var a, o = i > 1 ? void 0 : i ? K(e, s) : e, r = t.length - 1; r >= 0; r--) (a = t[r]) && (o = (i ? a(e, s, o) : a(o)) || o);
56
+ return i && o && W(e, s, o), o;
57
57
  };
58
- let p = class extends M(":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}") {
58
+ let h = class extends M(":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}") {
59
59
  constructor() {
60
- super(...arguments), this.required = !1, this.placeholder = "", this.value = "", this.label = "", this.maxHeight = "25vh", this.multi = !1, this.description = "", this.inputRef = L(), this.searchTerm$ = new V(), this.isOpen = !1, this.startY = 0, this.statusMessage = "", this.handleKeyDown = (t) => {
61
- const e = this.options.filter((s) => !s.hidden);
60
+ super(...arguments), this.required = !1, this.placeholder = "", this.value = "", this.label = "", this.maxHeight = "25vh", this.multi = !1, this.description = "", this.inputRef = L(), this.searchTerm$ = new V(), this.isOpen = !1, this.autocomplete = "on", this.startY = 0, this.statusMessage = "", this.handleKeyDown = (t) => {
61
+ const e = this.options.filter((i) => !i.hidden);
62
62
  if (!this.isOpen) return void (["Enter", "ArrowDown"].includes(t.key) && (t.preventDefault(), this.showOptions().then(() => {
63
63
  e.length > 0 && this.focusOption(e, 0);
64
64
  })));
65
- let i = e.findIndex((s) => s.matches(":focus"));
66
- switch (i === -1 && (i = 0), t.key) {
65
+ let s = e.findIndex((i) => i.matches(":focus"));
66
+ switch (s === -1 && (s = 0), t.key) {
67
67
  case "Escape":
68
68
  t.preventDefault(), this.hideOptions(), this.input.focus();
69
69
  break;
70
70
  case "ArrowDown":
71
- t.preventDefault(), this.focusOption(e, Math.min(i + 1, e.length - 1));
71
+ t.preventDefault(), this.focusOption(e, Math.min(s + 1, e.length - 1));
72
72
  break;
73
73
  case "ArrowUp":
74
- t.preventDefault(), this.focusOption(e, Math.max(i - 1, 0));
74
+ t.preventDefault(), this.focusOption(e, Math.max(s - 1, 0));
75
75
  break;
76
76
  case "Home":
77
77
  t.preventDefault(), this.focusOption(e, 0);
@@ -80,9 +80,9 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
80
80
  t.preventDefault(), this.focusOption(e, e.length - 1);
81
81
  break;
82
82
  case "Enter":
83
- if (t.preventDefault(), e[i]) {
84
- const s = e[i].getAttribute("data-value") || e[i].getAttribute("value");
85
- s && this.handleOptionClick(s);
83
+ if (t.preventDefault(), e[s]) {
84
+ const i = e[s].getAttribute("data-value") || e[s].getAttribute("value");
85
+ i && this.handleOptionClick(i);
86
86
  }
87
87
  break;
88
88
  case "Tab":
@@ -90,7 +90,7 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
90
90
  break;
91
91
  default:
92
92
  if (t.key.length === 1 && /[a-zA-Z0-9]/.test(t.key)) {
93
- const s = t.key.toLowerCase(), a = e.findIndex((o) => (o.label || o.textContent || "").toLowerCase().startsWith(s));
93
+ const i = t.key.toLowerCase(), a = e.findIndex((o) => (o.label || o.textContent || "").toLowerCase().startsWith(i));
94
94
  a !== -1 && (t.preventDefault(), this.focusOption(e, a));
95
95
  }
96
96
  }
@@ -101,15 +101,15 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
101
101
  this.handleKeyDown(t);
102
102
  } }), this.searchTerm$.pipe(z(), P((t) => {
103
103
  var a;
104
- const e = t.trim().toLowerCase(), i = this.options.map((o) => {
104
+ const e = t.trim().toLowerCase(), s = this.options.map((o) => {
105
105
  const r = (o.label || o.textContent || "").toLowerCase();
106
106
  return { option: o, score: F(e, r) };
107
107
  }).filter(({ score: o }) => o > 0.8).sort((o, r) => o.score - r.score);
108
108
  this.options.forEach((o) => o.hidden = !0);
109
- for (const { option: o } of i) o.hidden = !1;
110
- this.empty.hidden = i.length > 0, this.statusMessage = i.length > 0 ? `${i.length} option${i.length === 1 ? "" : "s"} available.` : "No results found.";
111
- const s = (a = this.shadowRoot) == null ? void 0 : a.querySelector("#live-status");
112
- s && (s.textContent = this.statusMessage), this.setupOptionsAccessibility(), this.requestUpdate();
109
+ for (const { option: o } of s) o.hidden = !1;
110
+ this.empty.hidden = s.length > 0, this.statusMessage = s.length > 0 ? `${s.length} option${s.length === 1 ? "" : "s"} available.` : "No results found.";
111
+ const i = (a = this.shadowRoot) == null ? void 0 : a.querySelector("#live-status");
112
+ i && (i.textContent = this.statusMessage), this.setupOptionsAccessibility(), this.requestUpdate();
113
113
  }), C(this.disconnecting)).subscribe(() => {
114
114
  this.showOptions();
115
115
  }), O(this, "focusout").pipe(C(this.disconnecting), B((t) => {
@@ -126,7 +126,7 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
126
126
  })).subscribe({ next: () => {
127
127
  var t;
128
128
  if (this.multi) {
129
- const e = this.options.filter((i) => i.selected).map((i) => i.label);
129
+ const e = this.options.filter((s) => s.selected).map((s) => s.label);
130
130
  this.input.value = e.join(", ");
131
131
  } else this.input.value = ((t = this.options.find((e) => e.value === this.value)) == null ? void 0 : t.label) ?? "";
132
132
  } });
@@ -159,10 +159,10 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
159
159
  requestAnimationFrame(() => {
160
160
  var t;
161
161
  if (this.multi) {
162
- const e = this.options.filter((i) => i.selected).map((i) => i.label);
162
+ const e = this.options.filter((s) => s.selected).map((s) => s.label);
163
163
  this.input.value = e.join(", ");
164
164
  } else {
165
- const e = (t = this.options.find((i) => i.value === this.value)) == null ? void 0 : t.label;
165
+ const e = (t = this.options.find((s) => s.value === this.value)) == null ? void 0 : t.label;
166
166
  this.input.value = e ?? "";
167
167
  }
168
168
  });
@@ -170,16 +170,16 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
170
170
  async showOptions() {
171
171
  if (!this.optionsContainer) return;
172
172
  this.optionsContainer.removeAttribute("hidden"), this.optionsContainer.style.display = "block", this.isOpen = !0;
173
- const { x: t, y: e } = await A(this.input, this.optionsContainer, { placement: "bottom-start", middleware: [D(5), E({ padding: 5 }), I({ apply({ availableWidth: i, availableHeight: s, elements: a, rects: o }) {
173
+ const { x: t, y: e } = await A(this.input, this.optionsContainer, { placement: "bottom-start", middleware: [D(5), E({ padding: 5 }), I({ apply({ availableWidth: s, availableHeight: i, elements: a, rects: o }) {
174
174
  const r = o.reference.width;
175
- a.floating.style.minWidth = `${r}px`, a.floating.style.maxWidth = `${i}px`, a.floating.style.maxHeight = `${s}px`;
175
+ a.floating.style.minWidth = `${r}px`, a.floating.style.maxWidth = `${s}px`, a.floating.style.maxHeight = `${i}px`;
176
176
  } })] });
177
177
  Object.assign(this.optionsContainer.style, { left: `${t}px`, top: `${e}px`, position: "absolute", zIndex: "9999", overflowY: "auto" });
178
178
  }
179
179
  hideOptions() {
180
- var e, i;
180
+ var e, s;
181
181
  (e = this.optionsContainer) == null || e.setAttribute("hidden", "true"), this.optionsContainer && (this.optionsContainer.style.display = "none"), this.isOpen = !1;
182
- const t = (i = this.shadowRoot) == null ? void 0 : i.querySelector("#live-status");
182
+ const t = (s = this.shadowRoot) == null ? void 0 : s.querySelector("#live-status");
183
183
  t && (t.textContent = "Dropdown closed.");
184
184
  }
185
185
  handleInputChange(t) {
@@ -188,18 +188,18 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
188
188
  this.searchTerm$.next(e);
189
189
  }
190
190
  handleOptionClick(t) {
191
- var e, i;
191
+ var e, s;
192
192
  if (this.multi) {
193
- const s = this.options.find((d) => d.value === t);
194
- s && (s.selected = !s.selected);
193
+ const i = this.options.find((d) => d.value === t);
194
+ i && (i.selected = !i.selected);
195
195
  const a = this.options.filter((d) => d.selected).map((d) => d.value);
196
196
  this.value = a.join(","), this.updateInputValue();
197
197
  const o = this.options.filter((d) => d.selected).map((d) => d.label), r = o.length > 0 ? `Selected: ${o.join(", ")}` : "No options selected", v = (e = this.shadowRoot) == null ? void 0 : e.querySelector("#live-status");
198
198
  v && (v.textContent = r), this.dispatchEvent(new CustomEvent("change", { detail: { value: a }, bubbles: !0, composed: !0 }));
199
199
  } else {
200
- const s = this.options.find((r) => r.value === t), a = (s == null ? void 0 : s.label) || "";
200
+ const i = this.options.find((r) => r.value === t), a = (i == null ? void 0 : i.label) || "";
201
201
  this.hideOptions(), this.value = t, this.updateInputValue();
202
- const o = (i = this.shadowRoot) == null ? void 0 : i.querySelector("#live-status");
202
+ const o = (s = this.shadowRoot) == null ? void 0 : s.querySelector("#live-status");
203
203
  o && (o.textContent = `Selected: ${a}`), this.dispatchEvent(new CustomEvent("change", { detail: { value: t }, bubbles: !0, composed: !0 }));
204
204
  }
205
205
  }
@@ -211,20 +211,20 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
211
211
  return (t = this.inputRef.value) == null ? void 0 : t.reportValidity();
212
212
  }
213
213
  handleTouchStart(t) {
214
- var e, i;
215
- this.startY = ((i = (e = t.touches) == null ? void 0 : e[0]) == null ? void 0 : i.clientY) ?? 0;
214
+ var e, s;
215
+ this.startY = ((s = (e = t.touches) == null ? void 0 : e[0]) == null ? void 0 : s.clientY) ?? 0;
216
216
  }
217
217
  preventScroll(t) {
218
218
  var o, r;
219
219
  const e = t.target;
220
220
  if (!this.optionsContainer.contains(e)) return;
221
- const i = this.optionsContainer.scrollTop, s = this.optionsContainer.scrollHeight - this.optionsContainer.offsetHeight, a = ((r = (o = t.touches) == null ? void 0 : o[0]) == null ? void 0 : r.clientY) ?? 0;
222
- (i <= 0 && a > this.startY || i >= s && a < this.startY) && t.preventDefault();
221
+ const s = this.optionsContainer.scrollTop, i = this.optionsContainer.scrollHeight - this.optionsContainer.offsetHeight, a = ((r = (o = t.touches) == null ? void 0 : o[0]) == null ? void 0 : r.clientY) ?? 0;
222
+ (s <= 0 && a > this.startY || s >= i && a < this.startY) && t.preventDefault();
223
223
  }
224
224
  focusOption(t, e) {
225
225
  if (!t.length) return;
226
- const i = t[e];
227
- i && (i.focus(), this.input.setAttribute("aria-activedescendant", i.id), i.scrollIntoView && i.scrollIntoView({ block: "nearest" }));
226
+ const s = t[e];
227
+ s && (s.focus(), this.input.setAttribute("aria-activedescendant", s.id), s.scrollIntoView && s.scrollIntoView({ block: "nearest" }));
228
228
  }
229
229
  render() {
230
230
  const t = `${this.id}-desc`;
@@ -238,7 +238,8 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
238
238
 
239
239
  <!-- The trigger slot (if any) overrides the default SchmancyInput -->
240
240
  <slot name="trigger">
241
- <schmancy-input
241
+ <sch-input
242
+ .autocomplete=${this.autocomplete}
242
243
  ${N(this.inputRef)}
243
244
  id="input"
244
245
  class="w-full"
@@ -258,7 +259,7 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
258
259
  @focus=${() => this.showOptions()}
259
260
  @change=${this.handleInputChange}
260
261
  >
261
- </schmancy-input>
262
+ </sch-input>
262
263
  </slot>
263
264
 
264
265
  <ul
@@ -270,9 +271,9 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
270
271
  aria-label=${`${this.label || "Options"} dropdown`}
271
272
  hidden
272
273
  @click=${(e) => {
273
- var s;
274
- const i = (s = e.detail) == null ? void 0 : s.value;
275
- i && this.handleOptionClick(i);
274
+ var i;
275
+ const s = (i = e.detail) == null ? void 0 : i.value;
276
+ s && this.handleOptionClick(s);
276
277
  }}
277
278
  @touchstart=${this.handleTouchStart}
278
279
  @touchmove=${this.preventScroll}
@@ -290,5 +291,5 @@ let p = class extends M(":host{display:block;border:unset!important;line-height:
290
291
  `;
291
292
  }
292
293
  };
293
- u([g({ type: Boolean })], p.prototype, "required", 2), u([g({ type: String })], p.prototype, "placeholder", 2), u([g({ type: String, reflect: !0 })], p.prototype, "value", 2), u([g({ type: String, reflect: !0 })], p.prototype, "label", 2), u([g({ type: String })], p.prototype, "maxHeight", 2), u([g({ type: Boolean })], p.prototype, "multi", 2), u([g({ type: String })], p.prototype, "description", 2), u([w("#options")], p.prototype, "optionsContainer", 2), u([w("#empty")], p.prototype, "empty", 2), u([w("schmancy-input")], p.prototype, "input", 2), u([H({ flatten: !0 })], p.prototype, "options", 2), u([g({ type: Boolean, reflect: !0 })], p.prototype, "isOpen", 2), u([R({ passive: !0 })], p.prototype, "handleOptionClick", 1), p = u([Y("schmancy-autocomplete")], p);
294
- //# sourceMappingURL=autocomplete-Bbi68nzP.js.map
294
+ c([y({ type: Boolean })], h.prototype, "required", 2), c([y({ type: String })], h.prototype, "placeholder", 2), c([y({ type: String, reflect: !0 })], h.prototype, "value", 2), c([y({ type: String, reflect: !0 })], h.prototype, "label", 2), c([y({ type: String })], h.prototype, "maxHeight", 2), c([y({ type: Boolean })], h.prototype, "multi", 2), c([y({ type: String })], h.prototype, "description", 2), c([w("#options")], h.prototype, "optionsContainer", 2), c([w("#empty")], h.prototype, "empty", 2), c([w("sch-input")], h.prototype, "input", 2), c([H({ flatten: !0 })], h.prototype, "options", 2), c([y({ type: Boolean, reflect: !0 })], h.prototype, "isOpen", 2), c([y({ type: String, reflect: !0 })], h.prototype, "autocomplete", 2), c([R({ passive: !0 })], h.prototype, "handleOptionClick", 1), h = c([Y("schmancy-autocomplete")], h);
295
+ //# sourceMappingURL=autocomplete-DzBhZOVS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete-DzBhZOVS.js","sources":["../src/utils/search.ts","../src/autocomplete/autocomplete.ts"],"sourcesContent":["/**\n * Calculate similarity score between two strings.\n * Returns a value between 0 (no match) and 1 (exact match).\n * Includes all similarity methods from the original filter directive.\n *\n * @param query The search query string\n * @param target The target string to compare against\n * @returns A similarity score from 0 to 1\n */\nexport function similarity(query: string, target: string): number {\n\t// Handle edge cases\n\tif (!query || !target) return 0\n\tif (query === target) return 1\n\n\t// Normalize strings for comparison\n\tconst normalizedQuery = query.toLowerCase().trim()\n\tconst normalizedTarget = target.toLowerCase().trim()\n\n\t// Simple exact match check\n\tif (normalizedQuery === normalizedTarget) return 1\n\n\t// Calculate different similarity metrics using all methods from the original filter\n\n\t// 1. Direct substring match\n\tconst substringScore = normalizedTarget.includes(normalizedQuery) ? 1 : 0\n\n\t// 2. Subsequence check\n\tconst subsequenceScore = isSubsequence(normalizedQuery, normalizedTarget) ? 0.8 : 0\n\n\t// 3. Anagram/character frequency match\n\tconst anagramScore = hasAllCharacters(normalizedQuery, normalizedTarget) ? 0.7 : 0\n\n\t// 4. Dice coefficient based on bigrams\n\tconst diceScore = diceCoefficient(normalizedQuery, normalizedTarget)\n\n\t// 5. Levenshtein distance\n\tconst maxLength = Math.max(normalizedQuery.length, normalizedTarget.length)\n\tconst levenshteinDistance = calculateLevenshtein(normalizedQuery, normalizedTarget)\n\tconst levenshteinScore = maxLength ? 1 - levenshteinDistance / maxLength : 0\n\n\t// Return the maximum score from all methods\n\treturn Math.max(substringScore, subsequenceScore, anagramScore, diceScore, levenshteinScore)\n}\n\n/**\n * Check if string 'sub' is a subsequence of string 'str'.\n * All characters in 'sub' must appear in order in 'str'.\n */\nfunction isSubsequence(sub: string, str: string): boolean {\n\tlet i = 0,\n\t\tj = 0\n\twhile (i < sub.length && j < str.length) {\n\t\tif (sub[i] === str[j]) i++\n\t\tj++\n\t}\n\treturn i === sub.length\n}\n\n/**\n * Check if all characters in 'query' are present in 'target'.\n * For example, \"aovc\" matches \"avocados\" (anagram subset matching).\n */\nfunction hasAllCharacters(query: string, target: string): boolean {\n\tconst countChars = (s: string): Record<string, number> => {\n\t\treturn s.split('').reduce(\n\t\t\t(acc, char) => {\n\t\t\t\tacc[char] = (acc[char] || 0) + 1\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{} as Record<string, number>,\n\t\t)\n\t}\n\n\tconst queryCount = countChars(query)\n\tconst targetCount = countChars(target)\n\n\treturn Object.keys(queryCount).every(char => (targetCount[char] || 0) >= queryCount[char])\n}\n\n/**\n * Generate bigrams for a string.\n * A bigram is a sequence of two adjacent characters.\n */\nfunction getBigrams(s: string): string[] {\n\tconst bigrams = []\n\tfor (let i = 0; i < s.length - 1; i++) {\n\t\tbigrams.push(s.substring(i, i + 2))\n\t}\n\treturn bigrams\n}\n\n/**\n * Compute Dice's coefficient for two strings based on bigrams.\n * Returns a value between 0 (no similarity) and 1 (perfect match).\n */\nfunction diceCoefficient(s1: string, s2: string): number {\n\tif (s1.length < 2 || s2.length < 2) return 0\n\n\tconst bigrams1 = getBigrams(s1)\n\tconst bigrams2 = getBigrams(s2)\n\n\tlet intersection = 0\n\tconst used = new Array(bigrams2.length).fill(false)\n\n\tfor (const bigram of bigrams1) {\n\t\tfor (let i = 0; i < bigrams2.length; i++) {\n\t\t\tif (!used[i] && bigrams2[i] === bigram) {\n\t\t\t\tintersection++\n\t\t\t\tused[i] = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn (2 * intersection) / (bigrams1.length + bigrams2.length)\n}\n\n/**\n * Calculate Levenshtein distance between two strings.\n */\nfunction calculateLevenshtein(a: string, b: string): number {\n\tif (a.length === 0) return b.length\n\tif (b.length === 0) return a.length\n\n\tconst matrix: number[][] = []\n\n\t// Initialize the matrix\n\tfor (let i = 0; i <= b.length; i++) {\n\t\tmatrix[i] = [i]\n\t}\n\tfor (let j = 0; j <= a.length; j++) {\n\t\tmatrix[0][j] = j\n\t}\n\n\t// Calculate distances\n\tfor (let i = 1; i <= b.length; i++) {\n\t\tfor (let j = 1; j <= a.length; j++) {\n\t\t\tconst cost = a[j - 1] === b[i - 1] ? 0 : 1\n\t\t\tmatrix[i][j] = Math.min(\n\t\t\t\tmatrix[i - 1][j] + 1, // deletion\n\t\t\t\tmatrix[i][j - 1] + 1, // insertion\n\t\t\t\tmatrix[i - 1][j - 1] + cost, // substitution\n\t\t\t)\n\t\t}\n\t}\n\n\treturn matrix[b.length][a.length]\n}\n","import { computePosition, offset, shift, size } from '@floating-ui/dom'\nimport { $LitElement } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport SchmancyInput from '@schmancy/input/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { html } from 'lit'\nimport { customElement, eventOptions, property, query, queryAssignedElements } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { from, fromEvent, Subject } from 'rxjs'\nimport { distinctUntilChanged, filter, switchMap, takeUntil, tap } from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\nimport type { SchmancyInputInputEvent } from '@schmancy/input/input'\nimport { similarity } from '@schmancy/utils/search'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n\tvalue: string | string[]\n}>\n\n/**\n * The SchmancyAutocomplete component provides an accessible autocomplete field with keyboard navigation.\n * @element schmancy-autocomplete\n * @fires change - Emitted when a selection is made\n * @slot - Default slot for schmancy-option elements\n * @slot trigger - Optional slot to override the default input\n */\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends $LitElement(style) {\n\t// Public API properties\n\t@property({ type: Boolean }) required = false\n\t@property({ type: String }) placeholder = ''\n\t@property({ type: String, reflect: true }) value = ''\n\t@property({ type: String, reflect: true }) label = ''\n\t@property({ type: String }) maxHeight = '25vh'\n\t@property({ type: Boolean }) multi = false\n\n\t/**\n\t * Optional description for the autocomplete to improve accessibility.\n\t * Will be associated with the input via aria-describedby.\n\t */\n\t@property({ type: String }) description = ''\n\n\t/** Direct reference to the <input> inside <sch-input> */\n\tinputRef = createRef<HTMLInputElement>()\n\n\t// Query selectors for elements in the shadow DOM\n\t@query('#options') private optionsContainer!: HTMLUListElement\n\t@query('#empty') private empty!: HTMLLIElement\n\t@query('sch-input') private input!: SchmancyInput\n\t@queryAssignedElements({ flatten: true }) private options!: SchmancyOption[]\n\n\t// Subject for search term changes\n\tprivate readonly searchTerm$ = new Subject<string>()\n\n\t// Flag to track dropdown state\n\t@property({ type: Boolean, reflect: true }) isOpen = false\n\n\t/** Autocomplete/autofill hints. */\n\t@property({ type: String, reflect: true })\n\tpublic autocomplete: AutoFill = 'on'\n\n\t// iOS scroll-blocking logic\n\tprivate startY = 0\n\n\t// Store status message for screen readers\n\tprivate statusMessage = ''\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Ensure the component has an ID (used for generating option IDs)\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-autocomplete-${Math.random().toString(36).substr(2, 9)}`\n\t\t}\n\n\t\t// Listen for keydown events on the input to enable keyboard navigation\n\t\tfromEvent(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe({\n\t\t\t\tnext: (e: KeyboardEvent) => {\n\t\t\t\t\tthis.handleKeyDown(e)\n\t\t\t\t},\n\t\t\t})\n\n\t\t// Search filtering logic\n\t\tthis.searchTerm$\n\t\t\t.pipe(\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(term => {\n\t\t\t\t\tconst searchTerm = term.trim().toLowerCase()\n\n\t\t\t\t\t// Filter options using Levenshtein distance\n\t\t\t\t\tconst matches = this.options\n\t\t\t\t\t\t.map(option => {\n\t\t\t\t\t\t\tconst optionText = (option.label || option.textContent || '').toLowerCase()\n\t\t\t\t\t\t\tconst score = similarity(searchTerm, optionText)\n\t\t\t\t\t\t\treturn { option, score }\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.filter(({ score }) => {\n\t\t\t\t\t\t\t// For short search terms, be lenient\n\t\t\t\t\t\t\treturn score > 0.8\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => a.score - b.score)\n\n\t\t\t\t\t// Show/hide options based on filtering\n\t\t\t\t\tthis.options.forEach(o => (o.hidden = true))\n\t\t\t\t\tfor (const { option } of matches) {\n\t\t\t\t\t\toption.hidden = false\n\t\t\t\t\t}\n\n\t\t\t\t\t// \"No results found\"\n\t\t\t\t\tthis.empty.hidden = matches.length > 0\n\n\t\t\t\t\t// Update status message for screen readers\n\t\t\t\t\tthis.statusMessage =\n\t\t\t\t\t\tmatches.length > 0\n\t\t\t\t\t\t\t? `${matches.length} option${matches.length === 1 ? '' : 's'} available.`\n\t\t\t\t\t\t\t: 'No results found.'\n\n\t\t\t\t\t// Update the live region to announce the results\n\t\t\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\t\t\tif (liveRegion) {\n\t\t\t\t\t\tliveRegion.textContent = this.statusMessage\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update accessibility attributes on options\n\t\t\t\t\tthis.setupOptionsAccessibility()\n\n\t\t\t\t\tthis.requestUpdate()\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\t// Show dropdown on each new search term\n\t\t\t\tthis.showOptions()\n\t\t\t})\n\n\t\t// Focus-out animation (fade out)\n\t\tfromEvent<FocusEvent>(this, 'focusout')\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t\tfilter(e => {\n\t\t\t\t\t// Don't close if focus moved to an option\n\t\t\t\t\tconst relatedTarget = e.relatedTarget as Element\n\t\t\t\t\treturn !this.contains(relatedTarget) && relatedTarget?.tagName !== 'SCHMANCY-OPTION'\n\t\t\t\t}),\n\t\t\t\tswitchMap(() => {\n\t\t\t\t\t// reset options to show all\n\t\t\t\t\tthis.options.forEach(o => (o.hidden = false))\n\t\t\t\t\tconst animation = this.optionsContainer.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\t\t\tduration: 150,\n\t\t\t\t\t\teasing: 'cubic-bezier(0.5, 0.01, 0.25, 1)',\n\t\t\t\t\t})\n\t\t\t\t\treturn from(\n\t\t\t\t\t\tnew Promise<void>(resolve => {\n\t\t\t\t\t\t\tanimation.onfinish = () => {\n\t\t\t\t\t\t\t\tthis.optionsContainer.style.display = 'none'\n\t\t\t\t\t\t\t\tthis.optionsContainer.style.opacity = '1'\n\t\t\t\t\t\t\t\tthis.isOpen = false\n\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: () => {\n\t\t\t\t\t// After closing, resync the input's value\n\t\t\t\t\tif (this.multi) {\n\t\t\t\t\t\tconst selected = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\t\t\t\tthis.input.value = selected.join(', ')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.input.value = this.options.find(o => o.value === this.value)?.label ?? ''\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t}\n\n\tfirstUpdated() {\n\t\tthis.updateInputValue()\n\t}\n\n\tprotected updated(changedProps: Map<string | number | symbol, unknown>) {\n\t\tsuper.updated(changedProps)\n\t\tif (changedProps.has('value')) {\n\t\t\tthis.syncSelectionFromValue()\n\t\t\tthis.updateInputValue()\n\t\t}\n\t}\n\n\t/**\n\t * When the <slot> changes (i.e. options are added/removed), update the following:\n\t * 1. Show or hide the \"No results found\" option.\n\t * 2. Sync the selection state.\n\t * 3. Setup accessibility attributes on the options.\n\t */\n\tprivate handleSlotChange() {\n\t\tthis.empty.hidden = this.options.some(option => !option.hidden)\n\t\tthis.syncSelectionFromValue()\n\t\tthis.updateInputValue()\n\t\tthis.setupOptionsAccessibility()\n\t}\n\n\t/**\n\t * Loops through assigned options and sets accessibility attributes:\n\t * - role=\"option\"\n\t * - A unique ID (if not already set)\n\t * - tabindex=\"-1\"\n\t * - aria-selected (based on whether the option is selected)\n\t */\n\tprivate setupOptionsAccessibility() {\n\t\tthis.options.forEach((option, index) => {\n\t\t\toption.setAttribute('role', 'option')\n\t\t\tif (!option.id) {\n\t\t\t\toption.id = `${this.id}-option-${index}`\n\t\t\t}\n\t\t\toption.tabIndex = -1\n\t\t\toption.setAttribute('aria-selected', String(this.multi ? option.selected : option.value === this.value))\n\t\t})\n\t}\n\n\tprivate syncSelectionFromValue() {\n\t\tif (this.multi) {\n\t\t\tconst values = this.value\n\t\t\t\t.split(',')\n\t\t\t\t.map(v => v.trim())\n\t\t\t\t.filter(Boolean)\n\t\t\tthis.options.forEach(o => {\n\t\t\t\to.selected = values.includes(o.value)\n\t\t\t})\n\t\t} else {\n\t\t\tthis.options.forEach(o => {\n\t\t\t\to.selected = o.value === this.value\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate updateInputValue() {\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.multi) {\n\t\t\t\tconst selected = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\t\tthis.input.value = selected.join(', ')\n\t\t\t} else {\n\t\t\t\tconst found = this.options.find(o => o.value === this.value)?.label\n\t\t\t\tthis.input.value = found ?? ''\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t * MAIN: Show the dropdown. Uses Floating UI to position and size the options container.\n\t */\n\tprivate async showOptions() {\n\t\tif (!this.optionsContainer) return\n\n\t\tthis.optionsContainer.removeAttribute('hidden')\n\t\tthis.optionsContainer.style.display = 'block'\n\t\tthis.isOpen = true\n\n\t\tconst { x, y } = await computePosition(this.input, this.optionsContainer, {\n\t\t\tplacement: 'bottom-start',\n\t\t\tmiddleware: [\n\t\t\t\toffset(5),\n\t\t\t\tshift({ padding: 5 }),\n\t\t\t\tsize({\n\t\t\t\t\tapply({ availableWidth, availableHeight, elements, rects }) {\n\t\t\t\t\t\t// At least match input width\n\t\t\t\t\t\tconst referenceWidth = rects.reference.width\n\t\t\t\t\t\telements.floating.style.minWidth = `${referenceWidth}px`\n\t\t\t\t\t\t// Cap to available viewport space\n\t\t\t\t\t\telements.floating.style.maxWidth = `${availableWidth}px`\n\t\t\t\t\t\telements.floating.style.maxHeight = `${availableHeight}px`\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t})\n\n\t\tObject.assign(this.optionsContainer.style, {\n\t\t\tleft: `${x}px`,\n\t\t\ttop: `${y}px`,\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '9999',\n\t\t\toverflowY: 'auto',\n\t\t})\n\t}\n\n\tprivate hideOptions() {\n\t\tthis.optionsContainer?.setAttribute('hidden', 'true')\n\t\tif (this.optionsContainer) {\n\t\t\tthis.optionsContainer.style.display = 'none'\n\t\t}\n\t\tthis.isOpen = false\n\n\t\t// Announce that the dropdown is closed to screen readers\n\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\tif (liveRegion) {\n\t\t\tliveRegion.textContent = 'Dropdown closed.'\n\t\t}\n\t}\n\n\tprivate handleInputChange(event: SchmancyInputInputEvent) {\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t\tconst term = event.detail.value\n\t\tthis.searchTerm$.next(term)\n\t}\n\n\t@eventOptions({ passive: true })\n\tprivate handleOptionClick(value: string) {\n\t\tif (this.multi) {\n\t\t\tconst option = this.options.find(o => o.value === value)\n\t\t\tif (option) option.selected = !option.selected\n\t\t\tconst selectedValues = this.options.filter(o => o.selected).map(o => o.value)\n\t\t\tthis.value = selectedValues.join(',')\n\t\t\tthis.updateInputValue()\n\n\t\t\t// Announce selection to screen readers\n\t\t\tconst selectedLabels = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\tconst announcement = selectedLabels.length > 0 ? `Selected: ${selectedLabels.join(', ')}` : 'No options selected'\n\n\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\tif (liveRegion) {\n\t\t\t\tliveRegion.textContent = announcement\n\t\t\t}\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n\t\t\t\t\tdetail: { value: selectedValues },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t} else {\n\t\t\tconst selectedOption = this.options.find(o => o.value === value)\n\t\t\tconst selectedLabel = selectedOption?.label || ''\n\n\t\t\tthis.hideOptions()\n\t\t\tthis.value = value\n\t\t\tthis.updateInputValue()\n\n\t\t\t// Announce selection to screen readers\n\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\tif (liveRegion) {\n\t\t\t\tliveRegion.textContent = `Selected: ${selectedLabel}`\n\t\t\t}\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n\t\t\t\t\tdetail: { value },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic checkValidity() {\n\t\treturn this.multi ? this.options.some(o => o.selected) : Boolean(this.value)\n\t}\n\n\tpublic reportValidity() {\n\t\treturn this.inputRef.value?.reportValidity()\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent) {\n\t\tthis.startY = event.touches?.[0]?.clientY ?? 0\n\t}\n\n\tprivate preventScroll(event: TouchEvent) {\n\t\tconst target = event.target as HTMLElement\n\t\tif (!this.optionsContainer.contains(target)) return\n\n\t\tconst scrollTop = this.optionsContainer.scrollTop\n\t\tconst scrollHeight = this.optionsContainer.scrollHeight\n\t\tconst offsetHeight = this.optionsContainer.offsetHeight\n\t\tconst contentHeight = scrollHeight - offsetHeight\n\n\t\tconst currentY = event.touches?.[0]?.clientY ?? 0\n\t\tif ((scrollTop <= 0 && currentY > this.startY) || (scrollTop >= contentHeight && currentY < this.startY)) {\n\t\t\tevent.preventDefault()\n\t\t}\n\t}\n\n\t/**\n\t * Keyboard navigation for the autocomplete.\n\t * – When the dropdown is closed, ArrowDown (or Enter/Space) opens it.\n\t * – When open, ArrowDown/ArrowUp move focus between options (which must have role=\"option\").\n\t * – Enter or Space selects the active option.\n\t * – Escape (or Tab) hides the dropdown.\n\t * - Home/End to navigate to first/last option\n\t */\n\tprivate handleKeyDown = (e: KeyboardEvent) => {\n\t\t// Get the visible options (i.e. those not hidden)\n\t\tconst options = this.options.filter(o => !o.hidden)\n\n\t\t// If the dropdown is closed, open it on Enter, Space, or ArrowDown\n\t\tif (!this.isOpen) {\n\t\t\tif (['Enter', 'ArrowDown'].includes(e.key)) {\n\t\t\t\t// Removed ' ' (space) here\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.showOptions().then(() => {\n\t\t\t\t\tif (options.length > 0) {\n\t\t\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Dropdown is open; determine the currently focused option\n\t\tlet currentIndex = options.findIndex(o => o.matches(':focus'))\n\t\tif (currentIndex === -1) {\n\t\t\t// If no option is focused, default to the first\n\t\t\tcurrentIndex = 0\n\t\t}\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.hideOptions()\n\t\t\t\tthis.input.focus()\n\t\t\t\tbreak\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.min(currentIndex + 1, options.length - 1))\n\t\t\t\tbreak\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.max(currentIndex - 1, 0))\n\t\t\t\tbreak\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\tbreak\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, options.length - 1)\n\t\t\t\tbreak\n\t\t\tcase 'Enter': // Removed ' ' (space) case here\n\t\t\t\te.preventDefault()\n\t\t\t\tif (options[currentIndex]) {\n\t\t\t\t\tconst value = options[currentIndex].getAttribute('data-value') || options[currentIndex].getAttribute('value')\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tthis.handleOptionClick(value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'Tab':\n\t\t\t\t// Close the dropdown on Tab\n\t\t\t\tthis.hideOptions()\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\t// For letter key presses, find and focus the first option that starts with that letter\n\t\t\t\tif (e.key.length === 1 && /[a-zA-Z0-9]/.test(e.key)) {\n\t\t\t\t\tconst searchKey = e.key.toLowerCase()\n\t\t\t\t\tconst matchIndex = options.findIndex(option =>\n\t\t\t\t\t\t(option.label || option.textContent || '').toLowerCase().startsWith(searchKey),\n\t\t\t\t\t)\n\n\t\t\t\t\tif (matchIndex !== -1) {\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\tthis.focusOption(options, matchIndex)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * Helper to focus an option by index and update the combobox's aria-activedescendant.\n\t */\n\tprivate focusOption(options: HTMLElement[], index: number) {\n\t\tif (!options.length) return\n\n\t\tconst option = options[index]\n\t\tif (option) {\n\t\t\toption.focus()\n\t\t\t// Update the input's aria-activedescendant to match the newly focused option\n\t\t\tthis.input.setAttribute('aria-activedescendant', option.id)\n\n\t\t\t// Ensure the focused option is visible in the dropdown (scroll if needed)\n\t\t\tif (option.scrollIntoView) {\n\t\t\t\toption.scrollIntoView({ block: 'nearest' })\n\t\t\t}\n\t\t}\n\t}\n\n\trender() {\n\t\t// Create a unique ID for the description\n\t\tconst descriptionId = `${this.id}-desc`\n\n\t\treturn html`\n\t\t\t<div class=\"relative\">\n\t\t\t\t<!-- Live region for screen reader announcements -->\n\t\t\t\t<div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n\t\t\t\t<!-- Optional description for the autocomplete -->\n\t\t\t\t${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n\t\t\t\t<!-- The trigger slot (if any) overrides the default SchmancyInput -->\n\t\t\t\t<slot name=\"trigger\">\n\t\t\t\t\t<sch-input\n\t\t\t\t\t\t.autocomplete=${this.autocomplete}\n\t\t\t\t\t\t${ref(this.inputRef)}\n\t\t\t\t\t\tid=\"input\"\n\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t.label=${this.label}\n\t\t\t\t\t\t.placeholder=${this.placeholder}\n\t\t\t\t\t\t.required=${this.required}\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tinputmode=\"text\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\tclickable\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\taria-controls=\"options\"\n\t\t\t\t\t\taria-expanded=${this.isOpen}\n\t\t\t\t\t\taria-describedby=${this.description ? descriptionId : undefined}\n\t\t\t\t\t\t@focus=${() => this.showOptions()}\n\t\t\t\t\t\t@change=${this.handleInputChange}\n\t\t\t\t\t>\n\t\t\t\t\t</sch-input>\n\t\t\t\t</slot>\n\n\t\t\t\t<ul\n\t\t\t\t\tid=\"options\"\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\tclass=\"absolute z-30 mt-1 w-full overflow-auto rounded-md shadow-sm\"\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=${this.multi ? 'true' : 'false'}\n\t\t\t\t\taria-label=${`${this.label || 'Options'} dropdown`}\n\t\t\t\t\thidden\n\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t// Each <schmancy-option> should dispatch a CustomEvent('click', { detail: { value } })\n\t\t\t\t\t\tconst detailVal = (e as CustomEvent).detail?.value\n\t\t\t\t\t\tif (detailVal) this.handleOptionClick(detailVal)\n\t\t\t\t\t}}\n\t\t\t\t\t@touchstart=${this.handleTouchStart}\n\t\t\t\t\t@touchmove=${this.preventScroll}\n\t\t\t\t\t${color({ bgColor: SchmancyTheme.sys.color.surface.container })}\n\t\t\t\t\t@slotchange=${this.handleSlotChange}\n\t\t\t\t>\n\t\t\t\t\t<!-- \"No results\" option -->\n\t\t\t\t\t<li id=\"empty\" tabindex=\"-1\" role=\"option\" aria-disabled=\"true\" class=\"p-2 text-center\">\n\t\t\t\t\t\t<schmancy-typography type=\"label\">No results found</schmancy-typography>\n\t\t\t\t\t</li>\n\t\t\t\t\t<!-- Slot for the <schmancy-option> elements -->\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-autocomplete': SchmancyAutocomplete\n\t}\n}\n"],"names":["similarity","query","target","normalizedQuery","toLowerCase","trim","normalizedTarget","substringScore","includes","subsequenceScore","sub","str","i","j","length","anagramScore","countChars","s","split","reduce","acc","char","queryCount","targetCount","Object","keys","every","diceScore","s1","s2","bigrams1","getBigrams","bigrams2","intersection","used","Array","fill","bigram","maxLength","Math","max","levenshteinDistance","a","b","matrix","cost","min","levenshteinScore","bigrams","push","substring","SchmancyAutocomplete","$LitElement","super","arguments","this","required","placeholder","value","label","maxHeight","multi","description","inputRef","createRef","searchTerm$","Subject","isOpen","autocomplete","startY","statusMessage","handleKeyDown","e","options","filter","o","hidden","key","preventDefault","showOptions","then","focusOption","currentIndex","findIndex","matches","hideOptions","input","focus","getAttribute","handleOptionClick","test","searchKey","matchIndex","option","textContent","startsWith","connectedCallback","id","random","toString","substr","fromEvent","pipe","takeUntil","disconnecting","subscribe","next","distinctUntilChanged","tap","term","searchTerm","map","optionText","score","sort","forEach","empty","liveRegion","shadowRoot","querySelector","setupOptionsAccessibility","requestUpdate","relatedTarget","contains","tagName","switchMap","animation","optionsContainer","animate","opacity","duration","easing","from","Promise","resolve","onfinish","style","display","selected","join","find","firstUpdated","updateInputValue","changedProps","updated","has","syncSelectionFromValue","handleSlotChange","some","index","setAttribute","tabIndex","String","values","v","Boolean","requestAnimationFrame","found","removeAttribute","x","y","computePosition","placement","middleware","offset","shift","padding","size","apply","availableWidth","availableHeight","elements","rects","referenceWidth","reference","width","floating","minWidth","maxWidth","assign","left","top","position","zIndex","overflowY","event","stopPropagation","detail","selectedValues","selectedLabels","announcement","dispatchEvent","CustomEvent","bubbles","composed","selectedOption","selectedLabel","reportValidity","touches","clientY","scrollTop","contentHeight","scrollHeight","offsetHeight","currentY","scrollIntoView","block","descriptionId","html","ref","handleInputChange","detailVal","handleTouchStart","preventScroll","color","bgColor","SchmancyTheme","sys","surface","container","__decorateClass","property","type","prototype","reflect","queryAssignedElements","flatten","eventOptions","passive","customElement"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";require("./autocomplete-DEUfHcCH.cjs");
1
+ "use strict";require("./autocomplete-CVTRldW1.cjs");
2
2
  //# sourceMappingURL=autocomplete.cjs.map
@@ -1,2 +1,2 @@
1
- import "./autocomplete-Bbi68nzP.js";
1
+ import "./autocomplete-DzBhZOVS.js";
2
2
  //# sourceMappingURL=autocomplete.js.map
package/dist/card.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";require("./teleport.component-BB820TxP.cjs");
1
+ "use strict";require("./teleport.component-72oIW654.cjs");
2
2
  //# sourceMappingURL=card.cjs.map
package/dist/card.js CHANGED
@@ -1,2 +1,2 @@
1
- import "./teleport.component-aomutiMW.js";
1
+ import "./teleport.component-vWzkjwaD.js";
2
2
  //# sourceMappingURL=card.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./teleport.component-BB820TxP.cjs");Object.defineProperty(exports,"SchmancyContentDrawer",{enumerable:!0,get:()=>e.SchmancyContentDrawer}),exports.SchmancyContentDrawerID=e.SchmancyContentDrawerID,Object.defineProperty(exports,"SchmancyContentDrawerMain",{enumerable:!0,get:()=>e.SchmancyContentDrawerMain}),exports.SchmancyContentDrawerMaxHeight=e.SchmancyContentDrawerMaxHeight,exports.SchmancyContentDrawerMinWidth=e.SchmancyContentDrawerMinWidth,Object.defineProperty(exports,"SchmancyContentDrawerSheet",{enumerable:!0,get:()=>e.SchmancyContentDrawerSheet}),exports.SchmancyContentDrawerSheetMode=e.SchmancyContentDrawerSheetMode,exports.SchmancyContentDrawerSheetState=e.SchmancyContentDrawerSheetState,exports.schmancyContentDrawer=e.schmancyContentDrawer;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./teleport.component-72oIW654.cjs");Object.defineProperty(exports,"SchmancyContentDrawer",{enumerable:!0,get:()=>e.SchmancyContentDrawer}),exports.SchmancyContentDrawerID=e.SchmancyContentDrawerID,Object.defineProperty(exports,"SchmancyContentDrawerMain",{enumerable:!0,get:()=>e.SchmancyContentDrawerMain}),exports.SchmancyContentDrawerMaxHeight=e.SchmancyContentDrawerMaxHeight,exports.SchmancyContentDrawerMinWidth=e.SchmancyContentDrawerMinWidth,Object.defineProperty(exports,"SchmancyContentDrawerSheet",{enumerable:!0,get:()=>e.SchmancyContentDrawerSheet}),exports.SchmancyContentDrawerSheetMode=e.SchmancyContentDrawerSheetMode,exports.SchmancyContentDrawerSheetState=e.SchmancyContentDrawerSheetState,exports.schmancyContentDrawer=e.schmancyContentDrawer;
2
2
  //# sourceMappingURL=content-drawer.cjs.map
@@ -1,4 +1,4 @@
1
- import { e as n, b as t, f as r, c, d as h, g as S, S as o, a as s, s as m } from "./teleport.component-aomutiMW.js";
1
+ import { e as n, b as t, f as r, c, d as h, g as S, S as o, a as s, s as m } from "./teleport.component-vWzkjwaD.js";
2
2
  export {
3
3
  n as SchmancyContentDrawer,
4
4
  t as SchmancyContentDrawerID,