Compare commits

...
Author SHA1 Message Date
Halvor Haugan b904f4ef04 feat(Combobox2): open when you start writing 2026-10-21 14:51:24 +02:00
2 changed files with 24 additions and 8 deletions

No files matched your search

@@ -289,7 +289,7 @@ export const Composition = () => {
</ComboboxRoot>
<ComboboxRoot {...rootProps}>
<ComboboxTrigger>
<ComboboxTrigger openWhenStartsTyping={false}>
<Button>Uten input</Button>
</ComboboxTrigger>
<ComboboxOverlay>
@@ -305,7 +305,7 @@ export const Composition = () => {
onToggleOption={setSelectedOption}
multiple={false}
>
<ComboboxTrigger>
<ComboboxTrigger openWhenStartsTyping={false}>
<Button>Single select</Button>
</ComboboxTrigger>
<ComboboxOverlay>
@@ -9,11 +9,18 @@ interface ComboboxTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElem
*/
children: React.ReactNode;
readOnly?: boolean;
/**
* Whether to open when the user starts typing.
* Set to `false` if the filter input is omitted.
* @default true
*/
openWhenStartsTyping?: boolean; // TODO: Check ComboboxFilter presence automatically? Or check in dev and warn if prop wrong.
}
const ComboboxTrigger = ({
children,
readOnly,
openWhenStartsTyping = true,
...rest
}: ComboboxTriggerProps) => {
const rootContext = useComboboxRootContext();
@@ -29,13 +36,22 @@ const ComboboxTrigger = ({
if (!readOnly && !rootContext.open) event.preventDefault();
}}
onKeyDown={(event) => {
if (
!readOnly &&
(event.key === "ArrowDown" || event.key === "ArrowUp")
) {
if (readOnly) {
return;
}
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
rootContext.setOpen(true);
// Stop keydown from scrolling window
event.preventDefault();
event.preventDefault(); // Stop keydown from scrolling window
} else if (
openWhenStartsTyping &&
!event.nativeEvent.isComposing &&
!event.ctrlKey &&
!event.metaKey &&
!event.altKey &&
event.key.length === 1 &&
event.key !== " "
) {
rootContext.setOpen(true); // Open when you start writing
}
}}
data-readonly={readOnly}