@magicx-eng/ai-autocomplete-vanilla 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,6 +15,7 @@ A framework-agnostic vanilla JS/TypeScript library that provides a guided AI-pow
15
15
  - **Keyboard navigation** — arrow keys, enter to submit, tab to autocomplete, backspace to un-bold the last completed param
16
16
  - **Client-side filtering** — instant substring filtering on every keystroke
17
17
  - **Option overrides** — inject or dynamically generate client-side options per suggestion type
18
+ - **Product strip (opt-in)** — plug in any platform's product search and the dropdown renders a horizontal row of product cards below the options; the SDK owns the UI, your integration owns only `fetch` and `transform`
18
19
  - **Controlled & uncontrolled** — works out of the box or integrates with external state
19
20
  - **Accessible** — ARIA combobox 1.2 pattern with `role="listbox"`, `aria-activedescendant`
20
21
  - **IME-safe** — composition events are buffered so input text is committed once, after composition ends
@@ -464,7 +465,9 @@ const offA = ac.on("change", logToAnalytics);
464
465
  const offB = ac.on("change", syncToStore);
465
466
  ```
466
467
 
467
- Events: `submit`, `error`, `change`, `paramsChange`, `stateChange`, `focus`, `blur`.
468
+ Events: `submit`, `error`, `change`, `paramsChange`, `stateChange`, `focus`, `blur`, `productSelect`.
469
+
470
+ **Errors in your callbacks are contained.** A listener that throws is logged to the console (once per event per instance) and the remaining listeners still run — the SDK's own state is unaffected, so a bug in one handler can't stall the widget. The same holds for `subscribe()` listeners and `optionOverrides` functions; an override that throws falls back to that suggestion's existing options rather than blanking the list. One exception is deliberate: if an `onSubmit` handler throws, Tier 1 skips its auto-reset so the user's typed query isn't cleared out from under a failed submit.
468
471
 
469
472
  Constructor callbacks (`onSubmit`, `onChange`, etc.) are registered once at construction as the initial listener for that event. Use `on()` for any additional or replacement listeners. **`update()` does not swap event listeners** — use `on()` for dynamic listener management.
470
473
 
package/dist/index.d.mts CHANGED
@@ -419,6 +419,12 @@ declare class AIAutocomplete {
419
419
  private domRefs;
420
420
  private dropdownRefs;
421
421
  private timers;
422
+ /** One per instance — see {@link ConsumerBoundary}. Shared by the emitter, `subscribe()` and `optionOverrides`. */
423
+ private boundary;
424
+ /** Identity of the raw override record the wrapped copy below was built from. */
425
+ private rawOverrides;
426
+ private wrappedOverrides;
427
+ private subscriberCount;
422
428
  private emitter;
423
429
  private sessionId;
424
430
  private readonly emitSubmit;
@@ -434,15 +440,54 @@ declare class AIAutocomplete {
434
440
  setActivePill(index: number): void;
435
441
  removeLastParam(): void;
436
442
  /**
437
- * Backspace inside a completed param: drop the param's "completed" status so
438
- * it renders as plain (un-bold) text, AND remove one grapheme before the
439
- * caretsame single-character delete a normal Backspace would do. The
440
- * remaining text stays in the input so the user can continue editing what
441
- * they had typed instead of losing the whole phrase.
443
+ * Locate the chip whose rendered text covers `offset`.
444
+ *
445
+ * Walks the derived `segments` the exact thing the editor renders rather
446
+ * than re-deriving param positions here. That keeps chip hit-testing in step
447
+ * with `deriveSegments` by construction (including params whose text repeats
448
+ * earlier in the input, and identified params that had to dodge completed
449
+ * coverage) instead of hand-mirroring its walk in a third place.
450
+ *
451
+ * Both chip kinds are returned: completed and identified render as visually
452
+ * identical chips, so both must behave atomically under Backspace. Re-edit
453
+ * remains completed-only — see `startEditingParamAtCaret`.
454
+ */
455
+ private findChipSpanAt;
456
+ /** Drop a located chip from whichever param array owns it. */
457
+ private withoutChip;
458
+ /**
459
+ * Backspace at the caret. A chip is atomic: the caret sits beside it, never
460
+ * within it, so the two positions mean different things.
461
+ *
462
+ * - Caret exactly at the chip's trailing edge (the position a Backspace over
463
+ * the following space leaves you in): delete the WHOLE chip, the way a
464
+ * chip-style token behaves. Collapses the space seam it leaves behind so
465
+ * the surrounding words don't end up double-spaced.
466
+ * - Caret strictly inside the chip (only reachable by clicking into it):
467
+ * drop the param so its text renders plain, and remove one grapheme — the
468
+ * user keeps the phrase they had and can edit it by hand.
469
+ *
470
+ * Applies to both chip kinds. Completed and identified params render
471
+ * identically, so they must delete identically; only the array the param is
472
+ * dropped from differs.
442
473
  *
443
474
  * Returns true when a param was reconciled (caller should `preventDefault`).
444
475
  */
445
476
  removeParamAtCaret(offset: number): boolean;
477
+ /**
478
+ * ArrowLeft while the caret sits at a completed pill's trailing edge selects
479
+ * the pill rather than moving the caret into it: re-edit turns on, the pill
480
+ * renders highlighted, and the dropdown shows its cached options. The caret
481
+ * stays put at the trailing edge — it never enters the pill.
482
+ *
483
+ * Identified chips are excluded: they carry no cached options and are
484
+ * deliberately not re-editable (see `renderEditable`), even though Backspace
485
+ * treats them atomically like any other chip.
486
+ *
487
+ * Returns true when re-edit started (caller should `preventDefault` so the
488
+ * browser doesn't step the caret inside the `<strong>`).
489
+ */
490
+ startEditingParamAtCaret(offset: number): boolean;
446
491
  /**
447
492
  * Set the editor caret at the given plain-text offset. Uses the core's own
448
493
  * `domRefs.input` in "full" mode; falls back to the wrapper-provided
@@ -473,7 +518,13 @@ declare class AIAutocomplete {
473
518
  handleTextChange(value: string): void;
474
519
  handleKeyDown(e: KeyboardEvent): void;
475
520
  setFocused(focused: boolean): void;
476
- /** Subscribe to state changes. Listener receives the full (input + derived) shape. */
521
+ /**
522
+ * Subscribe to state changes. Listener receives the full (input + derived) shape.
523
+ *
524
+ * Consumer code, so it gets the same isolation as the `on*` events: a throw
525
+ * is contained and reported rather than unwinding into the `store.set` that
526
+ * triggered the notification. See {@link ConsumerBoundary}.
527
+ */
477
528
  subscribe(listener: (state: CoreState) => void): () => void;
478
529
  getState(): CoreState;
479
530
  get listboxId(): string;
@@ -491,6 +542,24 @@ declare class AIAutocomplete {
491
542
  selectOption(option: SuggestionOption): void;
492
543
  private startSelectionAnimationTimer;
493
544
  private fireTelemetry;
545
+ /**
546
+ * `this.opts` with every `optionOverrides` entry wrapped in the instance's
547
+ * {@link ConsumerBoundary}.
548
+ *
549
+ * The derive layer calls these functions on the SDK's stack — from
550
+ * `getState()`, and from inside the store's notification drain — so an
551
+ * un-wrapped throw would unwind whatever internal operation triggered the
552
+ * derive and abort delivery of every queued notification with it, taking the
553
+ * instance down rather than just the override. Wrapped, a failed override
554
+ * answers `undefined` and each call site falls back to the server's options.
555
+ *
556
+ * Memoized on the raw record's identity so a swapped integration is
557
+ * re-wrapped while a stable one isn't re-wrapped on every derive. Note
558
+ * `update({ optionOverrides })` only becomes visible on the next store write
559
+ * — the derived layer memoizes on inputs identity, and `update` doesn't
560
+ * invalidate it for this key. Pre-existing, and unchanged by the wrapping.
561
+ */
562
+ private deriveOpts;
494
563
  private setupContainer;
495
564
  private buildAndRenderFull;
496
565
  private buildAndRenderDropdown;
package/dist/index.d.ts CHANGED
@@ -419,6 +419,12 @@ declare class AIAutocomplete {
419
419
  private domRefs;
420
420
  private dropdownRefs;
421
421
  private timers;
422
+ /** One per instance — see {@link ConsumerBoundary}. Shared by the emitter, `subscribe()` and `optionOverrides`. */
423
+ private boundary;
424
+ /** Identity of the raw override record the wrapped copy below was built from. */
425
+ private rawOverrides;
426
+ private wrappedOverrides;
427
+ private subscriberCount;
422
428
  private emitter;
423
429
  private sessionId;
424
430
  private readonly emitSubmit;
@@ -434,15 +440,54 @@ declare class AIAutocomplete {
434
440
  setActivePill(index: number): void;
435
441
  removeLastParam(): void;
436
442
  /**
437
- * Backspace inside a completed param: drop the param's "completed" status so
438
- * it renders as plain (un-bold) text, AND remove one grapheme before the
439
- * caretsame single-character delete a normal Backspace would do. The
440
- * remaining text stays in the input so the user can continue editing what
441
- * they had typed instead of losing the whole phrase.
443
+ * Locate the chip whose rendered text covers `offset`.
444
+ *
445
+ * Walks the derived `segments` the exact thing the editor renders rather
446
+ * than re-deriving param positions here. That keeps chip hit-testing in step
447
+ * with `deriveSegments` by construction (including params whose text repeats
448
+ * earlier in the input, and identified params that had to dodge completed
449
+ * coverage) instead of hand-mirroring its walk in a third place.
450
+ *
451
+ * Both chip kinds are returned: completed and identified render as visually
452
+ * identical chips, so both must behave atomically under Backspace. Re-edit
453
+ * remains completed-only — see `startEditingParamAtCaret`.
454
+ */
455
+ private findChipSpanAt;
456
+ /** Drop a located chip from whichever param array owns it. */
457
+ private withoutChip;
458
+ /**
459
+ * Backspace at the caret. A chip is atomic: the caret sits beside it, never
460
+ * within it, so the two positions mean different things.
461
+ *
462
+ * - Caret exactly at the chip's trailing edge (the position a Backspace over
463
+ * the following space leaves you in): delete the WHOLE chip, the way a
464
+ * chip-style token behaves. Collapses the space seam it leaves behind so
465
+ * the surrounding words don't end up double-spaced.
466
+ * - Caret strictly inside the chip (only reachable by clicking into it):
467
+ * drop the param so its text renders plain, and remove one grapheme — the
468
+ * user keeps the phrase they had and can edit it by hand.
469
+ *
470
+ * Applies to both chip kinds. Completed and identified params render
471
+ * identically, so they must delete identically; only the array the param is
472
+ * dropped from differs.
442
473
  *
443
474
  * Returns true when a param was reconciled (caller should `preventDefault`).
444
475
  */
445
476
  removeParamAtCaret(offset: number): boolean;
477
+ /**
478
+ * ArrowLeft while the caret sits at a completed pill's trailing edge selects
479
+ * the pill rather than moving the caret into it: re-edit turns on, the pill
480
+ * renders highlighted, and the dropdown shows its cached options. The caret
481
+ * stays put at the trailing edge — it never enters the pill.
482
+ *
483
+ * Identified chips are excluded: they carry no cached options and are
484
+ * deliberately not re-editable (see `renderEditable`), even though Backspace
485
+ * treats them atomically like any other chip.
486
+ *
487
+ * Returns true when re-edit started (caller should `preventDefault` so the
488
+ * browser doesn't step the caret inside the `<strong>`).
489
+ */
490
+ startEditingParamAtCaret(offset: number): boolean;
446
491
  /**
447
492
  * Set the editor caret at the given plain-text offset. Uses the core's own
448
493
  * `domRefs.input` in "full" mode; falls back to the wrapper-provided
@@ -473,7 +518,13 @@ declare class AIAutocomplete {
473
518
  handleTextChange(value: string): void;
474
519
  handleKeyDown(e: KeyboardEvent): void;
475
520
  setFocused(focused: boolean): void;
476
- /** Subscribe to state changes. Listener receives the full (input + derived) shape. */
521
+ /**
522
+ * Subscribe to state changes. Listener receives the full (input + derived) shape.
523
+ *
524
+ * Consumer code, so it gets the same isolation as the `on*` events: a throw
525
+ * is contained and reported rather than unwinding into the `store.set` that
526
+ * triggered the notification. See {@link ConsumerBoundary}.
527
+ */
477
528
  subscribe(listener: (state: CoreState) => void): () => void;
478
529
  getState(): CoreState;
479
530
  get listboxId(): string;
@@ -491,6 +542,24 @@ declare class AIAutocomplete {
491
542
  selectOption(option: SuggestionOption): void;
492
543
  private startSelectionAnimationTimer;
493
544
  private fireTelemetry;
545
+ /**
546
+ * `this.opts` with every `optionOverrides` entry wrapped in the instance's
547
+ * {@link ConsumerBoundary}.
548
+ *
549
+ * The derive layer calls these functions on the SDK's stack — from
550
+ * `getState()`, and from inside the store's notification drain — so an
551
+ * un-wrapped throw would unwind whatever internal operation triggered the
552
+ * derive and abort delivery of every queued notification with it, taking the
553
+ * instance down rather than just the override. Wrapped, a failed override
554
+ * answers `undefined` and each call site falls back to the server's options.
555
+ *
556
+ * Memoized on the raw record's identity so a swapped integration is
557
+ * re-wrapped while a stable one isn't re-wrapped on every derive. Note
558
+ * `update({ optionOverrides })` only becomes visible on the next store write
559
+ * — the derived layer memoizes on inputs identity, and `update` doesn't
560
+ * invalidate it for this key. Pre-existing, and unchanged by the wrapping.
561
+ */
562
+ private deriveOpts;
494
563
  private setupContainer;
495
564
  private buildAndRenderFull;
496
565
  private buildAndRenderDropdown;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var ue=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var rt=Object.getOwnPropertyNames;var ot=Object.prototype.hasOwnProperty;var st=(n,e)=>{for(var t in e)ue(n,t,{get:e[t],enumerable:!0})},at=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of rt(e))!ot.call(n,r)&&r!==t&&ue(n,r,{get:()=>e[r],enumerable:!(i=it(e,r))||i.enumerable});return n};var lt=n=>at(ue({},"__esModule",{value:!0}),n);var qt={};st(qt,{AIAutocomplete:()=>de,ATTRIBUTION_URL:()=>fe,ModeController:()=>R,SKIPPED_PARAM_TEXT:()=>pe,buildAttributionUrl:()=>ee,buildQuery:()=>v,buildSubmitResult:()=>M,createStore:()=>se,cursorIsAtEnd:()=>j,extractPlainText:()=>_,getCursorOffset:()=>E,getFooterHint:()=>te,plainTextLength:()=>W,previousGraphemeBoundary:()=>V,renderEditableContent:()=>oe,setCursorOffset:()=>C,withSkippedParams:()=>O});module.exports=lt(qt);var H=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 dt="https://api.ai-autocomplete.com",F=`${dt}/api/suggest`,Pe=new WeakMap;function N(n){return n?.type==="accessToken"}function ct(n){if(!(!n||N(n)))return n}function B(n){let e=Pe.get(n.getAccessToken);return e||(e=new H(n),Pe.set(n.getAccessToken,e)),e}function K(n){return{"Content-Type":"application/json",...n?.appIdentifier&&{"X-App-Identifier":n.appIdentifier},...n?.headers}}function U(n){let e=ct(n),t=e?.apiKey;return t?(e?.authScheme??"Bearer")==="Basic"?`Basic ${btoa(t)}`:`Bearer ${t}`:null}var pe="skipped";function O(n,e){if(e.length===0)return n;let t=new Set(n.map(r=>r.type)),i=e.filter(r=>!t.has(r.type)).map(r=>({placeholder:"",type:r.type,text:pe,kind:null}));return i.length>0?[...n,...i]:n}var ut="0.8.0",ve=!1;function pt(){return crypto.randomUUID()}function mt(n,e){return{placeholder:n.placeholder,type:n.type,...e&&{text:n.text},kind:n.kind}}function gt(n,e,t,i,r,o,a){let s=e.find(l=>l.type==="contact"&&l.metadata?.contact_account_count)?.metadata?.contact_account_count,d=typeof s=="number"?s:void 0;return{data:{raw_query:n,completed_params:O(e.map(l=>mt(l,t)),a??[]),...r&&r.length>0&&{identified_params:r.map(l=>({type:l.type,value:l.text}))},...o&&o.length>0&&{recently_suggested:o},...d!=null&&{contact_account_count:d}},meta:{request_id:pt(),request_at:new Date().toISOString(),language:typeof navigator<"u"?navigator.language:"en-US",client_version:ut,session_id:i}}}async function Ce(n,e,t,i,r){return fetch(n,{method:"POST",headers:{...e,Authorization:`Bearer ${t}`},body:i,signal:r})}async function Ee(n,e,t){let i=t.apiConfig,r=!t.maskCompletedText,o=gt(n,e,r,t.sessionId,t.identifiedParams,t.recentlySuggested,t.skippedParams),a=K(i),s=i?.endpoint??F,d=JSON.stringify(o);if(N(i)){let c=B(i),p=await c.getToken(),f=await Ce(s,a,p,d,t.signal);if(f.status===401){let h=await c.getToken(!0);f=await Ce(s,a,h,d,t.signal)}if(!f.ok)throw new Error(`API error: ${f.status} ${f.statusText}`);return f.json()}let l=U(i);!l&&!ve&&(ve=!0,console.warn("[AIAutocomplete] No apiKey in apiConfig. Requests will be sent without an Authorization header.")),l&&(a.Authorization=l);let u=await fetch(s,{method:"POST",headers:a,body:d,signal:t.signal});if(!u.ok)throw new Error(`API error: ${u.status} ${u.statusText}`);return u.json()}function v(n,e){let t=n,i={},r=[],o=[],a=0;for(let s of e){let d=(i[s.type]??0)+1;i[s.type]=d;let u=`{{${s.type.toUpperCase().replace(/\s+/g,"_")}_${d}}}`,c=f=>{let h=t.indexOf(s.text,f);for(;h!==-1&&o.some(y=>h<y.end&&h+s.text.length>y.start);)h=t.indexOf(s.text,h+1);return h},p=c(a);if(p===-1&&(p=c(0)),p!==-1){t=t.slice(0,p)+u+t.slice(p+s.text.length);let f=u.length-s.text.length;for(let h of o)h.start>=p+s.text.length&&(h.start+=f,h.end+=f);o.push({start:p,end:p+u.length}),a=p>=a?p+u.length:a+f}r.push({...s,placeholder:u})}return{rawQuery:t,completedParams:r}}function T(n,e,t){return e>0||!t?e:n.toLowerCase().startsWith(t.toLowerCase())?t.length:e}function A(n,e,t){let i=n.slice(e);if(t||e===0||n[e-1]===" ")return i;let r=i.indexOf(" ");return r===-1?"":i.slice(r+1)}function we(n,e){let t=n.trimEnd().replace(/\s+/g," ");if(t.length===0||e.length===0)return 0;let i=t.split(" "),r=e.toLowerCase();for(let o=0;o<i.length;o++){let a=i.slice(o).join(" ");if(r.startsWith(a.toLowerCase())){let s=t.length-a.length;return n.length-s}}return 0}function I(n,e){if(!n)return[];let t=e.trimStart();if(!t)return n;let i=t.toLowerCase();return n.filter(r=>!r.is_tappable||r.text.toLowerCase().includes(i))}function k(n,e){if(!n)return null;let t=e.trim();if(!t)return null;let i=t.toLowerCase();return n.find(r=>r.is_tappable&&r.text.toLowerCase()===i)??null}function Te(n,e){return e?n.map(t=>{let i=e[t.type];return i?{...t,options:i("")}:t}):n}function Ae(n,e){let t=0,i=e;for(let r of n)t+=r.value.length,r.type!=="text"&&(i=Math.max(i,t));return i}function Ie(n,e){let t=0;for(let i of n){let r=t+i.value.length;if(i.type==="text"&&r>e&&i.value.slice(Math.max(e-t,0)).trim().length>0)return!1;t=r}return!0}function Oe(n,e){let t=[],i=new Set;for(let r of[...n,...e])r.type==="placeholder"||i.has(r.type)||(i.add(r.type),t.push({type:r.type,text:r.text}));return t}function ke(n,e,t){if(n===e)return t;let i=Math.min(n.length,e.length),r=0;for(;r<i&&n[r]===e[r];)r++;if(r>=t)return t;let o=0;for(;o<i-r&&n[n.length-1-o]===e[e.length-1-o];)o++;return n.length-o<=t?t+(e.length-n.length):null}function me(n,e){let t=[],i=[],r=0;for(let o of e){let a=n.indexOf(o.text,r);if(a===-1){i.push(o);continue}t.push({start:a,end:a+o.text.length,param:o}),r=a+o.text.length}return{located:t,missing:i}}function De(n,e,t){let i=[],r=[],o=0;for(let a of t){let s=n.indexOf(a.text,o);for(;s!==-1&&e.some(d=>s<d.end&&s+a.text.length>d.start);)s=n.indexOf(a.text,s+1);if(s===-1){r.push(a);continue}i.push({start:s,end:s+a.text.length,param:a}),o=s+a.text.length}return{located:i,missing:r}}function Me(n,e,t=[]){let i=me(n,e).located,r=De(n,i,t).located,o=[...i.map(l=>({start:l.start,end:l.end,segment:{type:"completed",value:l.param.text,param:l.param}})),...r.map(l=>({start:l.start,end:l.end,segment:{type:"identified",value:l.param.text,param:l.param}}))].sort((l,u)=>l.start-u.start),a=[],s=0;for(let l of o)l.start>s&&a.push({type:"text",value:n.slice(s,l.start)}),a.push(l.segment),s=l.end;let d=n.slice(s);return d&&a.push({type:"text",value:d}),a}function Le(n,e){let{located:t,missing:i}=me(n,e);return{valid:t.map(r=>r.param),invalid:i}}function $(n,e,t){let i=me(n,e).located,{located:r,missing:o}=De(n,i,t);return{valid:r.map(a=>a.param),invalid:o}}var ft=100,ht=300,bt=2,q=class{constructor(e,t,i,r,o,a,s={}){this.store=e;this.getApiConfig=t;this.getOptionOverrides=i;this.getMaskCompletedText=r;this.getOnError=o;this.getSessionId=a;this.callbacks=s;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 r=++this.fetchVersion,o=this.store.get().text.length;try{this.callbacks.onRequest?.({query:this.store.get().text,signal:i.signal,isCurrent:()=>r===this.fetchVersion})}catch{}this.store.set({isLoading:!0,error:null});try{let a=this.store.get(),s=a.pendingSpan?Oe(a.pendingSpan.snapshot,a.actionableSuggestions):void 0,d=await Ee(e,t,{sessionId:this.getSessionId(),maskCompletedText:this.getMaskCompletedText(),signal:i.signal,apiConfig:this.getApiConfig(),identifiedParams:a.identifiedParams,recentlySuggested:s,skippedParams:a.skippedParams});if(r!==this.fetchVersion)return;let l=(d.data.input??[]).filter(x=>x.source==="identified").map(x=>({id:crypto.randomUUID(),type:x.type,text:x.text})),u=Te(d.data.suggestions??[],this.getOptionOverrides()),c=d.data.input??[],p=c[c.length-1],f=this.store.get().text,h,y;if(p?.state==="in_progress"){y=!0;let x=f.toLowerCase().lastIndexOf(p.text.toLowerCase());h=x!==-1?x:o}else y=!1,h=o;let g=u.filter(x=>x.type!=="placeholder")[0],m=null;if(g){let x=A(f,h,y),S=k(g.options,x);S&&(m={id:crypto.randomUUID(),placeholder:"",type:g.type,text:S.text,kind:S.kind,suggestionType:g.type,suggestionPlaceholder:g.text,options:g.options??[],metadata:S.metadata},u=u.filter(P=>P!==g),this.callbacks.onAutoMatch?.({active:g,matched:S,rawQuery:e}))}this.store.set(x=>{let S=m?[...x.completedParams,m]:x.completedParams,P=$(x.text,S,l).valid;return{suggestions:u,isLoading:!1,isReady:d.data.is_ready??!1,lastRawQuery:e,activeDropdownIndex:-1,filterBase:h,filterInProgress:y,identifiedParams:P,...m?{completedParams:S}:{}}})}catch(a){if(r===this.fetchVersion){let s=a instanceof Error?a:new Error(String(a));this.store.set({error:s,isLoading:!1}),this.getOnError()?.(s)}}}scheduleFetch(){if(this.clearTimers(),this.store.get().skipNextFetch){this.store.set({skipNextFetch:!1});return}let t=i=>{let r=this.store.get();if(!r.text&&r.completedParams.length===0)return this.doFetch("",[]),!0;let o=r.suggestions.filter(m=>m.type==="placeholder").map(m=>m.text).join(" "),a=T(r.text,r.filterBase,o),s=A(r.text,a,r.filterInProgress),l=r.suggestions.filter(m=>m.type!=="placeholder")[0],c=(l?I(l.options,s):[]).filter(m=>m.is_tappable),p=l?k(l.options,s)!==null:!1,f=s.trim().length>0;if(c.length>0&&!p&&f||r.completedParams.length===0&&r.text.length>0&&o.length>0&&o.toLowerCase().startsWith(r.text.toLowerCase()))return!1;let{rawQuery:h,completedParams:y}=v(r.text,r.completedParams),b=h.length<r.lastRawQuery.length,g=Math.abs(h.length-r.lastRawQuery.length);return b||g>=i?(this.doFetch(h,y),!0):!1};this.debounceTimer=setTimeout(()=>{t(bt)&&this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer)},ft),this.slowDebounceTimer=setTimeout(()=>t(1),ht)}clearTimers(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer),this.debounceTimer=null,this.slowDebounceTimer=null}};var Ne='[contenteditable="false"]',D;function xt(){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 Q(n,e){let t=n;for(;t&&t!==e;){if(t.nodeType===Node.ELEMENT_NODE&&t.matches(Ne))return!0;t=t.parentNode}return!1}function G(n){return(n.ownerDocument??document).createTreeWalker(n,NodeFilter.SHOW_TEXT,{acceptNode(e){return Q(e,n)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}})}function _(n){let e=G(n),t="",i=e.nextNode();for(;i;)t+=i.data,i=e.nextNode();return t}function W(n){let e=G(n),t=0,i=e.nextNode();for(;i;)t+=i.data.length,i=e.nextNode();return t}function E(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 r=t;if(Q(r,n)&&r!==n)return null;let o=0;for(let a=0;a<i&&a<r.childNodes.length;a++)o+=_e(r.childNodes[a],n);return o+Re(r,n)}return t.nodeType!==Node.TEXT_NODE||Q(t,n)?null:Re(t,n)+i}function _e(n,e){if(n.nodeType===Node.TEXT_NODE)return Q(n,e)?0:n.data.length;if(n.nodeType!==Node.ELEMENT_NODE)return 0;let t=n;if(t.matches(Ne))return 0;let i=0;for(let r of Array.from(t.childNodes))i+=_e(r,e);return i}function Re(n,e){let t=G(e),i=0,r=t.nextNode();for(;r;){if(r===n||n.nodeType===Node.ELEMENT_NODE&&n.contains(r))return i;i+=r.data.length,r=t.nextNode()}return i}function C(n,e){let t=n.ownerDocument??document,i=t.getSelection();if(!i)return;let r=Math.max(0,Math.min(e,W(n))),o=G(n),a=0,s=null,d=0,l=o.nextNode(),u=null;for(;l;){let p=l.data.length;if(r<a+p){s=l,d=r-a;break}if(r===a+p){let f=o.nextNode();f?(s=f,d=0):(s=l,d=p);break}a+=p,u=l,l=o.nextNode()}let c=t.createRange();if(s){let p=s.parentElement?.closest('strong[data-seg="completed"]');p&&p!==n&&n.contains(p)?d===0?c.setStartBefore(p):d===s.data.length?c.setStartAfter(p):c.setStart(s,d):c.setStart(s,d)}else u?c.setStart(u,u.data.length):c.setStart(n,0);c.collapse(!0),i.removeAllRanges(),i.addRange(c)}function j(n){let e=E(n);return e==null?!1:e>=W(n)}function V(n,e){if(e<=0)return 0;let t=xt();if(!t)return e-1;let i=n.slice(0,e),r=0;for(let{index:o}of t.segment(i))o<e&&(r=o);return r}function M(n,e,t=[]){let{rawQuery:i,completedParams:r}=v(n,e);return{query:n.trim(),raw_query:i,completed_params:O(r,t)}}function ge(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")?j(n):e?.caretOffset!=null?e.caretOffset>=e.text.length:!1}function yt(n){return n instanceof HTMLElement&&n.hasAttribute("data-aia-input")?E(n):null}var X=class{constructor(e,t){this.store=e;this.ctx=t}handleKeyDown(e){let t=this.store.get(),{listboxId:i,getOnSubmit:r}=this.ctx,o=this.getEffectiveColumns(),a=r(),s=this.getTappableIndices(o);if((e.shiftKey||e.metaKey||e.ctrlKey||e.altKey)&&(e.key==="ArrowDown"||e.key==="ArrowUp"||e.key==="ArrowLeft"||e.key==="ArrowRight"))return;let d=this.ctx.getOptionsPosition()==="above";switch(e.key){case"ArrowDown":{let l=ge(e.target,t),u=!!t.editingParam;if(!l&&!u&&t.activeDropdownIndex<0)break;if(t.activeDropdownIndex<0){if(d)break;if(e.preventDefault(),!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:s[0]??0});break}if(s.length===0)return;this.store.set({activeDropdownIndex:s[0]});break}if(e.preventDefault(),s.length===0)return;if(t.filteredOptions.length>0){let f=Math.floor((t.filteredOptions.length-1)/o);if(Math.floor(t.activeDropdownIndex/o)===f){this.store.set({activeDropdownIndex:-1});break}}let c=s.indexOf(t.activeDropdownIndex),p=c<s.length-1?c+1:0;this.store.set({activeDropdownIndex:s[p]});break}case"ArrowUp":{if(t.activeDropdownIndex<0){if(!d)break;let c=ge(e.target,t),p=!!t.editingParam;if(!c&&!p)break;e.preventDefault();let f=this.firstTappableInBottomRow(o)??s[0]??0;if(!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:f});break}if(s.length===0)return;this.store.set({activeDropdownIndex:f});break}if(s.length===0)break;if(e.preventDefault(),t.activeDropdownIndex<o){this.store.set({activeDropdownIndex:-1});break}let l=s.indexOf(t.activeDropdownIndex),u=l>0?l-1:s.length-1;this.store.set({activeDropdownIndex:s[u]});break}case"ArrowRight":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%o<o-1){let c=t.activeDropdownIndex+1;c<t.filteredOptions.length&&t.filteredOptions[c]?.is_tappable&&this.store.set({activeDropdownIndex:c})}break}if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){e.preventDefault();let u=e.target.closest("[data-aia-input]")??e.target,c=t.editingTail;this.ctx.exitEditMode?.(),C(u,c);break}ge(e.target,t)&&t.actionableSuggestions.length>=1&&(e.preventDefault(),this.removeActivePill());break}case"ArrowLeft":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%o>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,u=t.editingAnchor;this.ctx.exitEditMode?.(),C(l,u);break}break}case"Backspace":{if(t.editingParam||!this.ctx.removeParamAtCaret)break;let l=yt(e.target);if(l==null)break;this.ctx.removeParamAtCaret(l)&&e.preventDefault();break}case"Enter":{e.preventDefault(),t.activeDropdownIndex>=0&&t.filteredOptions[t.activeDropdownIndex]?.is_tappable?this.clickOrSelect(t.activeDropdownIndex,t.filteredOptions,i):a&&(a(M(t.text,t.completedParams,t.skippedParams)),this.ctx.afterSubmit?.());break}case"Tab":{let l=t.filteredOptions.map((p,f)=>p.is_tappable?f:-1).filter(p=>p!==-1);if(l.length===0)break;if(!t.isDropdownOpen){if(t.actionableSuggestions.length===0)break;e.preventDefault();let p=e.shiftKey?l[l.length-1]:l[0];this.store.set({pillTapped:!0,activeDropdownIndex:p});break}e.preventDefault();let u=l.indexOf(t.activeDropdownIndex),c;if(u<0)c=e.shiftKey?l.length-1:0;else{let p=e.shiftKey?-1:1;c=(u+p+l.length)%l.length}this.store.set({activeDropdownIndex:l[c]});break}case"Escape":{if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){let l=e.target.closest("[data-aia-input]")??e.target,u=t.editingTail;this.ctx.exitEditMode?.(),C(l,u)}this.store.set({activeDropdownIndex:-1});break}}}firstTappableInBottomRow(e){let t=this.store.get();if(t.filteredOptions.length===0)return null;let r=Math.floor((t.filteredOptions.length-1)/e)*e;for(let o=r;o<t.filteredOptions.length;o++)if(t.filteredOptions[o]?.is_tappable)return o;return null}getTappableIndices(e){let i=this.store.get().filteredOptions.map((o,a)=>o.is_tappable?a:-1).filter(o=>o!==-1),r=Array.from({length:e},()=>[]);for(let o of i)r[o%e].push(o);return r.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 r=getComputedStyle(i).gridTemplateColumns;if(r&&r!=="none"){let o=r.split(" ").filter(Boolean).length;if(o>0)return o}if(i===e)break;i=i.parentElement}return this.ctx.columns}clickOrSelect(e,t,i){let r=document.getElementById(`${i}-option-${e}`);r?r.click():this.ctx.selectOption(t[e])}removeActivePill(){let e=this.store.get(),t=e.suggestions.filter(s=>s.type==="placeholder"),i=e.suggestions.filter(s=>s.type!=="placeholder");if(i.length===0)return;let r=i[0],o=i.slice(1),a=e.skippedParams.some(s=>s.type===r.type);this.store.set({suggestions:[...t,...o],pillTapped:o.length>0,activeDropdownIndex:-1,...a?{}:{skippedParams:[...e.skippedParams,{id:crypto.randomUUID(),type:r.type,suggestionPlaceholder:r.text}]}}),o.length===0&&this.ctx.fetchNow?.()}};var z=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 r=i[e],o=i.filter((l,u)=>u!==e),a=t.suggestions.filter(l=>l.type==="placeholder");if(this.callbacks.onPillSelected){let{rawQuery:l}=v(t.text,t.completedParams);this.callbacks.onPillSelected({rawQuery:l,selectedPill:r.text,otherPills:o.map(u=>u.text)})}let s=[...a,r,...o],d=this.store.peek({suggestions:s}).filteredOptions.findIndex(l=>l.is_tappable);this.store.set({suggestions:s,pillTapped:!0,activeDropdownIndex:d})}removeLastParam(){this.store.get().completedParams.length!==0&&this.store.set(t=>({completedParams:t.completedParams.slice(0,-1),activeDropdownIndex:-1}))}};var Y=class{constructor(e,t){this.store=e;this.getConfig=t;this.hasLoggedError=!1}async run(e,t,i){let r=this.getConfig();if(r){if(e.trim().length===0){this.clear(i);return}try{let o=await r.fetch(e,t);if(t.aborted||!i())return;let a=r.transform(o),s=Array.isArray(a)?a:[],d=r.limit!=null?s.slice(0,r.limit):s;if(t.aborted||!i())return;this.commit(d)}catch(o){if(t.aborted||St(o))return;this.logOnce(o),this.clear(i)}}}clearNow(){this.commit([])}clear(e){e()&&this.commit([])}commit(e){e.length===0&&this.store.get().products.length===0||this.store.set({products:e})}logOnce(e){this.hasLoggedError||(this.hasLoggedError=!0,console.warn("[AIAutocomplete] products.fetch/transform failed \u2014 the product strip is hidden. Later failures on this instance are not logged.",e))}};function St(n){return n instanceof Error&&n.name==="AbortError"}function He(n,e){let t=e.dropdownTrigger??"auto",i=e.closeDropdownOnBlur??!0,a=n.filteredOptionsLength>0||n.activePillHasNoOptions||n.hasProducts;if(n.inEditMode){let s=i?n.isFocused:!0;return a&&s}if(t==="auto"){let s=i?n.isFocused:!0,d=n.text.replace(/\s+$/,"").length,l=n.caretOffset==null||n.caretOffset>=d;return(a||n.isLoading)&&s&&l}return t==="manual"?(a||n.isLoading)&&n.pillTapped:!1}function Fe(n,e){let t=Me(n.text,n.completedParams,n.identifiedParams),i=n.suggestions.filter(m=>m.type!=="placeholder"),r=i[0],o=r?e.optionOverrides?.[r.type]:void 0,a=n.suggestions.filter(m=>m.type==="placeholder").map(m=>m.text).join(" "),s=T(n.text,Math.min(n.filterBase,n.text.length),a),l=n.lastRawQuery!==""||s>0?A(n.text,s,n.filterInProgress):"",u=r?o?o(l.trim()):r.options??[]:[],c=n.editingParam!=null&&n.editingAnchor!=null,p;if(c&&n.editingParam&&n.editingAnchor!=null){let m=n.editingParam.id,x=n.completedParams.some(w=>w.id===m),S=n.caretOffset??n.editingAnchor,P=x?"":n.text.slice(n.editingAnchor,S);p=I(n.editingParam.options,P)}else p=I(u,l);let f=e.showNonTappableOptions===!1;f&&(p=p.filter(m=>m.is_tappable));let h=m=>f?m.is_tappable:!0,y;if(c){let m=n.editingParam?.options??[];y=n.editingParam!=null&&m.filter(h).length===0}else{let m=r?o?o(""):r.options??[]:[];y=r!=null&&m.filter(h).length===0}let b=He({inEditMode:c,filteredOptionsLength:p.length,isFocused:n.isFocused,text:n.text,caretOffset:n.caretOffset,isLoading:n.isLoading,pillTapped:n.pillTapped,activePillHasNoOptions:y,hasProducts:n.products.length>0},{dropdownTrigger:e.dropdownTrigger,closeDropdownOnBlur:e.closeDropdownOnBlur}),g=b&&n.activeDropdownIndex>=0&&!!p[n.activeDropdownIndex]?.is_tappable;return{segments:t,actionableSuggestions:i,filteredOptions:p,placeholderText:a,isDropdownOpen:b,isActivePillSelected:g}}function J(n){return n.mode==="fresh"?Pt(n):vt(n)}function Pt(n){let{text:e,completedParams:t,suggestions:i,filterBase:r,filterInProgress:o}=n,s=i.filter(S=>S.type!=="placeholder")[0];if(!s?.options)return null;let d=i.filter(S=>S.type==="placeholder").map(S=>S.text).join(" "),l=T(e,r,d),u=A(e,l,o),c=k(s.options,u);if(!c)return null;let p=c.text.toLowerCase(),f=e.toLowerCase().lastIndexOf(p),h=f>=0?f:Math.max(0,e.length-c.text.length),y=h+c.text.length,b=e.slice(h,y),m=y<e.length&&e[y]===" "?y+1:y,x={id:crypto.randomUUID(),placeholder:"",type:s.type,text:b,kind:c.kind,suggestionType:s.type,suggestionPlaceholder:s.text,options:s.options??[],metadata:c.metadata};return{patch:{text:e,completedParams:[...t,x],suggestions:i.filter(S=>S!==s),filterBase:m,newParamId:x.id,caretOffset:m,activeDropdownIndex:-1},caretPos:m}}function vt(n){let{text:e,completedParams:t,editingParam:i,editingAnchor:r,editingTail:o}=n;if(t.some(x=>x.id===i.id))return null;let a=e.slice(r,o),s=k(i.options,a);if(!s)return null;let d=s.text.toLowerCase(),l=a.toLowerCase().lastIndexOf(d),u=r+Math.max(0,l),c=u+s.text.length,p=e.slice(u,c),h=c<e.length&&e[c]===" "?c+1:c,y={id:crypto.randomUUID(),placeholder:"",type:i.suggestionType,text:p,kind:s.kind,suggestionType:i.suggestionType,suggestionPlaceholder:i.suggestionPlaceholder,options:i.options,metadata:s.metadata},b=t.length,g=0;for(let x=0;x<t.length;x++){let S=e.indexOf(t[x].text,g);if(S!==-1){if(S>=h){b=x;break}g=S+t[x].text.length}}let m=[...t];return m.splice(b,0,y),{patch:{text:e,completedParams:m,newParamId:y.id,filterBase:h,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:h,activeDropdownIndex:-1},caretPos:h}}var Z=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(a=>a.id===e);if(!i)return;let r=0,o=-1;for(let a of t.completedParams){let s=t.text.indexOf(a.text,r);if(s!==-1){if(a.id===e){o=s;break}r=s+a.text.length}}o<0||this.deps.store.set({editingParam:i,editingAnchor:o,editingTail:o+i.text.length,caretOffset:o+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,r=t.editingAnchor,o=t.editingTail;if(!i||r==null||o==null||!t.completedParams.some(d=>d.id===i.id))return!1;let a=t.text.slice(0,r)+e+t.text.slice(o),s=r+e.length;return this.deps.store.set(d=>({text:a,completedParams:d.completedParams.filter(l=>l.id!==i.id),editingTail:s,caretOffset:s,activeDropdownIndex:-1})),this.deps.scheduleSetCursor(s),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,r=t.editingAnchor,o=t.editingTail;if(!i||r==null||o==null)return;this.deps.fireTelemetry("option",{raw_query:v(t.text,t.completedParams).rawQuery,selected_option:e.text,other_options:i.options.filter(g=>g.text!==e.text).map(g=>g.text)});let a=t.text.slice(0,r),s=t.text.slice(o),d=r===0&&e.text.length>0?e.text[0].toUpperCase()+e.text.slice(1):e.text,l=s.length===0||s[0]!==" ",u=l?`${d} `:d,c=a+u+s,p=r+u.length+(l?0:1),f={id:crypto.randomUUID(),placeholder:"",type:i.suggestionType,text:d,kind:e.kind,suggestionType:i.suggestionType,suggestionPlaceholder:i.suggestionPlaceholder,options:i.options,metadata:e.metadata},h=t.completedParams.findIndex(g=>g.id===i.id),y=t.completedParams.filter(g=>g.id!==i.id),b=h>=0?Math.min(h,y.length):y.length;y.splice(b,0,f),this.deps.store.set({text:c,completedParams:y,newParamId:f.id,filterBase:p,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:p,activeDropdownIndex:-1,pillTapped:!1,skipNextFetch:!0,inSelectionAnimation:!0}),this.deps.startSelectionAnimationTimer(),this.deps.scheduleSetCursor(p)}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 fe="https://ai-autocomplete.com";function ee(n=fe){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 te(n,e){return n?{key:"enter",hint:"to proceed"}:e?{key:"tab",hint:"to select"}:{key:"\u2192",hint:"to skip"}}var Be="data-aia-key";function L(n,e,t){let i=new Map;for(let a of Array.from(n.children)){let s=a.getAttribute(Be);s!=null&&i.set(s,a)}let r=new Set,o=[];for(let a=0;a<e.length;a++){let s=e[a],d=t.keyOf(s,a);r.add(d);let l=i.get(d);l||(l=t.create(s,a),l.setAttribute(Be,d)),t.update?.(l,s,a),n.children[a]!==l&&n.insertBefore(l,n.children[a]??null),o.push(l)}for(let[a,s]of i)r.has(a)||s.remove();return o}var Ke=[125,69];function Ue(n,e){return e?1:n===0?.7:n===1?.4:.2}function ne(n,e,t,i,r=!1,o=!1,a=!1){let s=n.querySelector(".magicx-aia-pill-list");if(s||(s=document.createElement("span"),s.className="magicx-aia-pill-list",n.appendChild(s)),o&&e.length===0){s.setAttribute("data-aia-pill-list-loading",""),s.innerHTML="";for(let d=0;d<Ke.length;d++){let l=Ke[d],u=document.createElement("span");u.setAttribute("data-aia-pill-skeleton",""),u.className=`magicx-aia-pill magicx-aia-pill--skeleton${r?" magicx-aia-pill--rounded":""}`,u.style.width=`${l}px`,u.style.opacity=String(Ue(d,!1)),s.appendChild(u)}return}o?s.setAttribute("data-aia-pill-list-loading",""):s.removeAttribute("data-aia-pill-list-loading");for(let d of s.querySelectorAll("[data-aia-pill-skeleton]"))d.remove();L(s,e,{keyOf:d=>`${d.type}-${d.text}`,create:d=>{let l=document.createElement("button");return l.type="button",l.tabIndex=-1,l.setAttribute("data-aia-pill",""),l.setAttribute("contenteditable","false"),l.textContent=d.text,l.addEventListener("mousedown",u=>u.preventDefault()),l},update:(d,l,u)=>{let c=d,p=a&&u===t&&!o,f=["magicx-aia-pill"];r&&f.push("magicx-aia-pill--rounded"),o&&f.push("magicx-aia-pill--skeleton"),c.className=f.join(" "),c.style.width="",c.style.opacity=String(Ue(u,p)),o?(c.setAttribute("data-aia-loading",""),c.disabled=!0,c.onclick=null):(c.removeAttribute("data-aia-loading"),c.disabled=!1,c.onclick=()=>i(u))}})}function he(n){n.querySelector(".magicx-aia-pill-list")?.remove()}var Ct="Products";function $e(n,e,t,i,r){let o=n.querySelector(".magicx-aia-products");if(e.length===0){o?.remove();return}if(!o){o=document.createElement("section"),o.className="magicx-aia-products",o.setAttribute("data-aia-products",""),o.setAttribute("role","group"),o.setAttribute("aria-labelledby",`${t}-products-label`);let s=document.createElement("div");s.className="magicx-aia-products-label",s.id=`${t}-products-label`,s.textContent=Ct;let d=document.createElement("div");d.className="magicx-aia-products-row",d.setAttribute("data-aia-products-row",""),o.append(s,d),n.appendChild(o)}let a=o.querySelector(".magicx-aia-products-row");a&&L(a,e,{keyOf:s=>Et(s),create:s=>wt(s,i,r),update:(s,d,l)=>{s.id=`${t}-product-${l}`,s.dataset.aiaIndex=String(l)}})}function be(n,e){let t=n.querySelectorAll("[data-aia-product]");for(let i of t)i.tabIndex=e?0:-1}function Et(n){return[n.id,n.title,n.url,n.imageUrl,n.price,n.vendor].map(e=>e??"").join("\0")}function wt(n,e,t){let i=document.createElement("a");i.className="magicx-aia-product",i.setAttribute("data-aia-product",""),i.setAttribute("role","option"),i.setAttribute("aria-selected","false"),i.href=n.url,i.tabIndex=0;let r=document.createElement("span");if(r.className="magicx-aia-product-media",n.imageUrl){let s=document.createElement("img");s.className="magicx-aia-product-image",s.src=n.imageUrl,s.alt="",s.loading="lazy",s.decoding="async",r.appendChild(s)}else r.setAttribute("data-aia-product-placeholder","");i.appendChild(r);let o=document.createElement("span");if(o.className="magicx-aia-product-body",n.vendor){let s=document.createElement("span");s.className="magicx-aia-product-vendor",s.textContent=n.vendor,o.appendChild(s)}let a=document.createElement("span");if(a.className="magicx-aia-product-title",a.textContent=n.title,o.appendChild(a),n.price){let s=document.createElement("span");s.className="magicx-aia-product-price",s.textContent=n.price,o.appendChild(s)}return i.appendChild(o),i.addEventListener("click",s=>{s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||s.button!==0||(s.preventDefault(),e(n))}),i.addEventListener("keydown",s=>{s.key!=="Enter"&&s.key!==" "||(s.preventDefault(),e(n))}),i.addEventListener("focus",()=>t(!0)),i.addEventListener("blur",s=>{s.relatedTarget?.closest("[data-aia-dropdown]")||t(!1)}),i}function qe(n,e,t,i,r,o,a,s=""){let d=n.querySelector(".aia-grid");if(e.length===0){d?.remove();return}d||(d=document.createElement("div"),d.className="aia-grid magicx-aia-grid",d.setAttribute("data-scroll",""),d.style.setProperty("--aia-grid-min","250px"),d.style.setProperty("--aia-grid-max","1fr"),d.style.setProperty("--aia-grid-gap","0"),n.appendChild(d)),At(d,e,t,i,r,o,a),Tt(d,s)}function Tt(n,e){n.dataset.aiaGroup!==e&&(n.dataset.aiaGroup=e,n.scrollTop=0)}function At(n,e,t,i,r,o,a){let s=a?"1":"0";L(n,e,{keyOf:d=>`${d.text}\0${s}`,create:d=>It(d,a),update:(d,l,u)=>{let c=u===t&&!a;d.id=`${o}-option-${u}`,d.dataset.aiaIndex=String(u),d.setAttribute("aria-selected",String(c)),d.classList.toggle("magicx-aia-option--highlighted",c),!a&&l.is_tappable?(d.onclick=()=>{d.classList.add("magicx-aia-option--pressed"),i(l),setTimeout(()=>d.classList.remove("magicx-aia-option--pressed"),500)},d.onmouseenter=()=>{let p=Number.parseInt(d.dataset.aiaIndex??"-1",10);p>=0&&r(p)}):(d.onclick=null,d.onmouseenter=null)}})}function It(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 r=document.createElement("div");r.className="magicx-aia-streaks",t.appendChild(r);let o=document.createElement("div");o.className="magicx-aia-streaks-vert",t.appendChild(o);let a=document.createElement("span");a.className="magicx-aia-option-content";let s=document.createElement("span");if(s.className="magicx-aia-option-text",s.textContent=n.icon?`${n.icon} ${n.text}`:n.text,a.appendChild(s),n.tag){let d=document.createElement("span");d.className="magicx-aia-option-tag",d.textContent=n.tag,a.appendChild(d)}return t.appendChild(a),t}var Ot=[159,119,164];function ie(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 re(n,e){let{filteredOptions:t,activeIndex:i,isOpen:r,isLoading:o,pills:a,showPills:s,isActivePillSelected:d,onSelect:l,onHighlight:u,onPillClick:c}=e,p=s&&a.length>0,f=t.length>0,h=e.products.length>0,y=r&&(f||p||o||h);if(y?n.classList.add("magicx-aia-dropdown--visible"):n.classList.remove("magicx-aia-dropdown--visible"),o?n.setAttribute("data-aia-loading",""):n.removeAttribute("data-aia-loading"),!y){be(n,!1);return}h?n.setAttribute("data-aia-has-products",""):n.removeAttribute("data-aia-has-products");let b=n.querySelector(".aia-stack");b||(b=document.createElement("div"),b.className="aia-stack",b.style.setProperty("--aia-stack-space","8px"),n.appendChild(b));let g=p||o&&s,m=b.querySelector(".magicx-aia-pill-bar");g?(m||(m=document.createElement("div"),m.className="magicx-aia-pill-bar aia-cluster",m.setAttribute("data-nowrap",""),m.setAttribute("data-aia-pillbar",""),b.insertBefore(m,b.firstChild)),ne(m,a,0,c,!0,o,d)):m&&m.remove();let x=e.suggestions[0],S=x?`${x.type} ${x.text}`:"";qe(b,t,i,l,u,e.listboxId,o,S);let P=b.querySelector(".magicx-aia-skeleton-bars");if(o&&!f){if(!P){P=document.createElement("div"),P.className="magicx-aia-skeleton-bars",P.setAttribute("data-aia-skeleton-bars","");for(let nt of Ot){let ce=document.createElement("span");ce.className="magicx-aia-skeleton-bar",ce.style.width=`${nt}px`,P.appendChild(ce)}b.appendChild(P)}}else P&&P.remove();$e(b,e.products,e.listboxId,e.onProductSelect,e.onProductFocusChange),be(n,!0);let w=b.querySelector(".magicx-aia-footer")??Mt(),tt=i>=0&&!!t[i]?.is_tappable;Dt(w,te(tt,e.isInputEmpty)),w.isConnected||b.appendChild(w),kt(b,[".magicx-aia-pill-bar",".aia-grid",".magicx-aia-skeleton-bars",".magicx-aia-products",".magicx-aia-footer"])}function kt(n,e){let t=e.map(i=>n.querySelector(`:scope > ${i}`)).filter(i=>i!==null);for(let i=0;i<t.length;i++)n.children[i]!==t[i]&&n.insertBefore(t[i],n.children[i]??null)}function Dt(n,{key:e,hint:t}){let i=n.querySelector(".magicx-aia-footer-key"),r=n.querySelector(".magicx-aia-footer-hint");!i||!r||(i.textContent!==e&&(i.textContent=e),r.textContent!==t&&(r.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 r=document.createElement("span");r.className="magicx-aia-footer-hint",r.textContent="to select",t.append(i,r);let o=document.createElement("a");o.className="aia-cluster magicx-aia-footer-brand-link",o.setAttribute("data-align","center"),o.href=ee(),o.target="_blank",o.rel="noopener noreferrer",o.style.setProperty("--aia-cluster-gap","2px");let a=document.createElement("span");a.className="magicx-aia-footer-brand",a.textContent="AI";let s=document.createElement("span");return s.className="magicx-aia-footer-badge",s.textContent="Autocomplete",o.append(a,s),e.append(t,o),n.append(e),n}function Qe(n,e){let t=ie(e.listboxId);return n.appendChild(t),{dropdown:t}}function xe(n,e,t){re(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,products:e.products,onSelect:t.selectOption,onHighlight:i=>t.store.set({activeDropdownIndex:i}),onPillClick:t.setActivePill,onProductSelect:t.selectProduct,onProductFocusChange:i=>t.store.set({isFocused:i})})}function oe(n){let{input:e,segments:t,newParamId:i,editingParamId:r,placeholderText:o,isFocused:a}=n,s=t.length===0;e.dataset.aiaEmpty=s?"true":"false",s&&o?e.dataset.placeholder=o:delete e.dataset.placeholder;let d=t.map(b=>`${b.type}:${b.value}`).join("\0"),l=e.dataset.segKey??"",u=e.dataset.newParamId??"",c=e.dataset.editingParamId??"";if(d===l&&(i??"")===u&&(r??"")===c)return;let p=a?E(e):null;e.dataset.segKey=d,e.dataset.newParamId=i??"",e.dataset.editingParamId=r??"";let f=e.ownerDocument??document,h=f.createDocumentFragment(),y=0;for(let b of t)if(y+=b.value.length,b.type==="completed"){let g=f.createElement("strong");g.dataset.seg="completed",g.dataset.paramId=b.param.id;let m=b.param.id===i,x=b.param.id===r,S=["magicx-aia-segment","magicx-aia-segment--completed"];m&&S.push("magicx-aia-shimmer-revealed","magicx-aia-shimmer-sweep"),x&&S.push("magicx-aia-segment--editing"),g.className=S.join(" "),g.textContent=b.value,h.appendChild(g)}else if(b.type==="identified"){let g=f.createElement("strong");g.dataset.seg="identified",g.dataset.paramId=b.param.id,g.className="magicx-aia-segment magicx-aia-segment--completed",g.textContent=b.value,h.appendChild(g)}else h.appendChild(f.createTextNode(b.value));e.replaceChildren(h),e.dataset.aiaTextLength=String(y),p!=null&&C(e,Math.max(0,Math.min(p,y)))}var Lt='<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 Ge(){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=Lt,n}function Rt(){let n=document.createElement("div");return n.setAttribute("contenteditable","plaintext-only"),n.contentEditable==="plaintext-only"}function We(n,e){let t=e.firstElementChild;if(!t){e.removeAttribute("data-aia-pill-wrapped");return}let i=t.getBoundingClientRect(),r=n.getBoundingClientRect();i.top>=r.bottom-2?e.setAttribute("data-aia-pill-wrapped",""):e.removeAttribute("data-aia-pill-wrapped")}function je(n,e){let{listboxId:t}=e,i=ie(t);n.appendChild(i);let r=document.createElement("div");r.className="magicx-aia-input-wrapper",n.appendChild(r);let o=document.createElement("div");o.className="magicx-aia-editor",o.setAttribute("data-aia-editor",""),r.appendChild(o);let a=document.createElement("div");a.className="magicx-aia-input",a.setAttribute("data-aia-input",""),a.setAttribute("contenteditable",Rt()?"plaintext-only":"true"),a.setAttribute("role","combobox"),a.setAttribute("aria-autocomplete","list"),a.setAttribute("aria-haspopup","listbox"),a.setAttribute("aria-controls",t),a.setAttribute("aria-expanded","false"),a.setAttribute("spellcheck","true"),a.setAttribute("enterkeyhint","send"),o.appendChild(a);let s=document.createElement("span");s.className="magicx-aia-pill-list-container",s.setAttribute("data-aia-pill-list-container",""),o.appendChild(s);let d=null,l=null;e.submitButton===void 0?(d=Ge(),r.appendChild(d),l=d):e.submitButton!==null&&(l=e.submitButton,l.hasAttribute("data-aia-submit")||l.setAttribute("data-aia-submit",""),r.appendChild(l));let u=new AbortController,{signal:c}=u,p=!1,f=0,h=()=>{let g=_(a),x=g.length>0&&g[0]!==g[0].toUpperCase()?g[0].toUpperCase()+g.slice(1):g;e.handleChange(x)},y=()=>{let g=(a.ownerDocument??document).getSelection();if(!g||g.rangeCount===0)return null;let m=g.anchorNode;return!m||!a.contains(m)?null:(m.nodeType===Node.ELEMENT_NODE?m:m.parentElement)?.closest('strong[data-seg="completed"][data-param-id]')?.dataset.paramId??null};r.addEventListener("click",g=>{g.target?.closest("[data-aia-pill]")||a.focus()},{signal:c}),a.addEventListener("input",()=>{p||(f=performance.now(),h(),e.handleCaretAfterInput(E(a)))},{signal:c});let b=a.ownerDocument??document;if(b.addEventListener("selectionchange",()=>{let g=b.getSelection();if(!g||g.rangeCount===0||!a.contains(g.anchorNode))return;let m=y(),x=e.store.get().editingParam?.id??null;if(m&&m!==x){e.startEditingParam(m);return}performance.now()-f<50||e.handleCaretMove(E(a))},{signal:c}),a.addEventListener("compositionstart",()=>{p=!0},{signal:c}),a.addEventListener("compositionend",()=>{p=!1,h()},{signal:c}),a.addEventListener("beforeinput",g=>{let m=g,x=m.inputType;if(x==="insertParagraph"||x==="insertLineBreak"||x==="insertFromDrop"){g.preventDefault();return}if(x.startsWith("insert")||x.startsWith("delete")){let S=x.startsWith("delete")?"":m.data??"";e.replaceEditingRange(S)&&g.preventDefault()}},{signal:c}),a.addEventListener("paste",g=>{g.preventDefault();let m=(g.clipboardData?.getData("text/plain")??"").replace(/\r?\n/g," ");if(!m)return;let x=a.ownerDocument??document,S=x.getSelection();if(!S||S.rangeCount===0)return;let P=S.getRangeAt(0);if(!a.contains(P.startContainer))return;P.deleteContents();let w=x.createTextNode(m);P.insertNode(w),P.setStartAfter(w),P.collapse(!0),S.removeAllRanges(),S.addRange(P),h()},{signal:c}),a.addEventListener("keydown",g=>e.handleKeyDown(g),{signal:c}),a.addEventListener("focus",()=>e.store.set({isFocused:!0}),{signal:c}),a.addEventListener("blur",()=>e.store.set({isFocused:!1}),{signal:c}),l&&l.addEventListener("click",g=>{let m=e.store.get();!(m.text||m.completedParams.length>0)||!e.onSubmit||(g.stopPropagation(),e.onSubmit(M(m.text,m.completedParams,m.skippedParams)),e.afterSubmit?.())},{signal:c}),e.autoFocus!==!1){a.focus();let g=a.ownerDocument??document,m=g.getSelection(),x=m&&m.rangeCount>0&&a.contains(m.anchorNode);if(m&&!x){let S=g.createRange();S.selectNodeContents(a),S.collapse(!0),m.removeAllRanges(),m.addRange(S)}}if(typeof ResizeObserver<"u"){let g=new ResizeObserver(()=>We(a,s));g.observe(a),u.signal.addEventListener("abort",()=>g.disconnect(),{once:!0})}return{input:a,inlinePillContainer:s,dropdown:i,submitButton:d,abort:u}}function ye(n,e,t){let{input:i,inlinePillContainer:r,dropdown:o,submitButton:a}=n,{pillPlacement:s,setActivePill:d,selectOption:l,store:u}=t;i.setAttribute("aria-expanded",String(e.isDropdownOpen));let c=e.activeDropdownIndex>=0?`${t.listboxId}-option-${e.activeDropdownIndex}`:"";if(c?i.setAttribute("aria-activedescendant",c):i.removeAttribute("aria-activedescendant"),a){let b=!!e.text||e.completedParams.length>0;a.disabled=!b}let p=i.dataset.newParamId??"",f=e.newParamId!==null&&e.newParamId!==p;if(oe({input:i,segments:e.segments,newParamId:e.newParamId,editingParamId:e.editingParam?.id??null,placeholderText:e.placeholderText,isFocused:e.isFocused}),s==="inline"){let b=e.isLoading&&!e.editingParam&&!e.inSelectionAnimation;b||e.actionableSuggestions.length>0?ne(r,e.actionableSuggestions,0,d,!1,b,e.isActivePillSelected):he(r)}else he(r);We(i,r),f?(i.focus(),C(i,e.caretOffset??e.text.length)):e.isFocused&&_(i)!==e.text&&C(i,e.text.length);let h=e.editingParam?{type:e.editingParam.suggestionType,text:e.editingParam.suggestionPlaceholder,required:!0,options:e.editingParam.options}:null,y=h??e.actionableSuggestions[0];re(o,{suggestions:y?[{...y,options:e.filteredOptions}]:[],filteredOptions:e.filteredOptions,activeIndex:e.activeDropdownIndex,isOpen:e.isDropdownOpen,isLoading:e.isLoading&&!e.editingParam&&!e.inSelectionAnimation,listboxId:t.listboxId,pills:h?[h]:e.actionableSuggestions,showPills:s==="dropdown",isActivePillSelected:e.isActivePillSelected,isInputEmpty:e.text.trim().length===0,products:e.products,onSelect:l,onHighlight:b=>u.set({activeDropdownIndex:b}),onPillClick:d,onProductSelect:t.selectProduct,onProductFocusChange:b=>u.set({isFocused:b})})}function Ve(n,e){let t=n.actionableSuggestions[0];if(!t)return null;let i=n.filterBase,r=n.text.slice(0,i),o=r.length===0&&n.text.length===0,a=r.length===0&&n.text.length>0&&n.placeholderText.length>0&&n.placeholderText.toLowerCase().startsWith(n.text.toLowerCase());(o||a)&&n.placeholderText&&(r=`${n.placeholderText} `);let s=we(r,e.text);s>0&&(r=r.slice(0,r.length-s));let d=r.length>0&&r[r.length-1]!==" ",l=`${r}${d?" ":""}${e.text} `,u=(o||a)&&l.length>0?l[0].toUpperCase()+l.slice(1):l,c=u.toLowerCase().lastIndexOf(e.text.toLowerCase()),p=c>=0?u.slice(c,c+e.text.length):e.text,f={id:crypto.randomUUID(),placeholder:"",type:t.type,text:p,kind:e.kind,suggestionType:t.type,suggestionPlaceholder:t.text,options:t.options??[],metadata:e.metadata},h=n.actionableSuggestions.length-1;return{patch:{text:u,filterBase:u.length,completedParams:[...n.completedParams,f],newParamId:f.id,caretOffset:u.length,pillTapped:!1,activeDropdownIndex:-1,skipNextFetch:h>0,inSelectionAnimation:!0,pendingSpan:null},telemetry:{selectedOption:e.text,otherOptions:n.filteredOptions.filter(y=>y.text!==e.text).map(y=>y.text)},consumedSuggestion:t,remainingActionable:h}}function se(n){let e=n,t=new Set,i=[],r=!1;return{get:()=>e,set:o=>{let a=typeof o=="function"?o(e):o,s=e;if(e={...e,...a},i.push([e,s]),!r){r=!0;try{let d=0;for(let l=i.shift();l;l=i.shift()){if(++d>1e4)throw i.length=0,new Error("createStore: notifications did not settle after 10000 deliveries \u2014 a listener is likely calling set() on every notification");let[u,c]=l;for(let p of t)p(u,c)}}catch(d){throw i.length=0,d}finally{r=!1}}},subscribe:o=>(t.add(o),()=>{t.delete(o)})}}function Xe(n,e){let t,i,r=o=>(o!==t&&(t=o,i=e(o)),i);return{get:()=>{let o=n.get();return{...o,...r(o)}},set:o=>{typeof o=="function"?n.set(a=>{let s={...a,...r(a)};return o(s)}):n.set(o)},peek:o=>{let a={...n.get(),...o};return{...a,...e(a)}},subscribe:o=>n.subscribe((a,s)=>{let d={...s,...r(s)},l={...a,...r(a)};o(l,d)})}}var Se=!1;function ze(){if(Se||typeof document>"u")return;if(document.querySelector("style[data-magicx-aia]")){Se=!0;return}Se=!0;let n=document.createElement("style");n.setAttribute("data-magicx-aia",""),n.textContent=Nt,document.head.appendChild(n)}var Nt=`@layer layout {
1
+ "use strict";var ge=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var lt=Object.getOwnPropertyNames;var dt=Object.prototype.hasOwnProperty;var ct=(i,e)=>{for(var t in e)ge(i,t,{get:e[t],enumerable:!0})},pt=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of lt(e))!dt.call(i,r)&&r!==t&&ge(i,r,{get:()=>e[r],enumerable:!(n=at(e,r))||n.enumerable});return i};var ut=i=>pt(ge({},"__esModule",{value:!0}),i);var jt={};ct(jt,{AIAutocomplete:()=>ue,ATTRIBUTION_URL:()=>ye,ModeController:()=>R,SKIPPED_PARAM_TEXT:()=>fe,buildAttributionUrl:()=>ne,buildQuery:()=>v,buildSubmitResult:()=>L,createStore:()=>le,cursorIsAtEnd:()=>V,extractPlainText:()=>_,getCursorOffset:()=>w,getFooterHint:()=>ie,plainTextLength:()=>j,previousGraphemeBoundary:()=>X,renderEditableContent:()=>ae,setCursorOffset:()=>C,withSkippedParams:()=>O});module.exports=ut(jt);var H=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 mt="https://api.ai-autocomplete.com",F=`${mt}/api/suggest`,Ee=new WeakMap;function N(i){return i?.type==="accessToken"}function gt(i){if(!(!i||N(i)))return i}function B(i){let e=Ee.get(i.getAccessToken);return e||(e=new H(i),Ee.set(i.getAccessToken,e)),e}function K(i){return{"Content-Type":"application/json",...i?.appIdentifier&&{"X-App-Identifier":i.appIdentifier},...i?.headers}}function U(i){let e=gt(i),t=e?.apiKey;return t?(e?.authScheme??"Bearer")==="Basic"?`Basic ${btoa(t)}`:`Bearer ${t}`:null}var fe="skipped";function O(i,e){if(e.length===0)return i;let t=new Set(i.map(r=>r.type)),n=e.filter(r=>!t.has(r.type)).map(r=>({placeholder:"",type:r.type,text:fe,kind:null}));return n.length>0?[...i,...n]:i}var ft="0.9.0",Te=!1;function ht(){return crypto.randomUUID()}function bt(i,e){return{placeholder:i.placeholder,type:i.type,...e&&{text:i.text},kind:i.kind}}function xt(i,e,t,n,r,o,a){let s=e.find(l=>l.type==="contact"&&l.metadata?.contact_account_count)?.metadata?.contact_account_count,d=typeof s=="number"?s:void 0;return{data:{raw_query:i,completed_params:O(e.map(l=>bt(l,t)),a??[]),...r&&r.length>0&&{identified_params:r.map(l=>({type:l.type,value:l.text}))},...o&&o.length>0&&{recently_suggested:o},...d!=null&&{contact_account_count:d}},meta:{request_id:ht(),request_at:new Date().toISOString(),language:typeof navigator<"u"?navigator.language:"en-US",client_version:ft,session_id:n}}}async function Ae(i,e,t,n,r){return fetch(i,{method:"POST",headers:{...e,Authorization:`Bearer ${t}`},body:n,signal:r})}async function Ie(i,e,t){let n=t.apiConfig,r=!t.maskCompletedText,o=xt(i,e,r,t.sessionId,t.identifiedParams,t.recentlySuggested,t.skippedParams),a=K(n),s=n?.endpoint??F,d=JSON.stringify(o);if(N(n)){let p=B(n),u=await p.getToken(),f=await Ae(s,a,u,d,t.signal);if(f.status===401){let h=await p.getToken(!0);f=await Ae(s,a,h,d,t.signal)}if(!f.ok)throw new Error(`API error: ${f.status} ${f.statusText}`);return f.json()}let l=U(n);!l&&!Te&&(Te=!0,console.warn("[AIAutocomplete] No apiKey in apiConfig. Requests will be sent without an Authorization header.")),l&&(a.Authorization=l);let c=await fetch(s,{method:"POST",headers:a,body:d,signal:t.signal});if(!c.ok)throw new Error(`API error: ${c.status} ${c.statusText}`);return c.json()}function v(i,e){let t=i,n={},r=[],o=[],a=0;for(let s of e){let d=(n[s.type]??0)+1;n[s.type]=d;let c=`{{${s.type.toUpperCase().replace(/\s+/g,"_")}_${d}}}`,p=f=>{let h=t.indexOf(s.text,f);for(;h!==-1&&o.some(y=>h<y.end&&h+s.text.length>y.start);)h=t.indexOf(s.text,h+1);return h},u=p(a);if(u===-1&&(u=p(0)),u!==-1){t=t.slice(0,u)+c+t.slice(u+s.text.length);let f=c.length-s.text.length;for(let h of o)h.start>=u+s.text.length&&(h.start+=f,h.end+=f);o.push({start:u,end:u+c.length}),a=u>=a?u+c.length:a+f}r.push({...s,placeholder:c})}return{rawQuery:t,completedParams:r}}function T(i,e,t){return e>0||!t?e:i.toLowerCase().startsWith(t.toLowerCase())?t.length:e}function $(i,e,t){return e===0&&i.length>0&&t.length>0&&t.toLowerCase().startsWith(i.toLowerCase())}function A(i,e,t){let n=i.slice(e);if(t||e===0||i[e-1]===" ")return n;let r=n.indexOf(" ");return r===-1?"":n.slice(r+1)}function Oe(i,e){let t=i.trimEnd().replace(/\s+/g," ");if(t.length===0||e.length===0)return 0;let n=t.split(" "),r=e.toLowerCase();for(let o=0;o<n.length;o++){let a=n.slice(o).join(" ");if(r.startsWith(a.toLowerCase())){let s=t.length-a.length;return i.length-s}}return 0}function I(i,e){if(!i)return[];let t=e.trimStart();if(!t)return i;let n=t.toLowerCase();return i.filter(r=>!r.is_tappable||r.text.toLowerCase().includes(n))}function k(i,e){if(!i)return null;let t=e.trim();if(!t)return null;let n=t.toLowerCase();return i.find(r=>r.is_tappable&&r.text.toLowerCase()===n)??null}function ke(i,e){return e?i.map(t=>{let n=e[t.type];if(!n)return t;let r=n("");return r?{...t,options:r}:t}):i}function De(i,e){let t=0,n=e;for(let r of i)t+=r.value.length,r.type!=="text"&&(n=Math.max(n,t));return n}function Le(i,e){let t=0;for(let n of i){let r=t+n.value.length;if(n.type==="text"&&r>e&&n.value.slice(Math.max(e-t,0)).trim().length>0)return!1;t=r}return!0}function Me(i,e){let t=[],n=new Set;for(let r of[...i,...e])r.type==="placeholder"||n.has(r.type)||(n.add(r.type),t.push({type:r.type,text:r.text}));return t}function Re(i,e,t){if(i===e)return t;let n=Math.min(i.length,e.length),r=0;for(;r<n&&i[r]===e[r];)r++;if(r>=t)return t;let o=0;for(;o<n-r&&i[i.length-1-o]===e[e.length-1-o];)o++;return i.length-o<=t?t+(e.length-i.length):null}function he(i,e){let t=[],n=[],r=0;for(let o of e){let a=i.indexOf(o.text,r);if(a===-1){n.push(o);continue}t.push({start:a,end:a+o.text.length,param:o}),r=a+o.text.length}return{located:t,missing:n}}function Ne(i,e,t){let n=[],r=[],o=0;for(let a of t){let s=i.indexOf(a.text,o);for(;s!==-1&&e.some(d=>s<d.end&&s+a.text.length>d.start);)s=i.indexOf(a.text,s+1);if(s===-1){r.push(a);continue}n.push({start:s,end:s+a.text.length,param:a}),o=s+a.text.length}return{located:n,missing:r}}function _e(i,e,t=[]){let n=he(i,e).located,r=Ne(i,n,t).located,o=[...n.map(l=>({start:l.start,end:l.end,segment:{type:"completed",value:l.param.text,param:l.param}})),...r.map(l=>({start:l.start,end:l.end,segment:{type:"identified",value:l.param.text,param:l.param}}))].sort((l,c)=>l.start-c.start),a=[],s=0;for(let l of o)l.start>s&&a.push({type:"text",value:i.slice(s,l.start)}),a.push(l.segment),s=l.end;let d=i.slice(s);return d&&a.push({type:"text",value:d}),a}function He(i,e){let{located:t,missing:n}=he(i,e);return{valid:t.map(r=>r.param),invalid:n}}function q(i,e,t){let n=he(i,e).located,{located:r,missing:o}=Ne(i,n,t);return{valid:r.map(a=>a.param),invalid:o}}function yt(i){if(i instanceof Error)return i;try{return new Error(String(i))}catch{return new Error("Unknown error")}}var St=100,Pt=300,vt=2,Q=class{constructor(e,t,n,r,o,a,s={}){this.store=e;this.getApiConfig=t;this.getOptionOverrides=n;this.getMaskCompletedText=r;this.getOnError=o;this.getSessionId=a;this.callbacks=s;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(n=>{(n.text!==e||n.completedParams!==t)&&(e=n.text,t=n.completedParams,this.scheduleFetch())})}dispose(){this.abortController?.abort(),this.clearTimers(),this.unsubscribe?.()}async doFetch(e,t){this.abortController?.abort();let n=new AbortController;this.abortController=n;let r=++this.fetchVersion,o=this.store.get().text.length;try{this.callbacks.onRequest?.({query:this.store.get().text,signal:n.signal,isCurrent:()=>r===this.fetchVersion})}catch{}try{this.store.set({isLoading:!0,error:null});let a=this.store.get(),s=a.pendingSpan?Me(a.pendingSpan.snapshot,a.actionableSuggestions):void 0,d=await Ie(e,t,{sessionId:this.getSessionId(),maskCompletedText:this.getMaskCompletedText(),signal:n.signal,apiConfig:this.getApiConfig(),identifiedParams:a.identifiedParams,recentlySuggested:s,skippedParams:a.skippedParams});if(r!==this.fetchVersion)return;let l=(d.data.input??[]).filter(x=>x.source==="identified").map(x=>({id:crypto.randomUUID(),type:x.type,text:x.text})),c=ke(d.data.suggestions??[],this.getOptionOverrides()),p=d.data.input??[],u=p[p.length-1],f=this.store.get().text,h,y;if(u?.state==="in_progress"){y=!0;let x=f.toLowerCase().lastIndexOf(u.text.toLowerCase());h=x!==-1?x:o}else y=!1,h=o;let g=c.filter(x=>x.type!=="placeholder")[0],m=null;if(g){let x=A(f,h,y),S=k(g.options,x);S&&(m={id:crypto.randomUUID(),placeholder:"",type:g.type,text:S.text,kind:S.kind,suggestionType:g.type,suggestionPlaceholder:g.text,options:g.options??[],metadata:S.metadata},c=c.filter(P=>P!==g),this.callbacks.onAutoMatch?.({active:g,matched:S,rawQuery:e}))}this.store.set(x=>{let S=m?[...x.completedParams,m]:x.completedParams,P=q(x.text,S,l).valid;return{suggestions:c,isLoading:!1,isReady:d.data.is_ready??!1,lastRawQuery:e,activeDropdownIndex:-1,filterBase:h,filterInProgress:y,identifiedParams:P,...m?{completedParams:S}:{}}})}catch(a){let s=yt(a);r===this.fetchVersion&&(this.store.set({error:s,isLoading:!1}),this.getOnError()?.(s))}finally{if(r===this.fetchVersion&&this.store.get().isLoading)try{this.store.set({isLoading:!1})}catch{}}}scheduleFetch(){if(this.clearTimers(),this.store.get().skipNextFetch){this.store.set({skipNextFetch:!1});return}let t=n=>{let r=this.store.get();if(!r.text&&r.completedParams.length===0)return this.doFetch("",[]),!0;let o=r.suggestions.filter(m=>m.type==="placeholder").map(m=>m.text).join(" "),a=T(r.text,r.filterBase,o),s=A(r.text,a,r.filterInProgress),l=r.suggestions.filter(m=>m.type!=="placeholder")[0],p=(l?I(l.options,s):[]).filter(m=>m.is_tappable),u=l?k(l.options,s)!==null:!1,f=s.trim().length>0;if(p.length>0&&!u&&f||$(r.text,r.completedParams.length,o))return!1;let{rawQuery:h,completedParams:y}=v(r.text,r.completedParams),b=h.length<r.lastRawQuery.length,g=Math.abs(h.length-r.lastRawQuery.length);return b||g>=n?(this.doFetch(h,y),!0):!1};this.debounceTimer=setTimeout(()=>{t(vt)&&this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer)},St),this.slowDebounceTimer=setTimeout(()=>t(1),Pt)}clearTimers(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.slowDebounceTimer&&clearTimeout(this.slowDebounceTimer),this.debounceTimer=null,this.slowDebounceTimer=null}};var Be='[contenteditable="false"]',D;function Ct(){if(D!==void 0)return D;let i=globalThis.Intl.Segmenter;if(!i)return D=null,null;try{D=new i(void 0,{granularity:"grapheme"})}catch{D=null}return D??null}function G(i,e){let t=i;for(;t&&t!==e;){if(t.nodeType===Node.ELEMENT_NODE&&t.matches(Be))return!0;t=t.parentNode}return!1}function W(i){return(i.ownerDocument??document).createTreeWalker(i,NodeFilter.SHOW_TEXT,{acceptNode(e){return G(e,i)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}})}function _(i){let e=W(i),t="",n=e.nextNode();for(;n;)t+=n.data,n=e.nextNode();return t}function j(i){let e=W(i),t=0,n=e.nextNode();for(;n;)t+=n.data.length,n=e.nextNode();return t}function w(i){let e=(i.ownerDocument??document).getSelection();if(!e||e.rangeCount===0)return null;let t=e.anchorNode,n=e.anchorOffset;if(!t||!i.contains(t))return null;if(t.nodeType===Node.ELEMENT_NODE){let r=t;if(G(r,i)&&r!==i)return null;let o=0;for(let a=0;a<n&&a<r.childNodes.length;a++)o+=Ke(r.childNodes[a],i);return o+Fe(r,i)}return t.nodeType!==Node.TEXT_NODE||G(t,i)?null:Fe(t,i)+n}function Ke(i,e){if(i.nodeType===Node.TEXT_NODE)return G(i,e)?0:i.data.length;if(i.nodeType!==Node.ELEMENT_NODE)return 0;let t=i;if(t.matches(Be))return 0;let n=0;for(let r of Array.from(t.childNodes))n+=Ke(r,e);return n}function Fe(i,e){let t=W(e),n=0,r=t.nextNode();for(;r;){if(r===i||i.nodeType===Node.ELEMENT_NODE&&i.contains(r))return n;n+=r.data.length,r=t.nextNode()}return n}function C(i,e){let t=i.ownerDocument??document,n=t.getSelection();if(!n)return;let r=Math.max(0,Math.min(e,j(i))),o=W(i),a=0,s=null,d=0,l=o.nextNode(),c=null;for(;l;){let u=l.data.length;if(r<a+u){s=l,d=r-a;break}if(r===a+u){let f=o.nextNode();f?(s=f,d=0):(s=l,d=u);break}a+=u,c=l,l=o.nextNode()}let p=t.createRange();if(s){let u=s.parentElement?.closest('strong[data-seg="completed"]');u&&u!==i&&i.contains(u)?d===0?p.setStartBefore(u):d===s.data.length?p.setStartAfter(u):p.setStart(s,d):p.setStart(s,d)}else c?p.setStart(c,c.data.length):p.setStart(i,0);p.collapse(!0),n.removeAllRanges(),n.addRange(p)}function V(i){let e=w(i);return e==null?!1:e>=j(i)}function X(i,e){if(e<=0)return 0;let t=Ct();if(!t)return e-1;let n=i.slice(0,e),r=0;for(let{index:o}of t.segment(n))o<e&&(r=o);return r}function L(i,e,t=[]){let{rawQuery:n,completedParams:r}=v(i,e);return{query:i.trim(),raw_query:n,completed_params:O(r,t)}}function be(i,e){return i instanceof HTMLTextAreaElement||i instanceof HTMLInputElement?i.selectionStart!=null&&i.selectionStart===i.value.length:i instanceof HTMLElement&&i.hasAttribute("data-aia-input")?V(i):e?.caretOffset!=null?e.caretOffset>=e.text.length:!1}function xe(i){return i instanceof HTMLElement&&i.hasAttribute("data-aia-input")?w(i):null}var z=class{constructor(e,t){this.store=e;this.ctx=t}handleKeyDown(e){let t=this.store.get(),{listboxId:n,getOnSubmit:r}=this.ctx,o=this.getEffectiveColumns(),a=r(),s=this.getTappableIndices(o);if((e.shiftKey||e.metaKey||e.ctrlKey||e.altKey)&&(e.key==="ArrowDown"||e.key==="ArrowUp"||e.key==="ArrowLeft"||e.key==="ArrowRight"))return;let d=this.ctx.getOptionsPosition()==="above";switch(e.key){case"ArrowDown":{let l=be(e.target,t),c=!!t.editingParam;if(!l&&!c&&t.activeDropdownIndex<0)break;if(t.activeDropdownIndex<0){if(d)break;if(e.preventDefault(),!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:s[0]??0});break}if(s.length===0)return;this.store.set({activeDropdownIndex:s[0]});break}if(e.preventDefault(),s.length===0)return;if(t.filteredOptions.length>0){let f=Math.floor((t.filteredOptions.length-1)/o);if(Math.floor(t.activeDropdownIndex/o)===f){this.store.set({activeDropdownIndex:-1});break}}let p=s.indexOf(t.activeDropdownIndex),u=p<s.length-1?p+1:0;this.store.set({activeDropdownIndex:s[u]});break}case"ArrowUp":{if(t.activeDropdownIndex<0){if(!d)break;let p=be(e.target,t),u=!!t.editingParam;if(!p&&!u)break;e.preventDefault();let f=this.firstTappableInBottomRow(o)??s[0]??0;if(!t.isDropdownOpen&&t.actionableSuggestions.length>0){this.store.set({pillTapped:!0,activeDropdownIndex:f});break}if(s.length===0)return;this.store.set({activeDropdownIndex:f});break}if(s.length===0)break;if(e.preventDefault(),t.activeDropdownIndex<o){this.store.set({activeDropdownIndex:-1});break}let l=s.indexOf(t.activeDropdownIndex),c=l>0?l-1:s.length-1;this.store.set({activeDropdownIndex:s[c]});break}case"ArrowRight":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%o<o-1){let p=t.activeDropdownIndex+1;p<t.filteredOptions.length&&t.filteredOptions[p]?.is_tappable&&this.store.set({activeDropdownIndex:p})}break}if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){e.preventDefault();let c=e.target.closest("[data-aia-input]")??e.target,p=t.editingTail;this.ctx.exitEditMode?.(),C(c,p);break}be(e.target,t)&&t.actionableSuggestions.length>=1&&(e.preventDefault(),this.removeActivePill());break}case"ArrowLeft":{if(t.activeDropdownIndex>=0){if(e.preventDefault(),t.activeDropdownIndex%o>0){let l=t.activeDropdownIndex-1;l>=0&&t.filteredOptions[l]?.is_tappable&&this.store.set({activeDropdownIndex:l});break}if(!t.editingParam&&this.ctx.startEditingParamAtCaret){let l=xe(e.target);l!=null&&this.ctx.startEditingParamAtCaret(l)}break}if(t.editingParam&&e.target instanceof HTMLElement&&t.editingAnchor!=null){e.preventDefault();let l=e.target.closest("[data-aia-input]")??e.target,c=t.editingAnchor;this.ctx.exitEditMode?.(),C(l,c);break}if(this.ctx.startEditingParamAtCaret){let l=xe(e.target);l!=null&&this.ctx.startEditingParamAtCaret(l)&&e.preventDefault()}break}case"Backspace":{if(t.editingParam||!this.ctx.removeParamAtCaret)break;let l=xe(e.target);if(l==null)break;this.ctx.removeParamAtCaret(l)&&e.preventDefault();break}case"Enter":{e.preventDefault(),t.activeDropdownIndex>=0&&t.filteredOptions[t.activeDropdownIndex]?.is_tappable?this.clickOrSelect(t.activeDropdownIndex,t.filteredOptions,n):a&&a(L(t.text,t.completedParams,t.skippedParams))&&this.ctx.afterSubmit?.();break}case"Tab":{let l=t.filteredOptions.map((u,f)=>u.is_tappable?f:-1).filter(u=>u!==-1);if(l.length===0)break;if(!t.isDropdownOpen){if(t.actionableSuggestions.length===0)break;e.preventDefault();let u=e.shiftKey?l[l.length-1]:l[0];this.store.set({pillTapped:!0,activeDropdownIndex:u});break}e.preventDefault();let c=l.indexOf(t.activeDropdownIndex),p;if(c<0)p=e.shiftKey?l.length-1:0;else{let u=e.shiftKey?-1:1;p=(c+u+l.length)%l.length}this.store.set({activeDropdownIndex:l[p]});break}case"Escape":{if(t.editingParam&&e.target instanceof HTMLElement&&t.editingTail!=null){let l=e.target.closest("[data-aia-input]")??e.target,c=t.editingTail;this.ctx.exitEditMode?.(),C(l,c)}this.store.set({activeDropdownIndex:-1});break}}}firstTappableInBottomRow(e){let t=this.store.get();if(t.filteredOptions.length===0)return null;let r=Math.floor((t.filteredOptions.length-1)/e)*e;for(let o=r;o<t.filteredOptions.length;o++)if(t.filteredOptions[o]?.is_tappable)return o;return null}getTappableIndices(e){let n=this.store.get().filteredOptions.map((o,a)=>o.is_tappable?a:-1).filter(o=>o!==-1),r=Array.from({length:e},()=>[]);for(let o of n)r[o%e].push(o);return r.flat()}getEffectiveColumns(){let e=document.getElementById(this.ctx.listboxId);if(!e)return this.ctx.columns;let n=document.getElementById(`${this.ctx.listboxId}-option-0`)?.parentElement??null;for(;n;){let r=getComputedStyle(n).gridTemplateColumns;if(r&&r!=="none"){let o=r.split(" ").filter(Boolean).length;if(o>0)return o}if(n===e)break;n=n.parentElement}return this.ctx.columns}clickOrSelect(e,t,n){let r=document.getElementById(`${n}-option-${e}`);r?r.click():this.ctx.selectOption(t[e])}removeActivePill(){let e=this.store.get(),t=e.suggestions.filter(s=>s.type==="placeholder"),n=e.suggestions.filter(s=>s.type!=="placeholder");if(n.length===0)return;let r=n[0],o=n.slice(1),a=e.skippedParams.some(s=>s.type===r.type);this.store.set({suggestions:[...t,...o],pillTapped:o.length>0,activeDropdownIndex:-1,...a?{}:{skippedParams:[...e.skippedParams,{id:crypto.randomUUID(),type:r.type,suggestionPlaceholder:r.text}]}}),o.length===0&&this.ctx.fetchNow?.()}};var Y=class{constructor(e,t={}){this.store=e;this.callbacks=t}setActivePill(e){let t=this.store.get(),n=t.suggestions.filter(l=>l.type!=="placeholder");if(e<0||e>=n.length)return;let r=n[e],o=n.filter((l,c)=>c!==e),a=t.suggestions.filter(l=>l.type==="placeholder");if(this.callbacks.onPillSelected){let{rawQuery:l}=v(t.text,t.completedParams);this.callbacks.onPillSelected({rawQuery:l,selectedPill:r.text,otherPills:o.map(c=>c.text)})}let s=[...a,r,...o],d=this.store.peek({suggestions:s}).filteredOptions.findIndex(l=>l.is_tappable);this.store.set({suggestions:s,pillTapped:!0,activeDropdownIndex:d})}removeLastParam(){this.store.get().completedParams.length!==0&&this.store.set(t=>({completedParams:t.completedParams.slice(0,-1),activeDropdownIndex:-1}))}};var J=class{constructor(e,t){this.store=e;this.getConfig=t;this.hasLoggedError=!1}async run(e,t,n){let r=this.getConfig();if(r){if(e.trim().length===0){this.clear(n);return}try{let o=await r.fetch(e,t);if(t.aborted||!n())return;let a=r.transform(o),s=Array.isArray(a)?a:[],d=r.limit!=null?s.slice(0,r.limit):s;if(t.aborted||!n())return;this.commit(d)}catch(o){if(t.aborted||wt(o))return;this.logOnce(o),this.clear(n)}}}clearNow(){this.commit([])}clear(e){e()&&this.commit([])}commit(e){e.length===0&&this.store.get().products.length===0||this.store.set({products:e})}logOnce(e){this.hasLoggedError||(this.hasLoggedError=!0,console.warn("[AIAutocomplete] products.fetch/transform failed \u2014 the product strip is hidden. Later failures on this instance are not logged.",e))}};function wt(i){return i instanceof Error&&i.name==="AbortError"}function Ue(i,e){let t=e.dropdownTrigger??"auto",n=e.closeDropdownOnBlur??!0,a=i.filteredOptionsLength>0||i.activePillHasNoOptions||i.hasProducts;if(i.inEditMode){let s=n?i.isFocused:!0;return a&&s}if(t==="auto"){let s=n?i.isFocused:!0,d=i.text.replace(/\s+$/,"").length,l=i.caretOffset==null||i.caretOffset>=d;return(a||i.isLoading)&&s&&l}return t==="manual"?(a||i.isLoading)&&i.pillTapped:!1}function $e(i,e){let t=_e(i.text,i.completedParams,i.identifiedParams),n=i.suggestions.filter(m=>m.type!=="placeholder"),r=n[0],o=r?e.optionOverrides?.[r.type]:void 0,a=i.suggestions.filter(m=>m.type==="placeholder").map(m=>m.text).join(" "),s=T(i.text,Math.min(i.filterBase,i.text.length),a),l=s===0&&$(i.text,i.completedParams.length,a)?"":A(i.text,s,i.filterInProgress),c=r?o?o(l.trim())??r.options??[]:r.options??[]:[],p=i.editingParam!=null&&i.editingAnchor!=null,u;if(p&&i.editingParam&&i.editingAnchor!=null){let m=i.editingParam.id,x=i.completedParams.some(E=>E.id===m),S=i.caretOffset??i.editingAnchor,P=x?"":i.text.slice(i.editingAnchor,S);u=I(i.editingParam.options,P)}else u=I(c,l);let f=e.showNonTappableOptions===!1;f&&(u=u.filter(m=>m.is_tappable));let h=m=>f?m.is_tappable:!0,y;if(p){let m=i.editingParam?.options??[];y=i.editingParam!=null&&m.filter(h).length===0}else{let m=r?o?o("")??r.options??[]:r.options??[]:[];y=r!=null&&m.filter(h).length===0}let b=Ue({inEditMode:p,filteredOptionsLength:u.length,isFocused:i.isFocused,text:i.text,caretOffset:i.caretOffset,isLoading:i.isLoading,pillTapped:i.pillTapped,activePillHasNoOptions:y,hasProducts:i.products.length>0},{dropdownTrigger:e.dropdownTrigger,closeDropdownOnBlur:e.closeDropdownOnBlur}),g=b&&i.activeDropdownIndex>=0&&!!u[i.activeDropdownIndex]?.is_tappable;return{segments:t,actionableSuggestions:n,filteredOptions:u,placeholderText:a,isDropdownOpen:b,isActivePillSelected:g}}function Z(i){return i.mode==="fresh"?Et(i):Tt(i)}function Et(i){let{text:e,completedParams:t,suggestions:n,filterBase:r,filterInProgress:o}=i,s=n.filter(S=>S.type!=="placeholder")[0];if(!s?.options)return null;let d=n.filter(S=>S.type==="placeholder").map(S=>S.text).join(" "),l=T(e,r,d),c=A(e,l,o),p=k(s.options,c);if(!p)return null;let u=p.text.toLowerCase(),f=e.toLowerCase().lastIndexOf(u),h=f>=0?f:Math.max(0,e.length-p.text.length),y=h+p.text.length,b=e.slice(h,y),m=y<e.length&&e[y]===" "?y+1:y,x={id:crypto.randomUUID(),placeholder:"",type:s.type,text:b,kind:p.kind,suggestionType:s.type,suggestionPlaceholder:s.text,options:s.options??[],metadata:p.metadata};return{patch:{text:e,completedParams:[...t,x],suggestions:n.filter(S=>S!==s),filterBase:m,newParamId:x.id,caretOffset:m,activeDropdownIndex:-1},caretPos:m}}function Tt(i){let{text:e,completedParams:t,editingParam:n,editingAnchor:r,editingTail:o}=i;if(t.some(x=>x.id===n.id))return null;let a=e.slice(r,o),s=k(n.options,a);if(!s)return null;let d=s.text.toLowerCase(),l=a.toLowerCase().lastIndexOf(d),c=r+Math.max(0,l),p=c+s.text.length,u=e.slice(c,p),h=p<e.length&&e[p]===" "?p+1:p,y={id:crypto.randomUUID(),placeholder:"",type:n.suggestionType,text:u,kind:s.kind,suggestionType:n.suggestionType,suggestionPlaceholder:n.suggestionPlaceholder,options:n.options,metadata:s.metadata},b=t.length,g=0;for(let x=0;x<t.length;x++){let S=e.indexOf(t[x].text,g);if(S!==-1){if(S>=h){b=x;break}g=S+t[x].text.length}}let m=[...t];return m.splice(b,0,y),{patch:{text:e,completedParams:m,newParamId:y.id,filterBase:h,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:h,activeDropdownIndex:-1},caretPos:h}}function ee(i,e,t){let n=i.slice(0,e),r=i.slice(t),o=(n===""||n.endsWith(" "))&&r.startsWith(" ");return o&&(r=r.slice(1)),{text:n+r,removed:t-e+(o?1:0)}}var te=class{constructor(e){this.deps=e}start(e){let t=this.deps.store.get();if(t.editingParam?.id===e)return;let n=t.completedParams.find(a=>a.id===e);if(!n)return;let r=0,o=-1;for(let a of t.completedParams){let s=t.text.indexOf(a.text,r);if(s!==-1){if(a.id===e){o=s;break}r=s+a.text.length}}o<0||this.deps.store.set({editingParam:n,editingAnchor:o,editingTail:o+n.text.length,caretOffset:o+n.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(),n=t.editingParam,r=t.editingAnchor,o=t.editingTail;if(!n||r==null||o==null||!t.completedParams.some(d=>d.id===n.id))return!1;let{text:a}=e===""?ee(t.text,r,o):{text:t.text.slice(0,r)+e+t.text.slice(o)},s=r+e.length;return this.deps.store.set(d=>({text:a,completedParams:d.completedParams.filter(l=>l.id!==n.id),editingTail:s,caretOffset:s,activeDropdownIndex:-1})),this.deps.scheduleSetCursor(s),this.tryPromote(),!0}caretAfterInput(e){let t=this.deps.store.get(),n={caretOffset:e};t.editingParam&&t.editingAnchor!=null&&e!=null&&(e<t.editingAnchor?(n.editingParam=null,n.editingAnchor=null,n.editingTail=null,n.activeDropdownIndex=-1):t.editingTail!=null&&(n.editingTail=Math.max(t.editingTail,e))),this.deps.store.set(n),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(),n=t.editingParam,r=t.editingAnchor,o=t.editingTail;if(!n||r==null||o==null)return;this.deps.fireTelemetry("option",{raw_query:v(t.text,t.completedParams).rawQuery,selected_option:e.text,other_options:n.options.filter(g=>g.text!==e.text).map(g=>g.text)});let a=t.text.slice(0,r),s=t.text.slice(o),d=r===0&&e.text.length>0?e.text[0].toUpperCase()+e.text.slice(1):e.text,l=s.length===0||s[0]!==" ",c=l?`${d} `:d,p=a+c+s,u=r+c.length+(l?0:1),f={id:crypto.randomUUID(),placeholder:"",type:n.suggestionType,text:d,kind:e.kind,suggestionType:n.suggestionType,suggestionPlaceholder:n.suggestionPlaceholder,options:n.options,metadata:e.metadata},h=t.completedParams.findIndex(g=>g.id===n.id),y=t.completedParams.filter(g=>g.id!==n.id),b=h>=0?Math.min(h,y.length):y.length;y.splice(b,0,f),this.deps.store.set({text:p,completedParams:y,newParamId:f.id,filterBase:u,editingParam:null,editingAnchor:null,editingTail:null,caretOffset:u,activeDropdownIndex:-1,pillTapped:!1,skipNextFetch:!0,inSelectionAnimation:!0}),this.deps.startSelectionAnimationTimer(),this.deps.scheduleSetCursor(u)}tryPromote(){let e=this.deps.store.get();if(!e.editingParam||e.editingAnchor==null||e.editingTail==null)return;let t=Z({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 ye="https://ai-autocomplete.com";function ne(i=ye){try{if(typeof window>"u"||!window.location)return i;let e=window.location.hostname;if(!e)return i;let t=new URL(i);return t.searchParams.set("utm_source",e),t.toString()}catch{return i}}function ie(i,e){return i?{key:"enter",hint:"to proceed"}:e?{key:"tab",hint:"to select"}:{key:"\u2192",hint:"to skip"}}var qe="data-aia-key";function M(i,e,t){let n=new Map;for(let a of Array.from(i.children)){let s=a.getAttribute(qe);s!=null&&n.set(s,a)}let r=new Set,o=[];for(let a=0;a<e.length;a++){let s=e[a],d=t.keyOf(s,a);r.add(d);let l=n.get(d);l||(l=t.create(s,a),l.setAttribute(qe,d)),t.update?.(l,s,a),i.children[a]!==l&&i.insertBefore(l,i.children[a]??null),o.push(l)}for(let[a,s]of n)r.has(a)||s.remove();return o}var Qe=[125,69];function Ge(i,e){return e?1:i===0?.7:i===1?.4:.2}function re(i,e,t,n,r=!1,o=!1,a=!1){let s=i.querySelector(".magicx-aia-pill-list");if(s||(s=document.createElement("span"),s.className="magicx-aia-pill-list",i.appendChild(s)),o&&e.length===0){s.setAttribute("data-aia-pill-list-loading",""),s.innerHTML="";for(let d=0;d<Qe.length;d++){let l=Qe[d],c=document.createElement("span");c.setAttribute("data-aia-pill-skeleton",""),c.className=`magicx-aia-pill magicx-aia-pill--skeleton${r?" magicx-aia-pill--rounded":""}`,c.style.width=`${l}px`,c.style.opacity=String(Ge(d,!1)),s.appendChild(c)}return}o?s.setAttribute("data-aia-pill-list-loading",""):s.removeAttribute("data-aia-pill-list-loading");for(let d of s.querySelectorAll("[data-aia-pill-skeleton]"))d.remove();M(s,e,{keyOf:d=>`${d.type}-${d.text}`,create:d=>{let l=document.createElement("button");return l.type="button",l.tabIndex=-1,l.setAttribute("data-aia-pill",""),l.setAttribute("contenteditable","false"),l.textContent=d.text,l.addEventListener("mousedown",c=>c.preventDefault()),l},update:(d,l,c)=>{let p=d,u=a&&c===t&&!o,f=["magicx-aia-pill"];r&&f.push("magicx-aia-pill--rounded"),o&&f.push("magicx-aia-pill--skeleton"),p.className=f.join(" "),p.style.width="",p.style.opacity=String(Ge(c,u)),o?(p.setAttribute("data-aia-loading",""),p.disabled=!0,p.onclick=null):(p.removeAttribute("data-aia-loading"),p.disabled=!1,p.onclick=()=>n(c))}})}function Se(i){i.querySelector(".magicx-aia-pill-list")?.remove()}var At="Products";function We(i,e,t,n,r){let o=i.querySelector(".magicx-aia-products");if(e.length===0){o?.remove();return}if(!o){o=document.createElement("section"),o.className="magicx-aia-products",o.setAttribute("data-aia-products",""),o.setAttribute("role","group"),o.setAttribute("aria-labelledby",`${t}-products-label`);let s=document.createElement("div");s.className="magicx-aia-products-label",s.id=`${t}-products-label`,s.textContent=At;let d=document.createElement("div");d.className="magicx-aia-products-row",d.setAttribute("data-aia-products-row",""),o.append(s,d),i.appendChild(o)}let a=o.querySelector(".magicx-aia-products-row");a&&M(a,e,{keyOf:s=>It(s),create:s=>Ot(s,n,r),update:(s,d,l)=>{s.id=`${t}-product-${l}`,s.dataset.aiaIndex=String(l)}})}function Pe(i,e){let t=i.querySelectorAll("[data-aia-product]");for(let n of t)n.tabIndex=e?0:-1}function It(i){return[i.id,i.title,i.url,i.imageUrl,i.price,i.vendor].map(e=>e??"").join("\0")}function Ot(i,e,t){let n=document.createElement("a");n.className="magicx-aia-product",n.setAttribute("data-aia-product",""),n.setAttribute("role","option"),n.setAttribute("aria-selected","false"),n.href=i.url,n.tabIndex=0;let r=document.createElement("span");if(r.className="magicx-aia-product-media",i.imageUrl){let s=document.createElement("img");s.className="magicx-aia-product-image",s.src=i.imageUrl,s.alt="",s.loading="lazy",s.decoding="async",r.appendChild(s)}else r.setAttribute("data-aia-product-placeholder","");n.appendChild(r);let o=document.createElement("span");if(o.className="magicx-aia-product-body",i.vendor){let s=document.createElement("span");s.className="magicx-aia-product-vendor",s.textContent=i.vendor,o.appendChild(s)}let a=document.createElement("span");if(a.className="magicx-aia-product-title",a.textContent=i.title,o.appendChild(a),i.price){let s=document.createElement("span");s.className="magicx-aia-product-price",s.textContent=i.price,o.appendChild(s)}return n.appendChild(o),n.addEventListener("click",s=>{s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||s.button!==0||(s.preventDefault(),e(i))}),n.addEventListener("keydown",s=>{s.key!=="Enter"&&s.key!==" "||(s.preventDefault(),e(i))}),n.addEventListener("focus",()=>t(!0)),n.addEventListener("blur",s=>{s.relatedTarget?.closest("[data-aia-dropdown]")||t(!1)}),n}function je(i,e,t,n,r,o,a,s=""){let d=i.querySelector(".aia-grid");if(e.length===0){d?.remove();return}d||(d=document.createElement("div"),d.className="aia-grid magicx-aia-grid",d.setAttribute("data-scroll",""),d.style.setProperty("--aia-grid-min","250px"),d.style.setProperty("--aia-grid-max","1fr"),d.style.setProperty("--aia-grid-gap","0"),i.appendChild(d)),Dt(d,e,t,n,r,o,a),kt(d,s)}function kt(i,e){i.dataset.aiaGroup!==e&&(i.dataset.aiaGroup=e,i.scrollTop=0)}function Dt(i,e,t,n,r,o,a){let s=a?"1":"0";M(i,e,{keyOf:d=>`${d.text}\0${s}`,create:d=>Lt(d,a),update:(d,l,c)=>{let p=c===t&&!a;d.id=`${o}-option-${c}`,d.dataset.aiaIndex=String(c),d.setAttribute("aria-selected",String(p)),d.classList.toggle("magicx-aia-option--highlighted",p),!a&&l.is_tappable?(d.onclick=()=>{d.classList.add("magicx-aia-option--pressed"),n(l),setTimeout(()=>d.classList.remove("magicx-aia-option--pressed"),500)},d.onmouseenter=()=>{let u=Number.parseInt(d.dataset.aiaIndex??"-1",10);u>=0&&r(u)}):(d.onclick=null,d.onmouseenter=null)}})}function Lt(i,e){let t=document.createElement("div");t.setAttribute("role","option"),t.setAttribute("data-aia-option",""),e&&t.setAttribute("data-aia-loading",""),t.tabIndex=e||!i.is_tappable?-1:0;let n=["magicx-aia-option"];i.is_tappable?n.push("magicx-aia-option--tappable"):n.push("magicx-aia-option--non-tappable"),t.className=n.join(" ");let r=document.createElement("div");r.className="magicx-aia-streaks",t.appendChild(r);let o=document.createElement("div");o.className="magicx-aia-streaks-vert",t.appendChild(o);let a=document.createElement("span");a.className="magicx-aia-option-content";let s=document.createElement("span");if(s.className="magicx-aia-option-text",s.textContent=i.icon?`${i.icon} ${i.text}`:i.text,a.appendChild(s),i.tag){let d=document.createElement("span");d.className="magicx-aia-option-tag",d.textContent=i.tag,a.appendChild(d)}return t.appendChild(a),t}var Mt=[159,119,164];function oe(i){let e=document.createElement("div");return e.id=i,e.setAttribute("role","listbox"),e.setAttribute("data-aia-dropdown",""),e.className="magicx-aia-dropdown",e.addEventListener("mousedown",t=>t.preventDefault()),e}function se(i,e){let{filteredOptions:t,activeIndex:n,isOpen:r,isLoading:o,pills:a,showPills:s,isActivePillSelected:d,onSelect:l,onHighlight:c,onPillClick:p}=e,u=s&&a.length>0,f=t.length>0,h=e.products.length>0,y=r&&(f||u||o||h);if(y?i.classList.add("magicx-aia-dropdown--visible"):i.classList.remove("magicx-aia-dropdown--visible"),o?i.setAttribute("data-aia-loading",""):i.removeAttribute("data-aia-loading"),!y){Pe(i,!1);return}h?i.setAttribute("data-aia-has-products",""):i.removeAttribute("data-aia-has-products");let b=i.querySelector(".aia-stack");b||(b=document.createElement("div"),b.className="aia-stack",b.style.setProperty("--aia-stack-space","8px"),i.appendChild(b));let g=u||o&&s,m=b.querySelector(".magicx-aia-pill-bar");g?(m||(m=document.createElement("div"),m.className="magicx-aia-pill-bar aia-cluster",m.setAttribute("data-nowrap",""),m.setAttribute("data-aia-pillbar",""),b.insertBefore(m,b.firstChild)),re(m,a,0,p,!0,o,d)):m&&m.remove();let x=e.suggestions[0],S=x?`${x.type} ${x.text}`:"";je(b,t,n,l,c,e.listboxId,o,S);let P=b.querySelector(".magicx-aia-skeleton-bars");if(o&&!f){if(!P){P=document.createElement("div"),P.className="magicx-aia-skeleton-bars",P.setAttribute("data-aia-skeleton-bars","");for(let st of Mt){let me=document.createElement("span");me.className="magicx-aia-skeleton-bar",me.style.width=`${st}px`,P.appendChild(me)}b.appendChild(P)}}else P&&P.remove();We(b,e.products,e.listboxId,e.onProductSelect,e.onProductFocusChange),Pe(i,!0);let E=b.querySelector(".magicx-aia-footer")??_t(),ot=n>=0&&!!t[n]?.is_tappable;Nt(E,ie(ot,e.isInputEmpty)),E.isConnected||b.appendChild(E),Rt(b,[".magicx-aia-pill-bar",".aia-grid",".magicx-aia-skeleton-bars",".magicx-aia-products",".magicx-aia-footer"])}function Rt(i,e){let t=e.map(n=>i.querySelector(`:scope > ${n}`)).filter(n=>n!==null);for(let n=0;n<t.length;n++)i.children[n]!==t[n]&&i.insertBefore(t[n],i.children[n]??null)}function Nt(i,{key:e,hint:t}){let n=i.querySelector(".magicx-aia-footer-key"),r=i.querySelector(".magicx-aia-footer-hint");!n||!r||(n.textContent!==e&&(n.textContent=e),r.textContent!==t&&(r.textContent=t))}function _t(){let i=document.createElement("footer");i.className="magicx-aia-footer",i.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 n=document.createElement("kbd");n.className="magicx-aia-footer-key",n.textContent="tab";let r=document.createElement("span");r.className="magicx-aia-footer-hint",r.textContent="to select",t.append(n,r);let o=document.createElement("a");o.className="aia-cluster magicx-aia-footer-brand-link",o.setAttribute("data-align","center"),o.href=ne(),o.target="_blank",o.rel="noopener noreferrer",o.style.setProperty("--aia-cluster-gap","2px");let a=document.createElement("span");a.className="magicx-aia-footer-brand",a.textContent="AI";let s=document.createElement("span");return s.className="magicx-aia-footer-badge",s.textContent="Autocomplete",o.append(a,s),e.append(t,o),i.append(e),i}function Ve(i,e){let t=oe(e.listboxId);return i.appendChild(t),{dropdown:t}}function ve(i,e,t){se(i.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,products:e.products,onSelect:t.selectOption,onHighlight:n=>t.store.set({activeDropdownIndex:n}),onPillClick:t.setActivePill,onProductSelect:t.selectProduct,onProductFocusChange:n=>t.store.set({isFocused:n})})}function ae(i){let{input:e,segments:t,newParamId:n,editingParamId:r,placeholderText:o,isFocused:a}=i,s=t.length===0;e.dataset.aiaEmpty=s?"true":"false",s&&o?e.dataset.placeholder=o:delete e.dataset.placeholder;let d=t.map(b=>`${b.type}:${b.value}`).join("\0"),l=e.dataset.segKey??"",c=e.dataset.newParamId??"",p=e.dataset.editingParamId??"";if(d===l&&(n??"")===c&&(r??"")===p)return;let u=a?w(e):null;e.dataset.segKey=d,e.dataset.newParamId=n??"",e.dataset.editingParamId=r??"";let f=e.ownerDocument??document,h=f.createDocumentFragment(),y=0;for(let b of t)if(y+=b.value.length,b.type==="completed"){let g=f.createElement("strong");g.dataset.seg="completed",g.dataset.paramId=b.param.id;let m=b.param.id===n,x=b.param.id===r,S=["magicx-aia-segment","magicx-aia-segment--completed"];m&&S.push("magicx-aia-shimmer-revealed","magicx-aia-shimmer-sweep"),x&&S.push("magicx-aia-segment--editing"),g.className=S.join(" "),g.textContent=b.value,h.appendChild(g)}else if(b.type==="identified"){let g=f.createElement("strong");g.dataset.seg="identified",g.dataset.paramId=b.param.id,g.className="magicx-aia-segment magicx-aia-segment--completed",g.textContent=b.value,h.appendChild(g)}else h.appendChild(f.createTextNode(b.value));e.replaceChildren(h),e.dataset.aiaTextLength=String(y),u!=null&&C(e,Math.max(0,Math.min(u,y)))}var Ht='<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 Xe(){let i=document.createElement("button");return i.type="button",i.className="magicx-aia-submit",i.setAttribute("aria-label","Submit"),i.setAttribute("data-aia-submit",""),i.innerHTML=Ht,i}function Ft(){let i=document.createElement("div");return i.setAttribute("contenteditable","plaintext-only"),i.contentEditable==="plaintext-only"}function ze(i,e){let t=e.firstElementChild;if(!t){e.removeAttribute("data-aia-pill-wrapped");return}let n=t.getBoundingClientRect(),r=i.getBoundingClientRect();n.top>=r.bottom-2?e.setAttribute("data-aia-pill-wrapped",""):e.removeAttribute("data-aia-pill-wrapped")}function Ye(i,e){let{listboxId:t}=e,n=oe(t);i.appendChild(n);let r=document.createElement("div");r.className="magicx-aia-input-wrapper",i.appendChild(r);let o=document.createElement("div");o.className="magicx-aia-editor",o.setAttribute("data-aia-editor",""),r.appendChild(o);let a=document.createElement("div");a.className="magicx-aia-input",a.setAttribute("data-aia-input",""),a.setAttribute("contenteditable",Ft()?"plaintext-only":"true"),a.setAttribute("role","combobox"),a.setAttribute("aria-autocomplete","list"),a.setAttribute("aria-haspopup","listbox"),a.setAttribute("aria-controls",t),a.setAttribute("aria-expanded","false"),a.setAttribute("spellcheck","true"),a.setAttribute("enterkeyhint","send"),o.appendChild(a);let s=document.createElement("span");s.className="magicx-aia-pill-list-container",s.setAttribute("data-aia-pill-list-container",""),o.appendChild(s);let d=null,l=null;e.submitButton===void 0?(d=Xe(),r.appendChild(d),l=d):e.submitButton!==null&&(l=e.submitButton,l.hasAttribute("data-aia-submit")||l.setAttribute("data-aia-submit",""),r.appendChild(l));let c=new AbortController,{signal:p}=c,u=!1,f=0,h=()=>{let g=_(a),x=g.length>0&&g[0]!==g[0].toUpperCase()?g[0].toUpperCase()+g.slice(1):g;e.handleChange(x)},y=()=>{let g=(a.ownerDocument??document).getSelection();if(!g||g.rangeCount===0)return null;let m=g.anchorNode;return!m||!a.contains(m)?null:(m.nodeType===Node.ELEMENT_NODE?m:m.parentElement)?.closest('strong[data-seg="completed"][data-param-id]')?.dataset.paramId??null};r.addEventListener("click",g=>{g.target?.closest("[data-aia-pill]")||a.focus()},{signal:p}),a.addEventListener("input",()=>{u||(f=performance.now(),h(),e.handleCaretAfterInput(w(a)))},{signal:p});let b=a.ownerDocument??document;if(b.addEventListener("selectionchange",()=>{let g=b.getSelection();if(!g||g.rangeCount===0||!a.contains(g.anchorNode))return;let m=y(),x=e.store.get().editingParam?.id??null;if(m&&m!==x){e.startEditingParam(m);return}performance.now()-f<50||e.handleCaretMove(w(a))},{signal:p}),a.addEventListener("compositionstart",()=>{u=!0},{signal:p}),a.addEventListener("compositionend",()=>{u=!1,h()},{signal:p}),a.addEventListener("beforeinput",g=>{let m=g,x=m.inputType;if(x==="insertParagraph"||x==="insertLineBreak"||x==="insertFromDrop"){g.preventDefault();return}if(x.startsWith("insert")||x.startsWith("delete")){let S=x.startsWith("delete")?"":m.data??"";e.replaceEditingRange(S)&&g.preventDefault()}},{signal:p}),a.addEventListener("paste",g=>{g.preventDefault();let m=(g.clipboardData?.getData("text/plain")??"").replace(/\r?\n/g," ");if(!m)return;let x=a.ownerDocument??document,S=x.getSelection();if(!S||S.rangeCount===0)return;let P=S.getRangeAt(0);if(!a.contains(P.startContainer))return;P.deleteContents();let E=x.createTextNode(m);P.insertNode(E),P.setStartAfter(E),P.collapse(!0),S.removeAllRanges(),S.addRange(P),h()},{signal:p}),a.addEventListener("keydown",g=>e.handleKeyDown(g),{signal:p}),a.addEventListener("focus",()=>e.store.set({isFocused:!0}),{signal:p}),a.addEventListener("blur",()=>e.store.set({isFocused:!1}),{signal:p}),l&&l.addEventListener("click",g=>{let m=e.store.get();if(!(!!m.text||m.completedParams.length>0)||!e.onSubmit)return;g.stopPropagation(),e.onSubmit(L(m.text,m.completedParams,m.skippedParams))&&e.afterSubmit?.()},{signal:p}),e.autoFocus!==!1){a.focus();let g=a.ownerDocument??document,m=g.getSelection(),x=m&&m.rangeCount>0&&a.contains(m.anchorNode);if(m&&!x){let S=g.createRange();S.selectNodeContents(a),S.collapse(!0),m.removeAllRanges(),m.addRange(S)}}if(typeof ResizeObserver<"u"){let g=new ResizeObserver(()=>ze(a,s));g.observe(a),c.signal.addEventListener("abort",()=>g.disconnect(),{once:!0})}return{input:a,inlinePillContainer:s,dropdown:n,submitButton:d,abort:c}}function Ce(i,e,t){let{input:n,inlinePillContainer:r,dropdown:o,submitButton:a}=i,{pillPlacement:s,setActivePill:d,selectOption:l,store:c}=t;n.setAttribute("aria-expanded",String(e.isDropdownOpen));let p=e.activeDropdownIndex>=0?`${t.listboxId}-option-${e.activeDropdownIndex}`:"";if(p?n.setAttribute("aria-activedescendant",p):n.removeAttribute("aria-activedescendant"),a){let b=!!e.text||e.completedParams.length>0;a.disabled=!b}let u=n.dataset.newParamId??"",f=e.newParamId!==null&&e.newParamId!==u;if(ae({input:n,segments:e.segments,newParamId:e.newParamId,editingParamId:e.editingParam?.id??null,placeholderText:e.placeholderText,isFocused:e.isFocused}),s==="inline"){let b=e.isLoading&&!e.editingParam&&!e.inSelectionAnimation;b||e.actionableSuggestions.length>0?re(r,e.actionableSuggestions,0,d,!1,b,e.isActivePillSelected):Se(r)}else Se(r);ze(n,r),f?(n.focus(),C(n,e.caretOffset??e.text.length)):e.isFocused&&_(n)!==e.text&&C(n,e.text.length);let h=e.editingParam?{type:e.editingParam.suggestionType,text:e.editingParam.suggestionPlaceholder,required:!0,options:e.editingParam.options}:null,y=h??e.actionableSuggestions[0];se(o,{suggestions:y?[{...y,options:e.filteredOptions}]:[],filteredOptions:e.filteredOptions,activeIndex:e.activeDropdownIndex,isOpen:e.isDropdownOpen,isLoading:e.isLoading&&!e.editingParam&&!e.inSelectionAnimation,listboxId:t.listboxId,pills:h?[h]:e.actionableSuggestions,showPills:s==="dropdown",isActivePillSelected:e.isActivePillSelected,isInputEmpty:e.text.trim().length===0,products:e.products,onSelect:l,onHighlight:b=>c.set({activeDropdownIndex:b}),onPillClick:d,onProductSelect:t.selectProduct,onProductFocusChange:b=>c.set({isFocused:b})})}function Je(i,e){let t=i.actionableSuggestions[0];if(!t)return null;let n=i.filterBase,r=i.text.slice(0,n),o=r.length===0&&i.text.length===0,a=r.length===0&&i.text.length>0&&i.placeholderText.length>0&&i.placeholderText.toLowerCase().startsWith(i.text.toLowerCase());(o||a)&&i.placeholderText&&(r=`${i.placeholderText} `);let s=Oe(r,e.text);s>0&&(r=r.slice(0,r.length-s));let d=r.length>0&&r[r.length-1]!==" ",l=`${r}${d?" ":""}${e.text} `,c=(o||a)&&l.length>0?l[0].toUpperCase()+l.slice(1):l,p=c.toLowerCase().lastIndexOf(e.text.toLowerCase()),u=p>=0?c.slice(p,p+e.text.length):e.text,f={id:crypto.randomUUID(),placeholder:"",type:t.type,text:u,kind:e.kind,suggestionType:t.type,suggestionPlaceholder:t.text,options:t.options??[],metadata:e.metadata},h=i.actionableSuggestions.length-1;return{patch:{text:c,filterBase:c.length,completedParams:[...i.completedParams,f],newParamId:f.id,caretOffset:c.length,pillTapped:!1,activeDropdownIndex:-1,skipNextFetch:h>0,inSelectionAnimation:!0,pendingSpan:null},telemetry:{selectedOption:e.text,otherOptions:i.filteredOptions.filter(y=>y.text!==e.text).map(y=>y.text)},consumedSuggestion:t,remainingActionable:h}}function le(i){let e=i,t=new Set,n=[],r=!1;return{get:()=>e,set:o=>{let a=typeof o=="function"?o(e):o,s=e;if(e={...e,...a},n.push([e,s]),!r){r=!0;try{let d=0;for(let l=n.shift();l;l=n.shift()){if(++d>1e4)throw n.length=0,new Error("createStore: notifications did not settle after 10000 deliveries \u2014 a listener is likely calling set() on every notification");let[c,p]=l;for(let u of t)u(c,p)}}catch(d){throw n.length=0,d}finally{r=!1}}},subscribe:o=>(t.add(o),()=>{t.delete(o)})}}function Ze(i,e){let t,n,r=o=>(o!==t&&(t=o,n=e(o)),n);return{get:()=>{let o=i.get();return{...o,...r(o)}},set:o=>{typeof o=="function"?i.set(a=>{let s={...a,...r(a)};return o(s)}):i.set(o)},peek:o=>{let a={...i.get(),...o};return{...a,...e(a)}},subscribe:o=>i.subscribe((a,s)=>{let d={...s,...r(s)},l={...a,...r(a)};o(l,d)})}}var we=!1;function et(){if(we||typeof document>"u")return;if(document.querySelector("style[data-magicx-aia]")){we=!0;return}we=!0;let i=document.createElement("style");i.setAttribute("data-magicx-aia",""),i.textContent=Bt,document.head.appendChild(i)}var Bt=`@layer layout {
2
2
  .aia-stack {
3
3
  display: flex;
4
4
  flex-direction: column;
@@ -1390,5 +1390,5 @@
1390
1390
  animation-duration: 0s !important;
1391
1391
  transition-duration: 0s !important;
1392
1392
  }
1393
- `;var ae=class{constructor(){this.listeners={}}on(e,t){let i=(...o)=>t(...o),r=this.listeners[e];return r||(r=new Set,this.listeners[e]=r),r.add(i),()=>{this.listeners[e]?.delete(i)}}emit(e,...t){let i=this.listeners[e];if(i)for(let r of i)r(...t)}hasListeners(e){return(this.listeners[e]?.size??0)>0}clear(){this.listeners={}}};var le=class{constructor(){this.timers=new Map}schedule(e,t,i){this.clear(e);let r=setTimeout(()=>{this.timers.delete(e),t()},i);this.timers.set(e,r)}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 R=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 _t(n){return(n??F).replace(/\/suggest(\?|#|$)/,"/telemetry/events$1")}async function Ht(n){return N(n)?`Bearer ${await B(n).getToken()}`:U(n)}async function Ye(n){try{let e=_t(n.apiConfig?.endpoint),t=K(n.apiConfig),i=await Ht(n.apiConfig);i&&(t.Authorization=i);let r=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:r})}catch{}}var Ft="newParam",Je="suggestionRemoval",Bt="selectionAnimation",Kt=650,Ut=0;function $t(){return`:ac-${++Ut}:`}var Ze=500;function et(){return{text:"",completedParams:[],identifiedParams:[],skippedParams:[],pendingSpan:null,suggestions:[],products:[],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 de=class{constructor(e,t={}){this.inputStore=se(et());this._listboxId=$t();this.modeController=null;this.unsubscribers=[];this.domRefs=null;this.dropdownRefs=null;this.timers=new le;this.emitter=new ae;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=Xe(this.inputStore,i=>Fe(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.onProductSelect&&this.emitter.on("productSelect",t.onProductSelect),t.value!==void 0&&this.store.set({text:t.value}),t.completedParams!==void 0&&this.store.set({completedParams:t.completedParams}),this.pillsController=new z(this.store,{onPillSelected:({rawQuery:i,selectedPill:r,otherPills:o})=>{this.fireTelemetry("pill",{raw_query:i,selected_pill:r,other_pills:o})}}),this.reEdit=new Z({store:this.store,scheduleSetCursor:i=>this.scheduleSetCursor(i),fireTelemetry:(i,r)=>this.fireTelemetry(i,r),startSelectionAnimationTimer:()=>this.startSelectionAnimationTimer()}),this.productsController=new Y(this.store,()=>this.opts.products),this.fetchController=new q(this.store,()=>this.opts.apiConfig,()=>this.opts.optionOverrides,()=>this.opts.maskCompletedText,()=>this.emitter.hasListeners("error")?this.emitError:void 0,()=>this.sessionId,{onRequest:({query:i,signal:r,isCurrent:o})=>{this.productsController.run(i,r,o).catch(()=>{})},onAutoMatch:({active:i,matched:r,rawQuery:o})=>{this.fireTelemetry("option",{raw_query:o,selected_option:r.text,other_options:(i.options??[]).filter(a=>a.text!==r.text).map(a=>a.text)})}}),this.keyboardController=new X(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(),fetchNow:()=>this.fetchNow()}),this.unsubscribers.push(this.store.subscribe((i,r)=>{i.text!==r.text&&this.emitter.emit("change",i.text),i.completedParams!==r.completedParams&&this.emitter.emit("paramsChange",i.completedParams),i.isFocused!==r.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.unsubscribers.push(this.store.subscribe((i,r)=>{if(i.text===r.text&&i.completedParams===r.completedParams||i.identifiedParams.length===0)return;let{valid:o,invalid:a}=$(i.text,i.completedParams,i.identifiedParams);a.length>0&&this.store.set({identifiedParams:o})})),this.unsubscribers.push(this.store.subscribe((i,r)=>{let o=i.pendingSpan;if(!o||i.text===r.text&&i.completedParams===r.completedParams&&i.identifiedParams===r.identifiedParams)return;let a=o.anchor;if(i.text!==r.text){let d=ke(r.text,i.text,a);if(d===null){this.store.set({pendingSpan:null});return}a=d}i.text.slice(a).trim().length===0||Ie(i.segments,a)?this.store.set({pendingSpan:null}):a!==o.anchor&&this.store.set({pendingSpan:{anchor:a,snapshot:o.snapshot}})})),this.renderMode!=="headless"&&(ze(),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({...et(),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:r}=t,o=0;for(let a=0;a<r.length;a++){let s=r[a],d=i.indexOf(s.text,o);if(d===-1)continue;let l=d,u=d+s.text.length;if(e>l&&e<=u){let c=V(i,e),p=i.slice(0,c)+i.slice(e),f=r.filter((h,y)=>y!==a);return this.store.set(h=>({text:p,filterBase:Math.min(h.filterBase,p.length),completedParams:f,pillTapped:!1,activeDropdownIndex:-1})),this.scheduleSetCursor(c),!0}o=u}return!1}scheduleSetCursor(e){queueMicrotask(()=>{let t=this.domRefs;t?(t.input.focus(),C(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})}selectProduct(e){this.emitter.emit("productSelect",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){let t=this.opts.products;Object.assign(this.opts,e),"products"in e&&e.products!==t&&this.productsController.clearNow(),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=Ve(t,e);if(i&&(this.fireTelemetry("option",{raw_query:v(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(Je),i.remainingActionable>0)){let r=i.consumedSuggestion;this.timers.schedule(Je,()=>{this.store.set(o=>({suggestions:o.suggestions.filter(a=>a!==r)}))},Ze)}}startSelectionAnimationTimer(){this.timers.schedule(Bt,()=>this.store.set({inSelectionAnimation:!1}),Ze)}fireTelemetry(e,t){let i=this.opts.source??(this.renderMode==="full"?"full-sdk":"headless-sdk");Ye({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 R(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),selectProduct:i=>this.selectProduct(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=je(this.container,t),this.subscribeBatchedRender(()=>{this.domRefs&&ye(this.domRefs,this.store.get(),t)}),ye(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),selectProduct:t=>this.selectProduct(t)};this.dropdownRefs=Qe(this.container,e),this.subscribeBatchedRender(()=>{this.dropdownRefs&&xe(this.dropdownRefs,this.store.get(),e)}),xe(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(Ft,()=>this.store.set({newParamId:null}),Kt)}))}handleChange(e){let t=this.store.get();this.store.set({text:e,pillTapped:!1,activeDropdownIndex:-1});let{valid:i,invalid:r}=Le(e,t.completedParams);r.length>0&&this.store.set({completedParams:i}),this.maybePromoteExactMatch(e),this.maybeOpenPendingSpan()}maybeOpenPendingSpan(){let e=this.store.get();if(e.pendingSpan||e.actionableSuggestions.length===0)return;let t=T(e.text,Math.min(e.filterBase,e.text.length),e.placeholderText),i=Ae(e.segments,t);e.text.slice(i).trim().length!==0&&this.store.set({pendingSpan:{anchor:i,snapshot:e.actionableSuggestions}})}maybeExitReEditOnNoMatch(){let e=this.store.get();if(!e.editingParam||e.editingAnchor==null||e.completedParams.some(o=>o.id===e.editingParam?.id))return;let t=e.caretOffset??e.editingAnchor,i=e.text.slice(e.editingAnchor,t);I(e.editingParam.options,i).some(o=>o.is_tappable)||(this.reEdit.exit(),this.fetchNow())}fetchNow(){let e=this.store.get(),{rawQuery:t,completedParams:i}=v(e.text,e.completedParams);this.fetchController.doFetch(t,i)}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,SKIPPED_PARAM_TEXT,buildAttributionUrl,buildQuery,buildSubmitResult,createStore,cursorIsAtEnd,extractPlainText,getCursorOffset,getFooterHint,plainTextLength,previousGraphemeBoundary,renderEditableContent,setCursorOffset,withSkippedParams});
1393
+ `;var de=class{constructor(){this.reported=new Set}run(e,t){try{return t()}catch(n){this.report(e,n,e);return}}runListener(e,t,n=e){try{return t(),!0}catch(r){return this.report(e,r,n),!1}}report(e,t,n){this.reported.has(n)||(this.reported.add(n),console.error(`[AIAutocomplete] "${e}" threw. The error is contained \u2014 SDK state is unaffected. Later failures of "${e}" on this instance are not logged.`,t))}};var ce=class{constructor(e){this.boundary=e;this.listeners={};this.keys=new WeakMap;this.registrationCount=0}on(e,t){let n=`${String(e)}#${++this.registrationCount}`,r=(...a)=>t(...a);this.keys.set(r,n);let o=this.listeners[e];return o||(o=new Set,this.listeners[e]=o),o.add(r),()=>{this.listeners[e]?.delete(r)}}emit(e,...t){let n=this.listeners[e];if(!n)return!0;let r=!0;for(let o of n)this.boundary.runListener(String(e),()=>o(...t),this.keys.get(o)??String(e))||(r=!1);return r}hasListeners(e){return(this.listeners[e]?.size??0)>0}clear(){this.listeners={}}};var pe=class{constructor(){this.timers=new Map}schedule(e,t,n){this.clear(e);let r=setTimeout(()=>{this.timers.delete(e),t()},n);this.timers.set(e,r)}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 R=class{constructor(e,t="auto",n){this.container=e;this.mode=t;this.onResolve=n;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 Kt(i){return(i??F).replace(/\/suggest(\?|#|$)/,"/telemetry/events$1")}async function Ut(i){return N(i)?`Bearer ${await B(i).getToken()}`:U(i)}async function tt(i){try{let e=Kt(i.apiConfig?.endpoint),t=K(i.apiConfig),n=await Ut(i.apiConfig);n&&(t.Authorization=n);let r=JSON.stringify({source:i.source,session_id:i.sessionId,type:i.type,at:new Date().toISOString(),query_data:i.queryData});await fetch(e,{method:"POST",headers:t,body:r})}catch{}}var $t="newParam",nt="suggestionRemoval",qt="selectionAnimation",Qt=650,Gt=0;function Wt(){return`:ac-${++Gt}:`}var it=500;function rt(){return{text:"",completedParams:[],identifiedParams:[],skippedParams:[],pendingSpan:null,suggestions:[],products:[],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 ue=class{constructor(e,t={}){this.inputStore=le(rt());this._listboxId=Wt();this.modeController=null;this.unsubscribers=[];this.domRefs=null;this.dropdownRefs=null;this.timers=new pe;this.boundary=new de;this.subscriberCount=0;this.emitter=new ce(this.boundary);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=Ze(this.inputStore,n=>$e(n,this.deriveOpts())),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.onProductSelect&&this.emitter.on("productSelect",t.onProductSelect),t.value!==void 0&&this.store.set({text:t.value}),t.completedParams!==void 0&&this.store.set({completedParams:t.completedParams}),this.pillsController=new Y(this.store,{onPillSelected:({rawQuery:n,selectedPill:r,otherPills:o})=>{this.fireTelemetry("pill",{raw_query:n,selected_pill:r,other_pills:o})}}),this.reEdit=new te({store:this.store,scheduleSetCursor:n=>this.scheduleSetCursor(n),fireTelemetry:(n,r)=>this.fireTelemetry(n,r),startSelectionAnimationTimer:()=>this.startSelectionAnimationTimer()}),this.productsController=new J(this.store,()=>this.opts.products),this.fetchController=new Q(this.store,()=>this.opts.apiConfig,()=>this.deriveOpts().optionOverrides,()=>this.opts.maskCompletedText,()=>this.emitter.hasListeners("error")?this.emitError:void 0,()=>this.sessionId,{onRequest:({query:n,signal:r,isCurrent:o})=>{this.productsController.run(n,r,o).catch(()=>{})},onAutoMatch:({active:n,matched:r,rawQuery:o})=>{this.fireTelemetry("option",{raw_query:o,selected_option:r.text,other_options:(n.options??[]).filter(a=>a.text!==r.text).map(a=>a.text)})}}),this.keyboardController=new z(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:n=>this.selectOption(n),removeParamAtCaret:n=>this.removeParamAtCaret(n),startEditingParamAtCaret:n=>this.startEditingParamAtCaret(n),exitEditMode:()=>this.exitEditMode(),fetchNow:()=>this.fetchNow()}),this.unsubscribers.push(this.store.subscribe((n,r)=>{n.text!==r.text&&this.emitter.emit("change",n.text),n.completedParams!==r.completedParams&&this.emitter.emit("paramsChange",n.completedParams),n.isFocused!==r.isFocused&&(n.isFocused?this.emitter.emit("focus"):this.emitter.emit("blur")),this.emitter.emit("stateChange",n)})),this.unsubscribers.push(this.store.subscribe(()=>this.maybeExitReEditOnNoMatch())),this.unsubscribers.push(this.store.subscribe((n,r)=>{if(n.text===r.text&&n.completedParams===r.completedParams||n.identifiedParams.length===0)return;let{valid:o,invalid:a}=q(n.text,n.completedParams,n.identifiedParams);a.length>0&&this.store.set({identifiedParams:o})})),this.unsubscribers.push(this.store.subscribe((n,r)=>{let o=n.pendingSpan;if(!o||n.text===r.text&&n.completedParams===r.completedParams&&n.identifiedParams===r.identifiedParams)return;let a=o.anchor;if(n.text!==r.text){let d=Re(r.text,n.text,a);if(d===null){this.store.set({pendingSpan:null});return}a=d}n.text.slice(a).trim().length===0||Le(n.segments,a)?this.store.set({pendingSpan:null}):a!==o.anchor&&this.store.set({pendingSpan:{anchor:a,snapshot:o.snapshot}})})),this.renderMode!=="headless"&&(et(),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({...rt(),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()}findChipSpanAt(e){let t=0;for(let n of this.store.get().segments){let r=t;if(t+=n.value.length,n.type!=="text"&&e>r&&e<=t)return{kind:n.type,param:n.param,start:r,end:t}}return null}withoutChip(e,t){return t.kind==="completed"?{completedParams:e.completedParams.filter(n=>n.id!==t.param.id)}:{identifiedParams:e.identifiedParams.filter(n=>n.id!==t.param.id)}}removeParamAtCaret(e){let t=this.findChipSpanAt(e);if(!t)return!1;let{text:n}=this.store.get(),{start:r,end:o}=t;if(e===o){let{text:d,removed:l}=ee(n,r,o);return this.store.set(c=>({text:d,filterBase:Math.min(c.filterBase>r?Math.max(r,c.filterBase-l):c.filterBase,d.length),...this.withoutChip(c,t),pillTapped:!1,activeDropdownIndex:-1})),this.scheduleSetCursor(r),!0}let a=X(n,e),s=n.slice(0,a)+n.slice(e);return this.store.set(d=>({text:s,filterBase:Math.min(d.filterBase,s.length),...this.withoutChip(d,t),pillTapped:!1,activeDropdownIndex:-1})),this.scheduleSetCursor(a),!0}startEditingParamAtCaret(e){let t=this.findChipSpanAt(e);return!t||t.kind!=="completed"||t.end!==e?!1:(this.reEdit.start(t.param.id),this.store.get().editingParam?.id===t.param.id)}scheduleSetCursor(e){queueMicrotask(()=>{let t=this.domRefs;if(t)t.input.focus(),C(t.input,e);else{let n=this.opts.setCursor;n&&this.boundary.runListener("setCursor",()=>n(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})}selectProduct(e){this.emitter.emit("productSelect",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){let t=`subscribe#${++this.subscriberCount}`;return this.store.subscribe(n=>{this.boundary.runListener("subscribe",()=>e(n),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){let t=this.opts.products;Object.assign(this.opts,e),"products"in e&&e.products!==t&&this.productsController.clearNow(),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 n=Je(t,e);if(n&&(this.fireTelemetry("option",{raw_query:v(t.text,t.completedParams).rawQuery,selected_option:n.telemetry.selectedOption,other_options:n.telemetry.otherOptions}),this.store.set(n.patch),this.startSelectionAnimationTimer(),this.timers.clear(nt),n.remainingActionable>0)){let r=n.consumedSuggestion;this.timers.schedule(nt,()=>{this.store.set(o=>({suggestions:o.suggestions.filter(a=>a!==r)}))},it)}}startSelectionAnimationTimer(){this.timers.schedule(qt,()=>this.store.set({inSelectionAnimation:!1}),it)}fireTelemetry(e,t){let n=this.opts.source??(this.renderMode==="full"?"full-sdk":"headless-sdk");tt({source:n,sessionId:this.sessionId,type:e,queryData:t,apiConfig:this.opts.apiConfig})}deriveOpts(){let e=this.opts.optionOverrides;if(!e)return this.opts;if(e!==this.rawOverrides){this.rawOverrides=e;let t={};for(let[n,r]of Object.entries(e))t[n]=o=>this.boundary.run(`optionOverrides.${n}`,()=>r(o));this.wrappedOverrides=t}return{...this.opts,optionOverrides:this.wrappedOverrides}}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 R(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:n=>this.selectOption(n),setActivePill:n=>this.pillsController.setActivePill(n),selectProduct:n=>this.selectProduct(n),handleKeyDown:n=>this.keyboardController.handleKeyDown(n),handleChange:n=>this.handleChange(n),startEditingParam:n=>this.startEditingParam(n),handleCaretAfterInput:n=>this.handleCaretAfterInput(n),handleCaretMove:n=>this.handleCaretMove(n),replaceEditingRange:n=>this.replaceEditingRange(n)};this.domRefs=Ye(this.container,t),this.subscribeBatchedRender(()=>{this.domRefs&&Ce(this.domRefs,this.store.get(),t)}),Ce(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),selectProduct:t=>this.selectProduct(t)};this.dropdownRefs=Ve(this.container,e),this.subscribeBatchedRender(()=>{this.dropdownRefs&&ve(this.dropdownRefs,this.store.get(),e)}),ve(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($t,()=>this.store.set({newParamId:null}),Qt)}))}handleChange(e){let t=this.store.get();this.store.set({text:e,pillTapped:!1,activeDropdownIndex:-1});let{valid:n,invalid:r}=He(e,t.completedParams);r.length>0&&this.store.set({completedParams:n}),this.maybePromoteExactMatch(e),this.maybeOpenPendingSpan()}maybeOpenPendingSpan(){let e=this.store.get();if(e.pendingSpan||e.actionableSuggestions.length===0)return;let t=T(e.text,Math.min(e.filterBase,e.text.length),e.placeholderText),n=De(e.segments,t);e.text.slice(n).trim().length!==0&&this.store.set({pendingSpan:{anchor:n,snapshot:e.actionableSuggestions}})}maybeExitReEditOnNoMatch(){let e=this.store.get();if(!e.editingParam||e.editingAnchor==null||e.completedParams.some(o=>o.id===e.editingParam?.id))return;let t=e.caretOffset??e.editingAnchor,n=e.text.slice(e.editingAnchor,t);I(e.editingParam.options,n).some(o=>o.is_tappable)||(this.reEdit.exit(),this.fetchNow())}fetchNow(){let e=this.store.get(),{rawQuery:t,completedParams:n}=v(e.text,e.completedParams);this.fetchController.doFetch(t,n)}maybePromoteExactMatch(e){let t=this.store.get(),n=Z({mode:"fresh",text:e,completedParams:t.completedParams,suggestions:t.suggestions,filterBase:t.filterBase,filterInProgress:t.filterInProgress});n&&this.store.set(n.patch)}};0&&(module.exports={AIAutocomplete,ATTRIBUTION_URL,ModeController,SKIPPED_PARAM_TEXT,buildAttributionUrl,buildQuery,buildSubmitResult,createStore,cursorIsAtEnd,extractPlainText,getCursorOffset,getFooterHint,plainTextLength,previousGraphemeBoundary,renderEditableContent,setCursorOffset,withSkippedParams});
1394
1394
  //# sourceMappingURL=index.js.map