element-plus
Version:
A Component Library for Vue 3
1 lines • 4.91 kB
Source Map (JSON)
{"version":3,"file":"useSize.mjs","sources":["../../../../../../../packages/components/splitter/src/hooks/useSize.ts"],"sourcesContent":["import { computed, ref, watch } from 'vue'\nimport { isString } from '@element-plus/utils'\n\nimport type { ComputedRef, Ref } from 'vue'\nimport type { PanelItemState } from '../type'\n\nexport function getPct(str: string) {\n return Number(str.slice(0, -1)) / 100\n}\n\nexport function getPx(str: string) {\n return Number(str.slice(0, -2))\n}\n\nexport function isPct(\n itemSize: string | number | undefined\n): itemSize is string {\n return isString(itemSize) && itemSize.endsWith('%')\n}\n\nexport function isPx(\n itemSize: string | number | undefined\n): itemSize is string {\n return isString(itemSize) && itemSize.endsWith('px')\n}\n\nexport function useSize(\n panels: Ref<PanelItemState[]>,\n containerSize: ComputedRef<number>\n) {\n const propSizes = computed(() => panels.value.map((i) => i.size))\n\n const panelCounts = computed(() => panels.value.length)\n\n const percentSizes = ref<number[]>([])\n\n watch([propSizes, panelCounts, containerSize], () => {\n let ptgList: (number | undefined)[] = []\n let emptyCount = 0\n\n // Convert the passed props size to a percentage\n for (let i = 0; i < panelCounts.value; i += 1) {\n const itemSize = panels.value[i]?.size\n\n if (isPct(itemSize)) {\n ptgList[i] = getPct(itemSize)\n } else if (isPx(itemSize)) {\n ptgList[i] = getPx(itemSize) / containerSize.value\n } else if (itemSize || itemSize === 0) {\n const num = Number(itemSize)\n\n if (!Number.isNaN(num)) {\n ptgList[i] = num / containerSize.value\n }\n } else {\n emptyCount += 1\n ptgList[i] = undefined\n }\n }\n\n const totalPtg = ptgList.reduce<number>((acc, ptg) => acc + (ptg || 0), 0)\n\n if (totalPtg > 1 || !emptyCount) {\n // If it is greater than 1, the scaling ratio\n const scale = 1 / totalPtg\n ptgList = ptgList.map((ptg) => (ptg === undefined ? 0 : ptg * scale))\n } else {\n // If it is less than 1, the filling ratio\n const avgRest = (1 - totalPtg) / emptyCount\n ptgList = ptgList.map((ptg) => (ptg === undefined ? avgRest : ptg))\n }\n\n percentSizes.value = ptgList as number[]\n })\n\n const ptg2px = (ptg: number) => ptg * containerSize.value\n const pxSizes = computed(() => percentSizes.value.map(ptg2px))\n\n return { percentSizes, pxSizes }\n}\n"],"names":[],"mappings":"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"}