@bccampus/ui-components 0.4.2 → 0.5.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/_chunks/CompositeDataItem.js +204 -0
- package/dist/_chunks/createLucideIcon.js +103 -0
- package/dist/_chunks/index.js +125 -0
- package/dist/_chunks/index2.js +44 -0
- package/dist/_chunks/index3.js +533 -0
- package/dist/{utils-CRiPKpXj.js → _chunks/utils.js} +754 -526
- package/dist/components/index.d.ts +16 -0
- package/dist/components/index.js +84 -0
- package/dist/components/ui/banner.d.ts +10 -0
- package/dist/components/ui/banner.js +45 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/{button.js → components/ui/button.js} +11 -10
- package/dist/components/ui/card.d.ts +27 -0
- package/dist/components/ui/card.js +109 -0
- package/dist/components/ui/composite/CompositeData.d.ts +20 -0
- package/dist/components/ui/composite/CompositeData.js +89 -0
- package/dist/components/ui/composite/CompositeDataItem.d.ts +28 -0
- package/dist/components/ui/composite/CompositeDataItem.js +5 -0
- package/dist/components/ui/composite/FocusProvider/AbstractFocusProvider.d.ts +41 -0
- package/dist/components/ui/composite/FocusProvider/AbstractFocusProvider.js +35 -0
- package/dist/components/ui/composite/FocusProvider/ListboxFocusProvider.d.ts +16 -0
- package/dist/components/ui/composite/FocusProvider/ListboxFocusProvider.js +67 -0
- package/dist/components/ui/composite/FocusProvider/index.d.ts +2 -0
- package/dist/components/ui/composite/FocusProvider/index.js +6 -0
- package/dist/components/ui/composite/SelectionProvider/AbstractSelectionProvider.d.ts +23 -0
- package/dist/components/ui/composite/SelectionProvider/AbstractSelectionProvider.js +20 -0
- package/dist/components/ui/composite/SelectionProvider/MultipleSelectionProvider.d.ts +9 -0
- package/dist/components/ui/composite/SelectionProvider/MultipleSelectionProvider.js +20 -0
- package/dist/components/ui/composite/SelectionProvider/SingleSelectionProvider.d.ts +9 -0
- package/dist/components/ui/composite/SelectionProvider/SingleSelectionProvider.js +25 -0
- package/dist/components/ui/composite/SelectionProvider/index.d.ts +3 -0
- package/dist/components/ui/composite/SelectionProvider/index.js +8 -0
- package/dist/components/ui/composite/composite-component-item.d.ts +2 -0
- package/dist/components/ui/composite/composite-component-item.js +74 -0
- package/dist/components/ui/composite/composite-component.d.ts +2 -0
- package/dist/components/ui/composite/composite-component.js +66 -0
- package/dist/components/ui/composite/index.d.ts +7 -0
- package/dist/components/ui/composite/index.js +22 -0
- package/dist/components/ui/composite/listbox.d.ts +2 -0
- package/dist/components/ui/composite/listbox.js +58 -0
- package/dist/components/ui/composite/types.d.ts +82 -0
- package/dist/components/ui/composite/types.js +1 -0
- package/dist/components/ui/horizontal-list.d.ts +10 -0
- package/dist/components/ui/horizontal-list.js +82 -0
- package/dist/components/ui/icon-generator/generate-tiles.d.ts +4 -0
- package/dist/components/ui/icon-generator/generate-tiles.js +223 -0
- package/dist/components/ui/icon-generator/icon-generator.d.ts +3 -0
- package/dist/components/ui/icon-generator/icon-generator.js +82 -0
- package/dist/components/ui/icon-generator/index.d.ts +4 -0
- package/dist/components/ui/icon-generator/index.js +11 -0
- package/dist/components/ui/icon-generator/masked-image-generator.d.ts +3 -0
- package/dist/components/ui/icon-generator/masked-image-generator.js +31 -0
- package/dist/{masked-image-generator.d.ts → components/ui/icon-generator/types.d.ts} +48 -58
- package/dist/components/ui/icon-generator/types.js +30 -0
- package/dist/components/ui/input.d.ts +3 -0
- package/dist/{input.js → components/ui/input.js} +8 -8
- package/dist/components/ui/navigation-menu.d.ts +16 -0
- package/dist/components/ui/navigation-menu.js +1041 -0
- package/dist/components/ui/overlay.d.ts +7 -0
- package/dist/{overlay.js → components/ui/overlay.js} +7 -7
- package/dist/components/ui/page-header.d.ts +5 -0
- package/dist/{page-header.js → components/ui/page-header.js} +189 -181
- package/dist/components/ui/page-section.d.ts +8 -0
- package/dist/{page-section.js → components/ui/page-section.js} +7 -7
- package/dist/components/ui/page.d.ts +3 -0
- package/dist/components/ui/page.js +8 -0
- package/dist/components/ui/popover.d.ts +7 -0
- package/dist/components/ui/popover.js +3532 -0
- package/dist/components/ui/search-input.d.ts +3 -0
- package/dist/components/ui/search-input.js +24 -0
- package/dist/components/ui/tag.d.ts +10 -0
- package/dist/{tag.js → components/ui/tag.js} +10 -9
- package/dist/components/ui/typography/caption.d.ts +8 -0
- package/dist/components/ui/typography/caption.js +28 -0
- package/dist/components/ui/typography/index.d.ts +1 -0
- package/dist/components/ui/typography/index.js +5 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +9 -0
- package/dist/hooks/use-effect-after-mount.d.ts +2 -0
- package/dist/hooks/use-effect-after-mount.js +24 -0
- package/dist/hooks/use-id.d.ts +1 -0
- package/dist/hooks/use-id.js +7 -0
- package/dist/hooks/use-keyboard-event.d.ts +59 -0
- package/dist/hooks/use-keyboard-event.js +52 -0
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.js +16 -0
- package/dist/lib/object.d.ts +5 -0
- package/dist/lib/object.js +38 -0
- package/dist/lib/set-operations.d.ts +5 -0
- package/dist/lib/set-operations.js +51 -0
- package/dist/{utils.d.ts → lib/utils.d.ts} +2 -5
- package/dist/lib/utils.js +4 -0
- package/package.json +9 -76
- package/src/components/index.ts +17 -0
- package/src/components/ui/composite/FocusProvider/index.ts +2 -0
- package/src/components/ui/composite/SelectionProvider/MultipleSelectionProvider.ts +1 -1
- package/src/components/ui/composite/SelectionProvider/index.ts +3 -0
- package/src/components/ui/composite/index.ts +5 -5
- package/src/components/ui/icon-generator/index.ts +2 -0
- package/src/components/ui/typography/index.ts +1 -0
- package/src/hooks/index.ts +3 -0
- package/src/index.ts +3 -0
- package/src/lib/index.ts +3 -0
- package/tsconfig.lib.json +44 -0
- package/vite.config.ts +28 -31
- package/dist/AbstractFocusProvider-CxvlcEki.js +0 -29
- package/dist/AbstractSelectionProvider-BtaROstC.js +0 -30
- package/dist/CompositeDataItem-DuHOHCWy.js +0 -158
- package/dist/ListboxFocusProvider.d.ts +0 -149
- package/dist/ListboxFocusProvider.js +0 -53
- package/dist/MultipleSelectionProvider.d.ts +0 -141
- package/dist/MultipleSelectionProvider.js +0 -19
- package/dist/SingleSelectionProvider.d.ts +0 -141
- package/dist/SingleSelectionProvider.js +0 -23
- package/dist/banner.d.ts +0 -16
- package/dist/banner.js +0 -42
- package/dist/button.d.ts +0 -17
- package/dist/caption.d.ts +0 -13
- package/dist/caption.js +0 -27
- package/dist/card.d.ts +0 -46
- package/dist/card.js +0 -108
- package/dist/composite-component-DSUbd1XS.js +0 -122
- package/dist/composite.d.ts +0 -208
- package/dist/composite.js +0 -82
- package/dist/createLucideIcon-CzehbSja.js +0 -94
- package/dist/generate-tiles-DuagGD1d.js +0 -244
- package/dist/generate-tiles.d.ts +0 -43
- package/dist/generate-tiles.js +0 -7
- package/dist/horizontal-list.d.ts +0 -16
- package/dist/horizontal-list.js +0 -77
- package/dist/icon-generator-tuhuqdpL.js +0 -76
- package/dist/icon-generator.d.ts +0 -58
- package/dist/icon-generator.js +0 -6
- package/dist/index-CQhYMnjT.js +0 -34
- package/dist/index-U7DVCmS_.js +0 -76
- package/dist/input.d.ts +0 -7
- package/dist/listbox.d.ts +0 -171
- package/dist/listbox.js +0 -76
- package/dist/masked-image-generator.js +0 -29
- package/dist/navigation-menu.d.ts +0 -27
- package/dist/navigation-menu.js +0 -1139
- package/dist/overlay.d.ts +0 -13
- package/dist/page-header.d.ts +0 -9
- package/dist/page-section.d.ts +0 -14
- package/dist/page.d.ts +0 -7
- package/dist/page.js +0 -8
- package/dist/search-input.d.ts +0 -7
- package/dist/search-input.js +0 -23
- package/dist/tag.d.ts +0 -16
- package/dist/ui-components.d.ts +0 -215
- package/dist/ui-components.js +0 -54
- package/dist/utils.js +0 -4
- package/src/assets/icons/icon_01.svg +0 -6
- package/src/assets/icons/icon_02.svg +0 -6
- package/src/assets/icons/icon_03.svg +0 -6
- package/src/assets/icons/icon_04.svg +0 -6
- package/src/assets/icons/icon_05.svg +0 -4
- package/src/assets/icons/icon_06.svg +0 -4
- package/src/assets/images/image_01.jpg +0 -0
- package/src/assets/images/image_02.jpg +0 -0
- package/src/assets/images/image_03.webp +0 -0
- package/src/assets/images/image_04.png +0 -0
- package/src/assets/images/image_05.jpg +0 -0
- package/src/assets/images/image_06.jpg +0 -0
- package/src/components/ui/index.ts +0 -15
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PreinitializedWritableAtom } from 'nanostores';
|
|
2
|
+
import { CompositeData } from '../CompositeData';
|
|
3
|
+
import { CompositeDataItem } from '../CompositeDataItem';
|
|
4
|
+
import { CompositeDataOptions, CompositeItemKey } from '../types';
|
|
5
|
+
export interface SelectionProvider {
|
|
6
|
+
select(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
7
|
+
deselect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
8
|
+
toggleSelect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class AbstractSelectionProvider<T extends object> {
|
|
11
|
+
protected data: CompositeData<T>;
|
|
12
|
+
protected dataOptions: CompositeDataOptions<T>;
|
|
13
|
+
selectedKeys: PreinitializedWritableAtom<Set<CompositeItemKey>>;
|
|
14
|
+
init(data: CompositeData<T>, dataOptions: CompositeDataOptions<T>): void;
|
|
15
|
+
abstract select(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
16
|
+
abstract select(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
17
|
+
abstract select(item?: CompositeDataItem<T> | CompositeItemKey, recursive?: boolean): void;
|
|
18
|
+
abstract deselect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
19
|
+
abstract deselect(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
20
|
+
abstract deselect(item?: CompositeDataItem<T> | CompositeItemKey, recursive?: boolean): void;
|
|
21
|
+
toggleSelect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
22
|
+
toggleSelect(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { a as atom, C as CompositeDataItem } from "../../../../_chunks/CompositeDataItem.js";
|
|
2
|
+
class AbstractSelectionProvider {
|
|
3
|
+
data;
|
|
4
|
+
dataOptions;
|
|
5
|
+
selectedKeys = atom(/* @__PURE__ */ new Set());
|
|
6
|
+
init(data, dataOptions) {
|
|
7
|
+
this.data = data;
|
|
8
|
+
this.dataOptions = dataOptions;
|
|
9
|
+
this.dataOptions.selectedKeys.forEach((selectedKey) => this.select(selectedKey));
|
|
10
|
+
}
|
|
11
|
+
toggleSelect(item, recursive = false) {
|
|
12
|
+
const _item = item ? item instanceof CompositeDataItem ? item : this.data.lookup.get(item) : this.data.focusProvider.focusedItem.get();
|
|
13
|
+
if (!_item) return;
|
|
14
|
+
if (_item.state.get().selected) this.deselect(_item, recursive);
|
|
15
|
+
else this.select(_item, recursive);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
AbstractSelectionProvider
|
|
20
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CompositeDataItem } from '../CompositeDataItem';
|
|
2
|
+
import { CompositeItemKey } from '../types';
|
|
3
|
+
import { AbstractSelectionProvider } from './AbstractSelectionProvider';
|
|
4
|
+
export declare class MultipleSelectionProvider<T extends object> extends AbstractSelectionProvider<T> {
|
|
5
|
+
select(itemKey: CompositeItemKey, recursive?: boolean): void;
|
|
6
|
+
select(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
7
|
+
deselect(itemKey: CompositeItemKey, recursive?: boolean): void;
|
|
8
|
+
deselect(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { C as CompositeDataItem } from "../../../../_chunks/CompositeDataItem.js";
|
|
2
|
+
import { AbstractSelectionProvider } from "./AbstractSelectionProvider.js";
|
|
3
|
+
import { union, difference } from "../../../../lib/set-operations.js";
|
|
4
|
+
class MultipleSelectionProvider extends AbstractSelectionProvider {
|
|
5
|
+
select(item, recursive = false) {
|
|
6
|
+
const _item = item instanceof CompositeDataItem ? item : this.data.lookup.get(item);
|
|
7
|
+
if (!_item) return;
|
|
8
|
+
const selectedKeys = _item.select(recursive);
|
|
9
|
+
this.selectedKeys.set(union(this.selectedKeys.get(), selectedKeys));
|
|
10
|
+
}
|
|
11
|
+
deselect(item, recursive = false) {
|
|
12
|
+
const _item = item instanceof CompositeDataItem ? item : this.data.lookup.get(item);
|
|
13
|
+
if (!_item) return;
|
|
14
|
+
const deselectedKeys = _item.deselect(recursive);
|
|
15
|
+
this.selectedKeys.set(difference(this.selectedKeys.get(), deselectedKeys));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
MultipleSelectionProvider
|
|
20
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CompositeDataItem } from '../CompositeDataItem';
|
|
2
|
+
import { CompositeItemKey } from '../types';
|
|
3
|
+
import { AbstractSelectionProvider } from './AbstractSelectionProvider';
|
|
4
|
+
export declare class SingleSelectionProvider<T extends object> extends AbstractSelectionProvider<T> {
|
|
5
|
+
select(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
6
|
+
select(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
7
|
+
deselect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
8
|
+
deselect(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { C as CompositeDataItem } from "../../../../_chunks/CompositeDataItem.js";
|
|
2
|
+
import { AbstractSelectionProvider } from "./AbstractSelectionProvider.js";
|
|
3
|
+
import { difference } from "../../../../lib/set-operations.js";
|
|
4
|
+
class SingleSelectionProvider extends AbstractSelectionProvider {
|
|
5
|
+
select(item, _recursive = false) {
|
|
6
|
+
const _item = item ? item instanceof CompositeDataItem ? item : this.data.lookup.get(item) : this.data.focusProvider.focusedItem.get();
|
|
7
|
+
if (!_item) return;
|
|
8
|
+
this.selectedKeys.get().forEach((selectedKey) => {
|
|
9
|
+
const _item2 = this.data.lookup.get(selectedKey);
|
|
10
|
+
if (!_item2) return;
|
|
11
|
+
_item2.deselect(false);
|
|
12
|
+
});
|
|
13
|
+
const selectedKeys = _item.select(false);
|
|
14
|
+
this.selectedKeys.set(new Set(selectedKeys));
|
|
15
|
+
}
|
|
16
|
+
deselect(item, _recursive = false) {
|
|
17
|
+
const _item = item ? item instanceof CompositeDataItem ? item : this.data.lookup.get(item) : this.data.focusProvider.focusedItem.get();
|
|
18
|
+
if (!_item) return;
|
|
19
|
+
const deselectedKeys = _item.deselect(false);
|
|
20
|
+
this.selectedKeys.set(difference(this.selectedKeys.get(), deselectedKeys));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
SingleSelectionProvider
|
|
25
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AbstractSelectionProvider } from "./AbstractSelectionProvider.js";
|
|
2
|
+
import { SingleSelectionProvider } from "./SingleSelectionProvider.js";
|
|
3
|
+
import { MultipleSelectionProvider } from "./MultipleSelectionProvider.js";
|
|
4
|
+
export {
|
|
5
|
+
AbstractSelectionProvider,
|
|
6
|
+
MultipleSelectionProvider,
|
|
7
|
+
SingleSelectionProvider
|
|
8
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useCallback, useSyncExternalStore, useMemo } from "react";
|
|
3
|
+
function listenKeys($store, keys, listener) {
|
|
4
|
+
let keysSet = new Set(keys).add(void 0);
|
|
5
|
+
return $store.listen((value, oldValue, changed) => {
|
|
6
|
+
if (keysSet.has(changed)) {
|
|
7
|
+
listener(value, oldValue, changed);
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
let emit = (snapshotRef, onChange) => (value) => {
|
|
12
|
+
if (snapshotRef.current === value) return;
|
|
13
|
+
snapshotRef.current = value;
|
|
14
|
+
onChange();
|
|
15
|
+
};
|
|
16
|
+
function useStore(store, { keys, deps = [store, keys] } = {}) {
|
|
17
|
+
let snapshotRef = useRef();
|
|
18
|
+
snapshotRef.current = store.get();
|
|
19
|
+
let subscribe = useCallback((onChange) => {
|
|
20
|
+
emit(snapshotRef, onChange)(store.value);
|
|
21
|
+
return keys?.length > 0 ? listenKeys(store, keys, emit(snapshotRef, onChange)) : store.listen(emit(snapshotRef, onChange));
|
|
22
|
+
}, deps);
|
|
23
|
+
let get = () => snapshotRef.current;
|
|
24
|
+
return useSyncExternalStore(subscribe, get, get);
|
|
25
|
+
}
|
|
26
|
+
function CompositeComponentItem({
|
|
27
|
+
id,
|
|
28
|
+
className,
|
|
29
|
+
item,
|
|
30
|
+
role,
|
|
31
|
+
itemMouseEventHandler,
|
|
32
|
+
itemKeyboardEventHandler,
|
|
33
|
+
render
|
|
34
|
+
}) {
|
|
35
|
+
const data = useStore(item.data);
|
|
36
|
+
const state = useStore(item.state);
|
|
37
|
+
const handlers = useMemo(() => {
|
|
38
|
+
if (state.disabled) return {};
|
|
39
|
+
return {
|
|
40
|
+
mouseEventHandler: () => itemMouseEventHandler?.(item),
|
|
41
|
+
keyboardEventHandler: () => itemKeyboardEventHandler?.(item)
|
|
42
|
+
};
|
|
43
|
+
}, [state.disabled, item, itemKeyboardEventHandler, itemMouseEventHandler]);
|
|
44
|
+
return /* @__PURE__ */ jsxs(
|
|
45
|
+
"div",
|
|
46
|
+
{
|
|
47
|
+
id,
|
|
48
|
+
role,
|
|
49
|
+
"aria-disabled": state.disabled,
|
|
50
|
+
"data-key": item.key,
|
|
51
|
+
tabIndex: !state.disabled ? state.focused ? 0 : -1 : void 0,
|
|
52
|
+
className,
|
|
53
|
+
children: [
|
|
54
|
+
render({ data, key: item.key, level: item.level }, state, handlers),
|
|
55
|
+
item.children && item.children.length > 0 && [...item.children].map((child) => /* @__PURE__ */ jsx(
|
|
56
|
+
CompositeComponentItem,
|
|
57
|
+
{
|
|
58
|
+
id: `${id}-${item.key}`,
|
|
59
|
+
role,
|
|
60
|
+
item: child,
|
|
61
|
+
render,
|
|
62
|
+
className,
|
|
63
|
+
itemMouseEventHandler,
|
|
64
|
+
itemKeyboardEventHandler
|
|
65
|
+
},
|
|
66
|
+
child.key
|
|
67
|
+
))
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
CompositeComponentItem
|
|
74
|
+
};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { CompositeProps } from './types';
|
|
2
|
+
export declare function CompositeComponent<T extends object>({ data, variant, rootRole, itemRole, groupRole, renderItem, className, itemClassName, ref, handleRef, id, itemMouseEventHandler, itemKeyboardEventHandler, ...props }: CompositeProps<T>): import("react").JSX.Element;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useImperativeHandle, useMemo } from "react";
|
|
3
|
+
import { CompositeComponentItem } from "./composite-component-item.js";
|
|
4
|
+
import { useId } from "../../../hooks/use-id.js";
|
|
5
|
+
const defaultRoles = {
|
|
6
|
+
listbox: {
|
|
7
|
+
rootRole: "listbox",
|
|
8
|
+
groupRole: "group",
|
|
9
|
+
itemRole: "option"
|
|
10
|
+
},
|
|
11
|
+
grid: {
|
|
12
|
+
rootRole: "grid",
|
|
13
|
+
groupRole: "rowgroup",
|
|
14
|
+
itemRole: "row"
|
|
15
|
+
},
|
|
16
|
+
custom: void 0
|
|
17
|
+
};
|
|
18
|
+
function CompositeComponent({
|
|
19
|
+
data,
|
|
20
|
+
variant,
|
|
21
|
+
rootRole,
|
|
22
|
+
itemRole,
|
|
23
|
+
groupRole,
|
|
24
|
+
renderItem,
|
|
25
|
+
className,
|
|
26
|
+
itemClassName,
|
|
27
|
+
ref,
|
|
28
|
+
handleRef,
|
|
29
|
+
id,
|
|
30
|
+
itemMouseEventHandler,
|
|
31
|
+
itemKeyboardEventHandler,
|
|
32
|
+
...props
|
|
33
|
+
}) {
|
|
34
|
+
const compositeId = useId(id);
|
|
35
|
+
useImperativeHandle(
|
|
36
|
+
handleRef,
|
|
37
|
+
() => {
|
|
38
|
+
return {
|
|
39
|
+
focusProvider: data.focusProvider,
|
|
40
|
+
selectionProvider: data.selectionProvider
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
[data]
|
|
44
|
+
);
|
|
45
|
+
const roles = useMemo(
|
|
46
|
+
() => defaultRoles[variant] ?? { rootRole, groupRole, itemRole },
|
|
47
|
+
[groupRole, itemRole, rootRole, variant]
|
|
48
|
+
);
|
|
49
|
+
return /* @__PURE__ */ jsx("div", { ref, id: compositeId, className, tabIndex: -1, role: roles.rootRole, ...props, children: [...data].map((item) => /* @__PURE__ */ jsx(
|
|
50
|
+
CompositeComponentItem,
|
|
51
|
+
{
|
|
52
|
+
className: itemClassName,
|
|
53
|
+
id: `${compositeId}-${item.key}`,
|
|
54
|
+
role: roles.itemRole,
|
|
55
|
+
groupRole: roles.groupRole,
|
|
56
|
+
item,
|
|
57
|
+
render: renderItem,
|
|
58
|
+
itemMouseEventHandler,
|
|
59
|
+
itemKeyboardEventHandler
|
|
60
|
+
},
|
|
61
|
+
item.key
|
|
62
|
+
)) });
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
CompositeComponent
|
|
66
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './CompositeData.ts';
|
|
2
|
+
export * from './CompositeDataItem.ts';
|
|
3
|
+
export * from './FocusProvider';
|
|
4
|
+
export * from './SelectionProvider';
|
|
5
|
+
export * from './composite-component.tsx';
|
|
6
|
+
export * from './composite-component-item.tsx';
|
|
7
|
+
export * from './listbox.tsx';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CompositeData } from "./CompositeData.js";
|
|
2
|
+
import { C } from "../../../_chunks/CompositeDataItem.js";
|
|
3
|
+
import { AbstractFocusProvider } from "./FocusProvider/AbstractFocusProvider.js";
|
|
4
|
+
import { ListboxFocusProvider } from "./FocusProvider/ListboxFocusProvider.js";
|
|
5
|
+
import { AbstractSelectionProvider } from "./SelectionProvider/AbstractSelectionProvider.js";
|
|
6
|
+
import { SingleSelectionProvider } from "./SelectionProvider/SingleSelectionProvider.js";
|
|
7
|
+
import { MultipleSelectionProvider } from "./SelectionProvider/MultipleSelectionProvider.js";
|
|
8
|
+
import { CompositeComponent } from "./composite-component.js";
|
|
9
|
+
import { CompositeComponentItem } from "./composite-component-item.js";
|
|
10
|
+
import { Listbox } from "./listbox.js";
|
|
11
|
+
export {
|
|
12
|
+
AbstractFocusProvider,
|
|
13
|
+
AbstractSelectionProvider,
|
|
14
|
+
CompositeComponent,
|
|
15
|
+
CompositeComponentItem,
|
|
16
|
+
CompositeData,
|
|
17
|
+
C as CompositeDataItem,
|
|
18
|
+
Listbox,
|
|
19
|
+
ListboxFocusProvider,
|
|
20
|
+
MultipleSelectionProvider,
|
|
21
|
+
SingleSelectionProvider
|
|
22
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { CompositeComponent } from "./composite-component.js";
|
|
3
|
+
import { useRef, useCallback } from "react";
|
|
4
|
+
import { useKeyboardEvent } from "../../../hooks/use-keyboard-event.js";
|
|
5
|
+
function Listbox({ data, ...props }) {
|
|
6
|
+
const compositeRef = useRef(null);
|
|
7
|
+
const focusElement = useCallback(() => {
|
|
8
|
+
const itemKey = data.focusProvider.focusedItem.get()?.key;
|
|
9
|
+
if (itemKey && compositeRef.current) {
|
|
10
|
+
const focusedItemEl = compositeRef.current.querySelector(`[data-key="${itemKey}"]`);
|
|
11
|
+
if (focusedItemEl) focusedItemEl.focus();
|
|
12
|
+
}
|
|
13
|
+
}, [data]);
|
|
14
|
+
const handleKeyboardEvent = useKeyboardEvent({
|
|
15
|
+
ArrowUp: () => {
|
|
16
|
+
data.focusProvider.focusUp();
|
|
17
|
+
focusElement();
|
|
18
|
+
},
|
|
19
|
+
ArrowDown: () => {
|
|
20
|
+
data.focusProvider.focusDown();
|
|
21
|
+
focusElement();
|
|
22
|
+
},
|
|
23
|
+
Home: () => {
|
|
24
|
+
data.focusProvider.focusToFirst();
|
|
25
|
+
focusElement();
|
|
26
|
+
},
|
|
27
|
+
End: () => {
|
|
28
|
+
data.focusProvider.focusToLast();
|
|
29
|
+
focusElement();
|
|
30
|
+
},
|
|
31
|
+
Space: () => {
|
|
32
|
+
data.selectionProvider?.toggleSelect();
|
|
33
|
+
focusElement();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const handleItemMouseEvent = useCallback(
|
|
37
|
+
(item) => {
|
|
38
|
+
data.focusProvider.focus(item.key);
|
|
39
|
+
data.selectionProvider?.toggleSelect(item);
|
|
40
|
+
focusElement();
|
|
41
|
+
},
|
|
42
|
+
[data.focusProvider, data.selectionProvider, focusElement]
|
|
43
|
+
);
|
|
44
|
+
return /* @__PURE__ */ jsx(
|
|
45
|
+
CompositeComponent,
|
|
46
|
+
{
|
|
47
|
+
ref: compositeRef,
|
|
48
|
+
variant: "listbox",
|
|
49
|
+
data,
|
|
50
|
+
onKeyDown: handleKeyboardEvent,
|
|
51
|
+
itemMouseEventHandler: handleItemMouseEvent,
|
|
52
|
+
...props
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
Listbox
|
|
58
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { AriaRole, KeyboardEventHandler, MouseEventHandler, ReactNode } from 'react';
|
|
2
|
+
import { CompositeDataItem } from './CompositeDataItem';
|
|
3
|
+
import { AbstractFocusProvider, FocusProvider } from './FocusProvider/AbstractFocusProvider';
|
|
4
|
+
import { AbstractSelectionProvider, SelectionProvider } from './SelectionProvider/AbstractSelectionProvider';
|
|
5
|
+
import { CompositeData } from './CompositeData';
|
|
6
|
+
export type CompositeItemKey = string | number;
|
|
7
|
+
export type CompositeRoles = {
|
|
8
|
+
variant: 'listbox';
|
|
9
|
+
rootRole?: never;
|
|
10
|
+
itemRole?: never;
|
|
11
|
+
groupRole?: never;
|
|
12
|
+
} | {
|
|
13
|
+
variant: 'grid';
|
|
14
|
+
rootRole?: never;
|
|
15
|
+
itemRole?: never;
|
|
16
|
+
groupRole?: never;
|
|
17
|
+
} | {
|
|
18
|
+
variant: 'custom';
|
|
19
|
+
rootRole: AriaRole;
|
|
20
|
+
itemRole: AriaRole;
|
|
21
|
+
groupRole: AriaRole;
|
|
22
|
+
};
|
|
23
|
+
export interface CompositeOptions {
|
|
24
|
+
disabledKeys?: CompositeItemKey[];
|
|
25
|
+
selectedKeys?: CompositeItemKey[];
|
|
26
|
+
itemKeyProp?: string;
|
|
27
|
+
itemChildrenProp?: string;
|
|
28
|
+
}
|
|
29
|
+
interface CompositeDataPropGetters<T> {
|
|
30
|
+
getItemKey: (item: T) => CompositeItemKey;
|
|
31
|
+
getItemChildren: (item: T) => T[] | undefined;
|
|
32
|
+
}
|
|
33
|
+
export interface CompositeProviderOptions<T extends object> {
|
|
34
|
+
focusProvider: AbstractFocusProvider<T>;
|
|
35
|
+
selectionProvider?: AbstractSelectionProvider<T>;
|
|
36
|
+
}
|
|
37
|
+
export type CompositeDataOptions<T> = Required<CompositeOptions> & CompositeDataPropGetters<T>;
|
|
38
|
+
export type CompositeDataItemOptions<T> = CompositeDataPropGetters<T> & {
|
|
39
|
+
initialState?: CompositeDataItemState;
|
|
40
|
+
itemChildrenProp: string;
|
|
41
|
+
};
|
|
42
|
+
export interface CompositeDataItemState {
|
|
43
|
+
focused: boolean;
|
|
44
|
+
selected: boolean;
|
|
45
|
+
disabled: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface CompositeEventHandlers {
|
|
48
|
+
mouseEventHandler?: MouseEventHandler<HTMLElement>;
|
|
49
|
+
keyboardEventHandler?: KeyboardEventHandler<HTMLElement>;
|
|
50
|
+
}
|
|
51
|
+
export interface CompositeItemEventHandlerFunctions<T extends object> {
|
|
52
|
+
itemMouseEventHandler?: (itemAtom: CompositeDataItem<T>) => void;
|
|
53
|
+
itemKeyboardEventHandler?: (itemAtom: CompositeDataItem<T>) => void;
|
|
54
|
+
}
|
|
55
|
+
export interface BaseCompositeProps<T extends object> extends React.ComponentPropsWithoutRef<"div"> {
|
|
56
|
+
data: CompositeData<T>;
|
|
57
|
+
className?: string;
|
|
58
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
59
|
+
handleRef?: React.Ref<CompositeHandle>;
|
|
60
|
+
renderItem: CompositeItemRenderFn<T>;
|
|
61
|
+
itemClassName?: string;
|
|
62
|
+
}
|
|
63
|
+
export type CompositeProps<T extends object> = BaseCompositeProps<T> & CompositeItemEventHandlerFunctions<T> & CompositeRoles;
|
|
64
|
+
export interface CompositeHandle {
|
|
65
|
+
focusProvider: FocusProvider;
|
|
66
|
+
selectionProvider?: SelectionProvider;
|
|
67
|
+
}
|
|
68
|
+
export type CompositeItemRenderFn<T extends object> = (item: {
|
|
69
|
+
data: T;
|
|
70
|
+
level: number;
|
|
71
|
+
key: CompositeItemKey;
|
|
72
|
+
}, state: CompositeDataItemState, eventHandlers: CompositeEventHandlers) => ReactNode;
|
|
73
|
+
export interface CompositeItemProps<T extends object> extends CompositeItemEventHandlerFunctions<T> {
|
|
74
|
+
id: string;
|
|
75
|
+
className?: string;
|
|
76
|
+
role?: AriaRole;
|
|
77
|
+
groupRole?: AriaRole;
|
|
78
|
+
item: CompositeDataItem<T>;
|
|
79
|
+
remove?: () => void;
|
|
80
|
+
render: CompositeItemRenderFn<T>;
|
|
81
|
+
}
|
|
82
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { VariantProps } from 'class-variance-authority';
|
|
2
|
+
declare const horizontalListVariants: (props?: ({
|
|
3
|
+
variant?: "overflow" | "contain" | null | undefined;
|
|
4
|
+
} & import('class-variance-authority/dist/types').ClassProp) | undefined) => string;
|
|
5
|
+
export interface HorizontalListProps extends VariantProps<typeof horizontalListVariants>, React.ComponentProps<"div"> {
|
|
6
|
+
toolbarLocation?: "bottom" | "top";
|
|
7
|
+
scrollBy?: number;
|
|
8
|
+
}
|
|
9
|
+
declare function HorizontalList({ variant, className, children, toolbarLocation, scrollBy, ...props }: HorizontalListProps): import("react").JSX.Element;
|
|
10
|
+
export { HorizontalList };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { c as cn } from "../../_chunks/utils.js";
|
|
3
|
+
import { Button } from "./button.js";
|
|
4
|
+
import { useRef, useCallback } from "react";
|
|
5
|
+
import { c as cva } from "../../_chunks/index2.js";
|
|
6
|
+
import { c as createLucideIcon } from "../../_chunks/createLucideIcon.js";
|
|
7
|
+
/**
|
|
8
|
+
* @license lucide-react v0.544.0 - ISC
|
|
9
|
+
*
|
|
10
|
+
* This source code is licensed under the ISC license.
|
|
11
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
12
|
+
*/
|
|
13
|
+
const __iconNode$1 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
|
|
14
|
+
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1);
|
|
15
|
+
/**
|
|
16
|
+
* @license lucide-react v0.544.0 - ISC
|
|
17
|
+
*
|
|
18
|
+
* This source code is licensed under the ISC license.
|
|
19
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
20
|
+
*/
|
|
21
|
+
const __iconNode = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
|
|
22
|
+
const ChevronRight = createLucideIcon("chevron-right", __iconNode);
|
|
23
|
+
const horizontalListVariants = cva(
|
|
24
|
+
"scrollbar-hidden overscroll-x-contain flex flex-row flex-nowrap py-1 gap-(--gap-card) overflow-x-auto snap-x snap-mandatory touch-pan-x scroll-smooth *:shrink-0 *:grow-0 *:snap-center *:select-none",
|
|
25
|
+
{
|
|
26
|
+
variants: {
|
|
27
|
+
variant: {
|
|
28
|
+
contain: "w-full ",
|
|
29
|
+
overflow: "w-screen px-(--spacing-section) -ms-(--spacing-section) scroll-px-(--spacing-section)"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
defaultVariants: {
|
|
33
|
+
variant: "contain"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
function HorizontalList({
|
|
38
|
+
variant,
|
|
39
|
+
className,
|
|
40
|
+
children,
|
|
41
|
+
toolbarLocation = "bottom",
|
|
42
|
+
scrollBy = 360,
|
|
43
|
+
...props
|
|
44
|
+
}) {
|
|
45
|
+
const containerRef = useRef(null);
|
|
46
|
+
const scrollLeft = useCallback(() => {
|
|
47
|
+
containerRef.current?.scrollBy({ left: -scrollBy });
|
|
48
|
+
}, [scrollBy]);
|
|
49
|
+
const scrollRight = useCallback(() => {
|
|
50
|
+
containerRef.current?.scrollBy({ left: scrollBy });
|
|
51
|
+
}, [scrollBy]);
|
|
52
|
+
return /* @__PURE__ */ jsxs(
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
className: cn("flex gap-4", {
|
|
56
|
+
"flex-col": toolbarLocation === "bottom",
|
|
57
|
+
"flex-col-reverse": toolbarLocation === "top"
|
|
58
|
+
}),
|
|
59
|
+
children: [
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
ref: containerRef,
|
|
64
|
+
className: cn(
|
|
65
|
+
horizontalListVariants({ variant }),
|
|
66
|
+
className
|
|
67
|
+
),
|
|
68
|
+
...props,
|
|
69
|
+
children
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-center sm:justify-start", children: [
|
|
73
|
+
/* @__PURE__ */ jsx(Button, { size: "icon", variant: "ghost", className: "rounded-full", onClick: scrollLeft, children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-9" }) }),
|
|
74
|
+
/* @__PURE__ */ jsx(Button, { size: "icon", variant: "ghost", className: "rounded-full", onClick: scrollRight, children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-9" }) })
|
|
75
|
+
] })
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
HorizontalList
|
|
82
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { TileConfig, TileShape } from './types';
|
|
3
|
+
export declare const generateIconPattern: (width: number, height: number, tileConfig: TileShape | TileConfig) => (TileShape | TileConfig)[][];
|
|
4
|
+
export declare const generateTiles: (pattern: (TileShape | TileConfig)[][], tileSize: number, tileClassName?: string) => (JSX.Element | null)[];
|