{"version":3,"sources":["../src/components/Combobox/useCombobox.ts"],"sourcesContent":["'use client';\n\nimport type * as React from 'react';\nimport { mergeCallbacks, useEventCallback, useMergedRefs, slot } from '@fluentui/react-utilities';\nimport type { ComboboxProps, ComboboxState } from './Combobox.types';\nimport { useInputTriggerSlot } from '@fluentui/react-combobox';\nimport { Listbox } from '../Dropdown/Listbox';\nimport { toDataAttributeValue } from '../../utils';\nimport { useListboxPopupState } from '../Dropdown/useListboxPopupState';\n\nexport const useCombobox = (props: ComboboxProps, ref: React.Ref<HTMLInputElement>): ComboboxState => {\n  const { freeform } = props;\n\n  const {\n    props: mergedProps,\n    triggerRef,\n    activeParentRef,\n    activeDescendantController,\n    triggerNativeProps,\n    internalState,\n    listbox,\n    rootSlot,\n  } = useListboxPopupState<ComboboxProps, HTMLInputElement>(props, {\n    primarySlotTagName: 'input',\n    fieldControlOptions: { supportsLabelFor: true, supportsRequired: true },\n    // For multiselect, editable should be false to display comma-separated values in the trigger\n    // For single-select, editable is true to allow filtering\n    baseStateExtras: p => ({ editable: !p.multiselect }),\n  });\n\n  const { appearance: _appearance, size: _size, ...baseState } = internalState;\n  const { clearable, clearSelection, disabled, hasFocus, multiselect, open, selectedOptions } = baseState;\n\n  const triggerSlot = useInputTriggerSlot(mergedProps.input ?? {}, useMergedRefs(triggerRef, activeParentRef, ref), {\n    state: internalState,\n    freeform,\n    defaultProps: {\n      type: 'text',\n      value: baseState.value ?? '',\n      'aria-controls': open ? listbox?.id : undefined,\n      ...triggerNativeProps,\n    },\n    activeDescendantController,\n  });\n\n  const showClearIcon = selectedOptions.length > 0 && !disabled && clearable && !multiselect;\n  const placeholderVisible = !baseState.value && !!mergedProps.placeholder;\n\n  const state: ComboboxState = {\n    ...baseState,\n    components: { root: 'div', input: 'input', expandIcon: 'span', clearIcon: 'span', listbox: Listbox },\n    root: {\n      ...rootSlot,\n      'data-open': toDataAttributeValue(open),\n      'data-disabled': toDataAttributeValue(triggerSlot.disabled),\n      'data-placeholder': toDataAttributeValue(placeholderVisible),\n      'data-invalid': toDataAttributeValue(triggerSlot['aria-invalid']),\n      'data-clearable': toDataAttributeValue(showClearIcon),\n    },\n    input: triggerSlot,\n    listbox: open || hasFocus ? listbox : undefined,\n    clearIcon: slot.optional(mergedProps.clearIcon, {\n      defaultProps: { 'aria-hidden': 'true' },\n      elementType: 'span',\n      renderByDefault: true,\n    }),\n    expandIcon: slot.optional(mergedProps.expandIcon, {\n      renderByDefault: true,\n      elementType: 'span',\n    }),\n    showClearIcon,\n    activeDescendantController,\n  };\n\n  const onClearIconMouseDown = useEventCallback(\n    mergeCallbacks(state.clearIcon?.onMouseDown, (ev: React.MouseEvent<HTMLSpanElement>) => {\n      ev.preventDefault();\n    }),\n  );\n  const onClearIconClick = useEventCallback(\n    // eslint-disable-next-line react-hooks/refs\n    mergeCallbacks(state.clearIcon?.onClick, (ev: React.MouseEvent<HTMLSpanElement>) => {\n      clearSelection(ev);\n      triggerRef.current?.focus();\n    }),\n  );\n\n  if (state.clearIcon) {\n    state.clearIcon.onMouseDown = onClearIconMouseDown;\n    state.clearIcon.onClick = onClearIconClick;\n  }\n\n  // Heads up! We don't support \"clearable\" in multiselect mode, so we should never display a slot\n  if (multiselect) {\n    state.clearIcon = undefined;\n  }\n\n  return state;\n};\n"],"names":["useCombobox","props","ref","freeform","mergedProps","triggerRef","activeParentRef","activeDescendantController","triggerNativeProps","internalState","listbox","rootSlot","useListboxPopupState","primarySlotTagName","fieldControlOptions","supportsLabelFor","supportsRequired","baseStateExtras","p","editable","multiselect","appearance","_appearance","size","_size","baseState","clearable","clearSelection","disabled","hasFocus","open","selectedOptions","triggerSlot","useInputTriggerSlot","input","useMergedRefs","state","defaultProps","type","value","id","undefined","showClearIcon","length","placeholderVisible","placeholder","components","root","expandIcon","clearIcon","Listbox","toDataAttributeValue","slot","optional","elementType","renderByDefault","onClearIconMouseDown","useEventCallback","mergeCallbacks","onMouseDown","ev","preventDefault","onClearIconClick","onClick","current","focus"],"mappings":"AAAA;;;;;+BAUaA;;;eAAAA;;;gCAPyD;+BAElC;yBACZ;uBACa;sCACA;AAE9B,MAAMA,cAAc,CAACC,OAAsBC;IAChD,MAAM,EAAEC,QAAQ,EAAE,GAAGF;IAErB,MAAM,EACJA,OAAOG,WAAW,EAClBC,UAAU,EACVC,eAAe,EACfC,0BAA0B,EAC1BC,kBAAkB,EAClBC,aAAa,EACbC,OAAO,EACPC,QAAQ,EACT,GAAGC,IAAAA,0CAAoB,EAAkCX,OAAO;QAC/DY,oBAAoB;QACpBC,qBAAqB;YAAEC,kBAAkB;YAAMC,kBAAkB;QAAK;QACtE,6FAA6F;QAC7F,yDAAyD;QACzDC,iBAAiBC,CAAAA,IAAM,CAAA;gBAAEC,UAAU,CAACD,EAAEE,WAAW;YAAC,CAAA;IACpD;IAEA,MAAM,EAAEC,YAAYC,WAAW,EAAEC,MAAMC,KAAK,EAAE,GAAGC,WAAW,GAAGhB;IAC/D,MAAM,EAAEiB,SAAS,EAAEC,cAAc,EAAEC,QAAQ,EAAEC,QAAQ,EAAET,WAAW,EAAEU,IAAI,EAAEC,eAAe,EAAE,GAAGN;IAE9F,MAAMO,cAAcC,IAAAA,kCAAmB,EAAC7B,YAAY8B,KAAK,IAAI,CAAC,GAAGC,IAAAA,6BAAa,EAAC9B,YAAYC,iBAAiBJ,MAAM;QAChHkC,OAAO3B;QACPN;QACAkC,cAAc;YACZC,MAAM;YACNC,OAAOd,UAAUc,KAAK,IAAI;YAC1B,iBAAiBT,OAAOpB,SAAS8B,KAAKC;YACtC,GAAGjC,kBAAkB;QACvB;QACAD;IACF;IAEA,MAAMmC,gBAAgBX,gBAAgBY,MAAM,GAAG,KAAK,CAACf,YAAYF,aAAa,CAACN;IAC/E,MAAMwB,qBAAqB,CAACnB,UAAUc,KAAK,IAAI,CAAC,CAACnC,YAAYyC,WAAW;IAExE,MAAMT,QAAuB;QAC3B,GAAGX,SAAS;QACZqB,YAAY;YAAEC,MAAM;YAAOb,OAAO;YAASc,YAAY;YAAQC,WAAW;YAAQvC,SAASwC,gBAAO;QAAC;QACnGH,MAAM;YACJ,GAAGpC,QAAQ;YACX,aAAawC,IAAAA,2BAAoB,EAACrB;YAClC,iBAAiBqB,IAAAA,2BAAoB,EAACnB,YAAYJ,QAAQ;YAC1D,oBAAoBuB,IAAAA,2BAAoB,EAACP;YACzC,gBAAgBO,IAAAA,2BAAoB,EAACnB,WAAW,CAAC,eAAe;YAChE,kBAAkBmB,IAAAA,2BAAoB,EAACT;QACzC;QACAR,OAAOF;QACPtB,SAASoB,QAAQD,WAAWnB,UAAU+B;QACtCQ,WAAWG,oBAAI,CAACC,QAAQ,CAACjD,YAAY6C,SAAS,EAAE;YAC9CZ,cAAc;gBAAE,eAAe;YAAO;YACtCiB,aAAa;YACbC,iBAAiB;QACnB;QACAP,YAAYI,oBAAI,CAACC,QAAQ,CAACjD,YAAY4C,UAAU,EAAE;YAChDO,iBAAiB;YACjBD,aAAa;QACf;QACAZ;QACAnC;IACF;IAEA,MAAMiD,uBAAuBC,IAAAA,gCAAgB,EAC3CC,IAAAA,8BAAc,EAACtB,MAAMa,SAAS,EAAEU,aAAa,CAACC;QAC5CA,GAAGC,cAAc;IACnB;IAEF,MAAMC,mBAAmBL,IAAAA,gCAAgB,EACvC,4CAA4C;IAC5CC,IAAAA,8BAAc,EAACtB,MAAMa,SAAS,EAAEc,SAAS,CAACH;QACxCjC,eAAeiC;QACfvD,WAAW2D,OAAO,EAAEC;IACtB;IAGF,IAAI7B,MAAMa,SAAS,EAAE;QACnBb,MAAMa,SAAS,CAACU,WAAW,GAAGH;QAC9BpB,MAAMa,SAAS,CAACc,OAAO,GAAGD;IAC5B;IAEA,gGAAgG;IAChG,IAAI1C,aAAa;QACfgB,MAAMa,SAAS,GAAGR;IACpB;IAEA,OAAOL;AACT"}