@vellira-ui/core 2.31.0 → 2.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/useDropdown.d.ts +3 -2
- package/dist/useDropdown.d.ts.map +1 -1
- package/dist/useDropdown.js +4 -3
- package/dist/useKeyboardNavigation.d.ts +2 -1
- package/dist/useKeyboardNavigation.d.ts.map +1 -1
- package/dist/useKeyboardNavigation.js +7 -3
- package/dist/useSelect.d.ts.map +1 -1
- package/dist/useSelect.js +13 -1
- package/package.json +1 -1
package/dist/useDropdown.d.ts
CHANGED
|
@@ -6,10 +6,11 @@ export interface UseDropdownParams<TItem extends NavigableItem> {
|
|
|
6
6
|
disabled?: boolean;
|
|
7
7
|
onOpenChange?: (open: boolean) => void;
|
|
8
8
|
onSelect?: (value: string) => void;
|
|
9
|
-
getItemValue: (item: TItem) => string;
|
|
9
|
+
getItemValue: (item: TItem, index: number) => string;
|
|
10
10
|
getItemText?: (item: TItem) => string;
|
|
11
|
+
loop?: boolean;
|
|
11
12
|
}
|
|
12
|
-
export declare const useDropdown: <TItem extends NavigableItem>({ items, open, defaultOpen, disabled, onOpenChange, onSelect, getItemValue, getItemText, }: UseDropdownParams<TItem>) => {
|
|
13
|
+
export declare const useDropdown: <TItem extends NavigableItem>({ items, open, defaultOpen, disabled, onOpenChange, onSelect, getItemValue, getItemText, loop, }: UseDropdownParams<TItem>) => {
|
|
13
14
|
activeIndex: number;
|
|
14
15
|
setActiveIndex: import("react").Dispatch<import("react").SetStateAction<number>>;
|
|
15
16
|
isOpen: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDropdown.d.ts","sourceRoot":"","sources":["../src/useDropdown.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAEnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,iBAAiB,CAAC,KAAK,SAAS,aAAa;IAC5D,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useDropdown.d.ts","sourceRoot":"","sources":["../src/useDropdown.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAEnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,iBAAiB,CAAC,KAAK,SAAS,aAAa;IAC5D,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,SAAS,aAAa,EAAE,kGAUtD,iBAAiB,CAAC,KAAK,CAAC;;;;;wBA6CZ,OAAO,iBAAiB,MAAM;;;;uBAsClC,KAAK;mBAAL,KAAK;;;;;CAgDf,CAAC"}
|
package/dist/useDropdown.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from 'react';
|
|
2
2
|
import { useKeyboardNavigation, } from './useKeyboardNavigation.js';
|
|
3
|
-
export const useDropdown = ({ items, open, defaultOpen = false, disabled = false, onOpenChange, onSelect, getItemValue, getItemText, }) => {
|
|
3
|
+
export const useDropdown = ({ items, open, defaultOpen = false, disabled = false, onOpenChange, onSelect, getItemValue, getItemText, loop = true, }) => {
|
|
4
4
|
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
|
|
5
5
|
const [activeIndex, setActiveIndex] = useState(-1);
|
|
6
6
|
const isControlled = open !== undefined;
|
|
@@ -58,9 +58,9 @@ export const useDropdown = ({ items, open, defaultOpen = false, disabled = false
|
|
|
58
58
|
const selectItem = useCallback((item) => {
|
|
59
59
|
if (item.disabled)
|
|
60
60
|
return;
|
|
61
|
-
onSelect?.(getItemValue(item));
|
|
61
|
+
onSelect?.(getItemValue(item, items.indexOf(item)));
|
|
62
62
|
closeDropdown();
|
|
63
|
-
}, [closeDropdown, getItemValue, onSelect]);
|
|
63
|
+
}, [closeDropdown, getItemValue, items, onSelect]);
|
|
64
64
|
const selectActiveItem = useCallback(() => {
|
|
65
65
|
const item = items[activeIndex];
|
|
66
66
|
if (!item)
|
|
@@ -78,6 +78,7 @@ export const useDropdown = ({ items, open, defaultOpen = false, disabled = false
|
|
|
78
78
|
onSelect: selectActiveItem,
|
|
79
79
|
onClose: closeDropdown,
|
|
80
80
|
getItemText,
|
|
81
|
+
loop,
|
|
81
82
|
});
|
|
82
83
|
return {
|
|
83
84
|
activeIndex,
|
|
@@ -17,8 +17,9 @@ export interface UseKeyboardNavigationParams<TItem extends NavigableItem> {
|
|
|
17
17
|
onSelect?: () => void;
|
|
18
18
|
onClose?: () => void;
|
|
19
19
|
getItemText?: (item: TItem) => string;
|
|
20
|
+
loop?: boolean;
|
|
20
21
|
}
|
|
21
|
-
export declare const useKeyboardNavigation: <TItem extends NavigableItem>({ activeIndex, setActiveIndex, items, isOpen, onOpen, onSelect, onClose, getItemText, }: UseKeyboardNavigationParams<TItem>) => {
|
|
22
|
+
export declare const useKeyboardNavigation: <TItem extends NavigableItem>({ activeIndex, setActiveIndex, items, isOpen, onOpen, onSelect, onClose, getItemText, loop, }: UseKeyboardNavigationParams<TItem>) => {
|
|
22
23
|
onKeyDown: (event: KeyboardNavigationEvent) => void;
|
|
23
24
|
};
|
|
24
25
|
//# sourceMappingURL=useKeyboardNavigation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyboardNavigation.d.ts","sourceRoot":"","sources":["../src/useKeyboardNavigation.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B,CAAC,KAAK,SAAS,aAAa;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useKeyboardNavigation.d.ts","sourceRoot":"","sources":["../src/useKeyboardNavigation.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B,CAAC,KAAK,SAAS,aAAa;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,qBAAqB,GAAI,KAAK,SAAS,aAAa,EAAE,+FAUhE,2BAA2B,CAAC,KAAK,CAAC;uBAiFzB,uBAAuB;CA6FlC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
-
export const useKeyboardNavigation = ({ activeIndex, setActiveIndex, items, isOpen, onOpen, onSelect, onClose, getItemText, }) => {
|
|
2
|
+
export const useKeyboardNavigation = ({ activeIndex, setActiveIndex, items, isOpen, onOpen, onSelect, onClose, getItemText, loop = true, }) => {
|
|
3
3
|
const searchRef = useRef({
|
|
4
4
|
value: '',
|
|
5
5
|
timeoutId: undefined,
|
|
@@ -14,13 +14,17 @@ export const useKeyboardNavigation = ({ activeIndex, setActiveIndex, items, isOp
|
|
|
14
14
|
return current;
|
|
15
15
|
let index = current;
|
|
16
16
|
for (let i = 0; i < items.length; i++) {
|
|
17
|
-
|
|
17
|
+
const nextIndex = index + direction;
|
|
18
|
+
if (!loop && (nextIndex < 0 || nextIndex >= items.length)) {
|
|
19
|
+
return current;
|
|
20
|
+
}
|
|
21
|
+
index = (nextIndex + items.length) % items.length;
|
|
18
22
|
if (!items[index]?.disabled) {
|
|
19
23
|
return index;
|
|
20
24
|
}
|
|
21
25
|
}
|
|
22
26
|
return current;
|
|
23
|
-
}, [items]);
|
|
27
|
+
}, [items, loop]);
|
|
24
28
|
const getFirstEnabledIndex = useCallback(() => items.findIndex((item) => !item.disabled), [items]);
|
|
25
29
|
const getLastEnabledIndex = useCallback(() => {
|
|
26
30
|
for (let i = items.length - 1; i >= 0; i--) {
|
package/dist/useSelect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelect.d.ts","sourceRoot":"","sources":["../src/useSelect.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AAEjD,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,gBAAgB;IAC/D,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC7C,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,gBAAgB,EAAE,6IAazD,eAAe,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useSelect.d.ts","sourceRoot":"","sources":["../src/useSelect.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AAEjD,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,gBAAgB;IAC/D,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC7C,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,gBAAgB,EAAE,6IAazD,eAAe,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;6BAiFX,MAAM;wBAAN,MAAM;;;CAuFrB,CAAC"}
|
package/dist/useSelect.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useMemo, useState } from 'react';
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
2
|
import { useControllableState } from './useControllableState.js';
|
|
3
3
|
import { useKeyboardNavigation, } from './useKeyboardNavigation.js';
|
|
4
4
|
export const useSelect = ({ value, defaultValue, onValueChange, onChange, options, multiple = false, maxSelected, closeOnSelect = !multiple, disabled = false, open, defaultOpen = false, onOpenChange, }) => {
|
|
@@ -44,6 +44,17 @@ export const useSelect = ({ value, defaultValue, onValueChange, onChange, option
|
|
|
44
44
|
}
|
|
45
45
|
openDropdown();
|
|
46
46
|
}, [closeDropdown, disabled, isOpen, openDropdown]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!isOpen)
|
|
49
|
+
return;
|
|
50
|
+
setActiveIndex((currentIndex) => {
|
|
51
|
+
const currentOption = options[currentIndex];
|
|
52
|
+
if (currentOption && !currentOption.disabled) {
|
|
53
|
+
return currentIndex;
|
|
54
|
+
}
|
|
55
|
+
return getInitialActiveIndex();
|
|
56
|
+
});
|
|
57
|
+
}, [getInitialActiveIndex, isOpen, options]);
|
|
47
58
|
const selectValue = useCallback((nextValue) => {
|
|
48
59
|
if (nextValue === '') {
|
|
49
60
|
setSelectedValue(multiple ? [] : '');
|
|
@@ -70,6 +81,7 @@ export const useSelect = ({ value, defaultValue, onValueChange, onChange, option
|
|
|
70
81
|
return;
|
|
71
82
|
}
|
|
72
83
|
setSelectedValue(nextValue);
|
|
84
|
+
setActiveIndex(options.indexOf(nextOption));
|
|
73
85
|
closeDropdown();
|
|
74
86
|
}, [
|
|
75
87
|
closeDropdown,
|