@vellira-ui/core 2.25.0 → 2.26.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/index.d.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  export * from './useControllableState.js';
2
+ export * from './useDropdown.js';
2
3
  export * from './useKeyboardNavigation.js';
4
+ export * from './useModal.js';
5
+ export * from './useSelect.js';
6
+ export * from './useTabs.js';
3
7
  export * from './useTabsKeyboard.js';
4
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,7 @@
1
1
  export * from './useControllableState.js';
2
+ export * from './useDropdown.js';
2
3
  export * from './useKeyboardNavigation.js';
4
+ export * from './useModal.js';
5
+ export * from './useSelect.js';
6
+ export * from './useTabs.js';
3
7
  export * from './useTabsKeyboard.js';
@@ -1 +1,28 @@
1
+ import { type KeyboardNavigationEvent, type NavigableItem } from './useKeyboardNavigation.js';
2
+ export interface UseDropdownParams<TItem extends NavigableItem> {
3
+ items: TItem[];
4
+ open?: boolean;
5
+ defaultOpen?: boolean;
6
+ disabled?: boolean;
7
+ onOpenChange?: (open: boolean) => void;
8
+ onSelect?: (value: string) => void;
9
+ getItemValue: (item: TItem) => string;
10
+ getItemText?: (item: TItem) => string;
11
+ }
12
+ export declare const useDropdown: <TItem extends NavigableItem>({ items, open, defaultOpen, disabled, onOpenChange, onSelect, getItemValue, getItemText, }: UseDropdownParams<TItem>) => {
13
+ activeIndex: number;
14
+ setActiveIndex: import("react").Dispatch<import("react").SetStateAction<number>>;
15
+ isOpen: boolean;
16
+ open: boolean;
17
+ setOpen: (nextOpen: boolean, initialIndex?: number) => void;
18
+ openDropdown: (initialIndex?: number) => void;
19
+ closeDropdown: () => void;
20
+ toggleDropdown: () => void;
21
+ selectItem: (item: TItem) => void;
22
+ select: (item: TItem) => void;
23
+ selectActiveItem: () => void;
24
+ onKeyDown: (event: KeyboardNavigationEvent) => void;
25
+ getFirstEnabledIndex: () => number;
26
+ getLastEnabledIndex: () => number;
27
+ };
1
28
  //# sourceMappingURL=useDropdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDropdown.d.ts","sourceRoot":"","sources":["../src/useDropdown.ts"],"names":[],"mappings":""}
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;IACtC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;CACvC;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,SAAS,aAAa,EAAE,4FAStD,iBAAiB,CAAC,KAAK,CAAC;;;;;wBA6CZ,OAAO,iBAAiB,MAAM;;;;uBAsClC,KAAK;mBAAL,KAAK;;;;;CA+Cf,CAAC"}
@@ -1 +1,98 @@
1
- "use strict";
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { useKeyboardNavigation, } from './useKeyboardNavigation.js';
3
+ export const useDropdown = ({ items, open, defaultOpen = false, disabled = false, onOpenChange, onSelect, getItemValue, getItemText, }) => {
4
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
5
+ const [activeIndex, setActiveIndex] = useState(-1);
6
+ const isControlled = open !== undefined;
7
+ const isOpen = open ?? uncontrolledOpen;
8
+ const getFirstEnabledIndex = useCallback(() => items.findIndex((item) => !item.disabled), [items]);
9
+ const getLastEnabledIndex = useCallback(() => {
10
+ for (let index = items.length - 1; index >= 0; index--) {
11
+ if (!items[index]?.disabled) {
12
+ return index;
13
+ }
14
+ }
15
+ return -1;
16
+ }, [items]);
17
+ const syncActiveIndex = useCallback((nextOpen, initialIndex) => {
18
+ if (nextOpen) {
19
+ setActiveIndex((currentIndex) => {
20
+ if (currentIndex >= 0 && !items[currentIndex]?.disabled) {
21
+ return currentIndex;
22
+ }
23
+ return initialIndex ?? getFirstEnabledIndex();
24
+ });
25
+ return;
26
+ }
27
+ setActiveIndex(-1);
28
+ }, [getFirstEnabledIndex, items]);
29
+ useEffect(() => {
30
+ syncActiveIndex(isOpen);
31
+ }, [isOpen, syncActiveIndex]);
32
+ const setOpen = useCallback((nextOpen, initialIndex) => {
33
+ if (!isControlled) {
34
+ setUncontrolledOpen(nextOpen);
35
+ }
36
+ onOpenChange?.(nextOpen);
37
+ syncActiveIndex(nextOpen, initialIndex);
38
+ }, [isControlled, onOpenChange, syncActiveIndex]);
39
+ const openDropdown = useCallback((initialIndex = getFirstEnabledIndex()) => {
40
+ if (disabled)
41
+ return;
42
+ setOpen(true, initialIndex);
43
+ }, [disabled, getFirstEnabledIndex, setOpen]);
44
+ const closeDropdown = useCallback(() => {
45
+ if (!isOpen)
46
+ return;
47
+ setOpen(false);
48
+ }, [isOpen, setOpen]);
49
+ const toggleDropdown = useCallback(() => {
50
+ if (disabled)
51
+ return;
52
+ if (isOpen) {
53
+ setOpen(false);
54
+ return;
55
+ }
56
+ openDropdown();
57
+ }, [disabled, isOpen, openDropdown, setOpen]);
58
+ const selectItem = useCallback((item) => {
59
+ if (item.disabled)
60
+ return;
61
+ onSelect?.(getItemValue(item));
62
+ closeDropdown();
63
+ }, [closeDropdown, getItemValue, onSelect]);
64
+ const selectActiveItem = useCallback(() => {
65
+ const item = items[activeIndex];
66
+ if (!item)
67
+ return;
68
+ selectItem(item);
69
+ }, [activeIndex, items, selectItem]);
70
+ const { onKeyDown } = useKeyboardNavigation({
71
+ activeIndex,
72
+ setActiveIndex,
73
+ items,
74
+ isOpen,
75
+ onOpen: (event) => {
76
+ openDropdown(event.key === 'ArrowUp' ? getLastEnabledIndex() : getFirstEnabledIndex());
77
+ },
78
+ onSelect: selectActiveItem,
79
+ onClose: closeDropdown,
80
+ getItemText,
81
+ });
82
+ return {
83
+ activeIndex,
84
+ setActiveIndex,
85
+ isOpen,
86
+ open: isOpen,
87
+ setOpen,
88
+ openDropdown,
89
+ closeDropdown,
90
+ toggleDropdown,
91
+ selectItem,
92
+ select: selectItem,
93
+ selectActiveItem,
94
+ onKeyDown,
95
+ getFirstEnabledIndex,
96
+ getLastEnabledIndex,
97
+ };
98
+ };
@@ -13,7 +13,7 @@ export interface UseKeyboardNavigationParams<TItem extends NavigableItem> {
13
13
  setActiveIndex: (index: number) => void;
14
14
  items: TItem[];
15
15
  isOpen: boolean;
16
- onOpen: () => void;
16
+ onOpen: (event: KeyboardNavigationEvent) => void;
17
17
  onSelect?: () => void;
18
18
  onClose?: () => void;
19
19
  getItemText?: (item: TItem) => string;
@@ -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,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;CACvC;AAED,eAAO,MAAM,qBAAqB,GAAI,KAAK,SAAS,aAAa,EAAE,yFAShE,2BAA2B,CAAC,KAAK,CAAC;uBA2EzB,uBAAuB;CA8FlC,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;CACvC;AAED,eAAO,MAAM,qBAAqB,GAAI,KAAK,SAAS,aAAa,EAAE,yFAShE,2BAA2B,CAAC,KAAK,CAAC;uBA2EzB,uBAAuB;CA6FlC,CAAC"}
@@ -53,7 +53,7 @@ export const useKeyboardNavigation = ({ activeIndex, setActiveIndex, items, isOp
53
53
  event.key === 'ArrowDown' ||
54
54
  event.key === 'ArrowUp') {
55
55
  event.preventDefault();
56
- onOpen();
56
+ onOpen(event);
57
57
  }
58
58
  return;
59
59
  }
@@ -109,7 +109,6 @@ export const useKeyboardNavigation = ({ activeIndex, setActiveIndex, items, isOp
109
109
  }
110
110
  }, [
111
111
  activeIndex,
112
- items,
113
112
  isOpen,
114
113
  onOpen,
115
114
  onSelect,
@@ -1 +1,18 @@
1
+ export interface UseModalParams {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ closeOnBackdrop?: boolean;
5
+ closeOnClick?: boolean;
6
+ closeOnEsc?: boolean;
7
+ }
8
+ export declare const useModal: ({ isOpen, onClose, closeOnBackdrop, closeOnClick, closeOnEsc, }: UseModalParams) => {
9
+ isOpen: boolean;
10
+ open: boolean;
11
+ shouldRender: boolean;
12
+ onClose: () => void;
13
+ closeOnBackdrop: boolean | undefined;
14
+ closeOnEsc: boolean;
15
+ titleId: string;
16
+ descriptionId: string;
17
+ };
1
18
  //# sourceMappingURL=useModal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useModal.d.ts","sourceRoot":"","sources":["../src/useModal.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"useModal.d.ts","sourceRoot":"","sources":["../src/useModal.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,GAAI,iEAMtB,cAAc;;;;mBAZA,IAAI;;;;;CA2BpB,CAAC"}
package/dist/useModal.js CHANGED
@@ -1 +1,16 @@
1
- "use strict";
1
+ import { useId } from 'react';
2
+ export const useModal = ({ isOpen, onClose, closeOnBackdrop, closeOnClick, closeOnEsc = true, }) => {
3
+ const titleId = useId();
4
+ const descriptionId = useId();
5
+ const resolvedCloseOnBackdrop = closeOnBackdrop ?? closeOnClick;
6
+ return {
7
+ isOpen,
8
+ open: isOpen,
9
+ shouldRender: isOpen,
10
+ onClose,
11
+ closeOnBackdrop: resolvedCloseOnBackdrop,
12
+ closeOnEsc,
13
+ titleId,
14
+ descriptionId,
15
+ };
16
+ };
@@ -1 +1,34 @@
1
+ import { type NavigableItem } from './useKeyboardNavigation.js';
2
+ export interface SelectOptionLike extends NavigableItem {
3
+ label: string;
4
+ value: string;
5
+ }
6
+ export interface UseSelectParams<TOption extends SelectOptionLike> {
7
+ value?: string;
8
+ defaultValue?: string;
9
+ onChange?: (value: string) => void;
10
+ options: TOption[];
11
+ disabled?: boolean;
12
+ open?: boolean;
13
+ defaultOpen?: boolean;
14
+ onOpenChange?: (open: boolean) => void;
15
+ }
16
+ export declare const useSelect: <TOption extends SelectOptionLike>({ value, defaultValue, onChange, options, disabled, open, defaultOpen, onOpenChange, }: UseSelectParams<TOption>) => {
17
+ selectedValue: string;
18
+ setSelectedValue: (next: string) => void;
19
+ selectedOption: TOption | undefined;
20
+ isOpen: boolean;
21
+ open: boolean;
22
+ setIsOpen: (next: boolean) => void;
23
+ activeIndex: number;
24
+ setActiveIndex: import("react").Dispatch<import("react").SetStateAction<number>>;
25
+ getInitialActiveIndex: () => number;
26
+ openDropdown: () => void;
27
+ closeDropdown: () => void;
28
+ toggleDropdown: () => void;
29
+ selectValue: (nextValue: string) => void;
30
+ select: (nextValue: string) => void;
31
+ selectActiveOption: () => void;
32
+ onKeyDown: (event: import("./useKeyboardNavigation.js").KeyboardNavigationEvent) => void;
33
+ };
1
34
  //# sourceMappingURL=useSelect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSelect.d.ts","sourceRoot":"","sources":["../src/useSelect.ts"],"names":[],"mappings":""}
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,WAAW,eAAe,CAAC,OAAO,SAAS,gBAAgB;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,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,wFASzD,eAAe,CAAC,OAAO,CAAC;;;;;;;;;;;;;6BAoDX,MAAM;wBAAN,MAAM;;;CAgDrB,CAAC"}
package/dist/useSelect.js CHANGED
@@ -1 +1,82 @@
1
- "use strict";
1
+ import { useCallback, useMemo, useState } from 'react';
2
+ import { useControllableState } from './useControllableState.js';
3
+ import { useKeyboardNavigation, } from './useKeyboardNavigation.js';
4
+ export const useSelect = ({ value, defaultValue, onChange, options, disabled = false, open, defaultOpen = false, onOpenChange, }) => {
5
+ const [selectedValue, setSelectedValue] = useControllableState({
6
+ value,
7
+ defaultValue: defaultValue ?? '',
8
+ onChange,
9
+ });
10
+ const [isOpen, setIsOpen] = useControllableState({
11
+ value: open,
12
+ defaultValue: defaultOpen,
13
+ onChange: onOpenChange,
14
+ });
15
+ const [activeIndex, setActiveIndex] = useState(-1);
16
+ const selectedOption = useMemo(() => options.find((option) => option.value === selectedValue), [options, selectedValue]);
17
+ const getInitialActiveIndex = useCallback(() => {
18
+ const selectedIndex = options.findIndex((option) => option.value === selectedValue && !option.disabled);
19
+ if (selectedIndex >= 0)
20
+ return selectedIndex;
21
+ return options.findIndex((option) => !option.disabled);
22
+ }, [options, selectedValue]);
23
+ const openDropdown = useCallback(() => {
24
+ if (disabled)
25
+ return;
26
+ setActiveIndex(getInitialActiveIndex());
27
+ setIsOpen(true);
28
+ }, [disabled, getInitialActiveIndex, setIsOpen]);
29
+ const closeDropdown = useCallback(() => {
30
+ setIsOpen(false);
31
+ }, [setIsOpen]);
32
+ const toggleDropdown = useCallback(() => {
33
+ if (disabled)
34
+ return;
35
+ if (isOpen) {
36
+ closeDropdown();
37
+ return;
38
+ }
39
+ openDropdown();
40
+ }, [closeDropdown, disabled, isOpen, openDropdown]);
41
+ const selectValue = useCallback((nextValue) => {
42
+ const nextOption = options.find((option) => option.value === nextValue);
43
+ if (!nextOption || nextOption.disabled)
44
+ return;
45
+ setSelectedValue(nextValue);
46
+ closeDropdown();
47
+ }, [closeDropdown, options, setSelectedValue]);
48
+ const selectActiveOption = useCallback(() => {
49
+ const activeOption = options[activeIndex];
50
+ if (!activeOption)
51
+ return;
52
+ selectValue(activeOption.value);
53
+ }, [activeIndex, options, selectValue]);
54
+ const { onKeyDown } = useKeyboardNavigation({
55
+ activeIndex,
56
+ setActiveIndex,
57
+ items: options,
58
+ isOpen,
59
+ onOpen: openDropdown,
60
+ onClose: closeDropdown,
61
+ onSelect: selectActiveOption,
62
+ getItemText: (option) => option.label,
63
+ });
64
+ return {
65
+ selectedValue,
66
+ setSelectedValue,
67
+ selectedOption,
68
+ isOpen,
69
+ open: isOpen,
70
+ setIsOpen,
71
+ activeIndex,
72
+ setActiveIndex,
73
+ getInitialActiveIndex,
74
+ openDropdown,
75
+ closeDropdown,
76
+ toggleDropdown,
77
+ selectValue,
78
+ select: selectValue,
79
+ selectActiveOption,
80
+ onKeyDown,
81
+ };
82
+ };
package/dist/useTabs.d.ts CHANGED
@@ -1 +1,11 @@
1
+ export interface UseTabsParams {
2
+ activeIndex?: number;
3
+ defaultActiveIndex?: number;
4
+ onChange?: (index: number) => void;
5
+ orientation?: 'horizontal' | 'vertical';
6
+ }
7
+ export declare const useTabs: ({ activeIndex: controlledActiveIndex, defaultActiveIndex, onChange, }: UseTabsParams) => {
8
+ activeIndex: number;
9
+ setActiveIndex: (next: number) => void;
10
+ };
1
11
  //# sourceMappingURL=useTabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTabs.d.ts","sourceRoot":"","sources":["../src/useTabs.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"useTabs.d.ts","sourceRoot":"","sources":["../src/useTabs.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACzC;AAED,eAAO,MAAM,OAAO,GAAI,uEAIrB,aAAa;;;CAWf,CAAC"}
package/dist/useTabs.js CHANGED
@@ -1 +1,12 @@
1
- "use strict";
1
+ import { useControllableState } from './useControllableState.js';
2
+ export const useTabs = ({ activeIndex: controlledActiveIndex, defaultActiveIndex = 0, onChange, }) => {
3
+ const [activeIndex, setActiveIndex] = useControllableState({
4
+ value: controlledActiveIndex,
5
+ defaultValue: defaultActiveIndex,
6
+ onChange,
7
+ });
8
+ return {
9
+ activeIndex,
10
+ setActiveIndex,
11
+ };
12
+ };
@@ -5,7 +5,6 @@ export interface TabsKeyboardEvent {
5
5
  }
6
6
  export interface TabKeyboardItem {
7
7
  disabled?: boolean;
8
- focus?: () => void;
9
8
  props?: {
10
9
  disabled?: boolean;
11
10
  };
@@ -15,8 +14,9 @@ export interface UseTabsKeyboardParams<TItem extends TabKeyboardItem> {
15
14
  setActiveIndex: (index: number) => void;
16
15
  tabRefs: MutableRefObject<(TItem | null)[]>;
17
16
  orientation: 'horizontal' | 'vertical';
17
+ onNavigate?: (index: number) => void;
18
18
  }
19
- export declare const useTabsKeyboard: <TItem extends TabKeyboardItem>({ activeIndex, setActiveIndex, tabRefs, orientation, }: UseTabsKeyboardParams<TItem>) => {
19
+ export declare const useTabsKeyboard: <TItem extends TabKeyboardItem>({ activeIndex, setActiveIndex, tabRefs, orientation, onNavigate, }: UseTabsKeyboardParams<TItem>) => {
20
20
  onKeyDown: (event: TabsKeyboardEvent) => void;
21
21
  };
22
22
  //# sourceMappingURL=useTabsKeyboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTabsKeyboard.d.ts","sourceRoot":"","sources":["../src/useTabsKeyboard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB,CAAC,KAAK,SAAS,eAAe;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,gBAAgB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,WAAW,EAAE,YAAY,GAAG,UAAU,CAAC;CACxC;AAED,eAAO,MAAM,eAAe,GAAI,KAAK,SAAS,eAAe,EAAE,wDAK5D,qBAAqB,CAAC,KAAK,CAAC;uBAEnB,iBAAiB;CAiG5B,CAAC"}
1
+ {"version":3,"file":"useTabsKeyboard.d.ts","sourceRoot":"","sources":["../src/useTabsKeyboard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB,CAAC,KAAK,SAAS,eAAe;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,gBAAgB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,WAAW,EAAE,YAAY,GAAG,UAAU,CAAC;IACvC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,eAAO,MAAM,eAAe,GAAI,KAAK,SAAS,eAAe,EAAE,oEAM5D,qBAAqB,CAAC,KAAK,CAAC;uBAEnB,iBAAiB;CAiG5B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { useCallback } from 'react';
2
- export const useTabsKeyboard = ({ activeIndex, setActiveIndex, tabRefs, orientation = 'horizontal', }) => {
2
+ export const useTabsKeyboard = ({ activeIndex, setActiveIndex, tabRefs, orientation = 'horizontal', onNavigate, }) => {
3
3
  const onKeyDown = useCallback((event) => {
4
4
  const isTabDisabled = (tab) => {
5
5
  return Boolean(tab?.disabled || tab?.props?.disabled);
@@ -72,8 +72,8 @@ export const useTabsKeyboard = ({ activeIndex, setActiveIndex, tabRefs, orientat
72
72
  }
73
73
  if (nextIndex !== activeIndex) {
74
74
  setActiveIndex(nextIndex);
75
- tabRefs.current[nextIndex]?.focus?.();
75
+ onNavigate?.(nextIndex);
76
76
  }
77
- }, [activeIndex, orientation, setActiveIndex, tabRefs]);
77
+ }, [activeIndex, onNavigate, orientation, setActiveIndex, tabRefs]);
78
78
  return { onKeyDown };
79
79
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellira-ui/core",
3
- "version": "2.25.0",
3
+ "version": "2.26.0",
4
4
  "description": "Shared logic and hooks for Vellira Design System",
5
5
  "author": "Roman Bakurov",
6
6
  "license": "MIT",