Files
infocom-systems-design/node_modules/@headlessui/react/dist/components/combobox/combobox-machine.js
2025-10-03 22:27:28 +03:00

2 lines
8.5 KiB
JavaScript

var I=Object.defineProperty;var h=(t,i,e)=>i in t?I(t,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[i]=e;var f=(t,i,e)=>(h(t,typeof i!="symbol"?i+"":i,e),e);import{Machine as A}from'../../machine.js';import{ActionTypes as E,stackMachines as R}from'../../machines/stack-machine.js';import{Focus as T,calculateActiveIndex as g}from'../../utils/calculate-active-index.js';import{ElementPositionState as d,computeVisualPosition as M,detectMovement as C}from'../../utils/element-movement.js';import{sortByDomNode as F}from'../../utils/focus-management.js';import{match as O}from'../../utils/match.js';var P=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(P||{}),k=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(k||{}),_=(n=>(n[n.Pointer=0]="Pointer",n[n.Focus=1]="Focus",n[n.Other=2]="Other",n))(_||{}),D=(l=>(l[l.OpenCombobox=0]="OpenCombobox",l[l.CloseCombobox=1]="CloseCombobox",l[l.GoToOption=2]="GoToOption",l[l.SetTyping=3]="SetTyping",l[l.RegisterOption=4]="RegisterOption",l[l.UnregisterOption=5]="UnregisterOption",l[l.DefaultToFirstOption=6]="DefaultToFirstOption",l[l.SetActivationTrigger=7]="SetActivationTrigger",l[l.UpdateVirtualConfiguration=8]="UpdateVirtualConfiguration",l[l.SetInputElement=9]="SetInputElement",l[l.SetButtonElement=10]="SetButtonElement",l[l.SetOptionsElement=11]="SetOptionsElement",l[l.MarkInputAsMoved=12]="MarkInputAsMoved",l))(D||{});function v(t,i=e=>e){let e=t.activeOptionIndex!==null?t.options[t.activeOptionIndex]:null,n=i(t.options.slice()),o=n.length>0&&n[0].dataRef.current.order!==null?n.sort((u,a)=>u.dataRef.current.order-a.dataRef.current.order):F(n,u=>u.dataRef.current.domRef.current),r=e?o.indexOf(e):null;return r===-1&&(r=null),{options:o,activeOptionIndex:r}}let j={[1](t){var e;if((e=t.dataRef.current)!=null&&e.disabled||t.comboboxState===1)return t;let i=t.inputElement?d.Tracked(M(t.inputElement)):t.inputPositionState;return{...t,activeOptionIndex:null,comboboxState:1,isTyping:!1,activationTrigger:2,inputPositionState:i,__demoMode:!1}},[0](t){var i,e;if((i=t.dataRef.current)!=null&&i.disabled||t.comboboxState===0)return t;if((e=t.dataRef.current)!=null&&e.value){let n=t.dataRef.current.calculateIndex(t.dataRef.current.value);if(n!==-1)return{...t,activeOptionIndex:n,comboboxState:0,__demoMode:!1,inputPositionState:d.Idle}}return{...t,comboboxState:0,inputPositionState:d.Idle,__demoMode:!1}},[3](t,i){return t.isTyping===i.isTyping?t:{...t,isTyping:i.isTyping}},[2](t,i){var r,u,a,s;if((r=t.dataRef.current)!=null&&r.disabled||t.optionsElement&&!((u=t.dataRef.current)!=null&&u.optionsPropsRef.current.static)&&t.comboboxState===1)return t;if(t.virtual){let{options:p,disabled:c}=t.virtual,m=i.focus===T.Specific?i.idx:g(i,{resolveItems:()=>p,resolveActiveIndex:()=>{var l,x;return(x=(l=t.activeOptionIndex)!=null?l:p.findIndex(S=>!c(S)))!=null?x:null},resolveDisabled:c,resolveId(){throw new Error("Function not implemented.")}}),b=(a=i.trigger)!=null?a:2;return t.activeOptionIndex===m&&t.activationTrigger===b?t:{...t,activeOptionIndex:m,activationTrigger:b,isTyping:!1,__demoMode:!1}}let e=v(t);if(e.activeOptionIndex===null){let p=e.options.findIndex(c=>!c.dataRef.current.disabled);p!==-1&&(e.activeOptionIndex=p)}let n=i.focus===T.Specific?i.idx:g(i,{resolveItems:()=>e.options,resolveActiveIndex:()=>e.activeOptionIndex,resolveId:p=>p.id,resolveDisabled:p=>p.dataRef.current.disabled}),o=(s=i.trigger)!=null?s:2;return t.activeOptionIndex===n&&t.activationTrigger===o?t:{...t,...e,isTyping:!1,activeOptionIndex:n,activationTrigger:o,__demoMode:!1}},[4]:(t,i)=>{var r,u,a,s;if((r=t.dataRef.current)!=null&&r.virtual)return{...t,options:[...t.options,i.payload]};let e=i.payload,n=v(t,p=>(p.push(e),p));t.activeOptionIndex===null&&(a=(u=t.dataRef.current).isSelected)!=null&&a.call(u,i.payload.dataRef.current.value)&&(n.activeOptionIndex=n.options.indexOf(e));let o={...t,...n,activationTrigger:2};return(s=t.dataRef.current)!=null&&s.__demoMode&&t.dataRef.current.value===void 0&&(o.activeOptionIndex=0),o},[5]:(t,i)=>{var n;if((n=t.dataRef.current)!=null&&n.virtual)return{...t,options:t.options.filter(o=>o.id!==i.id)};let e=v(t,o=>{let r=o.findIndex(u=>u.id===i.id);return r!==-1&&o.splice(r,1),o});return{...t,...e,activationTrigger:2}},[6]:(t,i)=>t.defaultToFirstOption===i.value?t:{...t,defaultToFirstOption:i.value},[7]:(t,i)=>t.activationTrigger===i.trigger?t:{...t,activationTrigger:i.trigger},[8]:(t,i)=>{var n,o;if(t.virtual===null)return{...t,virtual:{options:i.options,disabled:(n=i.disabled)!=null?n:()=>!1}};if(t.virtual.options===i.options&&t.virtual.disabled===i.disabled)return t;let e=t.activeOptionIndex;if(t.activeOptionIndex!==null){let r=i.options.indexOf(t.virtual.options[t.activeOptionIndex]);r!==-1?e=r:e=null}return{...t,activeOptionIndex:e,virtual:{options:i.options,disabled:(o=i.disabled)!=null?o:()=>!1}}},[9]:(t,i)=>t.inputElement===i.element?t:{...t,inputElement:i.element},[10]:(t,i)=>t.buttonElement===i.element?t:{...t,buttonElement:i.element},[11]:(t,i)=>t.optionsElement===i.element?t:{...t,optionsElement:i.element},[12](t){return t.inputPositionState.kind!=="Tracked"?t:{...t,inputPositionState:d.Moved}}};class y extends A{constructor(e){super(e);f(this,"actions",{onChange:e=>{let{onChange:n,compare:o,mode:r,value:u}=this.state.dataRef.current;return O(r,{[0]:()=>n==null?void 0:n(e),[1]:()=>{let a=u.slice(),s=a.findIndex(p=>o(p,e));return s===-1?a.push(e):a.splice(s,1),n==null?void 0:n(a)}})},registerOption:(e,n)=>(this.send({type:4,payload:{id:e,dataRef:n}}),()=>{this.state.activeOptionIndex===this.state.dataRef.current.calculateIndex(n.current.value)&&this.send({type:6,value:!0}),this.send({type:5,id:e})}),goToOption:(e,n)=>(this.send({type:6,value:!1}),this.send({type:2,...e,trigger:n})),setIsTyping:e=>{this.send({type:3,isTyping:e})},closeCombobox:()=>{var e,n;this.send({type:1}),this.send({type:6,value:!1}),(n=(e=this.state.dataRef.current).onClose)==null||n.call(e)},openCombobox:()=>{this.send({type:0}),this.send({type:6,value:!0})},setActivationTrigger:e=>{this.send({type:7,trigger:e})},selectActiveOption:()=>{let e=this.selectors.activeOptionIndex(this.state);if(e!==null){if(this.actions.setIsTyping(!1),this.state.virtual)this.actions.onChange(this.state.virtual.options[e]);else{let{dataRef:n}=this.state.options[e];this.actions.onChange(n.current.value)}this.actions.goToOption({focus:T.Specific,idx:e})}},setInputElement:e=>{this.send({type:9,element:e})},setButtonElement:e=>{this.send({type:10,element:e})},setOptionsElement:e=>{this.send({type:11,element:e})}});f(this,"selectors",{activeDescendantId:e=>{var o,r;let n=this.selectors.activeOptionIndex(e);if(n!==null)return e.virtual?(r=e.options.find(u=>!u.dataRef.current.disabled&&e.dataRef.current.compare(u.dataRef.current.value,e.virtual.options[n])))==null?void 0:r.id:(o=e.options[n])==null?void 0:o.id},activeOptionIndex:e=>{if(e.defaultToFirstOption&&e.activeOptionIndex===null&&(e.virtual?e.virtual.options.length>0:e.options.length>0)){if(e.virtual){let{options:o,disabled:r}=e.virtual,u=o.findIndex(a=>{var s;return!((s=r==null?void 0:r(a))!=null&&s)});if(u!==-1)return u}let n=e.options.findIndex(o=>!o.dataRef.current.disabled);if(n!==-1)return n}return e.activeOptionIndex},activeOption:e=>{var o,r;let n=this.selectors.activeOptionIndex(e);return n===null?null:e.virtual?e.virtual.options[n!=null?n:0]:(r=(o=e.options[n])==null?void 0:o.dataRef.current.value)!=null?r:null},isActive:(e,n,o)=>{var u;let r=this.selectors.activeOptionIndex(e);return r===null?!1:e.virtual?r===e.dataRef.current.calculateIndex(n):((u=e.options[r])==null?void 0:u.id)===o},shouldScrollIntoView:(e,n,o)=>!(e.virtual||e.__demoMode||e.comboboxState!==0||e.activationTrigger===0||!this.selectors.isActive(e,n,o)),didInputMove(e){return e.inputPositionState.kind==="Moved"}});{let n=this.state.id,o=R.get(null);this.disposables.add(o.on(E.Push,r=>{!o.selectors.isTop(r,n)&&this.state.comboboxState===0&&this.actions.closeCombobox()})),this.on(0,()=>o.actions.push(n)),this.on(1,()=>o.actions.pop(n))}this.disposables.group(n=>{this.on(1,o=>{o.inputElement&&(n.dispose(),n.add(C(o.inputElement,o.inputPositionState,()=>{this.send({type:12})})))})})}static new({id:e,virtual:n=null,__demoMode:o=!1}){var r;return new y({id:e,dataRef:{current:{}},comboboxState:o?0:1,isTyping:!1,options:[],virtual:n?{options:n.options,disabled:(r=n.disabled)!=null?r:()=>!1}:null,activeOptionIndex:null,activationTrigger:2,inputElement:null,buttonElement:null,optionsElement:null,__demoMode:o,inputPositionState:d.Idle})}reduce(e,n){return O(n.type,j,e,n)}}export{D as ActionTypes,_ as ActivationTrigger,y as ComboboxMachine,P as ComboboxState,k as ValueMode};