@ark-ui/solid
Version:
A collection of unstyled, accessible UI components for Solid, utilizing state machines for seamless interaction.
87 lines (84 loc) • 3.14 kB
JavaScript
import { GridCollection, ListCollection, TreeCollection, filePathToTree } from '@zag-js/collection';
import { createMemo, splitProps, createSignal } from 'solid-js';
// src/components/collection/grid-collection.ts
var createGridCollection = (options) => new GridCollection(options);
var createListCollection = (options) => new ListCollection(options);
var createTreeCollection = (options) => new TreeCollection(options);
var createFileTreeCollection = (paths) => filePathToTree(paths);
function useListCollection(props) {
const splittedProps = createMemo(() => {
const rawProps = typeof props === "function" ? props() : props;
return splitProps(rawProps, ["initialItems", "filter", "limit"]);
});
const create = (items) => {
const [, collectionProps] = splittedProps();
return createListCollection({ ...collectionProps, items });
};
const init = () => {
const [localProps] = splittedProps();
return create(
localProps.limit != null ? localProps.initialItems.slice(0, localProps.limit) : localProps.initialItems
);
};
const [collection, setCollectionImpl] = createSignal(init());
const setCollection = (collection2) => {
const [localProps] = splittedProps();
setCollectionImpl(
localProps.limit == null ? collection2 : collection2.copy(collection2.items.slice(0, localProps.limit))
);
};
return {
collection,
filter: (inputValue) => {
const [localProps] = splittedProps();
const filter = localProps.filter;
if (!filter) return;
const filtered = create(localProps.initialItems).filter((itemString) => filter(itemString, inputValue));
setCollection(filtered);
},
set: (items) => {
setCollection(create(items));
},
reset: () => {
const [localProps] = splittedProps();
setCollection(create(localProps.initialItems));
},
clear: () => {
setCollection(create([]));
},
insert: (index, ...items) => {
setCollection(collection().insert(index, ...items));
},
insertBefore: (value, ...items) => {
setCollection(collection().insertBefore(value, ...items));
},
insertAfter: (value, ...items) => {
setCollection(collection().insertAfter(value, ...items));
},
remove: (...itemOrValues) => {
setCollection(collection().remove(...itemOrValues));
},
move: (value, to) => {
setCollection(collection().move(value, to));
},
moveBefore: (value, ...values) => {
setCollection(collection().moveBefore(value, ...values));
},
moveAfter: (value, ...values) => {
setCollection(collection().moveAfter(value, ...values));
},
reorder: (from, to) => {
setCollection(collection().reorder(from, to));
},
append: (...items) => {
setCollection(collection().append(...items));
},
prepend: (...items) => {
setCollection(collection().prepend(...items));
},
update: (value, item) => {
setCollection(collection().update(value, item));
}
};
}
export { createFileTreeCollection, createGridCollection, createListCollection, createTreeCollection, useListCollection };