@bccampus/ui-components 0.7.2 → 0.8.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/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +0 -2
- package/dist/_chunks/createLucideIcon.js +11 -10
- package/dist/_chunks/index.js +2 -2
- package/dist/_chunks/index4.js +2 -2
- package/dist/components/index.js +18 -13
- package/dist/components/ui/composite/CompositeData.d.ts +9 -8
- package/dist/components/ui/composite/CompositeData.js +20 -14
- package/dist/components/ui/composite/{FocusProvider/AbstractFocusProvider.d.ts → FocusManager/AbstractFocusManager.d.ts} +2 -19
- package/dist/components/ui/composite/{FocusProvider/AbstractFocusProvider.js → FocusManager/AbstractFocusManager.js} +16 -5
- package/dist/components/ui/composite/{FocusProvider/ListboxFocusProvider.d.ts → FocusManager/ListboxFocusManager.d.ts} +2 -2
- package/dist/components/ui/composite/{FocusProvider/ListboxFocusProvider.js → FocusManager/ListboxFocusManager.js} +3 -3
- package/dist/components/ui/composite/FocusManager/index.d.ts +3 -0
- package/dist/components/ui/composite/FocusManager/index.js +6 -0
- package/dist/components/ui/composite/FocusManager/types.d.ts +20 -0
- package/dist/components/ui/composite/FocusManager/types.js +1 -0
- package/dist/components/ui/composite/{SelectionProvider/AbstractSelectionProvider.d.ts → SelectionManager/AbstractSelectionManager.d.ts} +5 -20
- package/dist/components/ui/composite/{SelectionProvider/AbstractSelectionProvider.js → SelectionManager/AbstractSelectionManager.js} +8 -4
- package/dist/components/ui/composite/{SelectionProvider/MultipleSelectionProvider.d.ts → SelectionManager/MultipleSelectionManager.d.ts} +3 -2
- package/dist/components/ui/composite/{SelectionProvider/MultipleSelectionProvider.js → SelectionManager/MultipleSelectionManager.js} +4 -3
- package/dist/components/ui/composite/{SelectionProvider/SingleSelectionProvider.d.ts → SelectionManager/SingleSelectionManager.d.ts} +3 -2
- package/dist/components/ui/composite/{SelectionProvider/SingleSelectionProvider.js → SelectionManager/SingleSelectionManager.js} +6 -5
- package/dist/components/ui/composite/SelectionManager/index.d.ts +4 -0
- package/dist/components/ui/composite/SelectionManager/index.js +8 -0
- package/dist/components/ui/composite/SelectionManager/types.d.ts +19 -0
- package/dist/components/ui/composite/SelectionManager/types.js +1 -0
- package/dist/components/ui/composite/components/composite-component.d.ts +2 -0
- package/dist/components/ui/composite/{composite-component.js → components/composite-component.js} +16 -38
- package/dist/components/ui/composite/components/index.d.ts +5 -0
- package/dist/components/ui/composite/components/index.js +10 -0
- package/dist/components/ui/composite/{listbox.d.ts → components/listbox.d.ts} +1 -1
- package/dist/components/ui/composite/{listbox.js → components/listbox.js} +17 -12
- package/dist/components/ui/composite/components/types.d.ts +53 -0
- package/dist/components/ui/composite/components/types.js +1 -0
- package/dist/components/ui/composite/components/utils.d.ts +1 -0
- package/dist/components/ui/composite/components/utils.js +8 -0
- package/dist/components/ui/composite/create-composite-data.d.ts +80 -0
- package/dist/components/ui/composite/create-composite-data.js +22 -0
- package/dist/components/ui/composite/index.d.ts +4 -5
- package/dist/components/ui/composite/index.js +18 -13
- package/dist/components/ui/composite/types.d.ts +5 -67
- package/dist/components/ui/navigation-menu.js +1 -1
- package/dist/components/ui/popover.js +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +3 -1
- package/eslint.config.js +1 -1
- package/package.json +17 -16
- package/src/components/ui/composite/CompositeData.ts +38 -30
- package/src/components/ui/composite/{FocusProvider/AbstractFocusProvider.ts → FocusManager/AbstractFocusManager.ts} +19 -26
- package/src/components/ui/composite/{FocusProvider/ListboxFocusProvider.ts → FocusManager/ListboxFocusManager.ts} +2 -2
- package/src/components/ui/composite/FocusManager/index.ts +3 -0
- package/src/components/ui/composite/FocusManager/types.ts +23 -0
- package/src/components/ui/composite/{SelectionProvider/AbstractSelectionProvider.ts → SelectionManager/AbstractSelectionManager.ts} +13 -28
- package/src/components/ui/composite/{SelectionProvider/MultipleSelectionProvider.ts → SelectionManager/MultipleSelectionManager.ts} +4 -2
- package/src/components/ui/composite/{SelectionProvider/SingleSelectionProvider.ts → SelectionManager/SingleSelectionManager.ts} +6 -4
- package/src/components/ui/composite/SelectionManager/index.ts +4 -0
- package/src/components/ui/composite/SelectionManager/types.ts +24 -0
- package/src/components/ui/composite/{composite-component.tsx → components/composite-component.tsx} +17 -42
- package/src/components/ui/composite/components/index.ts +5 -0
- package/src/components/ui/composite/{listbox.tsx → components/listbox.tsx} +16 -11
- package/src/components/ui/composite/components/types.ts +66 -0
- package/src/components/ui/composite/components/utils.ts +6 -0
- package/src/components/ui/composite/create-composite-data.ts +98 -0
- package/src/components/ui/composite/index.ts +7 -8
- package/src/components/ui/composite/types.ts +5 -86
- package/src/hooks/index.ts +4 -3
- package/.yarn/releases/yarn-4.10.3.cjs +0 -942
- package/dist/components/ui/composite/FocusProvider/index.d.ts +0 -2
- package/dist/components/ui/composite/FocusProvider/index.js +0 -6
- package/dist/components/ui/composite/SelectionProvider/index.d.ts +0 -3
- package/dist/components/ui/composite/SelectionProvider/index.js +0 -8
- package/dist/components/ui/composite/composite-component.d.ts +0 -2
- package/src/components/ui/composite/FocusProvider/index.ts +0 -2
- package/src/components/ui/composite/SelectionProvider/index.ts +0 -3
- /package/dist/components/ui/composite/{composite-component-item.d.ts → components/composite-component-item.d.ts} +0 -0
- /package/dist/components/ui/composite/{composite-component-item.js → components/composite-component-item.js} +0 -0
- /package/src/components/ui/composite/{composite-component-item.tsx → components/composite-component-item.tsx} +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { computed } from "nanostores";
|
|
2
|
+
import { CompositeData } from "./CompositeData";
|
|
3
|
+
import type { CompositeOptions, CompositeManagerOptions } from "./types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns nanostores object with `CompositeData` instance,
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```
|
|
10
|
+
* const items = [...];
|
|
11
|
+
* const compositeData = createCompositeData(
|
|
12
|
+
* items,
|
|
13
|
+
* {
|
|
14
|
+
* focusManager: new ListboxFocusManager(),
|
|
15
|
+
* selectionManager: new SingleSelectionManager(),
|
|
16
|
+
* },
|
|
17
|
+
* {
|
|
18
|
+
* disabledKeys: ["key 02", "key 04", "key 3023"],
|
|
19
|
+
* selectedKeys: ["key 207", "key 101", "key 3021"],
|
|
20
|
+
* itemChildrenProp: "nodes",
|
|
21
|
+
* },
|
|
22
|
+
* );
|
|
23
|
+
*
|
|
24
|
+
* export function CompositeSelectedItems() {
|
|
25
|
+
* const composite = useStore(compositeData);
|
|
26
|
+
* const selections = useStore(composite.data.selectionManager!.selectedKeys);
|
|
27
|
+
* return (
|
|
28
|
+
* <div className="py-4 flex gap-2 items-center justify-star ">
|
|
29
|
+
* <span className="text-lg font-semibold text-accent-foreground">Selected Items:</span>
|
|
30
|
+
* <div className="flex gap-2 flex-wrap items-center justify-start *:bg-blue-100 *:p-2">
|
|
31
|
+
* {[...selections].map((selectedKey) => {
|
|
32
|
+
* return <span key={selectedKey}>{composite.data.item(selectedKey)?.data.get().name}</span>;
|
|
33
|
+
* })}
|
|
34
|
+
* </div>
|
|
35
|
+
* </div>
|
|
36
|
+
* );
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export const createCompositeData = <T extends object>(
|
|
41
|
+
items: T[],
|
|
42
|
+
managerOptions: CompositeManagerOptions<T>,
|
|
43
|
+
options?: CompositeOptions,
|
|
44
|
+
) => {
|
|
45
|
+
const $store = new CompositeData(items, managerOptions, options);
|
|
46
|
+
return computed($store.version, (version) => {
|
|
47
|
+
return { data: $store, version };
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Returns nanostores object with `CompositeData` instance.
|
|
53
|
+
*
|
|
54
|
+
* Intialize the store by calling the `fetch` function without any arguments
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```
|
|
58
|
+
* const compositeAsyncData = createAsyncCompositeData(
|
|
59
|
+
* async (url?: string) => {
|
|
60
|
+
* if (!url) return undefined;
|
|
61
|
+
*
|
|
62
|
+
* const response = await fetch(url);
|
|
63
|
+
* if (response.ok) {
|
|
64
|
+
* const data = await response.json();
|
|
65
|
+
* return data.results as NamedListItem[];
|
|
66
|
+
* }
|
|
67
|
+
*
|
|
68
|
+
* return null;
|
|
69
|
+
* },
|
|
70
|
+
* {
|
|
71
|
+
* focusManager: new ListboxFocusManager(),
|
|
72
|
+
* selectionManager: new MultipleSelectionManager(),
|
|
73
|
+
* },
|
|
74
|
+
* {
|
|
75
|
+
* itemKeyProp: "name",
|
|
76
|
+
* },
|
|
77
|
+
* );
|
|
78
|
+
*
|
|
79
|
+
* export function CompositeSomethign() {
|
|
80
|
+
* const composite = useStore(compositeAsyncData);
|
|
81
|
+
* return <Listbox data={composite.data} ... />
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export const createAsyncCompositeData = <T extends object, FnArgs = never>(
|
|
86
|
+
fetch: (options?: FnArgs) => Promise<T[] | undefined | null>,
|
|
87
|
+
managerOptions: CompositeManagerOptions<T>,
|
|
88
|
+
options?: CompositeOptions,
|
|
89
|
+
) => {
|
|
90
|
+
const load = (options?: FnArgs) => {
|
|
91
|
+
fetch(options).then((items) => items && $store.setItems(items));
|
|
92
|
+
};
|
|
93
|
+
const $store = new CompositeData(null, managerOptions, options);
|
|
94
|
+
load();
|
|
95
|
+
return computed($store.version, (version) => {
|
|
96
|
+
return { data: $store, version, load };
|
|
97
|
+
});
|
|
98
|
+
};
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export type * from './types'
|
|
1
|
+
export * from "./CompositeData.ts";
|
|
2
|
+
export * from "./CompositeDataItem.ts";
|
|
3
|
+
export * from "./FocusManager/index.ts";
|
|
4
|
+
export * from "./SelectionManager/index.ts";
|
|
5
|
+
export * from "./components";
|
|
6
|
+
export * from "./create-composite-data.ts";
|
|
7
|
+
export type * from "./types";
|
|
@@ -1,33 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type { AbstractFocusProvider, FocusProvider } from "./FocusProvider/AbstractFocusProvider";
|
|
4
|
-
import type { AbstractSelectionProvider, SelectionProvider } from "./SelectionProvider/AbstractSelectionProvider";
|
|
5
|
-
import type { CompositeData } from "./CompositeData";
|
|
1
|
+
import type { AbstractFocusManager } from "./FocusManager/AbstractFocusManager";
|
|
2
|
+
import type { AbstractSelectionManager } from "./SelectionManager/AbstractSelectionManager";
|
|
6
3
|
|
|
7
4
|
export type CompositeItemKey = string | number;
|
|
8
5
|
|
|
9
|
-
export type CompositeRoles =
|
|
10
|
-
| {
|
|
11
|
-
variant: "listbox";
|
|
12
|
-
rootRole?: never;
|
|
13
|
-
itemRole?: never;
|
|
14
|
-
groupRole?: never;
|
|
15
|
-
}
|
|
16
|
-
| {
|
|
17
|
-
variant: "grid";
|
|
18
|
-
rootRole?: never;
|
|
19
|
-
itemRole?: never;
|
|
20
|
-
groupRole?: never;
|
|
21
|
-
}
|
|
22
|
-
| {
|
|
23
|
-
variant: "custom";
|
|
24
|
-
rootRole: AriaRole;
|
|
25
|
-
itemRole: AriaRole;
|
|
26
|
-
groupRole: AriaRole;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export type InitialFocusTarget = "None" | "LastFocusedItem" | "SelectedItem" | "FirstItem";
|
|
30
|
-
|
|
31
6
|
export interface CompositeOptions {
|
|
32
7
|
disabledKeys?: CompositeItemKey[];
|
|
33
8
|
selectedKeys?: CompositeItemKey[];
|
|
@@ -41,9 +16,9 @@ interface CompositeDataPropGetters<T> {
|
|
|
41
16
|
getItemChildren: (item: T) => T[] | undefined;
|
|
42
17
|
}
|
|
43
18
|
|
|
44
|
-
export interface
|
|
45
|
-
|
|
46
|
-
|
|
19
|
+
export interface CompositeManagerOptions<T extends object> {
|
|
20
|
+
focusManager: AbstractFocusManager<T>;
|
|
21
|
+
selectionManager?: AbstractSelectionManager<T>;
|
|
47
22
|
}
|
|
48
23
|
|
|
49
24
|
export type CompositeDataOptions<T> = Required<CompositeOptions> & CompositeDataPropGetters<T>;
|
|
@@ -58,59 +33,3 @@ export interface CompositeDataItemState {
|
|
|
58
33
|
selected: boolean;
|
|
59
34
|
disabled: boolean;
|
|
60
35
|
}
|
|
61
|
-
|
|
62
|
-
export interface CompositeEventHandlers {
|
|
63
|
-
mouseEventHandler?: MouseEventHandler<HTMLElement>;
|
|
64
|
-
keyboardEventHandler?: KeyboardEventHandler<HTMLElement>;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export interface CompositeItemEventHandlerFunctions<T extends object> {
|
|
68
|
-
itemMouseEventHandler?: (itemAtom: CompositeDataItem<T>) => void;
|
|
69
|
-
itemKeyboardEventHandler?: (itemAtom: CompositeDataItem<T>) => void;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface BaseCompositeProps<T extends object> extends React.ComponentPropsWithoutRef<"div"> {
|
|
73
|
-
data: CompositeData<T>;
|
|
74
|
-
className?: string;
|
|
75
|
-
rootRef?: React.RefObject<HTMLDivElement | null>;
|
|
76
|
-
handleRef?: React.RefObject<CompositeHandle<T> | null>;
|
|
77
|
-
|
|
78
|
-
renderItem: CompositeItemRenderFn<T>;
|
|
79
|
-
itemClassName?: string;
|
|
80
|
-
|
|
81
|
-
initialFocus?: InitialFocusTarget;
|
|
82
|
-
/**
|
|
83
|
-
* Set `item.focused = true`, but not focus on the HTMLElement
|
|
84
|
-
*/
|
|
85
|
-
softFocus?: boolean;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export type CompositeProps<T extends object> = BaseCompositeProps<T> &
|
|
89
|
-
CompositeItemEventHandlerFunctions<T> &
|
|
90
|
-
CompositeRoles;
|
|
91
|
-
|
|
92
|
-
export interface CompositeHandle<T extends object> {
|
|
93
|
-
focusProvider: FocusProvider<T>;
|
|
94
|
-
focusElement: () => void;
|
|
95
|
-
selectionProvider?: SelectionProvider<T>;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export type CompositeItemRenderFn<T extends object> = (
|
|
99
|
-
item: { data: T; level: number; key: CompositeItemKey },
|
|
100
|
-
state: CompositeDataItemState,
|
|
101
|
-
eventHandlers: CompositeEventHandlers,
|
|
102
|
-
) => ReactNode;
|
|
103
|
-
|
|
104
|
-
export interface CompositeItemProps<T extends object> extends CompositeItemEventHandlerFunctions<T> {
|
|
105
|
-
id: string;
|
|
106
|
-
className?: string;
|
|
107
|
-
role?: AriaRole;
|
|
108
|
-
groupRole?: AriaRole;
|
|
109
|
-
|
|
110
|
-
item: CompositeDataItem<T>;
|
|
111
|
-
|
|
112
|
-
remove?: () => void;
|
|
113
|
-
render: CompositeItemRenderFn<T>;
|
|
114
|
-
|
|
115
|
-
softFocus?: boolean;
|
|
116
|
-
}
|
package/src/hooks/index.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
1
|
+
export * from "./use-effect-after-mount";
|
|
2
|
+
export * from "./use-id";
|
|
3
|
+
export * from "./use-keyboard-event";
|
|
4
|
+
export * from "./use-required-ref";
|