{"version":3,"file":"virtual-list-CiKIwcIK.mjs","sources":["../../../../packages/components/virtual-list/src/virtual-list.tsx","../../../../packages/components/virtual-list/index.ts"],"sourcesContent":["import {\n    computed,\n    defineComponent,\n    onMounted,\n    reactive,\n    ref,\n    watch\n} from 'vue';\nimport type { PropType } from 'vue';\nimport { createNamespace } from '@mealcomes/utils';\nimport type { ExtractPropTypes } from 'vue';\nimport type { TreeNode } from '../../tree';\n\n/**\n * virtual 组件 props\n */\nexport const virtualProps = {\n    /**\n     * 每一行的高度\n     */\n    size: {\n        type: Number,\n        default: 27\n    },\n    /**\n     * 可视窗口展示的数据条数\n     */\n    remain: {\n        type: Number,\n        default: 8\n    },\n    /**\n     * 数据\n     */\n    items: {\n        type: Array as PropType<TreeNode[]>,\n        default: () => []\n    }\n} as const;\n\n/**\n * virtual 组件 props 类型\n */\nexport type VirtualProps = ExtractPropTypes<typeof virtualProps>;\n\nexport default defineComponent({\n    name: 'mc-virtual-list',\n    props: virtualProps,\n    setup(props: VirtualProps, { slots }) {\n        const bem = createNamespace('virtual-list');\n        const wrapperRef = ref<HTMLElement>();\n        const barRef = ref<HTMLElement>();\n        const state = reactive({\n            start: 0,\n            end: props.remain\n        });\n        const prev = computed(() => {\n            return Math.min(state.start, props.remain);\n        });\n        const next = computed(() => {\n            return Math.min(props.items.length - state.end, props.remain);\n        });\n        const visibleData = computed(() =>\n            props.items.slice(state.start - prev.value, state.end! + next.value)\n        );\n        const offset = ref(0);\n\n        let ticking = false;\n        // 根据当前滚动的距离计算往下了多少数据\n        const handleScroll = () => {\n            if (!ticking) {\n                requestAnimationFrame(() => {\n                    const scrollTop = wrapperRef.value!.scrollTop;\n                    state.start = Math.floor(scrollTop / props.size);\n                    state.end = state.start + props.remain;\n                    offset.value =\n                        state.start * props.size - props.size * prev.value;\n                    ticking = false;\n                });\n                ticking = true;\n            }\n        };\n\n        const setHeight = () => {\n            wrapperRef.value!.style.height = props.remain * props.size + 'px';\n            barRef.value!.style.height = props.items.length * props.size + 'px';\n        };\n\n        // 监听总的items, 因为如果展开的话, items 的长度会改变\n        watch(() => props.items, setHeight);\n\n        onMounted(() => {\n            setHeight();\n        });\n        return () => {\n            return (\n                <div class={bem.b()} ref={wrapperRef} onScroll={handleScroll}>\n                    {/* 模拟总长度, 撑开滚动条 */}\n                    <div class={bem.e('scroll-bar')} ref={barRef}></div>\n                    {/* 更新列表的显示区域, 由于向下滚动时整个会往下, \n                    所以 list 也需要往下偏移, 保证 list 始终处于可见视图 */}\n                    <div\n                        class={bem.e('scroll-list')}\n                        style={{\n                            transform: `translate3d(0, ${offset.value}px, 0)`\n                        }}\n                    >\n                        {visibleData.value?.map(node =>\n                            slots.default!({ node })\n                        )}\n                    </div>\n                </div>\n            );\n        };\n    }\n});\n","import { withInstall } from '@mealcomes/utils';\nimport _Virtual from './src/virtual-list';\n\nconst Virtual = withInstall(_Virtual);\n\nexport default Virtual;\n\ndeclare module 'vue' {\n    export interface GlobalComponents {\n        McVirtual: typeof Virtual;\n    }\n}\n"],"names":["virtualProps","size","type","Number","default","remain","items","Array","_Virtual","name","props","setup","slots","bem","createNamespace","wrapperRef","ref","barRef","state","reactive","start","end","prev","computed","Math","min","next","length","visibleData","slice","value","offset","ticking","handleScroll","requestAnimationFrame","scrollTop","floor","setHeight","style","height","watch","onMounted","_createVNode","b","e","transform","map","node","Virtual","withInstall"],"mappings":";;AAgBO,MAAMA,IAAe;AAAA;AAAA;AAAA;AAAA,EAIxBC,MAAM;AAAA,IACFC,MAAMC;AAAAA,IACNC,SAAS;AAAA;;;;EAKbC,QAAQ;AAAA,IACJH,MAAMC;AAAAA,IACNC,SAAS;AAAA;;;;EAKbE,OAAO;AAAA,IACHJ,MAAMK;AAAAA,IACNH,SAASA,MAAM,CAAA;AAAA,EACnB;AACJ,GAOAI,sBAA+B;AAAA,EAC3BC,MAAM;AAAA,EACNC,OAAOV;AAAAA,EACPW,MAAMD,GAAqB;AAAA,IAAEE,OAAAA;AAAAA,EAAM,GAAG;AAClC,UAAMC,IAAMC,EAAgB,cAAc,GACpCC,IAAaC,EAAG,GAChBC,IAASD,EAAG,GACZE,IAAQC,EAAS;AAAA,MACnBC,OAAO;AAAA,MACPC,KAAKX,EAAML;AAAAA,IACf,CAAC,GACKiB,IAAOC,EAAS,MACXC,KAAKC,IAAIP,EAAME,OAAOV,EAAML,MAAM,CAC5C,GACKqB,IAAOH,EAAS,MACXC,KAAKC,IAAIf,EAAMJ,MAAMqB,SAAST,EAAMG,KAAKX,EAAML,MAAM,CAC/D,GACKuB,IAAcL,EAAS,MACzBb,EAAMJ,MAAMuB,MAAMX,EAAME,QAAQE,EAAKQ,OAAOZ,EAAMG,MAAOK,EAAKI,KAAK,CACvE,GACMC,IAASf,EAAI,CAAC;AAEpB,QAAIgB,IAAU;AAEd,UAAMC,IAAeA,MAAM;AACvB,MAAKD,MACDE,sBAAsB,MAAM;AACxB,cAAMC,IAAYpB,EAAWe,MAAOK;AACpCjB,QAAAA,EAAME,QAAQI,KAAKY,MAAMD,IAAYzB,EAAMT,IAAI,GAC/CiB,EAAMG,MAAMH,EAAME,QAAQV,EAAML,QAChC0B,EAAOD,QACHZ,EAAME,QAAQV,EAAMT,OAAOS,EAAMT,OAAOqB,EAAKQ,OACjDE,IAAU;AAAA,MACd,CAAC,GACDA,IAAU;AAAA,IAElB,GAEMK,IAAYA,MAAM;AACpBtB,MAAAA,EAAWe,MAAOQ,MAAMC,SAAS7B,EAAML,SAASK,EAAMT,OAAO,MAC7DgB,EAAOa,MAAOQ,MAAMC,SAAS7B,EAAMJ,MAAMqB,SAASjB,EAAMT,OAAO;AAAA,IACnE;AAGAuC,WAAAA,EAAM,MAAM9B,EAAMJ,OAAO+B,CAAS,GAElCI,EAAU,MAAM;AACZJ,MAAAA,EAAS;AAAA,IACb,CAAC,GACM,MAAM;;AACT,aAAAK,EAAA,OAAA;AAAA,QAAA,OACgB7B,EAAI8B,EAAC;AAAA,QAAE,KAAO5B;AAAAA,QAAU,UAAYkB;AAAAA,MAAY,GAAA,CAAAS,EAAA,OAAA;AAAA,QAAA,OAE5C7B,EAAI+B,EAAE,YAAY;AAAA,QAAC,KAAO3B;AAAAA,MAAM,GAAA,IAAA,GAAAyB,EAAA,OAAA;AAAA,QAAA,OAIjC7B,EAAI+B,EAAE,aAAa;AAAA,QAAC,OACpB;AAAA,UACHC,WAAW,kBAAkBd,EAAOD,KAAK;AAAA,QAC7C;AAAA,SAAC,EAEAF,IAAAA,EAAYE,UAAZF,gBAAAA,EAAmBkB,IAAIC,CAAAA,MACpBnC,EAAMR,QAAS;AAAA,QAAE2C,MAAAA;AAAAA,MAAK,CAAC,EAC1B,CAAA,CAAA,CAAA;AAAA,IAIjB;AAAA,EACJ;AACJ,CAAC,GChHKC,IAAUC,EAAYzC,CAAQ;"}