@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.
Files changed (165) hide show
  1. package/dist/_chunks/CompositeDataItem.js +204 -0
  2. package/dist/_chunks/createLucideIcon.js +103 -0
  3. package/dist/_chunks/index.js +125 -0
  4. package/dist/_chunks/index2.js +44 -0
  5. package/dist/_chunks/index3.js +533 -0
  6. package/dist/{utils-CRiPKpXj.js → _chunks/utils.js} +754 -526
  7. package/dist/components/index.d.ts +16 -0
  8. package/dist/components/index.js +84 -0
  9. package/dist/components/ui/banner.d.ts +10 -0
  10. package/dist/components/ui/banner.js +45 -0
  11. package/dist/components/ui/button.d.ts +11 -0
  12. package/dist/{button.js → components/ui/button.js} +11 -10
  13. package/dist/components/ui/card.d.ts +27 -0
  14. package/dist/components/ui/card.js +109 -0
  15. package/dist/components/ui/composite/CompositeData.d.ts +20 -0
  16. package/dist/components/ui/composite/CompositeData.js +89 -0
  17. package/dist/components/ui/composite/CompositeDataItem.d.ts +28 -0
  18. package/dist/components/ui/composite/CompositeDataItem.js +5 -0
  19. package/dist/components/ui/composite/FocusProvider/AbstractFocusProvider.d.ts +41 -0
  20. package/dist/components/ui/composite/FocusProvider/AbstractFocusProvider.js +35 -0
  21. package/dist/components/ui/composite/FocusProvider/ListboxFocusProvider.d.ts +16 -0
  22. package/dist/components/ui/composite/FocusProvider/ListboxFocusProvider.js +67 -0
  23. package/dist/components/ui/composite/FocusProvider/index.d.ts +2 -0
  24. package/dist/components/ui/composite/FocusProvider/index.js +6 -0
  25. package/dist/components/ui/composite/SelectionProvider/AbstractSelectionProvider.d.ts +23 -0
  26. package/dist/components/ui/composite/SelectionProvider/AbstractSelectionProvider.js +20 -0
  27. package/dist/components/ui/composite/SelectionProvider/MultipleSelectionProvider.d.ts +9 -0
  28. package/dist/components/ui/composite/SelectionProvider/MultipleSelectionProvider.js +20 -0
  29. package/dist/components/ui/composite/SelectionProvider/SingleSelectionProvider.d.ts +9 -0
  30. package/dist/components/ui/composite/SelectionProvider/SingleSelectionProvider.js +25 -0
  31. package/dist/components/ui/composite/SelectionProvider/index.d.ts +3 -0
  32. package/dist/components/ui/composite/SelectionProvider/index.js +8 -0
  33. package/dist/components/ui/composite/composite-component-item.d.ts +2 -0
  34. package/dist/components/ui/composite/composite-component-item.js +74 -0
  35. package/dist/components/ui/composite/composite-component.d.ts +2 -0
  36. package/dist/components/ui/composite/composite-component.js +66 -0
  37. package/dist/components/ui/composite/index.d.ts +7 -0
  38. package/dist/components/ui/composite/index.js +22 -0
  39. package/dist/components/ui/composite/listbox.d.ts +2 -0
  40. package/dist/components/ui/composite/listbox.js +58 -0
  41. package/dist/components/ui/composite/types.d.ts +82 -0
  42. package/dist/components/ui/composite/types.js +1 -0
  43. package/dist/components/ui/horizontal-list.d.ts +10 -0
  44. package/dist/components/ui/horizontal-list.js +82 -0
  45. package/dist/components/ui/icon-generator/generate-tiles.d.ts +4 -0
  46. package/dist/components/ui/icon-generator/generate-tiles.js +223 -0
  47. package/dist/components/ui/icon-generator/icon-generator.d.ts +3 -0
  48. package/dist/components/ui/icon-generator/icon-generator.js +82 -0
  49. package/dist/components/ui/icon-generator/index.d.ts +4 -0
  50. package/dist/components/ui/icon-generator/index.js +11 -0
  51. package/dist/components/ui/icon-generator/masked-image-generator.d.ts +3 -0
  52. package/dist/components/ui/icon-generator/masked-image-generator.js +31 -0
  53. package/dist/{masked-image-generator.d.ts → components/ui/icon-generator/types.d.ts} +48 -58
  54. package/dist/components/ui/icon-generator/types.js +30 -0
  55. package/dist/components/ui/input.d.ts +3 -0
  56. package/dist/{input.js → components/ui/input.js} +8 -8
  57. package/dist/components/ui/navigation-menu.d.ts +16 -0
  58. package/dist/components/ui/navigation-menu.js +1041 -0
  59. package/dist/components/ui/overlay.d.ts +7 -0
  60. package/dist/{overlay.js → components/ui/overlay.js} +7 -7
  61. package/dist/components/ui/page-header.d.ts +5 -0
  62. package/dist/{page-header.js → components/ui/page-header.js} +189 -181
  63. package/dist/components/ui/page-section.d.ts +8 -0
  64. package/dist/{page-section.js → components/ui/page-section.js} +7 -7
  65. package/dist/components/ui/page.d.ts +3 -0
  66. package/dist/components/ui/page.js +8 -0
  67. package/dist/components/ui/popover.d.ts +7 -0
  68. package/dist/components/ui/popover.js +3532 -0
  69. package/dist/components/ui/search-input.d.ts +3 -0
  70. package/dist/components/ui/search-input.js +24 -0
  71. package/dist/components/ui/tag.d.ts +10 -0
  72. package/dist/{tag.js → components/ui/tag.js} +10 -9
  73. package/dist/components/ui/typography/caption.d.ts +8 -0
  74. package/dist/components/ui/typography/caption.js +28 -0
  75. package/dist/components/ui/typography/index.d.ts +1 -0
  76. package/dist/components/ui/typography/index.js +5 -0
  77. package/dist/hooks/index.d.ts +3 -0
  78. package/dist/hooks/index.js +9 -0
  79. package/dist/hooks/use-effect-after-mount.d.ts +2 -0
  80. package/dist/hooks/use-effect-after-mount.js +24 -0
  81. package/dist/hooks/use-id.d.ts +1 -0
  82. package/dist/hooks/use-id.js +7 -0
  83. package/dist/hooks/use-keyboard-event.d.ts +59 -0
  84. package/dist/hooks/use-keyboard-event.js +52 -0
  85. package/dist/lib/index.d.ts +3 -0
  86. package/dist/lib/index.js +16 -0
  87. package/dist/lib/object.d.ts +5 -0
  88. package/dist/lib/object.js +38 -0
  89. package/dist/lib/set-operations.d.ts +5 -0
  90. package/dist/lib/set-operations.js +51 -0
  91. package/dist/{utils.d.ts → lib/utils.d.ts} +2 -5
  92. package/dist/lib/utils.js +4 -0
  93. package/package.json +9 -76
  94. package/src/components/index.ts +17 -0
  95. package/src/components/ui/composite/FocusProvider/index.ts +2 -0
  96. package/src/components/ui/composite/SelectionProvider/MultipleSelectionProvider.ts +1 -1
  97. package/src/components/ui/composite/SelectionProvider/index.ts +3 -0
  98. package/src/components/ui/composite/index.ts +5 -5
  99. package/src/components/ui/icon-generator/index.ts +2 -0
  100. package/src/components/ui/typography/index.ts +1 -0
  101. package/src/hooks/index.ts +3 -0
  102. package/src/index.ts +3 -0
  103. package/src/lib/index.ts +3 -0
  104. package/tsconfig.lib.json +44 -0
  105. package/vite.config.ts +28 -31
  106. package/dist/AbstractFocusProvider-CxvlcEki.js +0 -29
  107. package/dist/AbstractSelectionProvider-BtaROstC.js +0 -30
  108. package/dist/CompositeDataItem-DuHOHCWy.js +0 -158
  109. package/dist/ListboxFocusProvider.d.ts +0 -149
  110. package/dist/ListboxFocusProvider.js +0 -53
  111. package/dist/MultipleSelectionProvider.d.ts +0 -141
  112. package/dist/MultipleSelectionProvider.js +0 -19
  113. package/dist/SingleSelectionProvider.d.ts +0 -141
  114. package/dist/SingleSelectionProvider.js +0 -23
  115. package/dist/banner.d.ts +0 -16
  116. package/dist/banner.js +0 -42
  117. package/dist/button.d.ts +0 -17
  118. package/dist/caption.d.ts +0 -13
  119. package/dist/caption.js +0 -27
  120. package/dist/card.d.ts +0 -46
  121. package/dist/card.js +0 -108
  122. package/dist/composite-component-DSUbd1XS.js +0 -122
  123. package/dist/composite.d.ts +0 -208
  124. package/dist/composite.js +0 -82
  125. package/dist/createLucideIcon-CzehbSja.js +0 -94
  126. package/dist/generate-tiles-DuagGD1d.js +0 -244
  127. package/dist/generate-tiles.d.ts +0 -43
  128. package/dist/generate-tiles.js +0 -7
  129. package/dist/horizontal-list.d.ts +0 -16
  130. package/dist/horizontal-list.js +0 -77
  131. package/dist/icon-generator-tuhuqdpL.js +0 -76
  132. package/dist/icon-generator.d.ts +0 -58
  133. package/dist/icon-generator.js +0 -6
  134. package/dist/index-CQhYMnjT.js +0 -34
  135. package/dist/index-U7DVCmS_.js +0 -76
  136. package/dist/input.d.ts +0 -7
  137. package/dist/listbox.d.ts +0 -171
  138. package/dist/listbox.js +0 -76
  139. package/dist/masked-image-generator.js +0 -29
  140. package/dist/navigation-menu.d.ts +0 -27
  141. package/dist/navigation-menu.js +0 -1139
  142. package/dist/overlay.d.ts +0 -13
  143. package/dist/page-header.d.ts +0 -9
  144. package/dist/page-section.d.ts +0 -14
  145. package/dist/page.d.ts +0 -7
  146. package/dist/page.js +0 -8
  147. package/dist/search-input.d.ts +0 -7
  148. package/dist/search-input.js +0 -23
  149. package/dist/tag.d.ts +0 -16
  150. package/dist/ui-components.d.ts +0 -215
  151. package/dist/ui-components.js +0 -54
  152. package/dist/utils.js +0 -4
  153. package/src/assets/icons/icon_01.svg +0 -6
  154. package/src/assets/icons/icon_02.svg +0 -6
  155. package/src/assets/icons/icon_03.svg +0 -6
  156. package/src/assets/icons/icon_04.svg +0 -6
  157. package/src/assets/icons/icon_05.svg +0 -4
  158. package/src/assets/icons/icon_06.svg +0 -4
  159. package/src/assets/images/image_01.jpg +0 -0
  160. package/src/assets/images/image_02.jpg +0 -0
  161. package/src/assets/images/image_03.webp +0 -0
  162. package/src/assets/images/image_04.png +0 -0
  163. package/src/assets/images/image_05.jpg +0 -0
  164. package/src/assets/images/image_06.jpg +0 -0
  165. 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,3 @@
1
+ export * from './AbstractSelectionProvider';
2
+ export * from './SingleSelectionProvider';
3
+ export * from './MultipleSelectionProvider';
@@ -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,2 @@
1
+ import { CompositeItemProps } from './types';
2
+ export declare function CompositeComponentItem<T extends object>({ id, className, item, role, itemMouseEventHandler, itemKeyboardEventHandler, render, }: CompositeItemProps<T>): import("react").JSX.Element;
@@ -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,2 @@
1
+ import { BaseCompositeProps } from './types';
2
+ export declare function Listbox<T extends object>({ data, ...props }: BaseCompositeProps<T>): import("react").JSX.Element;
@@ -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,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)[];