Skip to content

Commit 874ad85

Browse files
navigating
1 parent d0babd3 commit 874ad85

File tree

2 files changed

+57
-41
lines changed

2 files changed

+57
-41
lines changed

packages/kit-headless/src/components/select/select-item.tsx

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,23 @@ export const HSelectItem = component$<SelectItemProps>((props) => {
3636
const itemId = `${context.localId}-${_index}`;
3737
const isInitialFocusSig = useSignal<boolean>(true);
3838

39-
const { selectionManager$, getNextEnabledItemIndex$ } = useSelect();
39+
const { selectionManager$, getNextEnabledItemIndex$, getPrevEnabledItemIndex$ } =
40+
useSelect();
4041

4142
const isSelectedSig = useComputed$(() => {
4243
const index = _index ?? null;
4344
return !disabled && context.selectedIndexSetSig.value.has(index!);
4445
});
4546

4647
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+
}
4856
});
4957

5058
useTask$(async function getIndexTask() {
@@ -118,13 +126,55 @@ export const HSelectItem = component$<SelectItemProps>((props) => {
118126
isSelectedSig,
119127
};
120128

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+
121170
useContextProvider(selectItemContextId, selectContext);
122171

123172
return (
124173
<li
125174
{...rest}
126175
id={itemId}
127176
onClick$={[handleClick$, props.onClick$]}
177+
onKeyDown$={[handleKeyDown$, props.onKeyDown$]}
128178
onPointerOver$={[handlePointerOver$, props.onPointerOver$]}
129179
ref={itemRef}
130180
tabIndex={-1}

packages/kit-headless/src/components/select/select-trigger.tsx

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -56,52 +56,18 @@ export const HSelectTrigger = component$<SelectTriggerProps>((props) => {
5656
: !context.isListboxOpenSig.value;
5757
break;
5858

59-
case 'ArrowDown':
60-
if (context.isListboxOpenSig.value) {
61-
context.highlightedIndexSig.value = await getNextEnabledItemIndex$(
62-
context.highlightedIndexSig.value!,
63-
);
64-
if (context.multiple && e.shiftKey) {
65-
await selectionManager$(context.highlightedIndexSig.value, 'toggle');
66-
}
67-
} else {
68-
context.isListboxOpenSig.value = true;
69-
}
59+
case 'Tab':
60+
case 'Escape':
61+
context.isListboxOpenSig.value = false;
7062
break;
7163

64+
case 'ArrowDown':
7265
case 'ArrowUp':
73-
if (context.isListboxOpenSig.value) {
74-
context.highlightedIndexSig.value = await getPrevEnabledItemIndex$(
75-
context.highlightedIndexSig.value!,
76-
);
77-
if (context.multiple && e.shiftKey) {
78-
await selectionManager$(context.highlightedIndexSig.value, 'toggle');
79-
}
80-
} else {
66+
if (!context.isListboxOpenSig.value) {
8167
context.isListboxOpenSig.value = true;
8268
}
8369
break;
8470

85-
case 'Home':
86-
if (context.isListboxOpenSig.value) {
87-
context.highlightedIndexSig.value = await getNextEnabledItemIndex$(-1);
88-
}
89-
break;
90-
91-
case 'End':
92-
if (context.isListboxOpenSig.value) {
93-
const lastEnabledOptionIndex = await getPrevEnabledItemIndex$(
94-
context.itemsMapSig.value.size,
95-
);
96-
context.highlightedIndexSig.value = lastEnabledOptionIndex;
97-
}
98-
break;
99-
100-
case 'Tab':
101-
case 'Escape':
102-
context.isListboxOpenSig.value = false;
103-
break;
104-
10571
case 'ArrowRight':
10672
if (!context.multiple) {
10773
const currentIndex = context.highlightedIndexSig.value ?? -1;

0 commit comments

Comments
 (0)