{"version":3,"file":"virtual-list.mjs","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    function refresh() {\n      return scroll.value?.refresh() ?? Promise.resolve()\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","Promise","resolve","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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"}