@magicx-eng/ai-autocomplete-vanilla 0.5.5 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/index.d.mts +14 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.js +139 -37
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +139 -37
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -374,11 +374,12 @@ Override these on the container element. All built-in defaults use `:where()` (z
|
|
|
374
374
|
| `--aia-shadow` | `inset 0 1px 0 rgba(255,255,255,0.9), 0 1px 2px rgba(16,24,40,0.1), 0 8px 24px rgba(16,24,40,0.16)` | `inset 0 1px 0 rgba(255,255,255,0.06), 0 1px 2px rgba(0,0,0,0.4), 0 8px 24px rgba(0,0,0,0.5)` | Input container elevation (box-shadow) |
|
|
375
375
|
| `--aia-dropdown-offset` | `13px` | `13px` | Gap between the input box and the dropdown (the dropdown's margin toward the input). |
|
|
376
376
|
| `--aia-footer-gap` | `8px` | `8px` | Breathing room above the dropdown footer (badge / keyboard hints), additive to the dropdown's 8px section gap. |
|
|
377
|
+
| `--aia-footer-chip-bg` | `--aia-surface` at 65% | `--aia-surface` at 65% | Fill behind the footer's keyboard hint and AI-Autocomplete badge. The option list scrolls under the footer, so this keeps both legible over the row passing behind them. `transparent` on the glass surface. |
|
|
377
378
|
| `--aia-dropdown-bg` | — | — | Optional bg color the dropdown's "glass" rim shadow tints toward. Set this to the page background behind the dropdown so the bottom-corner glow blends seamlessly. |
|
|
378
379
|
| `--aia-scrollbar-thumb` | `rgba(0, 0, 0, 0.3)` | `rgba(0, 0, 0, 0.3)` | Color of the option list's scrollbar thumb (Firefox + WebKit). |
|
|
379
380
|
| `--aia-streak-rgb` | `99, 102, 241` | `255, 255, 255` | Comma-separated RGB triplet used to tint the option-selection streak animation (consumed via `rgba(var(--aia-streak-rgb), …)`). |
|
|
380
381
|
| `--aia-streak-glass-bg` | `rgba(99, 102, 241, 0.1)` | `rgba(255, 255, 255, 0.1)` | Background fill for the streak's glass-pill effect. |
|
|
381
|
-
| `--aia-skeleton-bg` | `rgba(189, 189, 189, 0.
|
|
382
|
+
| `--aia-skeleton-bg` | `rgba(189, 189, 189, 0.25)` | `#1a1b1d` | Fill color for the loading skeleton bars and the masked text in cached pills/options. |
|
|
382
383
|
|
|
383
384
|
### Per-mode Overrides
|
|
384
385
|
|
package/dist/index.d.mts
CHANGED
|
@@ -417,6 +417,19 @@ interface Store<S> {
|
|
|
417
417
|
}
|
|
418
418
|
declare function createStore<S>(initial: S): Store<S>;
|
|
419
419
|
|
|
420
|
+
/** Base URL for the "AI Autocomplete" branding/attribution link in the dropdown footer. */
|
|
421
|
+
declare const ATTRIBUTION_URL = "https://ai-autocomplete.com";
|
|
422
|
+
/**
|
|
423
|
+
* Builds the attribution link URL, appending a `utm_source` query param derived
|
|
424
|
+
* from the current page's hostname. This lets analytics attribute the referral to
|
|
425
|
+
* the embedding site even when that site sends a `no-referrer` policy (which
|
|
426
|
+
* otherwise strips the Referer header and surfaces the visit as `$direct`).
|
|
427
|
+
*
|
|
428
|
+
* Falls back to the bare base URL when there is no browser `location` (SSR /
|
|
429
|
+
* non-browser env) or the hostname can't be read.
|
|
430
|
+
*/
|
|
431
|
+
declare function buildAttributionUrl(base?: string): string;
|
|
432
|
+
|
|
420
433
|
interface BuildQueryResult {
|
|
421
434
|
rawQuery: string;
|
|
422
435
|
completedParams: CompletedParamState[];
|
|
@@ -461,4 +474,4 @@ declare class ModeController {
|
|
|
461
474
|
private detachListener;
|
|
462
475
|
}
|
|
463
476
|
|
|
464
|
-
export { AIAutocomplete, type APIConfig, type APIKeyConfig, type AccessTokenConfig, type AccessTokenResult, type AppearanceMode, type AutocompleteRequest, type AutocompleteResponse, type AutocompleteResult, type CompletedParam, type CompletedParamState, type CoreOptions, type CoreState, type InputItem, ModeController, type OptionOverrides, type RenderMode, type Segment, type Store, type Suggestion, type SuggestionOption, type TaskKind, buildQuery, createStore, cursorIsAtEnd, extractPlainText, getCursorOffset, getFooterHint, plainTextLength, previousGraphemeBoundary, renderEditableContent, setCursorOffset };
|
|
477
|
+
export { AIAutocomplete, type APIConfig, type APIKeyConfig, ATTRIBUTION_URL, type AccessTokenConfig, type AccessTokenResult, type AppearanceMode, type AutocompleteRequest, type AutocompleteResponse, type AutocompleteResult, type CompletedParam, type CompletedParamState, type CoreOptions, type CoreState, type InputItem, ModeController, type OptionOverrides, type RenderMode, type Segment, type Store, type Suggestion, type SuggestionOption, type TaskKind, buildAttributionUrl, buildQuery, createStore, cursorIsAtEnd, extractPlainText, getCursorOffset, getFooterHint, plainTextLength, previousGraphemeBoundary, renderEditableContent, setCursorOffset };
|
package/dist/index.d.ts
CHANGED
|
@@ -417,6 +417,19 @@ interface Store<S> {
|
|
|
417
417
|
}
|
|
418
418
|
declare function createStore<S>(initial: S): Store<S>;
|
|
419
419
|
|
|
420
|
+
/** Base URL for the "AI Autocomplete" branding/attribution link in the dropdown footer. */
|
|
421
|
+
declare const ATTRIBUTION_URL = "https://ai-autocomplete.com";
|
|
422
|
+
/**
|
|
423
|
+
* Builds the attribution link URL, appending a `utm_source` query param derived
|
|
424
|
+
* from the current page's hostname. This lets analytics attribute the referral to
|
|
425
|
+
* the embedding site even when that site sends a `no-referrer` policy (which
|
|
426
|
+
* otherwise strips the Referer header and surfaces the visit as `$direct`).
|
|
427
|
+
*
|
|
428
|
+
* Falls back to the bare base URL when there is no browser `location` (SSR /
|
|
429
|
+
* non-browser env) or the hostname can't be read.
|
|
430
|
+
*/
|
|
431
|
+
declare function buildAttributionUrl(base?: string): string;
|
|
432
|
+
|
|
420
433
|
interface BuildQueryResult {
|
|
421
434
|
rawQuery: string;
|
|
422
435
|
completedParams: CompletedParamState[];
|
|
@@ -461,4 +474,4 @@ declare class ModeController {
|
|
|
461
474
|
private detachListener;
|
|
462
475
|
}
|
|
463
476
|
|
|
464
|
-
export { AIAutocomplete, type APIConfig, type APIKeyConfig, type AccessTokenConfig, type AccessTokenResult, type AppearanceMode, type AutocompleteRequest, type AutocompleteResponse, type AutocompleteResult, type CompletedParam, type CompletedParamState, type CoreOptions, type CoreState, type InputItem, ModeController, type OptionOverrides, type RenderMode, type Segment, type Store, type Suggestion, type SuggestionOption, type TaskKind, buildQuery, createStore, cursorIsAtEnd, extractPlainText, getCursorOffset, getFooterHint, plainTextLength, previousGraphemeBoundary, renderEditableContent, setCursorOffset };
|
|
477
|
+
export { AIAutocomplete, type APIConfig, type APIKeyConfig, ATTRIBUTION_URL, type AccessTokenConfig, type AccessTokenResult, type AppearanceMode, type AutocompleteRequest, type AutocompleteResponse, type AutocompleteResult, type CompletedParam, type CompletedParamState, type CoreOptions, type CoreState, type InputItem, ModeController, type OptionOverrides, type RenderMode, type Segment, type Store, type Suggestion, type SuggestionOption, type TaskKind, buildAttributionUrl, buildQuery, createStore, cursorIsAtEnd, extractPlainText, getCursorOffset, getFooterHint, plainTextLength, previousGraphemeBoundary, renderEditableContent, setCursorOffset };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var re=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var $e=Object.prototype.hasOwnProperty;var Ue=(n,e)=>{for(var t in e)re(n,t,{get:e[t],enumerable:!0})},Ge=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Qe(e))!$e.call(n,o)&&o!==t&&re(n,o,{get:()=>e[o],enumerable:!(i=qe(e,o))||i.enumerable});return n};var We=n=>Ge(re({},"__esModule",{value:!0}),n);var Tt={};Ue(Tt,{AIAutocomplete:()=>oe,ModeController:()=>M,buildQuery:()=>S,createStore:()=>te,cursorIsAtEnd:()=>$,extractPlainText:()=>L,getCursorOffset:()=>C,getFooterHint:()=>z,plainTextLength:()=>Q,previousGraphemeBoundary:()=>U,renderEditableContent:()=>ee,setCursorOffset:()=>P});module.exports=We(Tt);var R=class{constructor(e){this.config=e;this.current=null;this.expiresAt=null;this.inFlightRefresh=null;e.accessToken&&(this.current=e.accessToken)}async getToken(e=!1){if(!e&&this.current&&!this.isExpired())return this.current;if(!e&&this.inFlightRefresh)return this.inFlightRefresh;this.inFlightRefresh=this.refresh();try{return await this.inFlightRefresh}finally{this.inFlightRefresh=null}}async refresh(){let e=await this.config.getAccessToken();return this.current=e.accessToken,this.expiresAt=e.expiresAt??null,this.current}isExpired(){return this.expiresAt==null?!1:Date.now()>=this.expiresAt-3e4}};var je="https://api.ai-autocomplete.com",N=`${je}/api/suggest`,ue=new WeakMap;function k(n){return n?.type==="accessToken"}function Ve(n){if(!(!n||k(n)))return n}function _(n){let e=ue.get(n.getAccessToken);return e||(e=new R(n),ue.set(n.getAccessToken,e)),e}function H(n){return{"Content-Type":"application/json",...n?.appIdentifier&&{"X-App-Identifier":n.appIdentifier},...n?.headers}}function F(n){let e=Ve(n),t=e?.apiKey;return t?(e?.authScheme??"Bearer")==="Basic"?`Basic ${btoa(t)}`:`Bearer ${t}`:null}var ze="0.5.5",me=!1;function Xe(){return crypto.randomUUID()}function Ye(n,e){return{placeholder:n.placeholder,type:n.type,...e&&{text:n.text},kind:n.kind}}function Je(n,e,t,i){let o=e.find(s=>s.type==="contact"&&s.metadata?.contact_account_count)?.metadata?.contact_account_count,r=typeof o=="number"?o:void 0;return{data:{raw_query:n,completed_params:e.map(s=>Ye(s,t)),...r!=null&&{contact_account_count:r}},meta:{request_id:Xe(),request_at:new Date().toISOString(),language:typeof navigator<"u"?navigator.language:"en-US",client_version:ze,session_id:i}}}async function ge(n,e,t,i,o){return fetch(n,{method:"POST",headers:{...e,Authorization:`Bearer ${t}`},body:i,signal:o})}async function fe(n,e,t){let i=t.apiConfig,o=!t.maskCompletedText,r=Je(n,e,o,t.sessionId),s=H(i),a=i?.endpoint??N,c=JSON.stringify(r);if(k(i)){let d=_(i),g=await d.getToken(),h=await ge(a,s,g,c,t.signal);if(h.status===401){let x=await d.getToken(!0);h=await ge(a,s,x,c,t.signal)}if(!h.ok)throw new Error(`API error: ${h.status} ${h.statusText}`);return h.json()}let l=F(i);!l&&!me&&(me=!0,console.warn("[AIAutocomplete] No apiKey in apiConfig. Requests will be sent without an Authorization header.")),l&&(s.Authorization=l);let p=await fetch(a,{method:"POST",headers:s,body:c,signal:t.signal});if(!p.ok)throw new Error(`API error: ${p.status} ${p.statusText}`);return p.json()}function S(n,e){let t=n,i={},o=[];for(let r of e){let s=(i[r.type]??0)+1;i[r.type]=s;let c=`{{${r.type.toUpperCase().replace(/\s+/g,"_")}_${s}}}`,l=t.indexOf(r.text);l!==-1&&(t=t.slice(0,l)+c+t.slice(l+r.text.length)),o.push({...r,placeholder:c})}return{rawQuery:t,completedParams:o}}function I(n,e,t){return e>0||!t?e:n.toLowerCase().startsWith(t.toLowerCase())?t.length:e}function w(n,e,t){let i=n.slice(e);if(t||e===0||n[e-1]===" ")return i;let o=i.indexOf(" ");return o===-1?"":i.slice(o+1)}function he(n,e){let t=n.trimEnd().replace(/\s+/g," ");if(t.length===0||e.length===0)return 0;let i=t.split(" "),o=e.toLowerCase();for(let r=0;r<i.length;r++){let s=i.slice(r).join(" ");if(o.startsWith(s.toLowerCase())){let a=t.length-s.length;return n.length-a}}return 0}function A(n,e){if(!n)return[];let t=e.trimStart();if(!t)return n;let i=t.toLowerCase();return n.filter(o=>!o.is_tappable||o.text.toLowerCase().includes(i))}function O(n,e){if(!n)return null;let t=e.trim();if(!t)return null;let i=t.toLowerCase();return n.find(o=>o.is_tappable&&o.text.toLowerCase()===i)??null}function xe(n,e){return e?n.map(t=>{let i=e[t.type];return i?{...t,options:i("")}:t}):n}var Ze=100,et=300,tt=2,B=class{constructor(e,t,i,o,r,s,a={}){this.store=e;this.getApiConfig=t;this.getOptionOverrides=i;this.getMaskCompletedText=o;this.getOnError=r;this.getSessionId=s;this.callbacks=a;this.fetchVersion=0;this.abortController=null;this.debounceTimer=null;this.slowDebounceTimer=null;this.unsubscribe=null}start(){this.doFetch("",[]);let e=this.store.get().text,t=this.store.get().completedParams;this.unsubscribe=this.store.subscribe(i=>{(i.text!==e||i.completedParams!==t)&&(e=i.text,t=i.completedParams,this.scheduleFetch())})}dispose(){this.abortController?.abort(),this.clearTimers(),this.unsubscribe?.()}async doFetch(e,t){this.abortController?.abort();let i=new AbortController;this.abortController=i;let o=++this.fetchVersion,r=this.store.get().text.length;this.store.set({isLoading:!0,error:null});try{let s=await fe(e,t,{sessionId:this.getSessionId(),maskCompletedText:this.getMaskCompletedText(),signal:i.signal,apiConfig:this.getApiConfig()});if(o!==this.fetchVersion)return;let a=xe(s.data.suggestions??[],this.getOptionOverrides()),c=s.data.input??[],l=c[c.length-1],p=this.store.get().text,d,g;if(l?.state==="in_progress"){g=!0;let b=p.toLowerCase().lastIndexOf(l.text.toLowerCase());d=b!==-1?b:r}else g=!1,d=r;let x=a.filter(b=>b.type!=="placeholder")[0],f=null;if(x){let b=w(p,d,g),m=O(x.options,b);m&&(f={id:crypto.randomUUID(),placeholder:"",type:x.type,text:m.text,kind:m.kind,suggestionType:x.type,suggestionPlaceholder:x.text,options:x.options??[],metadata:m.metadata},a=a.filter(u=>u!==x),this.callbacks.onAutoMatch?.({active:x,matched:m,rawQuery:e}))}this.store.set(b=>({suggestions:a,isLoading:!1,isReady:s.data.is_ready??!1,lastRawQuery:e,activeDropdownIndex:-1,filterBase:d,filterInProgress:g,...f?{completedParams:[...b.completedParams,f]}:{}}))}catch(s){if(o===this.fetchVersion){let a=s instanceof Error?s:new Error(String(s));this.store.set({error:a,isLoading:!1}),this.getOnError()?.(a)}}}scheduleFetch(){if(this.clearTimers(),this.store.get().skipNextFetch){this.store.set({skipNextFetch:!1});return}let t=i=>{let o=this.store.get();if(!o.text&&o.completedParams.length===0)return this.doFetch("",[]),!0;let r=o.suggestions.filter(u=>u.type==="placeholder").map(u=>u.text).join(" "),s=I(o.text,o.filterBase,r),a=w(o.text,s,o.filterInProgress),l=o.suggestions.filter(u=>u.type!=="placeholder")[0],d=(l?A(l.options,a):[]).filter(u=>u.is_tappable),g=l?O(l.options,a)!==null:!1,h=a.trim().length>0;if(d.length>0&&!g&&h||o.completedParams.length===0&&o.text.length>0&&r.length>0&&r.toLowerCase().startsWith(o.text.toLowerCase()))return!1;let{rawQuery:x,completedParams:f}=S(o.text,o.completedParams),b=x.length<o.lastRawQuery.length,m=Math.abs(x.length-o.lastRawQuery.length);return b||m>=i?(this.doFetch(x,f),!0):!1};this.debounceTimer=setTimeout(()=>{t(tt)&&this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer)},Ze),this.slowDebounceTimer=setTimeout(()=>t(1),et)}clearTimers(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer),this.debounceTimer=null,this.slowDebounceTimer=null}};var ye='[contenteditable="false"]',D;function nt(){if(D!==void 0)return D;let n=globalThis.Intl.Segmenter;if(!n)return D=null,null;try{D=new n(void 0,{granularity:"grapheme"})}catch{D=null}return D??null}function K(n,e){let t=n;for(;t&&t!==e;){if(t.nodeType===Node.ELEMENT_NODE&&t.matches(ye))return!0;t=t.parentNode}return!1}function q(n){return(n.ownerDocument??document).createTreeWalker(n,NodeFilter.SHOW_TEXT,{acceptNode(e){return K(e,n)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}})}function L(n){let e=q(n),t="",i=e.nextNode();for(;i;)t+=i.data,i=e.nextNode();return t}function Q(n){let e=q(n),t=0,i=e.nextNode();for(;i;)t+=i.data.length,i=e.nextNode();return t}function C(n){let e=(n.ownerDocument??document).getSelection();if(!e||e.rangeCount===0)return null;let t=e.anchorNode,i=e.anchorOffset;if(!t||!n.contains(t))return null;if(t.nodeType===Node.ELEMENT_NODE){let o=t;if(K(o,n)&&o!==n)return null;let r=0;for(let s=0;s<i&&s<o.childNodes.length;s++)r+=ve(o.childNodes[s],n);return r+be(o,n)}return t.nodeType!==Node.TEXT_NODE||K(t,n)?null:be(t,n)+i}function ve(n,e){if(n.nodeType===Node.TEXT_NODE)return K(n,e)?0:n.data.length;if(n.nodeType!==Node.ELEMENT_NODE)return 0;let t=n;if(t.matches(ye))return 0;let i=0;for(let o of Array.from(t.childNodes))i+=ve(o,e);return i}function be(n,e){let t=q(e),i=0,o=t.nextNode();for(;o;){if(o===n||n.nodeType===Node.ELEMENT_NODE&&n.contains(o))return i;i+=o.data.length,o=t.nextNode()}return i}function P(n,e){let t=n.ownerDocument??document,i=t.getSelection();if(!i)return;let o=Math.max(0,Math.min(e,Q(n))),r=q(n),s=0,a=null,c=0,l=r.nextNode(),p=null;for(;l;){let g=l.data.length;if(o<s+g){a=l,c=o-s;break}if(o===s+g){let h=r.nextNode();h?(a=h,c=0):(a=l,c=g);break}s+=g,p=l,l=r.nextNode()}let d=t.createRange();if(a){let g=a.parentElement?.closest('strong[data-seg="completed"]');g&&g!==n&&n.contains(g)?c===0?d.setStartBefore(g):c===a.data.length?d.setStartAfter(g):d.setStart(a,c):d.setStart(a,c)}else p?d.setStart(p,p.data.length):d.setStart(n,0);d.collapse(!0),i.removeAllRanges(),i.addRange(d)}function $(n){let e=C(n);return e==null?!1:e>=Q(n)}function U(n,e){if(e<=0)return 0;let t=nt();if(!t)return e-1;let i=n.slice(0,e),o=0;for(let{index:r}of t.segment(i))r<e&&(o=r);return o}function se(n,e){return n instanceof HTMLTextAreaElement||n instanceof HTMLInputElement?n.selectionStart!=null&&n.selectionStart===n.value.length:n instanceof HTMLElement&&n.hasAttribute("data-aia-input")?$(n):e?.caretOffset!=null?e.caretOffset>=e.text.length:!1}function it(n){return n instanceof HTMLElement&&n.hasAttribute("data-aia-input")?C(n):null}var G=class{constructor(e,t){this.store=e;this.ctx=t}handleKeyDown(e){let t=this.store.get(),{listboxId:i,getOnSubmit:o}=this.ctx,r=this.getEffectiveColumns(),s=o(),a=this.getTappableIndices(r);if((e.shiftKey||e.metaKey||e.ctrlKey||e.altKey)&&(e.key==="ArrowDown"||e.key==="ArrowUp"||e.key==="ArrowLeft"||e.key==="ArrowRight"))return;let c=this.ctx.getOptionsPosition()==="above";switch(e.key){case"ArrowDown":{let l=se(e.target,t),p=!!t.editingParam;if(!l&&!p&&t.activeDropdownIndex<0)break;if(t.activeDropdownIndex<0){if(c)break;if(e.preventDefault(),!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:a[0]??0});break}if(a.length===0)return;this.store.set({activeDropdownIndex:a[0]});break}if(e.preventDefault(),a.length===0)return;if(t.filteredOptions.length>0){let h=Math.floor((t.filteredOptions.length-1)/r);if(Math.floor(t.activeDropdownIndex/r)===h){this.store.set({activeDropdownIndex:-1});break}}let d=a.indexOf(t.activeDropdownIndex),g=d<a.length-1?d+1:0;this.store.set({activeDropdownIndex:a[g]});break}case"ArrowUp":{if(t.activeDropdownIndex<0){if(!c)break;let d=se(e.target,t),g=!!t.editingParam;if(!d&&!g)break;e.preventDefault();let h=this.firstTappableInBottomRow(r)??a[0]??0;if(!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:h});break}if(a.length===0)return;this.store.set({activeDropdownIndex:h});break}if(a.length===0)break;if(e.preventDefault(),t.activeDropdownIndex<r){this.store.set({activeDropdownIndex:-1});break}let l=a.indexOf(t.activeDropdownIndex),p=l>0?l-1:a.length-1;this.store.set({activeDropdownIndex:a[p]});break}case"ArrowRight":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%r<r-1){let d=t.activeDropdownIndex+1;d<t.filteredOptions.length&&t.filteredOptions[d]?.is_tappable&&this.store.set({activeDropdownIndex:d})}break}if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){e.preventDefault();let p=e.target.closest("[data-aia-input]")??e.target,d=t.editingTail;this.ctx.exitEditMode?.(),P(p,d);break}se(e.target,t)&&t.actionableSuggestions.length>=1&&(e.preventDefault(),this.removeActivePill());break}case"ArrowLeft":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%r>0){let l=t.activeDropdownIndex-1;l>=0&&t.filteredOptions[l]?.is_tappable&&this.store.set({activeDropdownIndex:l})}break}if(t.editingParam&&e.target instanceof HTMLElement&&t.editingAnchor!=null){e.preventDefault();let l=e.target.closest("[data-aia-input]")??e.target,p=t.editingAnchor;this.ctx.exitEditMode?.(),P(l,p);break}break}case"Backspace":{if(t.editingParam||!this.ctx.removeParamAtCaret)break;let l=it(e.target);if(l==null)break;this.ctx.removeParamAtCaret(l)&&e.preventDefault();break}case"Enter":{if(e.preventDefault(),t.activeDropdownIndex>=0&&t.filteredOptions[t.activeDropdownIndex]?.is_tappable)this.clickOrSelect(t.activeDropdownIndex,t.filteredOptions,i);else if(s){let{rawQuery:l,completedParams:p}=S(t.text,t.completedParams);s({query:t.text.trim(),raw_query:l,completed_params:p}),this.ctx.afterSubmit?.()}break}case"Tab":{let l=t.filteredOptions.map((g,h)=>g.is_tappable?h:-1).filter(g=>g!==-1);if(l.length===0)break;if(!t.isDropdownOpen){if(t.actionableSuggestions.length===0)break;e.preventDefault();let g=e.shiftKey?l[l.length-1]:l[0];this.store.set({pillTapped:!0,activeDropdownIndex:g});break}e.preventDefault();let p=l.indexOf(t.activeDropdownIndex),d;if(p<0)d=e.shiftKey?l.length-1:0;else{let g=e.shiftKey?-1:1;d=(p+g+l.length)%l.length}this.store.set({activeDropdownIndex:l[d]});break}case"Escape":{if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){let l=e.target.closest("[data-aia-input]")??e.target,p=t.editingTail;this.ctx.exitEditMode?.(),P(l,p)}this.store.set({activeDropdownIndex:-1});break}}}firstTappableInBottomRow(e){let t=this.store.get();if(t.filteredOptions.length===0)return null;let o=Math.floor((t.filteredOptions.length-1)/e)*e;for(let r=o;r<t.filteredOptions.length;r++)if(t.filteredOptions[r]?.is_tappable)return r;return null}getTappableIndices(e){let i=this.store.get().filteredOptions.map((r,s)=>r.is_tappable?s:-1).filter(r=>r!==-1),o=Array.from({length:e},()=>[]);for(let r of i)o[r%e].push(r);return o.flat()}getEffectiveColumns(){let e=document.getElementById(this.ctx.listboxId);if(!e)return this.ctx.columns;let i=document.getElementById(`${this.ctx.listboxId}-option-0`)?.parentElement??null;for(;i;){let o=getComputedStyle(i).gridTemplateColumns;if(o&&o!=="none"){let r=o.split(" ").filter(Boolean).length;if(r>0)return r}if(i===e)break;i=i.parentElement}return this.ctx.columns}clickOrSelect(e,t,i){let o=document.getElementById(`${i}-option-${e}`);o?o.click():this.ctx.selectOption(t[e])}removeActivePill(){let e=this.store.get(),t=e.suggestions.filter(r=>r.type==="placeholder"),i=e.suggestions.filter(r=>r.type!=="placeholder");if(i.length===0)return;let o=i.slice(1);this.store.set({suggestions:[...t,...o],pillTapped:o.length>0,activeDropdownIndex:-1})}};var W=class{constructor(e,t={}){this.store=e;this.callbacks=t}setActivePill(e){let t=this.store.get(),i=t.suggestions.filter(l=>l.type!=="placeholder");if(e<0||e>=i.length)return;let o=i[e],r=i.filter((l,p)=>p!==e),s=t.suggestions.filter(l=>l.type==="placeholder");if(this.callbacks.onPillSelected){let{rawQuery:l}=S(t.text,t.completedParams);this.callbacks.onPillSelected({rawQuery:l,selectedPill:o.text,otherPills:r.map(p=>p.text)})}let a=[...s,o,...r],c=this.store.peek({suggestions:a}).filteredOptions.findIndex(l=>l.is_tappable);this.store.set({suggestions:a,pillTapped:!0,activeDropdownIndex:c})}removeLastParam(){this.store.get().completedParams.length!==0&&this.store.set(t=>({completedParams:t.completedParams.slice(0,-1),activeDropdownIndex:-1}))}};function Se(n,e){let t=[],i=0;for(let r of e){let s=n.indexOf(r.text,i);s!==-1&&(s>i&&t.push({type:"text",value:n.slice(i,s)}),t.push({type:"completed",value:r.text,param:r}),i=s+r.text.length)}let o=n.slice(i);return o&&t.push({type:"text",value:o}),t}function Pe(n,e){let t=[],i=[],o=0;for(let r of e){let s=n.indexOf(r.text,o);s===-1?i.push(r):(t.push(r),o=s+r.text.length)}return{valid:t,invalid:i}}function Te(n,e){let t=e.dropdownTrigger??"auto",i=e.closeDropdownOnBlur??!0,r=n.filteredOptionsLength>0||n.activePillHasNoOptions;if(n.inEditMode){let s=i?n.isFocused:!0;return r&&s}if(t==="auto"){let s=i?n.isFocused:!0,a=n.text.replace(/\s+$/,"").length,c=n.caretOffset==null||n.caretOffset>=a;return(r||n.isLoading)&&s&&c}return t==="manual"?(r||n.isLoading)&&n.pillTapped:!1}function Ce(n,e){let t=Se(n.text,n.completedParams),i=n.suggestions.filter(u=>u.type!=="placeholder"),o=i[0],r=o?e.optionOverrides?.[o.type]:void 0,s=n.suggestions.filter(u=>u.type==="placeholder").map(u=>u.text).join(" "),a=I(n.text,Math.min(n.filterBase,n.text.length),s),l=n.lastRawQuery!==""||a>0?w(n.text,a,n.filterInProgress):"",p=o?r?r(l.trim()):o.options??[]:[],d=n.editingParam!=null&&n.editingAnchor!=null,g;if(d&&n.editingParam&&n.editingAnchor!=null){let u=n.editingParam.id,y=n.completedParams.some(E=>E.id===u),v=n.caretOffset??n.editingAnchor,T=y?"":n.text.slice(n.editingAnchor,v);g=A(n.editingParam.options,T)}else g=A(p,l);let h=e.showNonTappableOptions===!1;h&&(g=g.filter(u=>u.is_tappable));let x=u=>h?u.is_tappable:!0,f;if(d){let u=n.editingParam?.options??[];f=n.editingParam!=null&&u.filter(x).length===0}else{let u=o?r?r(""):o.options??[]:[];f=o!=null&&u.filter(x).length===0}let b=Te({inEditMode:d,filteredOptionsLength:g.length,isFocused:n.isFocused,text:n.text,caretOffset:n.caretOffset,isLoading:n.isLoading,pillTapped:n.pillTapped,activePillHasNoOptions:f},{dropdownTrigger:e.dropdownTrigger,closeDropdownOnBlur:e.closeDropdownOnBlur}),m=b&&n.activeDropdownIndex>=0&&!!g[n.activeDropdownIndex]?.is_tappable;return{segments:t,actionableSuggestions:i,filteredOptions:g,placeholderText:s,isDropdownOpen:b,isActivePillSelected:m}}function j(n){return n.mode==="fresh"?ot(n):rt(n)}function ot(n){let{text:e,completedParams:t,suggestions:i,filterBase:o,filterInProgress:r}=n,a=i.filter(v=>v.type!=="placeholder")[0];if(!a?.options)return null;let c=i.filter(v=>v.type==="placeholder").map(v=>v.text).join(" "),l=I(e,o,c),p=w(e,l,r),d=O(a.options,p);if(!d)return null;let g=d.text.toLowerCase(),h=e.toLowerCase().lastIndexOf(g),x=h>=0?h:Math.max(0,e.length-d.text.length),f=x+d.text.length,b=e.slice(x,f),u=f<e.length&&e[f]===" "?f+1:f,y={id:crypto.randomUUID(),placeholder:"",type:a.type,text:b,kind:d.kind,suggestionType:a.type,suggestionPlaceholder:a.text,options:a.options??[],metadata:d.metadata};return{patch:{text:e,completedParams:[...t,y],suggestions:i.filter(v=>v!==a),filterBase:u,newParamId:y.id,caretOffset:u,activeDropdownIndex:-1},caretPos:u}}function rt(n){let{text:e,completedParams:t,editingParam:i,editingAnchor:o,editingTail:r}=n;if(t.some(y=>y.id===i.id))return null;let s=e.slice(o,r),a=O(i.options,s);if(!a)return null;let c=a.text.toLowerCase(),l=s.toLowerCase().lastIndexOf(c),p=o+Math.max(0,l),d=p+a.text.length,g=e.slice(p,d),x=d<e.length&&e[d]===" "?d+1:d,f={id:crypto.randomUUID(),placeholder:"",type:i.suggestionType,text:g,kind:a.kind,suggestionType:i.suggestionType,suggestionPlaceholder:i.suggestionPlaceholder,options:i.options,metadata:a.metadata},b=t.length,m=0;for(let y=0;y<t.length;y++){let v=e.indexOf(t[y].text,m);if(v!==-1){if(v>=x){b=y;break}m=v+t[y].text.length}}let u=[...t];return u.splice(b,0,f),{patch:{text:e,completedParams:u,newParamId:f.id,filterBase:x,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:x,activeDropdownIndex:-1},caretPos:x}}var V=class{constructor(e){this.deps=e}start(e){let t=this.deps.store.get();if(t.editingParam?.id===e)return;let i=t.completedParams.find(s=>s.id===e);if(!i)return;let o=0,r=-1;for(let s of t.completedParams){let a=t.text.indexOf(s.text,o);if(a!==-1){if(s.id===e){r=a;break}o=a+s.text.length}}r<0||this.deps.store.set({editingParam:i,editingAnchor:r,editingTail:r+i.text.length,caretOffset:r+i.text.length,activeDropdownIndex:-1})}exit(){this.deps.store.get().editingParam&&this.deps.store.set({editingParam:null,editingAnchor:null,editingTail:null,activeDropdownIndex:-1})}replaceRange(e){let t=this.deps.store.get(),i=t.editingParam,o=t.editingAnchor,r=t.editingTail;if(!i||o==null||r==null||!t.completedParams.some(c=>c.id===i.id))return!1;let s=t.text.slice(0,o)+e+t.text.slice(r),a=o+e.length;return this.deps.store.set(c=>({text:s,completedParams:c.completedParams.filter(l=>l.id!==i.id),editingTail:a,caretOffset:a,activeDropdownIndex:-1})),this.deps.scheduleSetCursor(a),this.tryPromote(),!0}caretAfterInput(e){let t=this.deps.store.get(),i={caretOffset:e};t.editingParam&&t.editingAnchor!=null&&e!=null&&(e<t.editingAnchor?(i.editingParam=null,i.editingAnchor=null,i.editingTail=null,i.activeDropdownIndex=-1):t.editingTail!=null&&(i.editingTail=Math.max(t.editingTail,e))),this.deps.store.set(i),this.tryPromote()}caretMove(e){let t=this.deps.store.get();if(t.editingParam&&t.editingAnchor!=null&&t.editingTail!=null&&e!=null&&(e<t.editingAnchor||e>t.editingTail)){this.deps.store.set({caretOffset:e,editingParam:null,editingAnchor:null,editingTail:null,activeDropdownIndex:-1});return}this.deps.store.set({caretOffset:e})}selectOption(e){let t=this.deps.store.get(),i=t.editingParam,o=t.editingAnchor,r=t.editingTail;if(!i||o==null||r==null)return;this.deps.fireTelemetry("option",{raw_query:S(t.text,t.completedParams).rawQuery,selected_option:e.text,other_options:i.options.filter(m=>m.text!==e.text).map(m=>m.text)});let s=t.text.slice(0,o),a=t.text.slice(r),c=o===0&&e.text.length>0?e.text[0].toUpperCase()+e.text.slice(1):e.text,l=a.length===0||a[0]!==" ",p=l?`${c} `:c,d=s+p+a,g=o+p.length+(l?0:1),h={id:crypto.randomUUID(),placeholder:"",type:i.suggestionType,text:c,kind:e.kind,suggestionType:i.suggestionType,suggestionPlaceholder:i.suggestionPlaceholder,options:i.options,metadata:e.metadata},x=t.completedParams.findIndex(m=>m.id===i.id),f=t.completedParams.filter(m=>m.id!==i.id),b=x>=0?Math.min(x,f.length):f.length;f.splice(b,0,h),this.deps.store.set({text:d,completedParams:f,newParamId:h.id,filterBase:g,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:g,activeDropdownIndex:-1,pillTapped:!1,skipNextFetch:!0,inSelectionAnimation:!0}),this.deps.startSelectionAnimationTimer(),this.deps.scheduleSetCursor(g)}tryPromote(){let e=this.deps.store.get();if(!e.editingParam||e.editingAnchor==null||e.editingTail==null)return;let t=j({mode:"edit",text:e.text,completedParams:e.completedParams,editingParam:e.editingParam,editingAnchor:e.editingAnchor,editingTail:e.editingTail});t&&(this.deps.store.set(t.patch),this.deps.scheduleSetCursor(t.caretPos))}};function z(n,e){return n?{key:"enter",hint:"to proceed"}:e?{key:"tab",hint:"to select"}:{key:"\u2192",hint:"to skip"}}var Ee="data-aia-key";function X(n,e,t){let i=new Map;for(let s of Array.from(n.children)){let a=s.getAttribute(Ee);a!=null&&i.set(a,s)}let o=new Set,r=[];for(let s=0;s<e.length;s++){let a=e[s],c=t.keyOf(a,s);o.add(c);let l=i.get(c);l||(l=t.create(a,s),l.setAttribute(Ee,c)),t.update?.(l,a,s),n.children[s]!==l&&n.insertBefore(l,n.children[s]??null),r.push(l)}for(let[s,a]of i)o.has(s)||a.remove();return r}var we=[125,69];function Ae(n,e){return e?1:n===0?.7:n===1?.4:.2}function Y(n,e,t,i,o=!1,r=!1,s=!1){let a=n.querySelector(".magicx-aia-pill-list");if(a||(a=document.createElement("span"),a.className="magicx-aia-pill-list",n.appendChild(a)),r&&e.length===0){a.setAttribute("data-aia-pill-list-loading",""),a.innerHTML="";for(let c=0;c<we.length;c++){let l=we[c],p=document.createElement("span");p.setAttribute("data-aia-pill-skeleton",""),p.className=`magicx-aia-pill magicx-aia-pill--skeleton${o?" magicx-aia-pill--rounded":""}`,p.style.width=`${l}px`,p.style.opacity=String(Ae(c,!1)),a.appendChild(p)}return}r?a.setAttribute("data-aia-pill-list-loading",""):a.removeAttribute("data-aia-pill-list-loading");for(let c of a.querySelectorAll("[data-aia-pill-skeleton]"))c.remove();X(a,e,{keyOf:c=>`${c.type}-${c.text}`,create:c=>{let l=document.createElement("button");return l.type="button",l.tabIndex=-1,l.setAttribute("data-aia-pill",""),l.setAttribute("contenteditable","false"),l.textContent=c.text,l.addEventListener("mousedown",p=>p.preventDefault()),l},update:(c,l,p)=>{let d=c,g=s&&p===t&&!r,h=["magicx-aia-pill"];o&&h.push("magicx-aia-pill--rounded"),r&&h.push("magicx-aia-pill--skeleton"),d.className=h.join(" "),d.style.width="",d.style.opacity=String(Ae(p,g)),r?(d.setAttribute("data-aia-loading",""),d.disabled=!0,d.onclick=null):(d.removeAttribute("data-aia-loading"),d.disabled=!1,d.onclick=()=>i(p))}})}function ae(n){n.querySelector(".magicx-aia-pill-list")?.remove()}var le=new WeakMap;function Ie(n,e,t,i,o,r,s){let a=n.querySelector(".aia-grid-fade");if(e.length===0){a&&(at(a),a.remove());return}let c=a?.querySelector(".aia-grid")??null;(!a||!c)&&(a=document.createElement("div"),a.className="aia-grid-fade",c=document.createElement("div"),c.className="aia-grid magicx-aia-grid",c.setAttribute("data-scroll",""),c.style.setProperty("--aia-grid-min","250px"),c.style.setProperty("--aia-grid-max","250px"),c.style.setProperty("--aia-grid-gap","0"),a.appendChild(c),st(a,c),n.appendChild(a)),lt(c,e,t,i,o,r,s),Oe(a,c)}function Oe(n,e){e.scrollHeight-e.scrollTop-e.clientHeight>1?n.setAttribute("data-fade",""):n.removeAttribute("data-fade")}function st(n,e){let t=()=>Oe(n,e),i=new ResizeObserver(t);i.observe(e),e.addEventListener("scroll",t,{passive:!0}),le.set(n,{ro:i,onScroll:t})}function at(n){let e=le.get(n);e&&(e.ro.disconnect(),n.querySelector(".aia-grid")?.removeEventListener("scroll",e.onScroll),le.delete(n))}function lt(n,e,t,i,o,r,s){let a=s?"1":"0";X(n,e,{keyOf:c=>`${c.text}\0${a}`,create:c=>ct(c,s),update:(c,l,p)=>{let d=p===t&&!s;c.id=`${r}-option-${p}`,c.dataset.aiaIndex=String(p),c.setAttribute("aria-selected",String(d)),c.classList.toggle("magicx-aia-option--highlighted",d),!s&&l.is_tappable?(c.onclick=()=>{c.classList.add("magicx-aia-option--pressed"),i(l),setTimeout(()=>c.classList.remove("magicx-aia-option--pressed"),500)},c.onmouseenter=()=>{let g=Number.parseInt(c.dataset.aiaIndex??"-1",10);g>=0&&o(g)}):(c.onclick=null,c.onmouseenter=null)}})}function ct(n,e){let t=document.createElement("div");t.setAttribute("role","option"),t.setAttribute("data-aia-option",""),e&&t.setAttribute("data-aia-loading",""),t.tabIndex=e||!n.is_tappable?-1:0;let i=["magicx-aia-option"];n.is_tappable?i.push("magicx-aia-option--tappable"):i.push("magicx-aia-option--non-tappable"),t.className=i.join(" ");let o=document.createElement("div");o.className="magicx-aia-streaks",t.appendChild(o);let r=document.createElement("div");r.className="magicx-aia-streaks-vert",t.appendChild(r);let s=document.createElement("span");s.className="magicx-aia-option-content";let a=document.createElement("span");if(a.className="magicx-aia-option-text",a.textContent=n.icon?`${n.icon} ${n.text}`:n.text,s.appendChild(a),n.tag){let c=document.createElement("span");c.className="magicx-aia-option-tag",c.textContent=n.tag,s.appendChild(c)}return t.appendChild(s),t}var dt=[159,119,164];function J(n){let e=document.createElement("div");return e.id=n,e.setAttribute("role","listbox"),e.setAttribute("data-aia-dropdown",""),e.className="magicx-aia-dropdown",e.addEventListener("mousedown",t=>t.preventDefault()),e}function Z(n,e){let{filteredOptions:t,activeIndex:i,isOpen:o,isLoading:r,pills:s,showPills:a,isActivePillSelected:c,onSelect:l,onHighlight:p,onPillClick:d}=e,g=a&&s.length>0,h=t.length>0,x=o&&(h||g||r);if(x?n.classList.add("magicx-aia-dropdown--visible"):n.classList.remove("magicx-aia-dropdown--visible"),r?n.setAttribute("data-aia-loading",""):n.removeAttribute("data-aia-loading"),!x)return;let f=n.querySelector(".aia-stack");f||(f=document.createElement("div"),f.className="aia-stack",f.style.setProperty("--aia-stack-space","8px"),n.appendChild(f));let b=g||r&&a,m=f.querySelector(".magicx-aia-pill-bar");b?(m||(m=document.createElement("div"),m.className="magicx-aia-pill-bar aia-cluster",m.setAttribute("data-nowrap",""),m.setAttribute("data-aia-pillbar",""),f.insertBefore(m,f.firstChild)),Y(m,s,0,d,!0,r,c)):m&&m.remove(),Ie(f,t,i,l,p,e.listboxId,r);let u=f.querySelector(".magicx-aia-skeleton-bars");if(r&&!h){if(!u){u=document.createElement("div"),u.className="magicx-aia-skeleton-bars",u.setAttribute("data-aia-skeleton-bars","");for(let T of dt){let E=document.createElement("span");E.className="magicx-aia-skeleton-bar",E.style.width=`${T}px`,u.appendChild(E)}f.appendChild(u)}}else u&&u.remove();let y=f.querySelector(".magicx-aia-footer")??ut(),v=i>=0&&!!t[i]?.is_tappable;pt(y,z(v,e.isInputEmpty)),f.lastElementChild!==y&&f.appendChild(y)}function pt(n,{key:e,hint:t}){let i=n.querySelector(".magicx-aia-footer-key"),o=n.querySelector(".magicx-aia-footer-hint");!i||!o||(i.textContent!==e&&(i.textContent=e),o.textContent!==t&&(o.textContent=t))}function ut(){let n=document.createElement("footer");n.className="magicx-aia-footer",n.setAttribute("data-aia-footer","");let e=document.createElement("div");e.className="aia-cluster magicx-aia-footer-row",e.setAttribute("data-align","center"),e.setAttribute("data-justify","between"),e.setAttribute("data-nowrap","");let t=document.createElement("div");t.className="aia-cluster magicx-aia-footer-hint-group",t.setAttribute("data-align","center"),t.style.setProperty("--aia-cluster-gap","5px");let i=document.createElement("kbd");i.className="magicx-aia-footer-key",i.textContent="tab";let o=document.createElement("span");o.className="magicx-aia-footer-hint",o.textContent="to select",t.append(i,o);let r=document.createElement("a");r.className="aia-cluster magicx-aia-footer-brand-link",r.setAttribute("data-align","center"),r.href="https://ai-autocomplete.com",r.target="_blank",r.rel="noopener noreferrer",r.style.setProperty("--aia-cluster-gap","2px");let s=document.createElement("span");s.className="magicx-aia-footer-brand",s.textContent="AI";let a=document.createElement("span");return a.className="magicx-aia-footer-badge",a.textContent="Autocomplete",r.append(s,a),e.append(t,r),n.append(e),n}function De(n,e){let t=J(e.listboxId);return n.appendChild(t),{dropdown:t}}function ce(n,e,t){Z(n.dropdown,{suggestions:e.actionableSuggestions.length>0?[{...e.actionableSuggestions[0],options:e.filteredOptions}]:[],filteredOptions:e.filteredOptions,activeIndex:e.activeDropdownIndex,isOpen:e.isDropdownOpen,isLoading:e.isLoading&&!e.editingParam&&!e.inSelectionAnimation,listboxId:t.listboxId,pills:e.actionableSuggestions,showPills:!0,isActivePillSelected:e.isActivePillSelected,isInputEmpty:e.text.trim().length===0,onSelect:t.selectOption,onHighlight:i=>t.store.set({activeDropdownIndex:i}),onPillClick:t.setActivePill})}function ee(n){let{input:e,segments:t,newParamId:i,editingParamId:o,placeholderText:r,isFocused:s}=n,a=t.length===0;e.dataset.aiaEmpty=a?"true":"false",a&&r?e.dataset.placeholder=r:delete e.dataset.placeholder;let c=t.map(b=>`${b.type}:${b.value}`).join("\0"),l=e.dataset.segKey??"",p=e.dataset.newParamId??"",d=e.dataset.editingParamId??"";if(c===l&&(i??"")===p&&(o??"")===d)return;let g=s?C(e):null;e.dataset.segKey=c,e.dataset.newParamId=i??"",e.dataset.editingParamId=o??"";let h=e.ownerDocument??document,x=h.createDocumentFragment(),f=0;for(let b of t)if(f+=b.value.length,b.type==="completed"){let m=h.createElement("strong");m.dataset.seg="completed",m.dataset.paramId=b.param.id;let u=b.param.id===i,y=b.param.id===o,v=["magicx-aia-segment","magicx-aia-segment--completed"];u&&v.push("magicx-aia-shimmer-revealed","magicx-aia-shimmer-sweep"),y&&v.push("magicx-aia-segment--editing"),m.className=v.join(" "),m.textContent=b.value,x.appendChild(m)}else x.appendChild(h.createTextNode(b.value));e.replaceChildren(x),e.dataset.aiaTextLength=String(f),g!=null&&P(e,Math.max(0,Math.min(g,f)))}var mt='<svg width="18" height="18" viewBox="0 0 18 18" fill="none" role="img" aria-label="Submit"><path d="M9 14V4M9 4L4 9M9 4L14 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';function Me(){let n=document.createElement("button");return n.type="button",n.className="magicx-aia-submit",n.setAttribute("aria-label","Submit"),n.setAttribute("data-aia-submit",""),n.innerHTML=mt,n}function gt(){let n=document.createElement("div");return n.setAttribute("contenteditable","plaintext-only"),n.contentEditable==="plaintext-only"}function ke(n,e){let t=e.firstElementChild;if(!t){e.removeAttribute("data-aia-pill-wrapped");return}let i=t.getBoundingClientRect(),o=n.getBoundingClientRect();i.top>=o.bottom-2?e.setAttribute("data-aia-pill-wrapped",""):e.removeAttribute("data-aia-pill-wrapped")}function Le(n,e){let{listboxId:t}=e,i=J(t);n.appendChild(i);let o=document.createElement("div");o.className="magicx-aia-input-wrapper",n.appendChild(o);let r=document.createElement("div");r.className="magicx-aia-editor",r.setAttribute("data-aia-editor",""),o.appendChild(r);let s=document.createElement("div");s.className="magicx-aia-input",s.setAttribute("data-aia-input",""),s.setAttribute("contenteditable",gt()?"plaintext-only":"true"),s.setAttribute("role","combobox"),s.setAttribute("aria-autocomplete","list"),s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-controls",t),s.setAttribute("aria-expanded","false"),s.setAttribute("spellcheck","true"),s.setAttribute("enterkeyhint","send"),r.appendChild(s);let a=document.createElement("span");a.className="magicx-aia-pill-list-container",a.setAttribute("data-aia-pill-list-container",""),r.appendChild(a);let c=null,l=null;e.submitButton===void 0?(c=Me(),o.appendChild(c),l=c):e.submitButton!==null&&(l=e.submitButton,l.hasAttribute("data-aia-submit")||l.setAttribute("data-aia-submit",""),o.appendChild(l));let p=new AbortController,{signal:d}=p,g=!1,h=0,x=()=>{let m=L(s),y=m.length>0&&m[0]!==m[0].toUpperCase()?m[0].toUpperCase()+m.slice(1):m;e.handleChange(y)},f=()=>{let m=(s.ownerDocument??document).getSelection();if(!m||m.rangeCount===0)return null;let u=m.anchorNode;return!u||!s.contains(u)?null:(u.nodeType===Node.ELEMENT_NODE?u:u.parentElement)?.closest('strong[data-seg="completed"][data-param-id]')?.dataset.paramId??null};o.addEventListener("click",m=>{m.target?.closest("[data-aia-pill]")||s.focus()},{signal:d}),s.addEventListener("input",()=>{g||(h=performance.now(),x(),e.handleCaretAfterInput(C(s)))},{signal:d});let b=s.ownerDocument??document;if(b.addEventListener("selectionchange",()=>{let m=b.getSelection();if(!m||m.rangeCount===0||!s.contains(m.anchorNode))return;let u=f(),y=e.store.get().editingParam?.id??null;if(u&&u!==y){e.startEditingParam(u);return}performance.now()-h<50||e.handleCaretMove(C(s))},{signal:d}),s.addEventListener("compositionstart",()=>{g=!0},{signal:d}),s.addEventListener("compositionend",()=>{g=!1,x()},{signal:d}),s.addEventListener("beforeinput",m=>{let u=m,y=u.inputType;if(y==="insertParagraph"||y==="insertLineBreak"||y==="insertFromDrop"){m.preventDefault();return}if(y.startsWith("insert")||y.startsWith("delete")){let v=y.startsWith("delete")?"":u.data??"";e.replaceEditingRange(v)&&m.preventDefault()}},{signal:d}),s.addEventListener("paste",m=>{m.preventDefault();let u=(m.clipboardData?.getData("text/plain")??"").replace(/\r?\n/g," ");if(!u)return;let y=s.ownerDocument??document,v=y.getSelection();if(!v||v.rangeCount===0)return;let T=v.getRangeAt(0);if(!s.contains(T.startContainer))return;T.deleteContents();let E=y.createTextNode(u);T.insertNode(E),T.setStartAfter(E),T.collapse(!0),v.removeAllRanges(),v.addRange(T),x()},{signal:d}),s.addEventListener("keydown",m=>e.handleKeyDown(m),{signal:d}),s.addEventListener("focus",()=>e.store.set({isFocused:!0}),{signal:d}),s.addEventListener("blur",()=>e.store.set({isFocused:!1}),{signal:d}),l&&l.addEventListener("click",m=>{let u=e.store.get();if(!(!!u.text||u.completedParams.length>0)||!e.onSubmit)return;m.stopPropagation();let{rawQuery:v,completedParams:T}=S(u.text,u.completedParams);e.onSubmit({query:u.text.trim(),raw_query:v,completed_params:T}),e.afterSubmit?.()},{signal:d}),e.autoFocus!==!1){s.focus();let m=s.ownerDocument??document,u=m.getSelection(),y=u&&u.rangeCount>0&&s.contains(u.anchorNode);if(u&&!y){let v=m.createRange();v.selectNodeContents(s),v.collapse(!0),u.removeAllRanges(),u.addRange(v)}}if(typeof ResizeObserver<"u"){let m=new ResizeObserver(()=>ke(s,a));m.observe(s),p.signal.addEventListener("abort",()=>m.disconnect(),{once:!0})}return{input:s,inlinePillContainer:a,dropdown:i,submitButton:c,abort:p}}function de(n,e,t){let{input:i,inlinePillContainer:o,dropdown:r,submitButton:s}=n,{pillPlacement:a,setActivePill:c,selectOption:l,store:p}=t;i.setAttribute("aria-expanded",String(e.isDropdownOpen));let d=e.activeDropdownIndex>=0?`${t.listboxId}-option-${e.activeDropdownIndex}`:"";if(d?i.setAttribute("aria-activedescendant",d):i.removeAttribute("aria-activedescendant"),s){let b=!!e.text||e.completedParams.length>0;s.disabled=!b}let g=i.dataset.newParamId??"",h=e.newParamId!==null&&e.newParamId!==g;if(ee({input:i,segments:e.segments,newParamId:e.newParamId,editingParamId:e.editingParam?.id??null,placeholderText:e.placeholderText,isFocused:e.isFocused}),a==="inline"){let b=e.isLoading&&!e.editingParam&&!e.inSelectionAnimation;b||e.actionableSuggestions.length>0?Y(o,e.actionableSuggestions,0,c,!1,b,e.isActivePillSelected):ae(o)}else ae(o);ke(i,o),h?(i.focus(),P(i,e.caretOffset??e.text.length)):e.isFocused&&L(i)!==e.text&&P(i,e.text.length);let x=e.editingParam?{type:e.editingParam.suggestionType,text:e.editingParam.suggestionPlaceholder,required:!0,options:e.editingParam.options}:null,f=x??e.actionableSuggestions[0];Z(r,{suggestions:f?[{...f,options:e.filteredOptions}]:[],filteredOptions:e.filteredOptions,activeIndex:e.activeDropdownIndex,isOpen:e.isDropdownOpen,isLoading:e.isLoading&&!e.editingParam&&!e.inSelectionAnimation,listboxId:t.listboxId,pills:x?[x]:e.actionableSuggestions,showPills:a==="dropdown",isActivePillSelected:e.isActivePillSelected,isInputEmpty:e.text.trim().length===0,onSelect:l,onHighlight:b=>p.set({activeDropdownIndex:b}),onPillClick:c})}function Re(n,e){let t=n.actionableSuggestions[0];if(!t)return null;let i=n.filterBase,o=n.text.slice(0,i),r=o.length===0&&n.text.length===0,s=o.length===0&&n.text.length>0&&n.placeholderText.length>0&&n.placeholderText.toLowerCase().startsWith(n.text.toLowerCase());(r||s)&&n.placeholderText&&(o=`${n.placeholderText} `);let a=he(o,e.text);a>0&&(o=o.slice(0,o.length-a));let c=o.length>0&&o[o.length-1]!==" ",l=`${o}${c?" ":""}${e.text} `,p=(r||s)&&l.length>0?l[0].toUpperCase()+l.slice(1):l,d=p.toLowerCase().lastIndexOf(e.text.toLowerCase()),g=d>=0?p.slice(d,d+e.text.length):e.text,h={id:crypto.randomUUID(),placeholder:"",type:t.type,text:g,kind:e.kind,suggestionType:t.type,suggestionPlaceholder:t.text,options:t.options??[],metadata:e.metadata},x=n.actionableSuggestions.length-1;return{patch:{text:p,filterBase:p.length,completedParams:[...n.completedParams,h],newParamId:h.id,caretOffset:p.length,pillTapped:!1,activeDropdownIndex:-1,skipNextFetch:x>0,inSelectionAnimation:!0},telemetry:{selectedOption:e.text,otherOptions:n.filteredOptions.filter(f=>f.text!==e.text).map(f=>f.text)},consumedSuggestion:t,remainingActionable:x}}function te(n){let e=n,t=new Set;return{get:()=>e,set:i=>{let o=typeof i=="function"?i(e):i,r={...e,...o},s=e;e=r;for(let a of t)a(r,s)},subscribe:i=>(t.add(i),()=>{t.delete(i)})}}function Ne(n,e){let t,i,o=r=>(r!==t&&(t=r,i=e(r)),i);return{get:()=>{let r=n.get();return{...r,...o(r)}},set:r=>{typeof r=="function"?n.set(s=>{let a={...s,...o(s)};return r(a)}):n.set(r)},peek:r=>{let s={...n.get(),...r};return{...s,...e(s)}},subscribe:r=>n.subscribe((s,a)=>{let c={...a,...o(a)},l={...s,...o(s)};r(l,c)})}}var pe=!1;function _e(){if(pe||typeof document>"u")return;if(document.querySelector("style[data-magicx-aia]")){pe=!0;return}pe=!0;let n=document.createElement("style");n.setAttribute("data-magicx-aia",""),n.textContent=ft,document.head.appendChild(n)}var ft=`@layer layout {
|
|
1
|
+
"use strict";var ae=Object.defineProperty;var $e=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Ge=Object.prototype.hasOwnProperty;var We=(n,e)=>{for(var t in e)ae(n,t,{get:e[t],enumerable:!0})},je=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of qe(e))!Ge.call(n,o)&&o!==t&&ae(n,o,{get:()=>e[o],enumerable:!(i=$e(e,o))||i.enumerable});return n};var Ve=n=>je(ae({},"__esModule",{value:!0}),n);var Ct={};We(Ct,{AIAutocomplete:()=>re,ATTRIBUTION_URL:()=>ce,ModeController:()=>k,buildAttributionUrl:()=>z,buildQuery:()=>S,createStore:()=>ne,cursorIsAtEnd:()=>$,extractPlainText:()=>L,getCursorOffset:()=>C,getFooterHint:()=>X,plainTextLength:()=>Q,previousGraphemeBoundary:()=>q,renderEditableContent:()=>te,setCursorOffset:()=>T});module.exports=Ve(Ct);var R=class{constructor(e){this.config=e;this.current=null;this.expiresAt=null;this.inFlightRefresh=null;e.accessToken&&(this.current=e.accessToken)}async getToken(e=!1){if(!e&&this.current&&!this.isExpired())return this.current;if(!e&&this.inFlightRefresh)return this.inFlightRefresh;this.inFlightRefresh=this.refresh();try{return await this.inFlightRefresh}finally{this.inFlightRefresh=null}}async refresh(){let e=await this.config.getAccessToken();return this.current=e.accessToken,this.expiresAt=e.expiresAt??null,this.current}isExpired(){return this.expiresAt==null?!1:Date.now()>=this.expiresAt-3e4}};var ze="https://api.ai-autocomplete.com",N=`${ze}/api/suggest`,ge=new WeakMap;function M(n){return n?.type==="accessToken"}function Xe(n){if(!(!n||M(n)))return n}function _(n){let e=ge.get(n.getAccessToken);return e||(e=new R(n),ge.set(n.getAccessToken,e)),e}function H(n){return{"Content-Type":"application/json",...n?.appIdentifier&&{"X-App-Identifier":n.appIdentifier},...n?.headers}}function F(n){let e=Xe(n),t=e?.apiKey;return t?(e?.authScheme??"Bearer")==="Basic"?`Basic ${btoa(t)}`:`Bearer ${t}`:null}var Ye="0.5.7",fe=!1;function Je(){return crypto.randomUUID()}function Ze(n,e){return{placeholder:n.placeholder,type:n.type,...e&&{text:n.text},kind:n.kind}}function et(n,e,t,i){let o=e.find(s=>s.type==="contact"&&s.metadata?.contact_account_count)?.metadata?.contact_account_count,r=typeof o=="number"?o:void 0;return{data:{raw_query:n,completed_params:e.map(s=>Ze(s,t)),...r!=null&&{contact_account_count:r}},meta:{request_id:Je(),request_at:new Date().toISOString(),language:typeof navigator<"u"?navigator.language:"en-US",client_version:Ye,session_id:i}}}async function he(n,e,t,i,o){return fetch(n,{method:"POST",headers:{...e,Authorization:`Bearer ${t}`},body:i,signal:o})}async function xe(n,e,t){let i=t.apiConfig,o=!t.maskCompletedText,r=et(n,e,o,t.sessionId),s=H(i),a=i?.endpoint??N,c=JSON.stringify(r);if(M(i)){let d=_(i),m=await d.getToken(),h=await he(a,s,m,c,t.signal);if(h.status===401){let x=await d.getToken(!0);h=await he(a,s,x,c,t.signal)}if(!h.ok)throw new Error(`API error: ${h.status} ${h.statusText}`);return h.json()}let l=F(i);!l&&!fe&&(fe=!0,console.warn("[AIAutocomplete] No apiKey in apiConfig. Requests will be sent without an Authorization header.")),l&&(s.Authorization=l);let p=await fetch(a,{method:"POST",headers:s,body:c,signal:t.signal});if(!p.ok)throw new Error(`API error: ${p.status} ${p.statusText}`);return p.json()}function S(n,e){let t=n,i={},o=[];for(let r of e){let s=(i[r.type]??0)+1;i[r.type]=s;let c=`{{${r.type.toUpperCase().replace(/\s+/g,"_")}_${s}}}`,l=t.indexOf(r.text);l!==-1&&(t=t.slice(0,l)+c+t.slice(l+r.text.length)),o.push({...r,placeholder:c})}return{rawQuery:t,completedParams:o}}function I(n,e,t){return e>0||!t?e:n.toLowerCase().startsWith(t.toLowerCase())?t.length:e}function w(n,e,t){let i=n.slice(e);if(t||e===0||n[e-1]===" ")return i;let o=i.indexOf(" ");return o===-1?"":i.slice(o+1)}function be(n,e){let t=n.trimEnd().replace(/\s+/g," ");if(t.length===0||e.length===0)return 0;let i=t.split(" "),o=e.toLowerCase();for(let r=0;r<i.length;r++){let s=i.slice(r).join(" ");if(o.startsWith(s.toLowerCase())){let a=t.length-s.length;return n.length-a}}return 0}function E(n,e){if(!n)return[];let t=e.trimStart();if(!t)return n;let i=t.toLowerCase();return n.filter(o=>!o.is_tappable||o.text.toLowerCase().includes(i))}function O(n,e){if(!n)return null;let t=e.trim();if(!t)return null;let i=t.toLowerCase();return n.find(o=>o.is_tappable&&o.text.toLowerCase()===i)??null}function ye(n,e){return e?n.map(t=>{let i=e[t.type];return i?{...t,options:i("")}:t}):n}var tt=100,nt=300,it=2,B=class{constructor(e,t,i,o,r,s,a={}){this.store=e;this.getApiConfig=t;this.getOptionOverrides=i;this.getMaskCompletedText=o;this.getOnError=r;this.getSessionId=s;this.callbacks=a;this.fetchVersion=0;this.abortController=null;this.debounceTimer=null;this.slowDebounceTimer=null;this.unsubscribe=null}start(){this.doFetch("",[]);let e=this.store.get().text,t=this.store.get().completedParams;this.unsubscribe=this.store.subscribe(i=>{(i.text!==e||i.completedParams!==t)&&(e=i.text,t=i.completedParams,this.scheduleFetch())})}dispose(){this.abortController?.abort(),this.clearTimers(),this.unsubscribe?.()}async doFetch(e,t){this.abortController?.abort();let i=new AbortController;this.abortController=i;let o=++this.fetchVersion,r=this.store.get().text.length;this.store.set({isLoading:!0,error:null});try{let s=await xe(e,t,{sessionId:this.getSessionId(),maskCompletedText:this.getMaskCompletedText(),signal:i.signal,apiConfig:this.getApiConfig()});if(o!==this.fetchVersion)return;let a=ye(s.data.suggestions??[],this.getOptionOverrides()),c=s.data.input??[],l=c[c.length-1],p=this.store.get().text,d,m;if(l?.state==="in_progress"){m=!0;let b=p.toLowerCase().lastIndexOf(l.text.toLowerCase());d=b!==-1?b:r}else m=!1,d=r;let x=a.filter(b=>b.type!=="placeholder")[0],f=null;if(x){let b=w(p,d,m),u=O(x.options,b);u&&(f={id:crypto.randomUUID(),placeholder:"",type:x.type,text:u.text,kind:u.kind,suggestionType:x.type,suggestionPlaceholder:x.text,options:x.options??[],metadata:u.metadata},a=a.filter(g=>g!==x),this.callbacks.onAutoMatch?.({active:x,matched:u,rawQuery:e}))}this.store.set(b=>({suggestions:a,isLoading:!1,isReady:s.data.is_ready??!1,lastRawQuery:e,activeDropdownIndex:-1,filterBase:d,filterInProgress:m,...f?{completedParams:[...b.completedParams,f]}:{}}))}catch(s){if(o===this.fetchVersion){let a=s instanceof Error?s:new Error(String(s));this.store.set({error:a,isLoading:!1}),this.getOnError()?.(a)}}}scheduleFetch(){if(this.clearTimers(),this.store.get().skipNextFetch){this.store.set({skipNextFetch:!1});return}let t=i=>{let o=this.store.get();if(!o.text&&o.completedParams.length===0)return this.doFetch("",[]),!0;let r=o.suggestions.filter(g=>g.type==="placeholder").map(g=>g.text).join(" "),s=I(o.text,o.filterBase,r),a=w(o.text,s,o.filterInProgress),l=o.suggestions.filter(g=>g.type!=="placeholder")[0],d=(l?E(l.options,a):[]).filter(g=>g.is_tappable),m=l?O(l.options,a)!==null:!1,h=a.trim().length>0;if(d.length>0&&!m&&h||o.completedParams.length===0&&o.text.length>0&&r.length>0&&r.toLowerCase().startsWith(o.text.toLowerCase()))return!1;let{rawQuery:x,completedParams:f}=S(o.text,o.completedParams),b=x.length<o.lastRawQuery.length,u=Math.abs(x.length-o.lastRawQuery.length);return b||u>=i?(this.doFetch(x,f),!0):!1};this.debounceTimer=setTimeout(()=>{t(it)&&this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer)},tt),this.slowDebounceTimer=setTimeout(()=>t(1),nt)}clearTimers(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer),this.debounceTimer=null,this.slowDebounceTimer=null}};var Se='[contenteditable="false"]',D;function ot(){if(D!==void 0)return D;let n=globalThis.Intl.Segmenter;if(!n)return D=null,null;try{D=new n(void 0,{granularity:"grapheme"})}catch{D=null}return D??null}function K(n,e){let t=n;for(;t&&t!==e;){if(t.nodeType===Node.ELEMENT_NODE&&t.matches(Se))return!0;t=t.parentNode}return!1}function U(n){return(n.ownerDocument??document).createTreeWalker(n,NodeFilter.SHOW_TEXT,{acceptNode(e){return K(e,n)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}})}function L(n){let e=U(n),t="",i=e.nextNode();for(;i;)t+=i.data,i=e.nextNode();return t}function Q(n){let e=U(n),t=0,i=e.nextNode();for(;i;)t+=i.data.length,i=e.nextNode();return t}function C(n){let e=(n.ownerDocument??document).getSelection();if(!e||e.rangeCount===0)return null;let t=e.anchorNode,i=e.anchorOffset;if(!t||!n.contains(t))return null;if(t.nodeType===Node.ELEMENT_NODE){let o=t;if(K(o,n)&&o!==n)return null;let r=0;for(let s=0;s<i&&s<o.childNodes.length;s++)r+=Pe(o.childNodes[s],n);return r+ve(o,n)}return t.nodeType!==Node.TEXT_NODE||K(t,n)?null:ve(t,n)+i}function Pe(n,e){if(n.nodeType===Node.TEXT_NODE)return K(n,e)?0:n.data.length;if(n.nodeType!==Node.ELEMENT_NODE)return 0;let t=n;if(t.matches(Se))return 0;let i=0;for(let o of Array.from(t.childNodes))i+=Pe(o,e);return i}function ve(n,e){let t=U(e),i=0,o=t.nextNode();for(;o;){if(o===n||n.nodeType===Node.ELEMENT_NODE&&n.contains(o))return i;i+=o.data.length,o=t.nextNode()}return i}function T(n,e){let t=n.ownerDocument??document,i=t.getSelection();if(!i)return;let o=Math.max(0,Math.min(e,Q(n))),r=U(n),s=0,a=null,c=0,l=r.nextNode(),p=null;for(;l;){let m=l.data.length;if(o<s+m){a=l,c=o-s;break}if(o===s+m){let h=r.nextNode();h?(a=h,c=0):(a=l,c=m);break}s+=m,p=l,l=r.nextNode()}let d=t.createRange();if(a){let m=a.parentElement?.closest('strong[data-seg="completed"]');m&&m!==n&&n.contains(m)?c===0?d.setStartBefore(m):c===a.data.length?d.setStartAfter(m):d.setStart(a,c):d.setStart(a,c)}else p?d.setStart(p,p.data.length):d.setStart(n,0);d.collapse(!0),i.removeAllRanges(),i.addRange(d)}function $(n){let e=C(n);return e==null?!1:e>=Q(n)}function q(n,e){if(e<=0)return 0;let t=ot();if(!t)return e-1;let i=n.slice(0,e),o=0;for(let{index:r}of t.segment(i))r<e&&(o=r);return o}function le(n,e){return n instanceof HTMLTextAreaElement||n instanceof HTMLInputElement?n.selectionStart!=null&&n.selectionStart===n.value.length:n instanceof HTMLElement&&n.hasAttribute("data-aia-input")?$(n):e?.caretOffset!=null?e.caretOffset>=e.text.length:!1}function rt(n){return n instanceof HTMLElement&&n.hasAttribute("data-aia-input")?C(n):null}var G=class{constructor(e,t){this.store=e;this.ctx=t}handleKeyDown(e){let t=this.store.get(),{listboxId:i,getOnSubmit:o}=this.ctx,r=this.getEffectiveColumns(),s=o(),a=this.getTappableIndices(r);if((e.shiftKey||e.metaKey||e.ctrlKey||e.altKey)&&(e.key==="ArrowDown"||e.key==="ArrowUp"||e.key==="ArrowLeft"||e.key==="ArrowRight"))return;let c=this.ctx.getOptionsPosition()==="above";switch(e.key){case"ArrowDown":{let l=le(e.target,t),p=!!t.editingParam;if(!l&&!p&&t.activeDropdownIndex<0)break;if(t.activeDropdownIndex<0){if(c)break;if(e.preventDefault(),!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:a[0]??0});break}if(a.length===0)return;this.store.set({activeDropdownIndex:a[0]});break}if(e.preventDefault(),a.length===0)return;if(t.filteredOptions.length>0){let h=Math.floor((t.filteredOptions.length-1)/r);if(Math.floor(t.activeDropdownIndex/r)===h){this.store.set({activeDropdownIndex:-1});break}}let d=a.indexOf(t.activeDropdownIndex),m=d<a.length-1?d+1:0;this.store.set({activeDropdownIndex:a[m]});break}case"ArrowUp":{if(t.activeDropdownIndex<0){if(!c)break;let d=le(e.target,t),m=!!t.editingParam;if(!d&&!m)break;e.preventDefault();let h=this.firstTappableInBottomRow(r)??a[0]??0;if(!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:h});break}if(a.length===0)return;this.store.set({activeDropdownIndex:h});break}if(a.length===0)break;if(e.preventDefault(),t.activeDropdownIndex<r){this.store.set({activeDropdownIndex:-1});break}let l=a.indexOf(t.activeDropdownIndex),p=l>0?l-1:a.length-1;this.store.set({activeDropdownIndex:a[p]});break}case"ArrowRight":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%r<r-1){let d=t.activeDropdownIndex+1;d<t.filteredOptions.length&&t.filteredOptions[d]?.is_tappable&&this.store.set({activeDropdownIndex:d})}break}if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){e.preventDefault();let p=e.target.closest("[data-aia-input]")??e.target,d=t.editingTail;this.ctx.exitEditMode?.(),T(p,d);break}le(e.target,t)&&t.actionableSuggestions.length>=1&&(e.preventDefault(),this.removeActivePill());break}case"ArrowLeft":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%r>0){let l=t.activeDropdownIndex-1;l>=0&&t.filteredOptions[l]?.is_tappable&&this.store.set({activeDropdownIndex:l})}break}if(t.editingParam&&e.target instanceof HTMLElement&&t.editingAnchor!=null){e.preventDefault();let l=e.target.closest("[data-aia-input]")??e.target,p=t.editingAnchor;this.ctx.exitEditMode?.(),T(l,p);break}break}case"Backspace":{if(t.editingParam||!this.ctx.removeParamAtCaret)break;let l=rt(e.target);if(l==null)break;this.ctx.removeParamAtCaret(l)&&e.preventDefault();break}case"Enter":{if(e.preventDefault(),t.activeDropdownIndex>=0&&t.filteredOptions[t.activeDropdownIndex]?.is_tappable)this.clickOrSelect(t.activeDropdownIndex,t.filteredOptions,i);else if(s){let{rawQuery:l,completedParams:p}=S(t.text,t.completedParams);s({query:t.text.trim(),raw_query:l,completed_params:p}),this.ctx.afterSubmit?.()}break}case"Tab":{let l=t.filteredOptions.map((m,h)=>m.is_tappable?h:-1).filter(m=>m!==-1);if(l.length===0)break;if(!t.isDropdownOpen){if(t.actionableSuggestions.length===0)break;e.preventDefault();let m=e.shiftKey?l[l.length-1]:l[0];this.store.set({pillTapped:!0,activeDropdownIndex:m});break}e.preventDefault();let p=l.indexOf(t.activeDropdownIndex),d;if(p<0)d=e.shiftKey?l.length-1:0;else{let m=e.shiftKey?-1:1;d=(p+m+l.length)%l.length}this.store.set({activeDropdownIndex:l[d]});break}case"Escape":{if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){let l=e.target.closest("[data-aia-input]")??e.target,p=t.editingTail;this.ctx.exitEditMode?.(),T(l,p)}this.store.set({activeDropdownIndex:-1});break}}}firstTappableInBottomRow(e){let t=this.store.get();if(t.filteredOptions.length===0)return null;let o=Math.floor((t.filteredOptions.length-1)/e)*e;for(let r=o;r<t.filteredOptions.length;r++)if(t.filteredOptions[r]?.is_tappable)return r;return null}getTappableIndices(e){let i=this.store.get().filteredOptions.map((r,s)=>r.is_tappable?s:-1).filter(r=>r!==-1),o=Array.from({length:e},()=>[]);for(let r of i)o[r%e].push(r);return o.flat()}getEffectiveColumns(){let e=document.getElementById(this.ctx.listboxId);if(!e)return this.ctx.columns;let i=document.getElementById(`${this.ctx.listboxId}-option-0`)?.parentElement??null;for(;i;){let o=getComputedStyle(i).gridTemplateColumns;if(o&&o!=="none"){let r=o.split(" ").filter(Boolean).length;if(r>0)return r}if(i===e)break;i=i.parentElement}return this.ctx.columns}clickOrSelect(e,t,i){let o=document.getElementById(`${i}-option-${e}`);o?o.click():this.ctx.selectOption(t[e])}removeActivePill(){let e=this.store.get(),t=e.suggestions.filter(r=>r.type==="placeholder"),i=e.suggestions.filter(r=>r.type!=="placeholder");if(i.length===0)return;let o=i.slice(1);this.store.set({suggestions:[...t,...o],pillTapped:o.length>0,activeDropdownIndex:-1})}};var W=class{constructor(e,t={}){this.store=e;this.callbacks=t}setActivePill(e){let t=this.store.get(),i=t.suggestions.filter(l=>l.type!=="placeholder");if(e<0||e>=i.length)return;let o=i[e],r=i.filter((l,p)=>p!==e),s=t.suggestions.filter(l=>l.type==="placeholder");if(this.callbacks.onPillSelected){let{rawQuery:l}=S(t.text,t.completedParams);this.callbacks.onPillSelected({rawQuery:l,selectedPill:o.text,otherPills:r.map(p=>p.text)})}let a=[...s,o,...r],c=this.store.peek({suggestions:a}).filteredOptions.findIndex(l=>l.is_tappable);this.store.set({suggestions:a,pillTapped:!0,activeDropdownIndex:c})}removeLastParam(){this.store.get().completedParams.length!==0&&this.store.set(t=>({completedParams:t.completedParams.slice(0,-1),activeDropdownIndex:-1}))}};function Te(n,e){let t=[],i=0;for(let r of e){let s=n.indexOf(r.text,i);s!==-1&&(s>i&&t.push({type:"text",value:n.slice(i,s)}),t.push({type:"completed",value:r.text,param:r}),i=s+r.text.length)}let o=n.slice(i);return o&&t.push({type:"text",value:o}),t}function Ce(n,e){let t=[],i=[],o=0;for(let r of e){let s=n.indexOf(r.text,o);s===-1?i.push(r):(t.push(r),o=s+r.text.length)}return{valid:t,invalid:i}}function we(n,e){let t=e.dropdownTrigger??"auto",i=e.closeDropdownOnBlur??!0,r=n.filteredOptionsLength>0||n.activePillHasNoOptions;if(n.inEditMode){let s=i?n.isFocused:!0;return r&&s}if(t==="auto"){let s=i?n.isFocused:!0,a=n.text.replace(/\s+$/,"").length,c=n.caretOffset==null||n.caretOffset>=a;return(r||n.isLoading)&&s&&c}return t==="manual"?(r||n.isLoading)&&n.pillTapped:!1}function Ee(n,e){let t=Te(n.text,n.completedParams),i=n.suggestions.filter(g=>g.type!=="placeholder"),o=i[0],r=o?e.optionOverrides?.[o.type]:void 0,s=n.suggestions.filter(g=>g.type==="placeholder").map(g=>g.text).join(" "),a=I(n.text,Math.min(n.filterBase,n.text.length),s),l=n.lastRawQuery!==""||a>0?w(n.text,a,n.filterInProgress):"",p=o?r?r(l.trim()):o.options??[]:[],d=n.editingParam!=null&&n.editingAnchor!=null,m;if(d&&n.editingParam&&n.editingAnchor!=null){let g=n.editingParam.id,v=n.completedParams.some(A=>A.id===g),y=n.caretOffset??n.editingAnchor,P=v?"":n.text.slice(n.editingAnchor,y);m=E(n.editingParam.options,P)}else m=E(p,l);let h=e.showNonTappableOptions===!1;h&&(m=m.filter(g=>g.is_tappable));let x=g=>h?g.is_tappable:!0,f;if(d){let g=n.editingParam?.options??[];f=n.editingParam!=null&&g.filter(x).length===0}else{let g=o?r?r(""):o.options??[]:[];f=o!=null&&g.filter(x).length===0}let b=we({inEditMode:d,filteredOptionsLength:m.length,isFocused:n.isFocused,text:n.text,caretOffset:n.caretOffset,isLoading:n.isLoading,pillTapped:n.pillTapped,activePillHasNoOptions:f},{dropdownTrigger:e.dropdownTrigger,closeDropdownOnBlur:e.closeDropdownOnBlur}),u=b&&n.activeDropdownIndex>=0&&!!m[n.activeDropdownIndex]?.is_tappable;return{segments:t,actionableSuggestions:i,filteredOptions:m,placeholderText:s,isDropdownOpen:b,isActivePillSelected:u}}function j(n){return n.mode==="fresh"?st(n):at(n)}function st(n){let{text:e,completedParams:t,suggestions:i,filterBase:o,filterInProgress:r}=n,a=i.filter(y=>y.type!=="placeholder")[0];if(!a?.options)return null;let c=i.filter(y=>y.type==="placeholder").map(y=>y.text).join(" "),l=I(e,o,c),p=w(e,l,r),d=O(a.options,p);if(!d)return null;let m=d.text.toLowerCase(),h=e.toLowerCase().lastIndexOf(m),x=h>=0?h:Math.max(0,e.length-d.text.length),f=x+d.text.length,b=e.slice(x,f),g=f<e.length&&e[f]===" "?f+1:f,v={id:crypto.randomUUID(),placeholder:"",type:a.type,text:b,kind:d.kind,suggestionType:a.type,suggestionPlaceholder:a.text,options:a.options??[],metadata:d.metadata};return{patch:{text:e,completedParams:[...t,v],suggestions:i.filter(y=>y!==a),filterBase:g,newParamId:v.id,caretOffset:g,activeDropdownIndex:-1},caretPos:g}}function at(n){let{text:e,completedParams:t,editingParam:i,editingAnchor:o,editingTail:r}=n;if(t.some(v=>v.id===i.id))return null;let s=e.slice(o,r),a=O(i.options,s);if(!a)return null;let c=a.text.toLowerCase(),l=s.toLowerCase().lastIndexOf(c),p=o+Math.max(0,l),d=p+a.text.length,m=e.slice(p,d),x=d<e.length&&e[d]===" "?d+1:d,f={id:crypto.randomUUID(),placeholder:"",type:i.suggestionType,text:m,kind:a.kind,suggestionType:i.suggestionType,suggestionPlaceholder:i.suggestionPlaceholder,options:i.options,metadata:a.metadata},b=t.length,u=0;for(let v=0;v<t.length;v++){let y=e.indexOf(t[v].text,u);if(y!==-1){if(y>=x){b=v;break}u=y+t[v].text.length}}let g=[...t];return g.splice(b,0,f),{patch:{text:e,completedParams:g,newParamId:f.id,filterBase:x,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:x,activeDropdownIndex:-1},caretPos:x}}var V=class{constructor(e){this.deps=e}start(e){let t=this.deps.store.get();if(t.editingParam?.id===e)return;let i=t.completedParams.find(s=>s.id===e);if(!i)return;let o=0,r=-1;for(let s of t.completedParams){let a=t.text.indexOf(s.text,o);if(a!==-1){if(s.id===e){r=a;break}o=a+s.text.length}}r<0||this.deps.store.set({editingParam:i,editingAnchor:r,editingTail:r+i.text.length,caretOffset:r+i.text.length,activeDropdownIndex:-1})}exit(){this.deps.store.get().editingParam&&this.deps.store.set({editingParam:null,editingAnchor:null,editingTail:null,activeDropdownIndex:-1})}replaceRange(e){let t=this.deps.store.get(),i=t.editingParam,o=t.editingAnchor,r=t.editingTail;if(!i||o==null||r==null||!t.completedParams.some(c=>c.id===i.id))return!1;let s=t.text.slice(0,o)+e+t.text.slice(r),a=o+e.length;return this.deps.store.set(c=>({text:s,completedParams:c.completedParams.filter(l=>l.id!==i.id),editingTail:a,caretOffset:a,activeDropdownIndex:-1})),this.deps.scheduleSetCursor(a),this.tryPromote(),!0}caretAfterInput(e){let t=this.deps.store.get(),i={caretOffset:e};t.editingParam&&t.editingAnchor!=null&&e!=null&&(e<t.editingAnchor?(i.editingParam=null,i.editingAnchor=null,i.editingTail=null,i.activeDropdownIndex=-1):t.editingTail!=null&&(i.editingTail=Math.max(t.editingTail,e))),this.deps.store.set(i),this.tryPromote()}caretMove(e){let t=this.deps.store.get();if(t.editingParam&&t.editingAnchor!=null&&t.editingTail!=null&&e!=null&&(e<t.editingAnchor||e>t.editingTail)){this.deps.store.set({caretOffset:e,editingParam:null,editingAnchor:null,editingTail:null,activeDropdownIndex:-1});return}this.deps.store.set({caretOffset:e})}selectOption(e){let t=this.deps.store.get(),i=t.editingParam,o=t.editingAnchor,r=t.editingTail;if(!i||o==null||r==null)return;this.deps.fireTelemetry("option",{raw_query:S(t.text,t.completedParams).rawQuery,selected_option:e.text,other_options:i.options.filter(u=>u.text!==e.text).map(u=>u.text)});let s=t.text.slice(0,o),a=t.text.slice(r),c=o===0&&e.text.length>0?e.text[0].toUpperCase()+e.text.slice(1):e.text,l=a.length===0||a[0]!==" ",p=l?`${c} `:c,d=s+p+a,m=o+p.length+(l?0:1),h={id:crypto.randomUUID(),placeholder:"",type:i.suggestionType,text:c,kind:e.kind,suggestionType:i.suggestionType,suggestionPlaceholder:i.suggestionPlaceholder,options:i.options,metadata:e.metadata},x=t.completedParams.findIndex(u=>u.id===i.id),f=t.completedParams.filter(u=>u.id!==i.id),b=x>=0?Math.min(x,f.length):f.length;f.splice(b,0,h),this.deps.store.set({text:d,completedParams:f,newParamId:h.id,filterBase:m,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:m,activeDropdownIndex:-1,pillTapped:!1,skipNextFetch:!0,inSelectionAnimation:!0}),this.deps.startSelectionAnimationTimer(),this.deps.scheduleSetCursor(m)}tryPromote(){let e=this.deps.store.get();if(!e.editingParam||e.editingAnchor==null||e.editingTail==null)return;let t=j({mode:"edit",text:e.text,completedParams:e.completedParams,editingParam:e.editingParam,editingAnchor:e.editingAnchor,editingTail:e.editingTail});t&&(this.deps.store.set(t.patch),this.deps.scheduleSetCursor(t.caretPos))}};var ce="https://ai-autocomplete.com";function z(n=ce){try{if(typeof window>"u"||!window.location)return n;let e=window.location.hostname;if(!e)return n;let t=new URL(n);return t.searchParams.set("utm_source",e),t.toString()}catch{return n}}function X(n,e){return n?{key:"enter",hint:"to proceed"}:e?{key:"tab",hint:"to select"}:{key:"\u2192",hint:"to skip"}}var Ae="data-aia-key";function Y(n,e,t){let i=new Map;for(let s of Array.from(n.children)){let a=s.getAttribute(Ae);a!=null&&i.set(a,s)}let o=new Set,r=[];for(let s=0;s<e.length;s++){let a=e[s],c=t.keyOf(a,s);o.add(c);let l=i.get(c);l||(l=t.create(a,s),l.setAttribute(Ae,c)),t.update?.(l,a,s),n.children[s]!==l&&n.insertBefore(l,n.children[s]??null),r.push(l)}for(let[s,a]of i)o.has(s)||a.remove();return r}var Ie=[125,69];function Oe(n,e){return e?1:n===0?.7:n===1?.4:.2}function J(n,e,t,i,o=!1,r=!1,s=!1){let a=n.querySelector(".magicx-aia-pill-list");if(a||(a=document.createElement("span"),a.className="magicx-aia-pill-list",n.appendChild(a)),r&&e.length===0){a.setAttribute("data-aia-pill-list-loading",""),a.innerHTML="";for(let c=0;c<Ie.length;c++){let l=Ie[c],p=document.createElement("span");p.setAttribute("data-aia-pill-skeleton",""),p.className=`magicx-aia-pill magicx-aia-pill--skeleton${o?" magicx-aia-pill--rounded":""}`,p.style.width=`${l}px`,p.style.opacity=String(Oe(c,!1)),a.appendChild(p)}return}r?a.setAttribute("data-aia-pill-list-loading",""):a.removeAttribute("data-aia-pill-list-loading");for(let c of a.querySelectorAll("[data-aia-pill-skeleton]"))c.remove();Y(a,e,{keyOf:c=>`${c.type}-${c.text}`,create:c=>{let l=document.createElement("button");return l.type="button",l.tabIndex=-1,l.setAttribute("data-aia-pill",""),l.setAttribute("contenteditable","false"),l.textContent=c.text,l.addEventListener("mousedown",p=>p.preventDefault()),l},update:(c,l,p)=>{let d=c,m=s&&p===t&&!r,h=["magicx-aia-pill"];o&&h.push("magicx-aia-pill--rounded"),r&&h.push("magicx-aia-pill--skeleton"),d.className=h.join(" "),d.style.width="",d.style.opacity=String(Oe(p,m)),r?(d.setAttribute("data-aia-loading",""),d.disabled=!0,d.onclick=null):(d.removeAttribute("data-aia-loading"),d.disabled=!1,d.onclick=()=>i(p))}})}function de(n){n.querySelector(".magicx-aia-pill-list")?.remove()}function De(n,e,t,i,o,r,s,a=""){let c=n.querySelector(".aia-grid");if(e.length===0){c?.remove();return}c||(c=document.createElement("div"),c.className="aia-grid magicx-aia-grid",c.setAttribute("data-scroll",""),c.style.setProperty("--aia-grid-min","250px"),c.style.setProperty("--aia-grid-max","1fr"),c.style.setProperty("--aia-grid-gap","0"),n.appendChild(c)),ct(c,e,t,i,o,r,s),lt(c,a)}function lt(n,e){n.dataset.aiaGroup!==e&&(n.dataset.aiaGroup=e,n.scrollTop=0)}function ct(n,e,t,i,o,r,s){let a=s?"1":"0";Y(n,e,{keyOf:c=>`${c.text}\0${a}`,create:c=>dt(c,s),update:(c,l,p)=>{let d=p===t&&!s;c.id=`${r}-option-${p}`,c.dataset.aiaIndex=String(p),c.setAttribute("aria-selected",String(d)),c.classList.toggle("magicx-aia-option--highlighted",d),!s&&l.is_tappable?(c.onclick=()=>{c.classList.add("magicx-aia-option--pressed"),i(l),setTimeout(()=>c.classList.remove("magicx-aia-option--pressed"),500)},c.onmouseenter=()=>{let m=Number.parseInt(c.dataset.aiaIndex??"-1",10);m>=0&&o(m)}):(c.onclick=null,c.onmouseenter=null)}})}function dt(n,e){let t=document.createElement("div");t.setAttribute("role","option"),t.setAttribute("data-aia-option",""),e&&t.setAttribute("data-aia-loading",""),t.tabIndex=e||!n.is_tappable?-1:0;let i=["magicx-aia-option"];n.is_tappable?i.push("magicx-aia-option--tappable"):i.push("magicx-aia-option--non-tappable"),t.className=i.join(" ");let o=document.createElement("div");o.className="magicx-aia-streaks",t.appendChild(o);let r=document.createElement("div");r.className="magicx-aia-streaks-vert",t.appendChild(r);let s=document.createElement("span");s.className="magicx-aia-option-content";let a=document.createElement("span");if(a.className="magicx-aia-option-text",a.textContent=n.icon?`${n.icon} ${n.text}`:n.text,s.appendChild(a),n.tag){let c=document.createElement("span");c.className="magicx-aia-option-tag",c.textContent=n.tag,s.appendChild(c)}return t.appendChild(s),t}var pt=[159,119,164];function Z(n){let e=document.createElement("div");return e.id=n,e.setAttribute("role","listbox"),e.setAttribute("data-aia-dropdown",""),e.className="magicx-aia-dropdown",e.addEventListener("mousedown",t=>t.preventDefault()),e}function ee(n,e){let{filteredOptions:t,activeIndex:i,isOpen:o,isLoading:r,pills:s,showPills:a,isActivePillSelected:c,onSelect:l,onHighlight:p,onPillClick:d}=e,m=a&&s.length>0,h=t.length>0,x=o&&(h||m||r);if(x?n.classList.add("magicx-aia-dropdown--visible"):n.classList.remove("magicx-aia-dropdown--visible"),r?n.setAttribute("data-aia-loading",""):n.removeAttribute("data-aia-loading"),!x)return;let f=n.querySelector(".aia-stack");f||(f=document.createElement("div"),f.className="aia-stack",f.style.setProperty("--aia-stack-space","8px"),n.appendChild(f));let b=m||r&&a,u=f.querySelector(".magicx-aia-pill-bar");b?(u||(u=document.createElement("div"),u.className="magicx-aia-pill-bar aia-cluster",u.setAttribute("data-nowrap",""),u.setAttribute("data-aia-pillbar",""),f.insertBefore(u,f.firstChild)),J(u,s,0,d,!0,r,c)):u&&u.remove();let g=e.suggestions[0],v=g?`${g.type} ${g.text}`:"";De(f,t,i,l,p,e.listboxId,r,v);let y=f.querySelector(".magicx-aia-skeleton-bars");if(r&&!h){if(!y){y=document.createElement("div"),y.className="magicx-aia-skeleton-bars",y.setAttribute("data-aia-skeleton-bars","");for(let Qe of pt){let se=document.createElement("span");se.className="magicx-aia-skeleton-bar",se.style.width=`${Qe}px`,y.appendChild(se)}f.appendChild(y)}}else y&&y.remove();let P=f.querySelector(".magicx-aia-footer")??mt(),A=i>=0&&!!t[i]?.is_tappable;ut(P,X(A,e.isInputEmpty)),f.lastElementChild!==P&&f.appendChild(P)}function ut(n,{key:e,hint:t}){let i=n.querySelector(".magicx-aia-footer-key"),o=n.querySelector(".magicx-aia-footer-hint");!i||!o||(i.textContent!==e&&(i.textContent=e),o.textContent!==t&&(o.textContent=t))}function mt(){let n=document.createElement("footer");n.className="magicx-aia-footer",n.setAttribute("data-aia-footer","");let e=document.createElement("div");e.className="aia-cluster magicx-aia-footer-row",e.setAttribute("data-align","center"),e.setAttribute("data-justify","between"),e.setAttribute("data-nowrap","");let t=document.createElement("div");t.className="aia-cluster magicx-aia-footer-hint-group",t.setAttribute("data-align","center"),t.style.setProperty("--aia-cluster-gap","5px");let i=document.createElement("kbd");i.className="magicx-aia-footer-key",i.textContent="tab";let o=document.createElement("span");o.className="magicx-aia-footer-hint",o.textContent="to select",t.append(i,o);let r=document.createElement("a");r.className="aia-cluster magicx-aia-footer-brand-link",r.setAttribute("data-align","center"),r.href=z(),r.target="_blank",r.rel="noopener noreferrer",r.style.setProperty("--aia-cluster-gap","2px");let s=document.createElement("span");s.className="magicx-aia-footer-brand",s.textContent="AI";let a=document.createElement("span");return a.className="magicx-aia-footer-badge",a.textContent="Autocomplete",r.append(s,a),e.append(t,r),n.append(e),n}function ke(n,e){let t=Z(e.listboxId);return n.appendChild(t),{dropdown:t}}function pe(n,e,t){ee(n.dropdown,{suggestions:e.actionableSuggestions.length>0?[{...e.actionableSuggestions[0],options:e.filteredOptions}]:[],filteredOptions:e.filteredOptions,activeIndex:e.activeDropdownIndex,isOpen:e.isDropdownOpen,isLoading:e.isLoading&&!e.editingParam&&!e.inSelectionAnimation,listboxId:t.listboxId,pills:e.actionableSuggestions,showPills:!0,isActivePillSelected:e.isActivePillSelected,isInputEmpty:e.text.trim().length===0,onSelect:t.selectOption,onHighlight:i=>t.store.set({activeDropdownIndex:i}),onPillClick:t.setActivePill})}function te(n){let{input:e,segments:t,newParamId:i,editingParamId:o,placeholderText:r,isFocused:s}=n,a=t.length===0;e.dataset.aiaEmpty=a?"true":"false",a&&r?e.dataset.placeholder=r:delete e.dataset.placeholder;let c=t.map(b=>`${b.type}:${b.value}`).join("\0"),l=e.dataset.segKey??"",p=e.dataset.newParamId??"",d=e.dataset.editingParamId??"";if(c===l&&(i??"")===p&&(o??"")===d)return;let m=s?C(e):null;e.dataset.segKey=c,e.dataset.newParamId=i??"",e.dataset.editingParamId=o??"";let h=e.ownerDocument??document,x=h.createDocumentFragment(),f=0;for(let b of t)if(f+=b.value.length,b.type==="completed"){let u=h.createElement("strong");u.dataset.seg="completed",u.dataset.paramId=b.param.id;let g=b.param.id===i,v=b.param.id===o,y=["magicx-aia-segment","magicx-aia-segment--completed"];g&&y.push("magicx-aia-shimmer-revealed","magicx-aia-shimmer-sweep"),v&&y.push("magicx-aia-segment--editing"),u.className=y.join(" "),u.textContent=b.value,x.appendChild(u)}else x.appendChild(h.createTextNode(b.value));e.replaceChildren(x),e.dataset.aiaTextLength=String(f),m!=null&&T(e,Math.max(0,Math.min(m,f)))}var gt='<svg width="18" height="18" viewBox="0 0 18 18" fill="none" role="img" aria-label="Submit"><path d="M9 14V4M9 4L4 9M9 4L14 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';function Me(){let n=document.createElement("button");return n.type="button",n.className="magicx-aia-submit",n.setAttribute("aria-label","Submit"),n.setAttribute("data-aia-submit",""),n.innerHTML=gt,n}function ft(){let n=document.createElement("div");return n.setAttribute("contenteditable","plaintext-only"),n.contentEditable==="plaintext-only"}function Le(n,e){let t=e.firstElementChild;if(!t){e.removeAttribute("data-aia-pill-wrapped");return}let i=t.getBoundingClientRect(),o=n.getBoundingClientRect();i.top>=o.bottom-2?e.setAttribute("data-aia-pill-wrapped",""):e.removeAttribute("data-aia-pill-wrapped")}function Re(n,e){let{listboxId:t}=e,i=Z(t);n.appendChild(i);let o=document.createElement("div");o.className="magicx-aia-input-wrapper",n.appendChild(o);let r=document.createElement("div");r.className="magicx-aia-editor",r.setAttribute("data-aia-editor",""),o.appendChild(r);let s=document.createElement("div");s.className="magicx-aia-input",s.setAttribute("data-aia-input",""),s.setAttribute("contenteditable",ft()?"plaintext-only":"true"),s.setAttribute("role","combobox"),s.setAttribute("aria-autocomplete","list"),s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-controls",t),s.setAttribute("aria-expanded","false"),s.setAttribute("spellcheck","true"),s.setAttribute("enterkeyhint","send"),r.appendChild(s);let a=document.createElement("span");a.className="magicx-aia-pill-list-container",a.setAttribute("data-aia-pill-list-container",""),r.appendChild(a);let c=null,l=null;e.submitButton===void 0?(c=Me(),o.appendChild(c),l=c):e.submitButton!==null&&(l=e.submitButton,l.hasAttribute("data-aia-submit")||l.setAttribute("data-aia-submit",""),o.appendChild(l));let p=new AbortController,{signal:d}=p,m=!1,h=0,x=()=>{let u=L(s),v=u.length>0&&u[0]!==u[0].toUpperCase()?u[0].toUpperCase()+u.slice(1):u;e.handleChange(v)},f=()=>{let u=(s.ownerDocument??document).getSelection();if(!u||u.rangeCount===0)return null;let g=u.anchorNode;return!g||!s.contains(g)?null:(g.nodeType===Node.ELEMENT_NODE?g:g.parentElement)?.closest('strong[data-seg="completed"][data-param-id]')?.dataset.paramId??null};o.addEventListener("click",u=>{u.target?.closest("[data-aia-pill]")||s.focus()},{signal:d}),s.addEventListener("input",()=>{m||(h=performance.now(),x(),e.handleCaretAfterInput(C(s)))},{signal:d});let b=s.ownerDocument??document;if(b.addEventListener("selectionchange",()=>{let u=b.getSelection();if(!u||u.rangeCount===0||!s.contains(u.anchorNode))return;let g=f(),v=e.store.get().editingParam?.id??null;if(g&&g!==v){e.startEditingParam(g);return}performance.now()-h<50||e.handleCaretMove(C(s))},{signal:d}),s.addEventListener("compositionstart",()=>{m=!0},{signal:d}),s.addEventListener("compositionend",()=>{m=!1,x()},{signal:d}),s.addEventListener("beforeinput",u=>{let g=u,v=g.inputType;if(v==="insertParagraph"||v==="insertLineBreak"||v==="insertFromDrop"){u.preventDefault();return}if(v.startsWith("insert")||v.startsWith("delete")){let y=v.startsWith("delete")?"":g.data??"";e.replaceEditingRange(y)&&u.preventDefault()}},{signal:d}),s.addEventListener("paste",u=>{u.preventDefault();let g=(u.clipboardData?.getData("text/plain")??"").replace(/\r?\n/g," ");if(!g)return;let v=s.ownerDocument??document,y=v.getSelection();if(!y||y.rangeCount===0)return;let P=y.getRangeAt(0);if(!s.contains(P.startContainer))return;P.deleteContents();let A=v.createTextNode(g);P.insertNode(A),P.setStartAfter(A),P.collapse(!0),y.removeAllRanges(),y.addRange(P),x()},{signal:d}),s.addEventListener("keydown",u=>e.handleKeyDown(u),{signal:d}),s.addEventListener("focus",()=>e.store.set({isFocused:!0}),{signal:d}),s.addEventListener("blur",()=>e.store.set({isFocused:!1}),{signal:d}),l&&l.addEventListener("click",u=>{let g=e.store.get();if(!(!!g.text||g.completedParams.length>0)||!e.onSubmit)return;u.stopPropagation();let{rawQuery:y,completedParams:P}=S(g.text,g.completedParams);e.onSubmit({query:g.text.trim(),raw_query:y,completed_params:P}),e.afterSubmit?.()},{signal:d}),e.autoFocus!==!1){s.focus();let u=s.ownerDocument??document,g=u.getSelection(),v=g&&g.rangeCount>0&&s.contains(g.anchorNode);if(g&&!v){let y=u.createRange();y.selectNodeContents(s),y.collapse(!0),g.removeAllRanges(),g.addRange(y)}}if(typeof ResizeObserver<"u"){let u=new ResizeObserver(()=>Le(s,a));u.observe(s),p.signal.addEventListener("abort",()=>u.disconnect(),{once:!0})}return{input:s,inlinePillContainer:a,dropdown:i,submitButton:c,abort:p}}function ue(n,e,t){let{input:i,inlinePillContainer:o,dropdown:r,submitButton:s}=n,{pillPlacement:a,setActivePill:c,selectOption:l,store:p}=t;i.setAttribute("aria-expanded",String(e.isDropdownOpen));let d=e.activeDropdownIndex>=0?`${t.listboxId}-option-${e.activeDropdownIndex}`:"";if(d?i.setAttribute("aria-activedescendant",d):i.removeAttribute("aria-activedescendant"),s){let b=!!e.text||e.completedParams.length>0;s.disabled=!b}let m=i.dataset.newParamId??"",h=e.newParamId!==null&&e.newParamId!==m;if(te({input:i,segments:e.segments,newParamId:e.newParamId,editingParamId:e.editingParam?.id??null,placeholderText:e.placeholderText,isFocused:e.isFocused}),a==="inline"){let b=e.isLoading&&!e.editingParam&&!e.inSelectionAnimation;b||e.actionableSuggestions.length>0?J(o,e.actionableSuggestions,0,c,!1,b,e.isActivePillSelected):de(o)}else de(o);Le(i,o),h?(i.focus(),T(i,e.caretOffset??e.text.length)):e.isFocused&&L(i)!==e.text&&T(i,e.text.length);let x=e.editingParam?{type:e.editingParam.suggestionType,text:e.editingParam.suggestionPlaceholder,required:!0,options:e.editingParam.options}:null,f=x??e.actionableSuggestions[0];ee(r,{suggestions:f?[{...f,options:e.filteredOptions}]:[],filteredOptions:e.filteredOptions,activeIndex:e.activeDropdownIndex,isOpen:e.isDropdownOpen,isLoading:e.isLoading&&!e.editingParam&&!e.inSelectionAnimation,listboxId:t.listboxId,pills:x?[x]:e.actionableSuggestions,showPills:a==="dropdown",isActivePillSelected:e.isActivePillSelected,isInputEmpty:e.text.trim().length===0,onSelect:l,onHighlight:b=>p.set({activeDropdownIndex:b}),onPillClick:c})}function Ne(n,e){let t=n.actionableSuggestions[0];if(!t)return null;let i=n.filterBase,o=n.text.slice(0,i),r=o.length===0&&n.text.length===0,s=o.length===0&&n.text.length>0&&n.placeholderText.length>0&&n.placeholderText.toLowerCase().startsWith(n.text.toLowerCase());(r||s)&&n.placeholderText&&(o=`${n.placeholderText} `);let a=be(o,e.text);a>0&&(o=o.slice(0,o.length-a));let c=o.length>0&&o[o.length-1]!==" ",l=`${o}${c?" ":""}${e.text} `,p=(r||s)&&l.length>0?l[0].toUpperCase()+l.slice(1):l,d=p.toLowerCase().lastIndexOf(e.text.toLowerCase()),m=d>=0?p.slice(d,d+e.text.length):e.text,h={id:crypto.randomUUID(),placeholder:"",type:t.type,text:m,kind:e.kind,suggestionType:t.type,suggestionPlaceholder:t.text,options:t.options??[],metadata:e.metadata},x=n.actionableSuggestions.length-1;return{patch:{text:p,filterBase:p.length,completedParams:[...n.completedParams,h],newParamId:h.id,caretOffset:p.length,pillTapped:!1,activeDropdownIndex:-1,skipNextFetch:x>0,inSelectionAnimation:!0},telemetry:{selectedOption:e.text,otherOptions:n.filteredOptions.filter(f=>f.text!==e.text).map(f=>f.text)},consumedSuggestion:t,remainingActionable:x}}function ne(n){let e=n,t=new Set;return{get:()=>e,set:i=>{let o=typeof i=="function"?i(e):i,r={...e,...o},s=e;e=r;for(let a of t)a(r,s)},subscribe:i=>(t.add(i),()=>{t.delete(i)})}}function _e(n,e){let t,i,o=r=>(r!==t&&(t=r,i=e(r)),i);return{get:()=>{let r=n.get();return{...r,...o(r)}},set:r=>{typeof r=="function"?n.set(s=>{let a={...s,...o(s)};return r(a)}):n.set(r)},peek:r=>{let s={...n.get(),...r};return{...s,...e(s)}},subscribe:r=>n.subscribe((s,a)=>{let c={...a,...o(a)},l={...s,...o(s)};r(l,c)})}}var me=!1;function He(){if(me||typeof document>"u")return;if(document.querySelector("style[data-magicx-aia]")){me=!0;return}me=!0;let n=document.createElement("style");n.setAttribute("data-magicx-aia",""),n.textContent=ht,document.head.appendChild(n)}var ht=`@layer layout {
|
|
2
2
|
.aia-stack {
|
|
3
3
|
display: flex;
|
|
4
4
|
flex-direction: column;
|
|
@@ -70,7 +70,9 @@
|
|
|
70
70
|
grid-auto-rows: min-content;
|
|
71
71
|
align-content: start;
|
|
72
72
|
justify-content: start;
|
|
73
|
-
|
|
73
|
+
/* The scroll box's reserved band (--aia-grid-scroll-* / --aia-grid-overlap-*)
|
|
74
|
+
is deliberately NOT declared here \u2014 see the unlayered rule in
|
|
75
|
+
appearance.css for why. */
|
|
74
76
|
max-height: var(--aia-grid-max-height, 120px);
|
|
75
77
|
overflow-y: auto;
|
|
76
78
|
scrollbar-width: thin;
|
|
@@ -86,33 +88,6 @@
|
|
|
86
88
|
background: var(--aia-scrollbar-thumb, rgba(255, 255, 255, 0.3));
|
|
87
89
|
border-radius: 3px;
|
|
88
90
|
}
|
|
89
|
-
|
|
90
|
-
/* Fade wrapper \u2014 bottom gradient overlay shown while the grid overflows
|
|
91
|
-
below: overflowing options fade into the dropdown surface color. Toggled
|
|
92
|
-
via data-fade by renderSuggestionGrid (mirrors React/Angular). */
|
|
93
|
-
.aia-grid-fade {
|
|
94
|
-
position: relative;
|
|
95
|
-
}
|
|
96
|
-
.aia-grid-fade::after {
|
|
97
|
-
content: "";
|
|
98
|
-
position: absolute;
|
|
99
|
-
left: 0;
|
|
100
|
-
right: 0;
|
|
101
|
-
bottom: 0;
|
|
102
|
-
height: 30%;
|
|
103
|
-
pointer-events: none;
|
|
104
|
-
opacity: 0;
|
|
105
|
-
transition: opacity 150ms ease-out;
|
|
106
|
-
background: linear-gradient(to bottom, transparent, var(--aia-surface, #ffffff));
|
|
107
|
-
}
|
|
108
|
-
.aia-grid-fade[data-fade]::after {
|
|
109
|
-
opacity: 1;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/* Glass surface has no solid color to fade into, so skip the fade entirely. */
|
|
113
|
-
[data-aia-surface="glass"] .aia-grid-fade::after {
|
|
114
|
-
display: none;
|
|
115
|
-
}
|
|
116
91
|
}
|
|
117
92
|
|
|
118
93
|
/* ===================================================================
|
|
@@ -380,7 +355,7 @@
|
|
|
380
355
|
display: block;
|
|
381
356
|
height: 14px;
|
|
382
357
|
border-radius: 999px;
|
|
383
|
-
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.
|
|
358
|
+
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.25)));
|
|
384
359
|
opacity: 0.5;
|
|
385
360
|
animation: magicx-aia-skeleton-pulse 1.4s ease-in-out infinite;
|
|
386
361
|
}
|
|
@@ -413,6 +388,15 @@
|
|
|
413
388
|
flex-direction: column;
|
|
414
389
|
gap: 8px;
|
|
415
390
|
padding: var(--aia-footer-gap, 8px) 8px 0;
|
|
391
|
+
/* The fade itself lives in appearance.css, on the footer's background.
|
|
392
|
+
Paints above the rows it covers: option content sits at z-index 2 (see
|
|
393
|
+
.magicx-aia-option-content) in this same stacking context, so anything
|
|
394
|
+
lower would end up *behind* the rows. */
|
|
395
|
+
position: relative;
|
|
396
|
+
z-index: 3;
|
|
397
|
+
/* Sitting on top of the list would otherwise swallow clicks and hovers on
|
|
398
|
+
the rows scrolling under it \u2014 only the branding link needs to be hit. */
|
|
399
|
+
pointer-events: none;
|
|
416
400
|
}
|
|
417
401
|
|
|
418
402
|
.magicx-aia-footer-key {
|
|
@@ -437,12 +421,41 @@
|
|
|
437
421
|
color: var(--aia-footer-hint-color, #505050);
|
|
438
422
|
}
|
|
439
423
|
|
|
424
|
+
.magicx-aia-footer-hint-group,
|
|
425
|
+
.magicx-aia-footer-brand-link {
|
|
426
|
+
/* Re-enabled over the footer's \`pointer-events: none\`: both groups are
|
|
427
|
+
visible chips sitting on the scroll band, so a click on one must land on
|
|
428
|
+
the chip rather than falling through to the option row behind it. */
|
|
429
|
+
pointer-events: auto;
|
|
430
|
+
}
|
|
431
|
+
|
|
440
432
|
.magicx-aia-footer-brand-link {
|
|
441
433
|
text-decoration: none;
|
|
442
434
|
cursor: pointer;
|
|
443
435
|
transition: opacity 150ms ease-out;
|
|
444
436
|
}
|
|
445
437
|
|
|
438
|
+
/* The two content groups carry a solid surface fill so the keyboard hint and
|
|
439
|
+
the AI-Autocomplete badge stay fully legible over whatever option row is
|
|
440
|
+
scrolling behind the footer. The inline padding keeps the fill from hugging
|
|
441
|
+
the glyphs. --aia-footer-chip-bg resolves to \`transparent\` on the glass
|
|
442
|
+
surface, where there's no solid color to fill with. */
|
|
443
|
+
.magicx-aia-footer-hint-group,
|
|
444
|
+
.magicx-aia-footer-brand-link {
|
|
445
|
+
/* Mixed here rather than declared on the container: a custom property
|
|
446
|
+
substitutes var() on the element its declaration applies to, so a mix
|
|
447
|
+
computed upstream would freeze the *theme's* surface and miss a
|
|
448
|
+
dropdown-level --aia-surface retint. Computed on the footer, it picks up
|
|
449
|
+
whichever ancestor set the surface. --aia-footer-chip-bg stays the
|
|
450
|
+
override hook \u2014 consumers set it, and the glass surface zeroes it. */
|
|
451
|
+
background: var(
|
|
452
|
+
--aia-footer-chip-bg,
|
|
453
|
+
color-mix(in srgb, var(--aia-surface, #ffffff) 65%, transparent)
|
|
454
|
+
);
|
|
455
|
+
padding-inline: 4px;
|
|
456
|
+
border-radius: 6px;
|
|
457
|
+
}
|
|
458
|
+
|
|
446
459
|
.magicx-aia-footer-brand-link:hover {
|
|
447
460
|
opacity: 0.7;
|
|
448
461
|
}
|
|
@@ -457,7 +470,7 @@
|
|
|
457
470
|
.magicx-aia-footer-badge {
|
|
458
471
|
display: inline-flex;
|
|
459
472
|
align-items: center;
|
|
460
|
-
height: 23px;
|
|
473
|
+
height: var(--aia-footer-row-height, 23px);
|
|
461
474
|
padding: 2.5px 5.5px;
|
|
462
475
|
border: 0.5px solid var(--aia-footer-badge-border, rgba(189, 189, 189, 0.51));
|
|
463
476
|
border-radius: 999px;
|
|
@@ -492,7 +505,7 @@
|
|
|
492
505
|
makes the radius render cleanly on each line bar. */
|
|
493
506
|
.magicx-aia-option[data-aia-loading] .magicx-aia-option-text {
|
|
494
507
|
color: transparent;
|
|
495
|
-
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.
|
|
508
|
+
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.25)));
|
|
496
509
|
border-radius: 999px;
|
|
497
510
|
-webkit-box-decoration-break: clone;
|
|
498
511
|
box-decoration-break: clone;
|
|
@@ -565,7 +578,7 @@
|
|
|
565
578
|
pointer-events: none;
|
|
566
579
|
cursor: default;
|
|
567
580
|
color: transparent;
|
|
568
|
-
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.
|
|
581
|
+
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.25)));
|
|
569
582
|
animation: magicx-aia-pill-skeleton-pulse 1.4s ease-in-out infinite;
|
|
570
583
|
}
|
|
571
584
|
|
|
@@ -574,7 +587,7 @@
|
|
|
574
587
|
pointer-events: none;
|
|
575
588
|
cursor: default;
|
|
576
589
|
color: transparent;
|
|
577
|
-
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.
|
|
590
|
+
background: var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, 0.25)));
|
|
578
591
|
box-shadow: none;
|
|
579
592
|
backdrop-filter: none;
|
|
580
593
|
animation: magicx-aia-pill-skeleton-pulse 1.4s ease-in-out infinite;
|
|
@@ -945,6 +958,7 @@
|
|
|
945
958
|
*/
|
|
946
959
|
:where(.magicx-aia) {
|
|
947
960
|
--aia-primitive-neutral-0: #000000;
|
|
961
|
+
--aia-primitive-neutral-150: #1a1b1d;
|
|
948
962
|
--aia-primitive-neutral-250: #323232;
|
|
949
963
|
--aia-primitive-neutral-300: #333539;
|
|
950
964
|
--aia-primitive-neutral-400: #4a4a4a;
|
|
@@ -955,6 +969,7 @@
|
|
|
955
969
|
--aia-primitive-neutral-1000: #ffffff;
|
|
956
970
|
--aia-primitive-blue-50: #eef2ff;
|
|
957
971
|
--aia-primitive-neutral-750-a50: rgba(189, 189, 189, 0.51);
|
|
972
|
+
--aia-primitive-neutral-750-a25: rgba(189, 189, 189, 0.25);
|
|
958
973
|
--aia-primitive-neutral-750-a35: rgba(189, 189, 189, 0.35);
|
|
959
974
|
--aia-primitive-neutral-750-a30: rgba(189, 189, 189, 0.3);
|
|
960
975
|
--aia-primitive-neutral-750-a15: rgba(189, 189, 189, 0.15);
|
|
@@ -1004,7 +1019,9 @@
|
|
|
1004
1019
|
|
|
1005
1020
|
--aia-color-text-muted: #6b7280; /* off shared palette (slate) */
|
|
1006
1021
|
|
|
1007
|
-
|
|
1022
|
+
/* Loading bars sit at half the contrast of the surrounding chrome so they
|
|
1023
|
+
read as a placeholder, not as content (a50 -> a25 over the light surface). */
|
|
1024
|
+
--aia-skeleton-bg: var(--aia-primitive-neutral-750-a25);
|
|
1008
1025
|
|
|
1009
1026
|
--aia-streak-rgb: 99, 102, 241; /* off shared palette (indigo effect) */
|
|
1010
1027
|
--aia-streak-glass-bg: rgba(99, 102, 241, 0.1);
|
|
@@ -1053,7 +1070,9 @@
|
|
|
1053
1070
|
|
|
1054
1071
|
--aia-color-text-muted: #c1c4cb; /* off shared palette (slate) */
|
|
1055
1072
|
|
|
1056
|
-
|
|
1073
|
+
/* Half as light against the dark surface as the old neutral-300 fill \u2014 the
|
|
1074
|
+
dark-mode counterpart of the light theme's a50 -> a25 step-down. */
|
|
1075
|
+
--aia-skeleton-bg: var(--aia-primitive-neutral-150);
|
|
1057
1076
|
|
|
1058
1077
|
--aia-streak-rgb: 255, 255, 255;
|
|
1059
1078
|
--aia-streak-glass-bg: rgba(255, 255, 255, 0.1);
|
|
@@ -1063,10 +1082,82 @@
|
|
|
1063
1082
|
--aia-footer-badge-border: var(--aia-primitive-neutral-500);
|
|
1064
1083
|
}
|
|
1065
1084
|
|
|
1085
|
+
/* Footer band \u2014 the option list runs *under* the dropdown footer and dissolves
|
|
1086
|
+
into it, instead of being cut off mid-row above it. The band is the footer's
|
|
1087
|
+
own height \u2014 its top inset (--aia-footer-gap) + --aia-footer-row-height:
|
|
1088
|
+
- the options grid reserves it as bottom padding, so the last option can
|
|
1089
|
+
still be scrolled fully clear of the footer;
|
|
1090
|
+
- --aia-grid-overlap-bottom (the band + the 8px stack gap) pulls the footer
|
|
1091
|
+
back up over that band;
|
|
1092
|
+
- the footer's background is the fade: transparent at the band's top edge,
|
|
1093
|
+
the full dropdown surface at its bottom, so a row dissolves as it passes
|
|
1094
|
+
behind. Its hint and branding groups sit on a 65%-opaque fill of their
|
|
1095
|
+
own (--aia-footer-chip-bg) so they stay legible across it.
|
|
1096
|
+
Lives here rather than with the dropdown's own rules so the
|
|
1097
|
+
optionsPosition="above" reset below always follows it in the cascade. */
|
|
1098
|
+
[data-aia-dropdown] {
|
|
1099
|
+
/* Height of the footer's hint / branding row \u2014 the badge is its tallest item
|
|
1100
|
+
(the kbd is shorter and centers against it). The band derives from it, so
|
|
1101
|
+
restyling the badge's height keeps the overlap in step. */
|
|
1102
|
+
--aia-footer-row-height: 23px;
|
|
1103
|
+
--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));
|
|
1104
|
+
--aia-grid-scroll-bottom: var(--aia-footer-band);
|
|
1105
|
+
--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));
|
|
1106
|
+
/* How far above the band the fade starts. */
|
|
1107
|
+
--aia-footer-fade-lead: 20px;
|
|
1108
|
+
--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0;
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
/* The reserved band the footer overlaps, kept OUT of \`@layer layout\` on
|
|
1112
|
+
purpose. A consumer reset (\`* { margin: 0; padding: 0 }\`, Tailwind's
|
|
1113
|
+
preflight, \u2026) is unlayered, and an unlayered declaration beats every layered
|
|
1114
|
+
one no matter its specificity \u2014 inside the layer this padding and margin
|
|
1115
|
+
were silently zeroed and the footer had nothing to sit over. */
|
|
1116
|
+
[data-aia-dropdown] .aia-grid[data-scroll] {
|
|
1117
|
+
padding-top: var(--aia-grid-scroll-top, 0);
|
|
1118
|
+
padding-bottom: var(--aia-grid-scroll-bottom, 0);
|
|
1119
|
+
margin-top: var(--aia-grid-overlap-top, 0);
|
|
1120
|
+
margin-bottom: var(--aia-grid-overlap-bottom, 0);
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
/* The fade. Painted on a pseudo-element rather than the footer box so it can
|
|
1124
|
+
start --aia-footer-fade-lead above the band's top edge: a row is then already
|
|
1125
|
+
dissolving by the time it reaches the hint / branding line, instead of
|
|
1126
|
+
crossing it at half strength. --aia-surface is what the dropdown paints
|
|
1127
|
+
itself with, so theming the surface retints the fade with it. z-index: -1
|
|
1128
|
+
keeps it under the footer's own content but, via the footer's stacking
|
|
1129
|
+
context, above the option rows. */
|
|
1130
|
+
[data-aia-dropdown] [data-aia-footer]::before {
|
|
1131
|
+
content: "";
|
|
1132
|
+
position: absolute;
|
|
1133
|
+
inset: var(--aia-footer-fade-inset, -20px 0 0);
|
|
1134
|
+
z-index: -1;
|
|
1135
|
+
pointer-events: none;
|
|
1136
|
+
background: linear-gradient(to bottom, transparent, var(--aia-surface, #ffffff));
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
/* The glass surface is translucent \u2014 there's no solid color to dissolve into,
|
|
1140
|
+
and a fill behind the hint / branding would paint an opaque patch on a
|
|
1141
|
+
frosted panel. Both opt out. */
|
|
1142
|
+
[data-aia-dropdown][data-aia-surface="glass"] {
|
|
1143
|
+
--aia-footer-chip-bg: transparent;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
[data-aia-dropdown][data-aia-surface="glass"] [data-aia-footer]::before {
|
|
1147
|
+
display: none;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1066
1150
|
/* optionsPosition: dropdown above the input. The sections live inside the
|
|
1067
1151
|
dropdown's .aia-stack, so the reversal targets the stack (not the dropdown,
|
|
1068
1152
|
whose only child is the stack). */
|
|
1069
1153
|
:where(.magicx-aia[data-options-position="above"]) [data-aia-dropdown] {
|
|
1154
|
+
/* The stack is reversed here (the footer sits on top of the list), so the
|
|
1155
|
+
reserved band and the overlap flip to the top edge. */
|
|
1156
|
+
--aia-grid-scroll-bottom: 0px;
|
|
1157
|
+
--aia-grid-overlap-bottom: 0px;
|
|
1158
|
+
--aia-grid-scroll-top: var(--aia-footer-band);
|
|
1159
|
+
--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));
|
|
1160
|
+
--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));
|
|
1070
1161
|
top: auto;
|
|
1071
1162
|
bottom: 100%;
|
|
1072
1163
|
margin-top: 0;
|
|
@@ -1077,6 +1168,17 @@
|
|
|
1077
1168
|
flex-direction: column-reverse;
|
|
1078
1169
|
}
|
|
1079
1170
|
|
|
1171
|
+
/* The footer now sits on top of the list, so its breathing room flips to the
|
|
1172
|
+
bottom edge \u2014 the side the option rows scroll under. */
|
|
1173
|
+
:where(.magicx-aia[data-options-position="above"]) [data-aia-dropdown] [data-aia-footer] {
|
|
1174
|
+
padding: 0 8px var(--aia-footer-gap, 8px);
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
/* ...and the fade runs the other way, out of the footer and down into the list. */
|
|
1178
|
+
:where(.magicx-aia[data-options-position="above"]) [data-aia-dropdown] [data-aia-footer]::before {
|
|
1179
|
+
background: linear-gradient(to top, transparent, var(--aia-surface, #ffffff));
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1080
1182
|
/* Disable all animations when data-animations="off" */
|
|
1081
1183
|
:where(.magicx-aia[data-animations="off"]) *,
|
|
1082
1184
|
:where(.magicx-aia[data-animations="off"]) *::before,
|
|
@@ -1084,5 +1186,5 @@
|
|
|
1084
1186
|
animation-duration: 0s !important;
|
|
1085
1187
|
transition-duration: 0s !important;
|
|
1086
1188
|
}
|
|
1087
|
-
`;var ne=class{constructor(){this.listeners={}}on(e,t){let i=(...r)=>t(...r),o=this.listeners[e];return o||(o=new Set,this.listeners[e]=o),o.add(i),()=>{this.listeners[e]?.delete(i)}}emit(e,...t){let i=this.listeners[e];if(i)for(let o of i)o(...t)}hasListeners(e){return(this.listeners[e]?.size??0)>0}clear(){this.listeners={}}};var ie=class{constructor(){this.timers=new Map}schedule(e,t,i){this.clear(e);let o=setTimeout(()=>{this.timers.delete(e),t()},i);this.timers.set(e,o)}clear(e){let t=this.timers.get(e);t!==void 0&&(clearTimeout(t),this.timers.delete(e))}clearAll(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};var M=class{constructor(e,t="auto",i){this.container=e;this.mode=t;this.onResolve=i;this.mediaQuery=null;this.onSystemChange=e=>{this.setResolved(e.matches?"dark":"light")};this.apply()}setMode(e){this.detachListener(),this.mode=e,this.apply()}destroy(){this.detachListener()}apply(){this.mode==="auto"?(this.mediaQuery??(this.mediaQuery=window.matchMedia("(prefers-color-scheme: dark)")),this.mediaQuery.addEventListener("change",this.onSystemChange),this.setResolved(this.mediaQuery.matches?"dark":"light")):this.setResolved(this.mode)}setResolved(e){this.container.dataset.mode=e,this.onResolve?.(e)}detachListener(){this.mediaQuery?.removeEventListener("change",this.onSystemChange)}};function ht(n){return(n??N).replace(/\/suggest(\?|#|$)/,"/telemetry/events$1")}async function xt(n){return k(n)?`Bearer ${await _(n).getToken()}`:F(n)}async function He(n){try{let e=ht(n.apiConfig?.endpoint),t=H(n.apiConfig),i=await xt(n.apiConfig);i&&(t.Authorization=i);let o=JSON.stringify({source:n.source,session_id:n.sessionId,type:n.type,at:new Date().toISOString(),query_data:n.queryData});await fetch(e,{method:"POST",headers:t,body:o})}catch{}}var bt="newParam",Fe="suggestionRemoval",yt="selectionAnimation",vt=650,St=0;function Pt(){return`:ac-${++St}:`}var Be=500;function Ke(){return{text:"",completedParams:[],suggestions:[],activeDropdownIndex:-1,newParamId:null,isLoading:!1,isReady:!1,error:null,filterBase:0,filterInProgress:!1,pillTapped:!1,skipNextFetch:!1,lastRawQuery:"",isFocused:!1,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:null,inSelectionAnimation:!1}}var oe=class{constructor(e,t={}){this.inputStore=te(Ke());this._listboxId=Pt();this.modeController=null;this.unsubscribers=[];this.domRefs=null;this.dropdownRefs=null;this.timers=new ie;this.emitter=new ne;this.sessionId=crypto.randomUUID();this.emitSubmit=e=>this.emitter.emit("submit",e);this.emitError=e=>this.emitter.emit("error",e);this.container=e,this.opts=t,this.renderMode=t.renderMode??"full",this.store=Ne(this.inputStore,i=>Ce(i,this.opts)),t.onSubmit&&this.emitter.on("submit",t.onSubmit),t.onError&&this.emitter.on("error",t.onError),t.onChange&&this.emitter.on("change",t.onChange),t.onParamsChange&&this.emitter.on("paramsChange",t.onParamsChange),t.onStateChange&&this.emitter.on("stateChange",t.onStateChange),t.onFocus&&this.emitter.on("focus",t.onFocus),t.onBlur&&this.emitter.on("blur",t.onBlur),t.value!==void 0&&this.store.set({text:t.value}),t.completedParams!==void 0&&this.store.set({completedParams:t.completedParams}),this.pillsController=new W(this.store,{onPillSelected:({rawQuery:i,selectedPill:o,otherPills:r})=>{this.fireTelemetry("pill",{raw_query:i,selected_pill:o,other_pills:r})}}),this.reEdit=new V({store:this.store,scheduleSetCursor:i=>this.scheduleSetCursor(i),fireTelemetry:(i,o)=>this.fireTelemetry(i,o),startSelectionAnimationTimer:()=>this.startSelectionAnimationTimer()}),this.fetchController=new B(this.store,()=>this.opts.apiConfig,()=>this.opts.optionOverrides,()=>this.opts.maskCompletedText,()=>this.emitter.hasListeners("error")?this.emitError:void 0,()=>this.sessionId,{onAutoMatch:({active:i,matched:o,rawQuery:r})=>{this.fireTelemetry("option",{raw_query:r,selected_option:o.text,other_options:(i.options??[]).filter(s=>s.text!==o.text).map(s=>s.text)})}}),this.keyboardController=new G(this.store,{columns:t.columns??2,listboxId:this.listboxId,getOnSubmit:()=>this.emitter.hasListeners("submit")?this.emitSubmit:void 0,getOptionsPosition:()=>this.opts.optionsPosition??"below",afterSubmit:this.renderMode==="full"?()=>this.reset():void 0,selectOption:i=>this.selectOption(i),removeParamAtCaret:i=>this.removeParamAtCaret(i),exitEditMode:()=>this.exitEditMode()}),this.unsubscribers.push(this.store.subscribe((i,o)=>{i.text!==o.text&&this.emitter.emit("change",i.text),i.completedParams!==o.completedParams&&this.emitter.emit("paramsChange",i.completedParams),i.isFocused!==o.isFocused&&(i.isFocused?this.emitter.emit("focus"):this.emitter.emit("blur")),this.emitter.emit("stateChange",i)})),this.unsubscribers.push(this.store.subscribe(()=>this.maybeExitReEditOnNoMatch())),this.renderMode!=="headless"&&(_e(),this.setupContainer()),this.renderMode==="full"?this.buildAndRenderFull():this.renderMode==="dropdown"&&this.buildAndRenderDropdown(),this.fetchController.start()}focus(){this.domRefs?.input.focus()}blur(){this.domRefs?.input.blur()}reset(){let e=this.store.get().isFocused;this.store.set({...Ke(),isFocused:e,skipNextFetch:!0}),this.sessionId=crypto.randomUUID(),this.fetchController.doFetch("",[])}destroy(){this.fetchController.dispose(),this.modeController?.destroy(),this.timers.clearAll(),this.emitter.clear();for(let e of this.unsubscribers)e();this.unsubscribers=[],this.domRefs?.abort.abort(),this.domRefs=null,this.dropdownRefs=null,this.renderMode!=="headless"&&(this.container.innerHTML="")}setMode(e){this.modeController?.setMode(e)}setValue(e){this.store.set({text:e})}setCompletedParams(e){this.store.set({completedParams:e})}setActivePill(e){this.pillsController.setActivePill(e);let t=this.store.get().text.length;this.store.set({caretOffset:t,isFocused:!0}),this.scheduleSetCursor(t)}removeLastParam(){this.pillsController.removeLastParam()}removeParamAtCaret(e){let t=this.store.get(),{text:i,completedParams:o}=t,r=0;for(let s=0;s<o.length;s++){let a=o[s],c=i.indexOf(a.text,r);if(c===-1)continue;let l=c,p=c+a.text.length;if(e>l&&e<=p){let d=U(i,e),g=i.slice(0,d)+i.slice(e),h=o.filter((x,f)=>f!==s);return this.store.set(x=>({text:g,filterBase:Math.min(x.filterBase,g.length),completedParams:h,pillTapped:!1,activeDropdownIndex:-1})),this.scheduleSetCursor(d),!0}r=p}return!1}scheduleSetCursor(e){queueMicrotask(()=>{let t=this.domRefs;t?(t.input.focus(),P(t.input,e)):this.opts.setCursor?.(e)})}clearNewParamId(){this.store.set({newParamId:null})}startEditingParam(e){this.reEdit.start(e)}replaceEditingRange(e){return this.reEdit.replaceRange(e)}exitEditMode(){this.reEdit.exit()}handleCaretAfterInput(e){this.reEdit.caretAfterInput(e)}handleCaretMove(e){this.reEdit.caretMove(e)}setActiveDropdownIndex(e){this.store.set({activeDropdownIndex:e})}handleTextChange(e){this.handleChange(e)}handleKeyDown(e){this.keyboardController.handleKeyDown(e)}setFocused(e){this.store.get().isFocused!==e&&this.store.set({isFocused:e})}subscribe(e){return this.store.subscribe(t=>e(t))}getState(){return this.store.get()}get listboxId(){return this._listboxId}get isReady(){return this.store.get().isReady}on(e,t){return this.emitter.on(e,t)}update(e){Object.assign(this.opts,e),e.mode!==void 0&&this.modeController?.setMode(e.mode),e.optionsPosition!==void 0&&(this.container.dataset.optionsPosition=e.optionsPosition),e.animations!==void 0&&(this.container.dataset.animations=e.animations?"on":"off"),e.pillPlacement!==void 0&&(this.container.dataset.pillPlacement=e.pillPlacement,this.store.set({})),(e.dropdownTrigger!==void 0||e.closeDropdownOnBlur!==void 0||e.showNonTappableOptions!==void 0)&&this.store.set({}),e.value!==void 0&&this.store.set({text:e.value}),e.completedParams!==void 0&&this.store.set({completedParams:e.completedParams})}selectOption(e){let t=this.store.get();if(t.editingParam&&t.editingAnchor!=null&&t.editingTail!=null){this.reEdit.selectOption(e);return}let i=Re(t,e);if(i&&(this.fireTelemetry("option",{raw_query:S(t.text,t.completedParams).rawQuery,selected_option:i.telemetry.selectedOption,other_options:i.telemetry.otherOptions}),this.store.set(i.patch),this.startSelectionAnimationTimer(),this.timers.clear(Fe),i.remainingActionable>0)){let o=i.consumedSuggestion;this.timers.schedule(Fe,()=>{this.store.set(r=>({suggestions:r.suggestions.filter(s=>s!==o)}))},Be)}}startSelectionAnimationTimer(){this.timers.schedule(yt,()=>this.store.set({inSelectionAnimation:!1}),Be)}fireTelemetry(e,t){let i=this.opts.source??(this.renderMode==="full"?"full-sdk":"headless-sdk");He({source:i,sessionId:this.sessionId,type:e,queryData:t,apiConfig:this.opts.apiConfig})}setupContainer(){this.container.classList.add("magicx-aia"),this.container.dataset.pillPlacement=this.renderMode==="dropdown"?"dropdown":this.opts.pillPlacement??"dropdown",this.container.dataset.optionsPosition=this.opts.optionsPosition??"below",this.container.dataset.animations=this.opts.animations??!0?"on":"off",this.modeController=new M(this.container,this.opts.mode??"auto")}buildAndRenderFull(){let e=this,t={store:this.store,listboxId:this.listboxId,get pillPlacement(){return e.opts.pillPlacement??"dropdown"},get onSubmit(){return e.emitter.hasListeners("submit")?e.emitSubmit:void 0},afterSubmit:()=>e.reset(),submitButton:this.opts.submitButton,autoFocus:this.opts.autoFocus??!0,selectOption:i=>this.selectOption(i),setActivePill:i=>this.pillsController.setActivePill(i),handleKeyDown:i=>this.keyboardController.handleKeyDown(i),handleChange:i=>this.handleChange(i),startEditingParam:i=>this.startEditingParam(i),handleCaretAfterInput:i=>this.handleCaretAfterInput(i),handleCaretMove:i=>this.handleCaretMove(i),replaceEditingRange:i=>this.replaceEditingRange(i)};this.domRefs=Le(this.container,t),this.subscribeBatchedRender(()=>{this.domRefs&&de(this.domRefs,this.store.get(),t)}),de(this.domRefs,this.store.get(),t),this.subscribeNewParamTimer()}buildAndRenderDropdown(){let e={store:this.store,listboxId:this.listboxId,selectOption:t=>this.selectOption(t),setActivePill:t=>this.pillsController.setActivePill(t)};this.dropdownRefs=De(this.container,e),this.subscribeBatchedRender(()=>{this.dropdownRefs&&ce(this.dropdownRefs,this.store.get(),e)}),ce(this.dropdownRefs,this.store.get(),e),this.subscribeNewParamTimer()}subscribeBatchedRender(e){let t=!1;this.unsubscribers.push(this.store.subscribe(()=>{t||(t=!0,queueMicrotask(()=>{t=!1,e()}))}))}subscribeNewParamTimer(){this.unsubscribers.push(this.store.subscribe((e,t)=>{e.newParamId&&e.newParamId!==t.newParamId&&this.timers.schedule(bt,()=>this.store.set({newParamId:null}),vt)}))}handleChange(e){let t=this.store.get();this.store.set({text:e,pillTapped:!1,activeDropdownIndex:-1});let{valid:i,invalid:o}=Pe(e,t.completedParams);o.length>0&&this.store.set({completedParams:i}),this.maybePromoteExactMatch(e)}maybeExitReEditOnNoMatch(){let e=this.store.get();if(!e.editingParam||e.editingAnchor==null||e.completedParams.some(a=>a.id===e.editingParam?.id))return;let t=e.caretOffset??e.editingAnchor,i=e.text.slice(e.editingAnchor,t);if(A(e.editingParam.options,i).some(a=>a.is_tappable))return;this.reEdit.exit();let{rawQuery:r,completedParams:s}=S(e.text,e.completedParams);this.fetchController.doFetch(r,s)}maybePromoteExactMatch(e){let t=this.store.get(),i=j({mode:"fresh",text:e,completedParams:t.completedParams,suggestions:t.suggestions,filterBase:t.filterBase,filterInProgress:t.filterInProgress});i&&this.store.set(i.patch)}};0&&(module.exports={AIAutocomplete,ModeController,buildQuery,createStore,cursorIsAtEnd,extractPlainText,getCursorOffset,getFooterHint,plainTextLength,previousGraphemeBoundary,renderEditableContent,setCursorOffset});
|
|
1189
|
+
`;var ie=class{constructor(){this.listeners={}}on(e,t){let i=(...r)=>t(...r),o=this.listeners[e];return o||(o=new Set,this.listeners[e]=o),o.add(i),()=>{this.listeners[e]?.delete(i)}}emit(e,...t){let i=this.listeners[e];if(i)for(let o of i)o(...t)}hasListeners(e){return(this.listeners[e]?.size??0)>0}clear(){this.listeners={}}};var oe=class{constructor(){this.timers=new Map}schedule(e,t,i){this.clear(e);let o=setTimeout(()=>{this.timers.delete(e),t()},i);this.timers.set(e,o)}clear(e){let t=this.timers.get(e);t!==void 0&&(clearTimeout(t),this.timers.delete(e))}clearAll(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};var k=class{constructor(e,t="auto",i){this.container=e;this.mode=t;this.onResolve=i;this.mediaQuery=null;this.onSystemChange=e=>{this.setResolved(e.matches?"dark":"light")};this.apply()}setMode(e){this.detachListener(),this.mode=e,this.apply()}destroy(){this.detachListener()}apply(){this.mode==="auto"?(this.mediaQuery??(this.mediaQuery=window.matchMedia("(prefers-color-scheme: dark)")),this.mediaQuery.addEventListener("change",this.onSystemChange),this.setResolved(this.mediaQuery.matches?"dark":"light")):this.setResolved(this.mode)}setResolved(e){this.container.dataset.mode=e,this.onResolve?.(e)}detachListener(){this.mediaQuery?.removeEventListener("change",this.onSystemChange)}};function xt(n){return(n??N).replace(/\/suggest(\?|#|$)/,"/telemetry/events$1")}async function bt(n){return M(n)?`Bearer ${await _(n).getToken()}`:F(n)}async function Fe(n){try{let e=xt(n.apiConfig?.endpoint),t=H(n.apiConfig),i=await bt(n.apiConfig);i&&(t.Authorization=i);let o=JSON.stringify({source:n.source,session_id:n.sessionId,type:n.type,at:new Date().toISOString(),query_data:n.queryData});await fetch(e,{method:"POST",headers:t,body:o})}catch{}}var yt="newParam",Be="suggestionRemoval",vt="selectionAnimation",St=650,Pt=0;function Tt(){return`:ac-${++Pt}:`}var Ke=500;function Ue(){return{text:"",completedParams:[],suggestions:[],activeDropdownIndex:-1,newParamId:null,isLoading:!1,isReady:!1,error:null,filterBase:0,filterInProgress:!1,pillTapped:!1,skipNextFetch:!1,lastRawQuery:"",isFocused:!1,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:null,inSelectionAnimation:!1}}var re=class{constructor(e,t={}){this.inputStore=ne(Ue());this._listboxId=Tt();this.modeController=null;this.unsubscribers=[];this.domRefs=null;this.dropdownRefs=null;this.timers=new oe;this.emitter=new ie;this.sessionId=crypto.randomUUID();this.emitSubmit=e=>this.emitter.emit("submit",e);this.emitError=e=>this.emitter.emit("error",e);this.container=e,this.opts=t,this.renderMode=t.renderMode??"full",this.store=_e(this.inputStore,i=>Ee(i,this.opts)),t.onSubmit&&this.emitter.on("submit",t.onSubmit),t.onError&&this.emitter.on("error",t.onError),t.onChange&&this.emitter.on("change",t.onChange),t.onParamsChange&&this.emitter.on("paramsChange",t.onParamsChange),t.onStateChange&&this.emitter.on("stateChange",t.onStateChange),t.onFocus&&this.emitter.on("focus",t.onFocus),t.onBlur&&this.emitter.on("blur",t.onBlur),t.value!==void 0&&this.store.set({text:t.value}),t.completedParams!==void 0&&this.store.set({completedParams:t.completedParams}),this.pillsController=new W(this.store,{onPillSelected:({rawQuery:i,selectedPill:o,otherPills:r})=>{this.fireTelemetry("pill",{raw_query:i,selected_pill:o,other_pills:r})}}),this.reEdit=new V({store:this.store,scheduleSetCursor:i=>this.scheduleSetCursor(i),fireTelemetry:(i,o)=>this.fireTelemetry(i,o),startSelectionAnimationTimer:()=>this.startSelectionAnimationTimer()}),this.fetchController=new B(this.store,()=>this.opts.apiConfig,()=>this.opts.optionOverrides,()=>this.opts.maskCompletedText,()=>this.emitter.hasListeners("error")?this.emitError:void 0,()=>this.sessionId,{onAutoMatch:({active:i,matched:o,rawQuery:r})=>{this.fireTelemetry("option",{raw_query:r,selected_option:o.text,other_options:(i.options??[]).filter(s=>s.text!==o.text).map(s=>s.text)})}}),this.keyboardController=new G(this.store,{columns:t.columns??2,listboxId:this.listboxId,getOnSubmit:()=>this.emitter.hasListeners("submit")?this.emitSubmit:void 0,getOptionsPosition:()=>this.opts.optionsPosition??"below",afterSubmit:this.renderMode==="full"?()=>this.reset():void 0,selectOption:i=>this.selectOption(i),removeParamAtCaret:i=>this.removeParamAtCaret(i),exitEditMode:()=>this.exitEditMode()}),this.unsubscribers.push(this.store.subscribe((i,o)=>{i.text!==o.text&&this.emitter.emit("change",i.text),i.completedParams!==o.completedParams&&this.emitter.emit("paramsChange",i.completedParams),i.isFocused!==o.isFocused&&(i.isFocused?this.emitter.emit("focus"):this.emitter.emit("blur")),this.emitter.emit("stateChange",i)})),this.unsubscribers.push(this.store.subscribe(()=>this.maybeExitReEditOnNoMatch())),this.renderMode!=="headless"&&(He(),this.setupContainer()),this.renderMode==="full"?this.buildAndRenderFull():this.renderMode==="dropdown"&&this.buildAndRenderDropdown(),this.fetchController.start()}focus(){this.domRefs?.input.focus()}blur(){this.domRefs?.input.blur()}reset(){let e=this.store.get().isFocused;this.store.set({...Ue(),isFocused:e,skipNextFetch:!0}),this.sessionId=crypto.randomUUID(),this.fetchController.doFetch("",[])}destroy(){this.fetchController.dispose(),this.modeController?.destroy(),this.timers.clearAll(),this.emitter.clear();for(let e of this.unsubscribers)e();this.unsubscribers=[],this.domRefs?.abort.abort(),this.domRefs=null,this.dropdownRefs=null,this.renderMode!=="headless"&&(this.container.innerHTML="")}setMode(e){this.modeController?.setMode(e)}setValue(e){this.store.set({text:e})}setCompletedParams(e){this.store.set({completedParams:e})}setActivePill(e){this.pillsController.setActivePill(e);let t=this.store.get().text.length;this.store.set({caretOffset:t,isFocused:!0}),this.scheduleSetCursor(t)}removeLastParam(){this.pillsController.removeLastParam()}removeParamAtCaret(e){let t=this.store.get(),{text:i,completedParams:o}=t,r=0;for(let s=0;s<o.length;s++){let a=o[s],c=i.indexOf(a.text,r);if(c===-1)continue;let l=c,p=c+a.text.length;if(e>l&&e<=p){let d=q(i,e),m=i.slice(0,d)+i.slice(e),h=o.filter((x,f)=>f!==s);return this.store.set(x=>({text:m,filterBase:Math.min(x.filterBase,m.length),completedParams:h,pillTapped:!1,activeDropdownIndex:-1})),this.scheduleSetCursor(d),!0}r=p}return!1}scheduleSetCursor(e){queueMicrotask(()=>{let t=this.domRefs;t?(t.input.focus(),T(t.input,e)):this.opts.setCursor?.(e)})}clearNewParamId(){this.store.set({newParamId:null})}startEditingParam(e){this.reEdit.start(e)}replaceEditingRange(e){return this.reEdit.replaceRange(e)}exitEditMode(){this.reEdit.exit()}handleCaretAfterInput(e){this.reEdit.caretAfterInput(e)}handleCaretMove(e){this.reEdit.caretMove(e)}setActiveDropdownIndex(e){this.store.set({activeDropdownIndex:e})}handleTextChange(e){this.handleChange(e)}handleKeyDown(e){this.keyboardController.handleKeyDown(e)}setFocused(e){this.store.get().isFocused!==e&&this.store.set({isFocused:e})}subscribe(e){return this.store.subscribe(t=>e(t))}getState(){return this.store.get()}get listboxId(){return this._listboxId}get isReady(){return this.store.get().isReady}on(e,t){return this.emitter.on(e,t)}update(e){Object.assign(this.opts,e),e.mode!==void 0&&this.modeController?.setMode(e.mode),e.optionsPosition!==void 0&&(this.container.dataset.optionsPosition=e.optionsPosition),e.animations!==void 0&&(this.container.dataset.animations=e.animations?"on":"off"),e.pillPlacement!==void 0&&(this.container.dataset.pillPlacement=e.pillPlacement,this.store.set({})),(e.dropdownTrigger!==void 0||e.closeDropdownOnBlur!==void 0||e.showNonTappableOptions!==void 0)&&this.store.set({}),e.value!==void 0&&this.store.set({text:e.value}),e.completedParams!==void 0&&this.store.set({completedParams:e.completedParams})}selectOption(e){let t=this.store.get();if(t.editingParam&&t.editingAnchor!=null&&t.editingTail!=null){this.reEdit.selectOption(e);return}let i=Ne(t,e);if(i&&(this.fireTelemetry("option",{raw_query:S(t.text,t.completedParams).rawQuery,selected_option:i.telemetry.selectedOption,other_options:i.telemetry.otherOptions}),this.store.set(i.patch),this.startSelectionAnimationTimer(),this.timers.clear(Be),i.remainingActionable>0)){let o=i.consumedSuggestion;this.timers.schedule(Be,()=>{this.store.set(r=>({suggestions:r.suggestions.filter(s=>s!==o)}))},Ke)}}startSelectionAnimationTimer(){this.timers.schedule(vt,()=>this.store.set({inSelectionAnimation:!1}),Ke)}fireTelemetry(e,t){let i=this.opts.source??(this.renderMode==="full"?"full-sdk":"headless-sdk");Fe({source:i,sessionId:this.sessionId,type:e,queryData:t,apiConfig:this.opts.apiConfig})}setupContainer(){this.container.classList.add("magicx-aia"),this.container.dataset.pillPlacement=this.renderMode==="dropdown"?"dropdown":this.opts.pillPlacement??"dropdown",this.container.dataset.optionsPosition=this.opts.optionsPosition??"below",this.container.dataset.animations=this.opts.animations??!0?"on":"off",this.modeController=new k(this.container,this.opts.mode??"auto")}buildAndRenderFull(){let e=this,t={store:this.store,listboxId:this.listboxId,get pillPlacement(){return e.opts.pillPlacement??"dropdown"},get onSubmit(){return e.emitter.hasListeners("submit")?e.emitSubmit:void 0},afterSubmit:()=>e.reset(),submitButton:this.opts.submitButton,autoFocus:this.opts.autoFocus??!0,selectOption:i=>this.selectOption(i),setActivePill:i=>this.pillsController.setActivePill(i),handleKeyDown:i=>this.keyboardController.handleKeyDown(i),handleChange:i=>this.handleChange(i),startEditingParam:i=>this.startEditingParam(i),handleCaretAfterInput:i=>this.handleCaretAfterInput(i),handleCaretMove:i=>this.handleCaretMove(i),replaceEditingRange:i=>this.replaceEditingRange(i)};this.domRefs=Re(this.container,t),this.subscribeBatchedRender(()=>{this.domRefs&&ue(this.domRefs,this.store.get(),t)}),ue(this.domRefs,this.store.get(),t),this.subscribeNewParamTimer()}buildAndRenderDropdown(){let e={store:this.store,listboxId:this.listboxId,selectOption:t=>this.selectOption(t),setActivePill:t=>this.pillsController.setActivePill(t)};this.dropdownRefs=ke(this.container,e),this.subscribeBatchedRender(()=>{this.dropdownRefs&&pe(this.dropdownRefs,this.store.get(),e)}),pe(this.dropdownRefs,this.store.get(),e),this.subscribeNewParamTimer()}subscribeBatchedRender(e){let t=!1;this.unsubscribers.push(this.store.subscribe(()=>{t||(t=!0,queueMicrotask(()=>{t=!1,e()}))}))}subscribeNewParamTimer(){this.unsubscribers.push(this.store.subscribe((e,t)=>{e.newParamId&&e.newParamId!==t.newParamId&&this.timers.schedule(yt,()=>this.store.set({newParamId:null}),St)}))}handleChange(e){let t=this.store.get();this.store.set({text:e,pillTapped:!1,activeDropdownIndex:-1});let{valid:i,invalid:o}=Ce(e,t.completedParams);o.length>0&&this.store.set({completedParams:i}),this.maybePromoteExactMatch(e)}maybeExitReEditOnNoMatch(){let e=this.store.get();if(!e.editingParam||e.editingAnchor==null||e.completedParams.some(a=>a.id===e.editingParam?.id))return;let t=e.caretOffset??e.editingAnchor,i=e.text.slice(e.editingAnchor,t);if(E(e.editingParam.options,i).some(a=>a.is_tappable))return;this.reEdit.exit();let{rawQuery:r,completedParams:s}=S(e.text,e.completedParams);this.fetchController.doFetch(r,s)}maybePromoteExactMatch(e){let t=this.store.get(),i=j({mode:"fresh",text:e,completedParams:t.completedParams,suggestions:t.suggestions,filterBase:t.filterBase,filterInProgress:t.filterInProgress});i&&this.store.set(i.patch)}};0&&(module.exports={AIAutocomplete,ATTRIBUTION_URL,ModeController,buildAttributionUrl,buildQuery,createStore,cursorIsAtEnd,extractPlainText,getCursorOffset,getFooterHint,plainTextLength,previousGraphemeBoundary,renderEditableContent,setCursorOffset});
|
|
1088
1190
|
//# sourceMappingURL=index.js.map
|