@@ -36,15 +36,23 @@ export const HSelectItem = component$<SelectItemProps>((props) => {
36
36
const itemId = `${ context . localId } -${ _index } ` ;
37
37
const isInitialFocusSig = useSignal < boolean > ( true ) ;
38
38
39
- const { selectionManager$, getNextEnabledItemIndex$ } = useSelect ( ) ;
39
+ const { selectionManager$, getNextEnabledItemIndex$, getPrevEnabledItemIndex$ } =
40
+ useSelect ( ) ;
40
41
41
42
const isSelectedSig = useComputed$ ( ( ) => {
42
43
const index = _index ?? null ;
43
44
return ! disabled && context . selectedIndexSetSig . value . has ( index ! ) ;
44
45
} ) ;
45
46
46
47
const isHighlightedSig = useComputed$ ( ( ) => {
47
- return ! disabled && context . highlightedIndexSig . value === _index ;
48
+ if ( disabled ) return ;
49
+
50
+ if ( context . highlightedIndexSig . value === _index ) {
51
+ itemRef . value ?. focus ( ) ;
52
+ return true ;
53
+ } else {
54
+ return false ;
55
+ }
48
56
} ) ;
49
57
50
58
useTask$ ( async function getIndexTask ( ) {
@@ -118,13 +126,55 @@ export const HSelectItem = component$<SelectItemProps>((props) => {
118
126
isSelectedSig,
119
127
} ;
120
128
129
+ const handleKeyDown$ = $ ( async ( e : KeyboardEvent ) => {
130
+ switch ( e . key ) {
131
+ case 'ArrowDown' :
132
+ if ( context . isListboxOpenSig . value ) {
133
+ context . highlightedIndexSig . value = await getNextEnabledItemIndex$ (
134
+ context . highlightedIndexSig . value ! ,
135
+ ) ;
136
+ if ( context . multiple && e . shiftKey ) {
137
+ await selectionManager$ ( context . highlightedIndexSig . value , 'toggle' ) ;
138
+ }
139
+ }
140
+ break ;
141
+
142
+ case 'ArrowUp' :
143
+ if ( context . isListboxOpenSig . value ) {
144
+ context . highlightedIndexSig . value = await getPrevEnabledItemIndex$ (
145
+ context . highlightedIndexSig . value ! ,
146
+ ) ;
147
+ if ( context . multiple && e . shiftKey ) {
148
+ await selectionManager$ ( context . highlightedIndexSig . value , 'toggle' ) ;
149
+ }
150
+ }
151
+ break ;
152
+
153
+ case 'Home' :
154
+ if ( context . isListboxOpenSig . value ) {
155
+ context . highlightedIndexSig . value = await getNextEnabledItemIndex$ ( - 1 ) ;
156
+ }
157
+ break ;
158
+
159
+ case 'End' :
160
+ if ( context . isListboxOpenSig . value ) {
161
+ const lastEnabledOptionIndex = await getPrevEnabledItemIndex$ (
162
+ context . itemsMapSig . value . size ,
163
+ ) ;
164
+ context . highlightedIndexSig . value = lastEnabledOptionIndex ;
165
+ }
166
+ break ;
167
+ }
168
+ } ) ;
169
+
121
170
useContextProvider ( selectItemContextId , selectContext ) ;
122
171
123
172
return (
124
173
< li
125
174
{ ...rest }
126
175
id = { itemId }
127
176
onClick$ = { [ handleClick$ , props . onClick$ ] }
177
+ onKeyDown$ = { [ handleKeyDown$ , props . onKeyDown$ ] }
128
178
onPointerOver$ = { [ handlePointerOver$ , props . onPointerOver$ ] }
129
179
ref = { itemRef }
130
180
tabIndex = { - 1 }
0 commit comments