Skip to content

Commit 50cb279

Browse files
committed
chore: improve keyboard navigation in tag (pill) mode
1 parent 1074f37 commit 50cb279

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

packages/pluggableWidgets/combobox-web/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1313
### Changed
1414

1515
- We made it possibly to clear the selection in single selection mode with Backspace key.
16+
- We improved keyboard navigation for multi selection with
1617

1718
## [2.7.0] - 2026-01-14
1819

packages/pluggableWidgets/combobox-web/src/components/MultiSelection/MultiSelection.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export function MultiSelection({
1818
ariaRequired,
1919
...options
2020
}: SelectionBaseProps<MultiSelector>): ReactElement {
21+
const inputRef = useRef<HTMLInputElement>(null);
2122
const {
2223
isOpen,
2324
getToggleButtonProps,
@@ -33,8 +34,7 @@ export function MultiSelection({
3334
items,
3435
setSelectedItems,
3536
toggleSelectedItem
36-
} = useDownshiftMultiSelectProps(selector, options, a11yConfig.a11yStatusMessage);
37-
const inputRef = useRef<HTMLInputElement>(null);
37+
} = useDownshiftMultiSelectProps(selector, options, inputRef, a11yConfig.a11yStatusMessage);
3838
const isSelectedItemsBoxStyle = selector.selectedItemsStyle === "boxes";
3939
const isOptionsSelected = selector.isOptionsSelected();
4040
const inputLabel = getInputLabel(options.inputId);

packages/pluggableWidgets/combobox-web/src/hooks/useDownshiftMultiSelectProps.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
useMultipleSelection,
99
UseMultipleSelectionReturnValue
1010
} from "downshift";
11-
import { useCallback, useMemo } from "react";
11+
import { RefObject, useCallback, useMemo } from "react";
1212
import { A11yStatusMessage, MultiSelector } from "../helpers/types";
1313

1414
export type UseDownshiftMultiSelectPropsReturnValue = UseMultipleSelectionReturnValue<string> &
@@ -36,6 +36,7 @@ interface Options {
3636
export function useDownshiftMultiSelectProps(
3737
selector: MultiSelector,
3838
options: Options,
39+
inputRef: RefObject<HTMLInputElement | null>,
3940
a11yStatusMessage: A11yStatusMessage
4041
): UseDownshiftMultiSelectPropsReturnValue {
4142
const {
@@ -57,14 +58,24 @@ export function useDownshiftMultiSelectProps(
5758
selector.setValue(selectedItems ?? []);
5859
},
5960

60-
onStateChange({ selectedItems: newSelectedItems, type }) {
61+
onStateChange({ selectedItems: newSelectedItems, type, activeIndex: newActiveIndex }) {
6162
switch (type) {
6263
case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownBackspace:
6364
case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownDelete:
65+
if (newActiveIndex === -1) {
66+
inputRef.current?.focus();
67+
}
68+
setSelectedItems(newSelectedItems!);
69+
break;
6470
case useMultipleSelection.stateChangeTypes.DropdownKeyDownBackspace:
6571
case useMultipleSelection.stateChangeTypes.FunctionRemoveSelectedItem:
6672
setSelectedItems(newSelectedItems!);
6773
break;
74+
case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownNavigationNext:
75+
if (newActiveIndex === -1) {
76+
inputRef.current?.focus();
77+
}
78+
break;
6879
default:
6980
break;
7081
}

0 commit comments

Comments
 (0)