@@ -27,6 +27,11 @@ export default function SearchableModelSelect({ value, onChange, capability, pla
2727 m . id . toLowerCase ( ) . includes ( query . toLowerCase ( ) )
2828 )
2929
30+ // Which item Enter will select — matches SearchableSelect behavior
31+ const enterTargetIndex = focusIndex >= 0 ? focusIndex
32+ : filtered . length > 0 ? 0
33+ : - 1
34+
3035 const commit = useCallback ( ( val ) => {
3136 setQuery ( val )
3237 onChange ( val )
@@ -39,6 +44,11 @@ export default function SearchableModelSelect({ value, onChange, capability, pla
3944 setOpen ( true )
4045 return
4146 }
47+ if ( ! open && e . key === 'Enter' ) {
48+ e . preventDefault ( )
49+ commit ( query )
50+ return
51+ }
4252 if ( ! open ) return
4353
4454 if ( e . key === 'ArrowDown' ) {
@@ -49,8 +59,8 @@ export default function SearchableModelSelect({ value, onChange, capability, pla
4959 setFocusIndex ( i => Math . max ( i - 1 , 0 ) )
5060 } else if ( e . key === 'Enter' ) {
5161 e . preventDefault ( )
52- if ( focusIndex >= 0 && focusIndex < filtered . length ) {
53- commit ( filtered [ focusIndex ] . id )
62+ if ( enterTargetIndex >= 0 ) {
63+ commit ( filtered [ enterTargetIndex ] . id )
5464 } else {
5565 commit ( query )
5666 }
@@ -97,9 +107,9 @@ export default function SearchableModelSelect({ value, onChange, capability, pla
97107 padding: 6px 10px;
98108 font-size: 0.8125rem;
99109 cursor: pointer;
100- white-space: nowrap ;
101- overflow: hidden ;
102- text-overflow: ellipsis ;
110+ display: flex ;
111+ align-items: center ;
112+ gap: 6px ;
103113 }
104114 .sms-item:hover, .sms-item.sms-focused {
105115 background: var(--color-bg-tertiary);
@@ -137,21 +147,27 @@ export default function SearchableModelSelect({ value, onChange, capability, pla
137147 { query ? 'No matching models — value will be used as-is' : 'No models available' }
138148 </ div >
139149 ) : (
140- filtered . map ( ( m , i ) => (
141- < div
142- key = { m . id }
143- role = "option"
144- aria-selected = { m . id === value }
145- className = { `sms-item${ i === focusIndex ? ' sms-focused' : '' } ${ m . id === value ? ' sms-active' : '' } ` }
146- onMouseEnter = { ( ) => setFocusIndex ( i ) }
147- onMouseDown = { ( e ) => {
148- e . preventDefault ( )
149- commit ( m . id )
150- } }
151- >
152- { m . id }
153- </ div >
154- ) )
150+ filtered . map ( ( m , i ) => {
151+ const isEnterTarget = i === enterTargetIndex
152+ return (
153+ < div
154+ key = { m . id }
155+ role = "option"
156+ aria-selected = { m . id === value }
157+ className = { `sms-item${ i === focusIndex || isEnterTarget ? ' sms-focused' : '' } ${ m . id === value ? ' sms-active' : '' } ` }
158+ onMouseEnter = { ( ) => setFocusIndex ( i ) }
159+ onMouseDown = { ( e ) => {
160+ e . preventDefault ( )
161+ commit ( m . id )
162+ } }
163+ >
164+ < span style = { { flex : 1 , overflow : 'hidden' , textOverflow : 'ellipsis' , whiteSpace : 'nowrap' } } > { m . id } </ span >
165+ { isEnterTarget && (
166+ < span style = { { color : 'var(--color-text-muted)' , fontSize : '0.75rem' , flexShrink : 0 } } > ↵</ span >
167+ ) }
168+ </ div >
169+ )
170+ } )
155171 ) }
156172 </ div >
157173 ) }
0 commit comments