ccf0807c1402e48af24799d967610558956620e412c7751e243047ce87ad65af608aaf5aaab7ad15abc8ad2b05b93f4fa8dadc6cd16c416a8ab420bc406a9b 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { computed, ref, watch } from 'vue';
  2. import { isString } from '@vue/shared';
  3. function getPct(str) {
  4. return Number(str.slice(0, -1)) / 100;
  5. }
  6. function getPx(str) {
  7. return Number(str.slice(0, -2));
  8. }
  9. function isPct(itemSize) {
  10. return isString(itemSize) && itemSize.endsWith("%");
  11. }
  12. function isPx(itemSize) {
  13. return isString(itemSize) && itemSize.endsWith("px");
  14. }
  15. function useSize(panels, containerSize) {
  16. const propSizes = computed(() => panels.value.map((i) => i.size));
  17. const panelCounts = computed(() => panels.value.length);
  18. const percentSizes = ref([]);
  19. watch([propSizes, panelCounts, containerSize], () => {
  20. var _a;
  21. let ptgList = [];
  22. let emptyCount = 0;
  23. for (let i = 0; i < panelCounts.value; i += 1) {
  24. const itemSize = (_a = panels.value[i]) == null ? void 0 : _a.size;
  25. if (isPct(itemSize)) {
  26. ptgList[i] = getPct(itemSize);
  27. } else if (isPx(itemSize)) {
  28. ptgList[i] = getPx(itemSize) / containerSize.value;
  29. } else if (itemSize || itemSize === 0) {
  30. const num = Number(itemSize);
  31. if (!Number.isNaN(num)) {
  32. ptgList[i] = num / containerSize.value;
  33. }
  34. } else {
  35. emptyCount += 1;
  36. ptgList[i] = void 0;
  37. }
  38. }
  39. const totalPtg = ptgList.reduce((acc, ptg) => acc + (ptg || 0), 0);
  40. if (totalPtg > 1 || !emptyCount) {
  41. const scale = 1 / totalPtg;
  42. ptgList = ptgList.map((ptg) => ptg === void 0 ? 0 : ptg * scale);
  43. } else {
  44. const avgRest = (1 - totalPtg) / emptyCount;
  45. ptgList = ptgList.map((ptg) => ptg === void 0 ? avgRest : ptg);
  46. }
  47. percentSizes.value = ptgList;
  48. });
  49. const ptg2px = (ptg) => ptg * containerSize.value;
  50. const pxSizes = computed(() => percentSizes.value.map(ptg2px));
  51. return { percentSizes, pxSizes };
  52. }
  53. export { getPct, getPx, isPct, isPx, useSize };
  54. //# sourceMappingURL=useSize.mjs.map