{"version":3,"file":"virtual-list.cjs","sources":["../../../components/virtual-list/virtual-list.tsx"],"sourcesContent":["import { NativeScroll } from '@/components/native-scroll'\nimport { ResizeObserver } from '@/components/resize-observer'\n\nimport { computed, defineComponent, nextTick, ref, renderSlot, toRefs, watch } from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { createSlotRender, useVirtual } from '@vexip-ui/hooks'\nimport { virtualListProps } from './props'\n\nimport type { NativeScrollExposed } from '@/components/native-scroll'\nimport type { ScrollPayload } from './symbol'\n\nexport default defineComponent({\n  name: 'VirtualList',\n  components: {\n    NativeScroll,\n    ResizeObserver,\n  },\n  inheritAttrs: false,\n  props: virtualListProps,\n  emits: [],\n  setup(_props, { slots, attrs, expose }) {\n    const props = useProps('virtualList', _props, {\n      items: {\n        default: () => [],\n        static: true,\n      },\n      itemSize: 36,\n      itemFixed: false,\n      idKey: 'id',\n      defaultKeyAt: null,\n      bufferSize: 5,\n      listTag: 'div',\n      itemsTag: 'ul',\n      itemsAttrs: null,\n      hideBar: false,\n      lockItems: false,\n      autoplay: false,\n      ignoreResize: false,\n      disabled: false,\n    })\n\n    const nh = useNameHelper('virtual-list')\n\n    const { items, itemSize, itemFixed, idKey, bufferSize } = toRefs(props)\n\n    const scroll = ref<NativeScrollExposed>()\n    const list = ref<HTMLElement>()\n    const wrapper = computed(() => scroll.value?.content)\n\n    const {\n      indexMap,\n      heightTree,\n      scrollOffset,\n      visibleItems,\n      listStyle,\n      itemsStyle,\n      handleScroll,\n      handleResize,\n      handleItemResize,\n      scrollTo,\n      scrollBy,\n      scrollToKey,\n      scrollToIndex,\n      ensureIndexInView,\n      ensureKeyInView,\n    } = useVirtual({\n      items,\n      itemSize,\n      itemFixed,\n      idKey,\n      bufferSize,\n      wrapper,\n      defaultKeyAt: props.defaultKeyAt,\n      autoResize: false,\n    })\n\n    expose({\n      scroll,\n      wrapper,\n      list,\n      indexMap,\n      heightTree,\n      scrollOffset,\n      scrollTo,\n      scrollBy,\n      scrollToKey,\n      scrollToIndex,\n      ensureIndexInView,\n      ensureKeyInView,\n      refresh,\n    })\n\n    watch(\n      () => props.items.length,\n      () => {\n        nextTick(refresh)\n      },\n    )\n\n    const className = computed(() => {\n      return [\n        nh.b(),\n        props.inherit && nh.bm('inherit'),\n        props.disabled && nh.bm('disabled'),\n        attrs.class,\n      ]\n    })\n\n    function onScroll(payload: ScrollPayload) {\n      handleScroll()\n      emitEvent(props.onScroll, payload)\n    }\n\n    function onResize(entry: ResizeObserverEntry) {\n      if (props.ignoreResize) return\n\n      handleResize(entry)\n      emitEvent(props.onResize, entry)\n    }\n\n    function onItemResize(key: number | string | symbol, entry: ResizeObserverEntry) {\n      if (!props.lockItems && !props.ignoreResize) {\n        handleItemResize(key, entry)\n      }\n    }\n\n    async function refresh() {\n      await scroll.value?.refresh()\n      handleScroll()\n    }\n\n    function renderList(items: Record<string, any>[]) {\n      const keyField = props.idKey\n      const itemFixed = props.itemFixed\n      const keyIndexMap = indexMap.value\n      const { class: itemsClass, style: itemsOtherStyle, ...itemsAttrs } = props.itemsAttrs || {}\n\n      const ListTag = (props.listTag || 'div') as any\n      const ItemsTag = (props.itemsTag || 'ul') as any\n\n      return (\n        <ResizeObserver onResize={refresh}>\n          <ListTag ref={list} class={nh.be('list')} style={listStyle.value}>\n            <ItemsTag\n              {...itemsAttrs}\n              class={[nh.be('items'), itemsClass]}\n              style={[itemsStyle.value, itemsOtherStyle]}\n            >\n              {slots.default && props.items.length\n                ? items.map(item => {\n                  const key = item[keyField]\n                  const index = keyIndexMap.get(key)\n                  const vnode = renderSlot(slots, 'default', { item, index })\n\n                  if (itemFixed) {\n                    vnode.key = key\n\n                    return vnode\n                  }\n\n                  const onResize = onItemResize.bind(null, key)\n\n                  return (\n                    <ResizeObserver key={key} onResize={onResize}>\n                      {() => vnode}\n                    </ResizeObserver>\n                  )\n                })\n                : renderSlot(slots, 'empty')}\n            </ItemsTag>\n          </ListTag>\n        </ResizeObserver>\n      )\n    }\n\n    return () => {\n      let renderingItems = visibleItems.value\n\n      if (import.meta.env.MODE === 'test') {\n        // It is difficult to test ResizeObserver in vitest, so directly rendering all items\n        renderingItems = props.items\n      }\n\n      return (\n        <NativeScroll\n          {...attrs}\n          ref={scroll}\n          class={className.value}\n          inherit={props.inherit}\n          use-y-bar={!props.hideBar}\n          scroll-y={scrollOffset.value}\n          autoplay={props.autoplay}\n          onScroll={onScroll}\n          onResize={onResize}\n        >\n          {{\n            default: () => {\n              if (props.disabled) {\n                return slots.default && props.items.length\n                  ? props.items.map((item, index) => {\n                    const key = item[props.idKey]\n                    const vnode = renderSlot(slots, 'default', { item, index })\n\n                    vnode.key = key\n\n                    return vnode\n                  })\n                  : renderSlot(slots, 'empty')\n              }\n\n              return renderList(renderingItems)\n            },\n            prefixTrap: createSlotRender(slots, ['prefix-trap', 'prefixTrap']),\n            suffixTrap: createSlotRender(slots, ['suffix-trap', 'suffixTrap']),\n          }}\n        </NativeScroll>\n      )\n    }\n  },\n})\n"],"names":["defineComponent","name","components","NativeScroll","ResizeObserver","inheritAttrs","props","virtualListProps","emits","setup","_props","slots","attrs","expose","useProps","items","default","static","itemSize","itemFixed","idKey","defaultKeyAt","bufferSize","listTag","itemsTag","itemsAttrs","hideBar","lockItems","autoplay","ignoreResize","disabled","nh","useNameHelper","toRefs","scroll","ref","list","wrapper","computed","value","content","indexMap","heightTree","scrollOffset","visibleItems","listStyle","itemsStyle","handleScroll","handleResize","handleItemResize","scrollTo","scrollBy","scrollToKey","scrollToIndex","ensureIndexInView","ensureKeyInView","useVirtual","autoResize","refresh","watch","length","nextTick","className","b","inherit","bm","class","onScroll","payload","onResize","entry","onItemResize","key","renderList","keyField","keyIndexMap","itemsClass","style","itemsOtherStyle","ListTag","ItemsTag","_createVNode","be","_mergeProps","map","item","index","get","vnode","renderSlot","bind","renderingItems","prefixTrap","createSlotRender","suffixTrap"],"mappings":"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"}