{"version":3,"file":"Collection.cjs","sources":["../../src/Collection/Collection.ts"],"sourcesContent":["import { type Ref, computed, defineComponent, h, inject, markRaw, provide, ref, watch, watchEffect } from 'vue'\nimport { Slot, usePrimitiveElement } from '@/Primitive'\n\ninterface CollectionContext<ItemData = {}> {\n  collectionRef: Ref<HTMLElement | undefined>\n  itemMap: Ref<Map<HTMLElement, { ref: HTMLElement, value?: any } & ItemData>>\n}\n\nconst ITEM_DATA_ATTR = 'data-reka-collection-item'\n\nexport function useCollection<ItemData = {}>(options: { key?: string, isProvider?: boolean } = {}) {\n  const { key = '', isProvider = false } = options\n  const injectionKey = `${key}CollectionProvider`\n  let context: CollectionContext<ItemData>\n\n  if (isProvider) {\n    const itemMap = ref<Map<HTMLElement, { ref: HTMLElement } & ItemData>>(new Map())\n    const collectionRef = ref<HTMLElement>()\n\n    context = {\n      collectionRef,\n      itemMap,\n    } as CollectionContext<ItemData>\n    provide(injectionKey, context)\n  }\n  else {\n    context = inject(injectionKey) as CollectionContext<ItemData>\n  }\n\n  const getItems = (includeDisabledItem = false) => {\n    const collectionNode = context.collectionRef.value\n    if (!collectionNode)\n      return []\n    const orderedNodes = Array.from(collectionNode.querySelectorAll(`[${ITEM_DATA_ATTR}]`))\n    const items = Array.from(context.itemMap.value.values())\n    const orderedItems = items.sort(\n      (a, b) => orderedNodes.indexOf(a.ref) - orderedNodes.indexOf(b.ref),\n    )\n\n    if (includeDisabledItem)\n      return orderedItems\n    else\n      return orderedItems.filter(i => i.ref.dataset.disabled !== '')\n  }\n\n  const CollectionSlot = defineComponent({\n    name: 'CollectionSlot',\n    setup(_, { slots }) {\n      const { primitiveElement, currentElement } = usePrimitiveElement()\n      watch(currentElement, () => {\n        context.collectionRef.value = currentElement.value\n      })\n      return () => h(Slot, { ref: primitiveElement }, slots)\n    },\n  })\n\n  const CollectionItem = defineComponent({\n    name: 'CollectionItem',\n    inheritAttrs: false,\n    props: {\n      value: {\n        // It accepts any value\n        validator: () => true,\n      },\n    },\n    setup(props, { slots, attrs }) {\n      const { primitiveElement, currentElement } = usePrimitiveElement()\n\n      watchEffect((cleanupFn) => {\n        if (currentElement.value) {\n          const key = markRaw(currentElement.value)\n          // @ts-expect-error ignore assignment of unknown to any\n          context.itemMap.value.set(key, { ref: currentElement.value!, value: props.value })\n          cleanupFn(() => context.itemMap.value.delete(key))\n        }\n      })\n\n      return () => h(Slot, { ...attrs, [ITEM_DATA_ATTR]: '', ref: primitiveElement }, slots)\n    },\n  })\n\n  const reactiveItems = computed(() => Array.from(context.itemMap.value.values()))\n  const itemMapSize = computed(() => context.itemMap.value.size)\n\n  return { getItems, reactiveItems, itemMapSize, CollectionSlot, CollectionItem }\n}\n"],"names":["ref","provide","inject","defineComponent","usePrimitiveElement","watch","h","Slot","watchEffect","key","markRaw","computed"],"mappings":"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"}