dlx

<p>import { forwardRef, useEffect, useRef, useState } from &quot;react&quot;</p> <p>&nbsp;</p> <p>import type { ForwardRefReturn, PolymorphicProps, PolymorphicRef } from &#39;../system&#39;</p> <p>import StyledInputDropdown, { StyledButtonWrapper, StyledPanelWrapper, type StyledInputDropdownProps, StyledInputDropdownOption, StyledInputDropdownOptionWrapper, StyledInputDropdownOptionIcon } from &quot;./InputDropdown.styled&quot;</p> <p>import { AllowedElementType } from &quot;./types&quot;</p> <p>import { generateId, safeRestProps } from &quot;../utils&quot;;</p> <p>import { Disclosure } from &quot;../Disclosure&quot;;</p> <p>import { Icon } from &quot;../Icon&quot;;</p> <p>import { Label } from &quot;../Label&quot;;</p> <p>import { InputField } from &quot;../InputField&quot;</p> <p>import { HelperText } from &quot;../HelperText&quot;;</p> <p>&nbsp;</p> <p>export type listBoxRoles = &quot;listbox&quot; | &quot;grid&quot; | &quot;tree&quot; | &quot;dialog&quot;</p> <p>&nbsp;</p> <p>export type InputDropdownProps&lt;T extends React.ElementType&gt; =</p> <p>PolymorphicProps&lt;T,</p> <p>StyledInputDropdownProps &amp; {</p> <p>&nbsp; &nbsp; htmlFor?: string;</p> <p>&nbsp; &nbsp; ref?: PolymorphicRef&lt;T&gt;;</p> <p>&nbsp; &nbsp; placeholder?: string;</p> <p>&nbsp; &nbsp; label?: string;</p> <p>&nbsp; &nbsp; value?: string | number;</p> <p>&nbsp; &nbsp; options: string[];</p> <p>&nbsp; &nbsp; hideLabel?: boolean;</p> <p>&nbsp; &nbsp; hideHelperText?: boolean;</p> <p>&nbsp; &nbsp; titleText?: string;</p> <p>&nbsp; &nbsp; roleCombobox?: string;</p> <p>&nbsp; &nbsp; roleListbox?: listBoxRoles;</p> <p>&nbsp; &nbsp; onChange?: any;</p> <p>&nbsp; &nbsp; onFocus?: () =&gt; void;</p> <p>&nbsp; &nbsp; onBlur?: () =&gt; void;</p> <p>&nbsp; &nbsp; disabled?: boolean;</p> <p>&nbsp; &nbsp; isOpen?: boolean;</p> <p>&nbsp; &nbsp; dropdownId?: string | number;</p> <p>&nbsp; &nbsp; isDropdownPanelOpen?: any;</p> <p>&nbsp; }&amp; Omit&lt;StyledInputDropdownProps, &quot;theme&quot;&gt; &amp;</p> <p>&nbsp; Omit&lt;React.ComponentPropsWithRef&lt;T&gt;, &quot;className&quot;&gt;&gt;;</p> <p>&nbsp;</p> <p>/**</p> <p>&nbsp;* Expected return type of InputDropdown</p> <p>&nbsp;* it includes the constructor and forward-ref</p> <p>&nbsp;* this ensure type-saftey being passed along</p> <p>&nbsp;*/</p> <p>export type InputDropdownComponent&lt;</p> <p>&nbsp; E extends React.ElementType = AllowedElementType</p> <p>&gt; = {</p> <p>&nbsp; &lt;T extends React.ElementType = E&gt;(</p> <p>&nbsp; &nbsp; props: InputDropdownProps&lt;T&gt;</p> <p>&nbsp; ): React.ReactNode;</p> <p>} &amp; ForwardRefReturn&lt;E, InputDropdownProps&lt;E&gt;&gt;;</p> <p>&nbsp;</p> <p>const InputDropdown = forwardRef(</p> <p>&nbsp; &nbsp; &lt;T extends React.ElementType = AllowedElementType&gt;(</p> <p>&nbsp; &nbsp; &nbsp; props: InputDropdownProps&lt;T&gt;,</p> <p>&nbsp; &nbsp; &nbsp; ref: PolymorphicRef&lt;T&gt;</p> <p>&nbsp; &nbsp; ) =&gt; {</p> <p>&nbsp; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; const {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; styledComponent: StyledComponent = StyledInputDropdown,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; label,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; helperText,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; variant,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; placeholder,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; value,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; options,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; hideLabel = false,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; hideHelperText,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; titleText,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; roleCombobox,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; roleListbox,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; onChange,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; onBlur,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; onFocus,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; disabled,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; isOpen = false,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; htmlFor,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; dropdownId,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; isDropdownPanelOpen = () =&gt; {},</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; onOptionClick,</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; ...rest</p> <p>&nbsp; &nbsp; &nbsp; } = safeRestProps(props);</p> <p><br /> &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; const[isPanelOpen, setIsPanelOpen] = useState(isOpen);</p> <p>&nbsp; &nbsp; &nbsp; const [mount, setMount] = useState(false);</p> <p>&nbsp; &nbsp; &nbsp; const[selectedValue, setSelectedValue] = useState&lt;any&gt;(value);</p> <p>&nbsp; &nbsp; &nbsp; const [ID] = useState(dropdownId ? dropdownId : generateId(&#39;input-dropdown&#39;))</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //ref&#39;s declared</p> <p>&nbsp; &nbsp; &nbsp; const dropdownEl = useRef&lt;any&gt;(null); &nbsp; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; const optionWrapperRef = useRef&lt;any&gt;(null); &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; const comboBoxRef = useRef&lt;any&gt;(null);</p> <p>&nbsp; &nbsp; &nbsp; const optionRef = useRef&lt;any[]&gt;([]);</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; const comboBoxFocus = () =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxRef.current?.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }, 100);</p> <p>&nbsp; &nbsp; &nbsp; }</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //default isOpen update</p> <p>&nbsp; &nbsp; &nbsp; useEffect(() =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; if(isOpen === true){</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(true)</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }else{</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(false)</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; }, [isOpen]) &nbsp; &nbsp; &nbsp;</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //combobox keyboard accessible options</p> <p>&nbsp; &nbsp; &nbsp; const handleKeyDown = (event: any) =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; switch (event.code) {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;ArrowDown&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(true);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;Space&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxRef.current.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;NumpadEnter&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxRef.current.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;Enter&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxRef.current.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;Alt + ArrowDown&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(true);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;ArrowUp&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(false);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;Escape&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(isPanelOpen === true){</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(false);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;Home&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(true);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (optionRef.current[0].parentElement as HTMLDivElement)?.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 100);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &#39;End&#39;:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(true);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (optionRef.current[options?.length - 1].parentElement as HTMLDivElement)?.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 100);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; default:</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; }; &nbsp;</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //Outside click handler</p> <p>&nbsp; &nbsp; &nbsp; const handleClickOutside = (event: MouseEvent) =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; if (</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dropdownEl.current &amp;&amp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !dropdownEl.current.contains(event.target as Node)</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; ) {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(false);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; };</p> <p>&nbsp; &nbsp; &nbsp; useEffect(() =&gt; { &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; document.addEventListener(&#39;mousedown&#39;, handleClickOutside);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; return () =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; document.removeEventListener(&#39;mousedown&#39;, handleClickOutside);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; };</p> <p>&nbsp; &nbsp; &nbsp; }, []);</p> <p>&nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //handle toggle behaviour of the panel</p> <p>&nbsp; &nbsp; &nbsp; const handlePanelToggle = (newVal: boolean) =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(newVal);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; isDropdownPanelOpen(newVal);</p> <p>&nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; const onValueChange = (e:any) =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; onChange &amp;&amp; onChange(e)</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; setSelectedValue(e);</p> <p>&nbsp; &nbsp; &nbsp; }</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; useEffect(() =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(mount)</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onValueChange(selectedValue);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // setSelectedValue(selectedValue);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // onChange &amp;&amp; onChange(selectedValue) &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; }, [selectedValue])</p> <p>&nbsp; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; useEffect(() =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; setMount(true); &nbsp; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; }, [])</p> <p>&nbsp; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //combobox wrapper logic</p> <p>&nbsp; &nbsp; &nbsp; const ButtonWrapper = () =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; return (</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;StyledButtonWrapper onKeyDown={handleKeyDown} ref={comboBoxRef} aria-labelledby={label ? label : &quot;dropdown-component&quot;} aria-controls={dropdownId} aria-expanded={isPanelOpen} role={roleCombobox ? roleCombobox : &quot;combobox&quot;} tabIndex={0} aria-haspopup={roleListbox ? roleListbox : &quot;listbox&quot;} aria-label={label ? label : &quot;Input Dropdown Component&quot;} id={htmlFor ? htmlFor : &quot;input-dropdown-component&quot;} variant={variant} {...rest}&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;InputField onChange={onValueChange} id={ID} icon={true} iconName={isPanelOpen ? &quot;ChevronUp&quot; : &quot;ChevronDown&quot;} disabled={disabled} title={titleText ? titleText : selectedValue} placeholder={placeholder} variant={variant ? variant : &quot;neutral&quot;} value={selectedValue} readOnly={true}/&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/StyledButtonWrapper&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; )</p> <p>&nbsp; &nbsp; &nbsp; }</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //listbox wrapper</p> <p>&nbsp; &nbsp; &nbsp; const PanelWrapper = () =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; return (</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;StyledPanelWrapper role={roleListbox ? roleListbox : &quot;listbox&quot;} onKeyDown={onOptionsKeyDown} ref={optionWrapperRef}&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {options?.map((option: string, index: any) =&gt; (</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;StyledInputDropdownOptionWrapper tabIndex={0} key={index}&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {option === selectedValue ?</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;StyledInputDropdownOptionIcon&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&lt;Icon iconName=&quot;Check&quot;/&gt;}</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/StyledInputDropdownOptionIcon&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;}</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;StyledInputDropdownOption ref={(el:any) =&gt; (optionRef.current[index] = el)} id={index} key={option} onClick={onOptionClicked(option)} role=&quot;option&quot; data-option={option} aria-selected={selectedValue?.length &gt; 0 ? &quot;true&quot; : &quot;false&quot;}&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {option}</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/StyledInputDropdownOption&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/StyledInputDropdownOptionWrapper&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ))}</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/StyledPanelWrapper&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; )</p> <p>&nbsp; &nbsp; &nbsp; }</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; const onOptionClicked = (value:any) =&gt; () =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; setSelectedValue(value);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(false); &nbsp; &nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; };</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; //options wrapper keyboard navigation</p> <p>&nbsp; &nbsp; &nbsp; const onOptionsKeyDown = (event: any) =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; if(event.key === &quot;Escape&quot;){</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(false);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; if(event.key === &quot;Enter&quot; || event.key === &quot;NumpadEnter&quot; || event.code === &quot;Space&quot;){</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const focusedOption = document.activeElement;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const val = focusedOption?.childNodes[0].textContent;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setSelectedValue(val); &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(() =&gt; {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setIsPanelOpen(false);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, 100);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBoxFocus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; if(event.key === &quot;Home&quot;){</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (optionRef.current[0].parentElement as HTMLDivElement)?.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; if(event.key === &quot;End&quot;){</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (optionRef.current[optionRef.current.length - 1].parentElement as HTMLDivElement)?.focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; if(event.code === &quot;ArrowDown&quot; || event.code === &quot;ArrowUp&quot;){</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.preventDefault();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // debugger</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Determine our current position</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let currentIndex = optionRef?.current.indexOf(event.target);</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Do nothing if somehow we couldn&#39;t find this element.</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // This shouldn&#39;t be possible so warn us devs</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (currentIndex === -1) {</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.warn(&quot;Unexpected Arrow key on Options menu&quot;, event);</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Up means we&#39;re going down one index</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentIndex += event.code === &quot;ArrowUp&quot; ? -1 : 1;</p> <p>&nbsp;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Focus the new element</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (optionRef?.current[currentIndex]?.parentElement as HTMLDivElement).focus();</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp; &nbsp; }</p> <p>&nbsp; &nbsp;</p> <p>&nbsp; &nbsp; &nbsp; return (</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;StyledInputDropdown aria-controls={dropdownId} aria-expanded={isPanelOpen} ref={ref} disabled={disabled} onFocus={onFocus} onBlur={onBlur} {...rest}&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Label label={label ? label : &quot;&quot;} htmlFor={htmlFor ? htmlFor : ID} disabled={disabled} hidden={hideLabel} onClick={comboBoxFocus}/&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Disclosure ref={dropdownEl} open={isPanelOpen} buttonContent={&lt;ButtonWrapper /&gt;} panelContent={&lt;PanelWrapper /&gt;} disabled={disabled} isClickedValueChange={handlePanelToggle} variant={variant} {...rest}/&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;HelperText content={hideHelperText ? &quot;&quot; : helperText} disabled={disabled} variant={variant} /&gt;</p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/StyledInputDropdown&gt;</p> <p>&nbsp; &nbsp; &nbsp; );</p> <p>&nbsp; &nbsp; }</p> <p>&nbsp; );</p> <p>&nbsp;</p> <p>export default InputDropdown as InputDropdownComponent</p> <p>&nbsp;</p>