@@ -26,6 +26,7 @@ export default function RepoPicker({
2626 const rootRef = useRef < HTMLDivElement > ( null ) ;
2727 const searchInputRef = useRef < HTMLInputElement > ( null ) ;
2828 const optionRefs = useRef < Array < HTMLButtonElement | null > > ( [ ] ) ;
29+ const openFocusModeRef = useRef < "select" | "preserve-end" > ( "select" ) ;
2930 const menuId = useId ( ) ;
3031 const filteredDirs = useMemo ( ( ) => {
3132 const needle = searchQuery . trim ( ) . toLowerCase ( ) ;
@@ -69,8 +70,17 @@ export default function RepoPicker({
6970 return ;
7071 }
7172 const rafId = requestAnimationFrame ( ( ) => {
72- searchInputRef . current ?. focus ( ) ;
73- searchInputRef . current ?. select ( ) ;
73+ const input = searchInputRef . current ;
74+ if ( ! input ) {
75+ return ;
76+ }
77+ input . focus ( ) ;
78+ if ( openFocusModeRef . current === "preserve-end" ) {
79+ const caret = input . value . length ;
80+ input . setSelectionRange ( caret , caret ) ;
81+ return ;
82+ }
83+ input . select ( ) ;
7484 } ) ;
7585 return ( ) => cancelAnimationFrame ( rafId ) ;
7686 } , [ open ] ) ;
@@ -129,6 +139,7 @@ export default function RepoPicker({
129139 }
130140
131141 event . preventDefault ( ) ;
142+ openFocusModeRef . current = "preserve-end" ;
132143 setOpen ( true ) ;
133144 if ( event . key === " " ) {
134145 return true ;
@@ -145,6 +156,7 @@ export default function RepoPicker({
145156
146157 if ( event . key === "Backspace" ) {
147158 event . preventDefault ( ) ;
159+ openFocusModeRef . current = "preserve-end" ;
148160 setOpen ( true ) ;
149161 setSearchQuery ( ( prev ) => prev . slice ( 0 , - 1 ) ) ;
150162 return ;
@@ -153,6 +165,7 @@ export default function RepoPicker({
153165 if ( ( event . key === "ArrowDown" || event . key === "ArrowUp" ) && filteredDirs . length > 0 ) {
154166 event . preventDefault ( ) ;
155167 if ( ! open ) {
168+ openFocusModeRef . current = "select" ;
156169 setOpen ( true ) ;
157170 return ;
158171 }
@@ -165,6 +178,7 @@ export default function RepoPicker({
165178
166179 if ( ( event . key === "Enter" || event . key === " " ) && ! open ) {
167180 event . preventDefault ( ) ;
181+ openFocusModeRef . current = "select" ;
168182 setOpen ( true ) ;
169183 return ;
170184 }
@@ -211,7 +225,14 @@ export default function RepoPicker({
211225 < button
212226 type = "button"
213227 className = { `${ styles . trigger } ${ value ? "" : styles . placeholder } ` }
214- onClick = { ( ) => setOpen ( ( prev ) => ! prev ) }
228+ onClick = { ( ) =>
229+ setOpen ( ( prev ) => {
230+ if ( ! prev ) {
231+ openFocusModeRef . current = "select" ;
232+ }
233+ return ! prev ;
234+ } )
235+ }
215236 onKeyDown = { handleTriggerKeyDown }
216237 aria-haspopup = "listbox"
217238 aria-expanded = { open }
0 commit comments