vxe-pc-ui 4.19.8 → 4.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/all.esm.js +878 -115
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/card/src/card.js +17 -3
  5. package/es/icon/style.css +1 -1
  6. package/es/language/fr-FR.js +29 -29
  7. package/es/layout-aside/src/layout-aside.js +8 -5
  8. package/es/layout-body/src/layout-body.js +19 -11
  9. package/es/list/src/list.js +364 -21
  10. package/es/list/style.css +43 -0
  11. package/es/list/style.min.css +1 -1
  12. package/es/scrollbar/src/scrollbar.js +59 -17
  13. package/es/scrollbar/style.css +1 -0
  14. package/es/style.css +1 -1
  15. package/es/style.min.css +1 -1
  16. package/es/tabs/src/tabs.js +19 -4
  17. package/es/tree/src/tree.js +393 -55
  18. package/es/tree/style.css +43 -0
  19. package/es/tree/style.min.css +1 -1
  20. package/es/ui/index.js +1 -1
  21. package/es/ui/src/log.js +1 -1
  22. package/es/ui/src/utils.js +12 -0
  23. package/es/vxe-list/style.css +43 -0
  24. package/es/vxe-list/style.min.css +1 -1
  25. package/es/vxe-scrollbar/style.css +1 -0
  26. package/es/vxe-tree/style.css +43 -0
  27. package/es/vxe-tree/style.min.css +1 -1
  28. package/lib/card/src/card.js +17 -3
  29. package/lib/card/src/card.min.js +1 -1
  30. package/lib/icon/style/style.css +1 -1
  31. package/lib/icon/style/style.min.css +1 -1
  32. package/lib/index.umd.js +914 -126
  33. package/lib/index.umd.min.js +1 -1
  34. package/lib/language/fr-FR.js +29 -29
  35. package/lib/language/fr-FR.min.js +1 -1
  36. package/lib/language/fr-FR.umd.js +29 -29
  37. package/lib/layout-aside/src/layout-aside.js +7 -7
  38. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  39. package/lib/layout-body/src/layout-body.js +27 -21
  40. package/lib/layout-body/src/layout-body.min.js +1 -1
  41. package/lib/list/src/list.js +368 -21
  42. package/lib/list/src/list.min.js +1 -1
  43. package/lib/list/style/style.css +43 -0
  44. package/lib/list/style/style.min.css +1 -1
  45. package/lib/scrollbar/src/scrollbar.js +67 -15
  46. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  47. package/lib/scrollbar/style/style.css +1 -0
  48. package/lib/style.css +1 -1
  49. package/lib/style.min.css +1 -1
  50. package/lib/tabs/src/tabs.js +22 -10
  51. package/lib/tabs/src/tabs.min.js +1 -1
  52. package/lib/tree/src/tree.js +397 -53
  53. package/lib/tree/src/tree.min.js +1 -1
  54. package/lib/tree/style/style.css +43 -0
  55. package/lib/tree/style/style.min.css +1 -1
  56. package/lib/ui/index.js +1 -1
  57. package/lib/ui/index.min.js +1 -1
  58. package/lib/ui/src/log.js +1 -1
  59. package/lib/ui/src/log.min.js +1 -1
  60. package/lib/ui/src/utils.js +14 -0
  61. package/lib/ui/src/utils.min.js +1 -1
  62. package/lib/vxe-list/style/style.css +43 -0
  63. package/lib/vxe-list/style/style.min.css +1 -1
  64. package/lib/vxe-scrollbar/style/style.css +1 -0
  65. package/lib/vxe-tree/style/style.css +43 -0
  66. package/lib/vxe-tree/style/style.min.css +1 -1
  67. package/package.json +1 -1
  68. package/packages/card/src/card.ts +18 -3
  69. package/packages/language/fr-FR.ts +903 -903
  70. package/packages/layout-aside/src/layout-aside.ts +8 -5
  71. package/packages/layout-body/src/layout-body.ts +23 -14
  72. package/packages/list/src/list.ts +397 -24
  73. package/packages/scrollbar/src/scrollbar.ts +63 -16
  74. package/packages/tabs/src/tabs.ts +19 -5
  75. package/packages/tree/src/tree.ts +432 -64
  76. package/packages/ui/src/utils.ts +14 -0
  77. package/styles/components/list.scss +76 -0
  78. package/styles/components/scrollbar.scss +3 -0
  79. package/styles/components/tree.scss +76 -0
  80. package/types/components/card.d.ts +10 -1
  81. package/types/components/layout-aside.d.ts +10 -1
  82. package/types/components/layout-body.d.ts +10 -1
  83. package/types/components/list.d.ts +33 -2
  84. package/types/components/scrollbar.d.ts +17 -2
  85. package/types/components/table-plugins/extend-cell-area.d.ts +1 -1
  86. package/types/components/table.d.ts +71 -4
  87. package/types/components/tabs.d.ts +10 -1
  88. package/types/components/tree.d.ts +33 -2
  89. /package/es/icon/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  90. /package/es/icon/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  91. /package/es/icon/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
  92. /package/es/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  93. /package/es/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  94. /package/es/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
  95. /package/lib/icon/style/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  96. /package/lib/icon/style/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  97. /package/lib/icon/style/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
  98. /package/lib/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  99. /package/lib/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  100. /package/lib/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
package/dist/all.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as core from '@vxe-ui/core';
2
- import { VxeUI, setConfig as setConfig$1, setIcon, getConfig as getConfig$4, createEvent as createEvent$1, getIcon as getIcon$2, renderEmptyElement as renderEmptyElement$1, useSize, globalEvents as globalEvents$1, usePermission, permission, renderer, getI18n as getI18n$2, globalResize as globalResize$1, menus as menus$3, GLOBAL_EVENT_KEYS, getSlotVNs as getSlotVNs$1, commands, formats, getComponent, validators } from '@vxe-ui/core';
2
+ import { VxeUI, setConfig as setConfig$1, setIcon, getConfig as getConfig$4, createEvent as createEvent$1, getIcon as getIcon$2, renderEmptyElement as renderEmptyElement$1, useSize, globalEvents as globalEvents$1, usePermission, permission, renderer, getI18n as getI18n$2, domUtils as domUtils$1, globalResize as globalResize$1, menus as menus$3, GLOBAL_EVENT_KEYS, getSlotVNs as getSlotVNs$1, commands, formats, getComponent, validators } from '@vxe-ui/core';
3
3
  export * from '@vxe-ui/core';
4
4
  import { defineComponent, ref, reactive, h, createCommentVNode, createApp, inject, computed, watch, onMounted, onUnmounted, provide, nextTick, onBeforeUnmount, resolveComponent, Teleport, onActivated, onDeactivated, TransitionGroup } from 'vue';
5
5
  import XEUtils from 'xe-utils';
@@ -101,7 +101,7 @@ function checkDynamic() {
101
101
  }
102
102
 
103
103
  const { log } = VxeUI;
104
- const uiVersion = `ui v${"4.19.8"}`;
104
+ const uiVersion = `ui v${"4.20.1"}`;
105
105
  function createComponentLog(name) {
106
106
  const tableVersion = VxeUI.tableVersion ? `table v${VxeUI.tableVersion}` : '';
107
107
  const ganttVersion = VxeUI.ganttVersion ? `gantt v${VxeUI.ganttVersion}` : '';
@@ -115,7 +115,7 @@ function createComponentLog(name) {
115
115
  const warnLog$j = log.create('warn', uiVersion);
116
116
  log.create('error', uiVersion);
117
117
 
118
- const version = "4.19.8";
118
+ const version = "4.20.1";
119
119
  VxeUI.uiVersion = version;
120
120
  VxeUI.dynamicApp = dynamicApp;
121
121
  function config(options) {
@@ -2694,6 +2694,9 @@ function enModelValue(nodeid) {
2694
2694
  function deModelValue(nodeid) {
2695
2695
  return nodeid ? decodeURIComponent(`${nodeid}`) : nodeid;
2696
2696
  }
2697
+ function getDefaultConfig(val1, def1) {
2698
+ return XEUtils.eqNull(val1) ? def1 : val1;
2699
+ }
2697
2700
 
2698
2701
  function createReactData$p() {
2699
2702
  return {
@@ -6479,6 +6482,7 @@ var VxeScrollbarComponent = defineVxeComponent({
6479
6482
  name: 'VxeScrollbar',
6480
6483
  props: {
6481
6484
  id: [String, Number],
6485
+ viewId: [String, Number],
6482
6486
  width: [String, Number],
6483
6487
  height: [String, Number],
6484
6488
  minWidth: [String, Number],
@@ -6494,6 +6498,14 @@ var VxeScrollbarComponent = defineVxeComponent({
6494
6498
  type: Boolean,
6495
6499
  default: () => getConfig$2().scrollbar.padding
6496
6500
  },
6501
+ autoHide: {
6502
+ type: Boolean,
6503
+ default: () => getConfig$2().scrollbar.autoHide
6504
+ },
6505
+ visible: {
6506
+ type: Boolean,
6507
+ default: () => getConfig$2().scrollbar.visible
6508
+ },
6497
6509
  xConfig: Object,
6498
6510
  yConfig: Object,
6499
6511
  className: {
@@ -6538,6 +6550,8 @@ var VxeScrollbarComponent = defineVxeComponent({
6538
6550
  const { width, height, minWidth, minHeight, maxWidth, maxHeight } = props;
6539
6551
  const xOpts = computeXOpts.value;
6540
6552
  const yOpts = computeYOpts.value;
6553
+ const barWidth = yOpts.width;
6554
+ const barHeight = xOpts.height;
6541
6555
  const stys = {};
6542
6556
  if (width) {
6543
6557
  stys.width = toCssUnit(width);
@@ -6557,33 +6571,53 @@ var VxeScrollbarComponent = defineVxeComponent({
6557
6571
  if (maxHeight) {
6558
6572
  stys.maxHeight = toCssUnit(maxHeight);
6559
6573
  }
6560
- if (yOpts.width) {
6561
- stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(yOpts.width);
6562
- }
6563
- if (xOpts.height) {
6564
- stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(xOpts.height);
6574
+ if (barWidth || barHeight) {
6575
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight);
6576
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth);
6565
6577
  }
6566
6578
  return stys;
6567
6579
  });
6580
+ const computeXVisible = computed(() => {
6581
+ const { visible } = props;
6582
+ const xOpts = computeXOpts.value;
6583
+ return getDefaultConfig(xOpts.visible, visible);
6584
+ });
6585
+ const computeYVisible = computed(() => {
6586
+ const { visible } = props;
6587
+ const yOpts = computeYOpts.value;
6588
+ return getDefaultConfig(yOpts.visible, visible);
6589
+ });
6590
+ const computeXAutoHide = computed(() => {
6591
+ const { autoHide } = props;
6592
+ const xOpts = computeXOpts.value;
6593
+ return getDefaultConfig(xOpts.autoHide, autoHide);
6594
+ });
6595
+ const computeYAutoHide = computed(() => {
6596
+ const { autoHide } = props;
6597
+ const yOpts = computeYOpts.value;
6598
+ return getDefaultConfig(yOpts.autoHide, autoHide);
6599
+ });
6568
6600
  const computeWrapperClss = computed(() => {
6569
6601
  const { native, className, padding } = props;
6570
6602
  const { yThumbHeight, xThumbWidth } = reactData;
6571
- const xOpts = computeXOpts.value;
6572
- const yOpts = computeYOpts.value;
6573
6603
  const xToTop = computeXToTop.value;
6574
6604
  const yToLeft = computeYToLeft.value;
6605
+ const xVisible = computeXVisible.value;
6606
+ const yVisible = computeYVisible.value;
6607
+ const xAutoHide = computeXAutoHide.value;
6608
+ const yAutoHide = computeYAutoHide.value;
6575
6609
  return domUtils.buildClass([
6576
6610
  'vxe-scrollbar',
6577
- `ov-x--${xOpts.visible || 'visible'}`,
6578
- `ov-y--${yOpts.visible || 'visible'}`,
6611
+ `ov-x--${xVisible === false ? 'hidden' : 'visible'}`,
6612
+ `ov-y--${yVisible === false ? 'hidden' : 'visible'}`,
6579
6613
  `sx-pos--${xToTop ? 'top' : 'bottom'}`,
6580
6614
  `sy-pos--${yToLeft ? 'left' : 'right'}`,
6581
6615
  native ? 'is--native' : 'is--virtual',
6582
6616
  className
6583
6617
  ], {
6584
6618
  'is--padding': padding,
6585
- 'ov-x--auto-hide': xOpts.autoHide,
6586
- 'ov-y--auto-hide': yOpts.autoHide,
6619
+ 'ov-x--auto-hide': xAutoHide,
6620
+ 'ov-y--auto-hide': yAutoHide,
6587
6621
  'overflow-y': yThumbHeight,
6588
6622
  'overflow-x': xThumbWidth
6589
6623
  });
@@ -6923,13 +6957,13 @@ var VxeScrollbarComponent = defineVxeComponent({
6923
6957
  const scrollbarPrivateMethods = {};
6924
6958
  Object.assign($xeScrollbar, scrollbarMethods, scrollbarPrivateMethods);
6925
6959
  const renderVN = () => {
6926
- const { id, native, loading, viewAttrs } = props;
6960
+ const { id, native, loading, viewId, viewAttrs } = props;
6927
6961
  const wrapperStyle = computeWrapperStyle.value;
6928
6962
  const wrapperClss = computeWrapperClss.value;
6929
6963
  const viewClss = computeViewClss.value;
6930
6964
  const viewInnerClss = computeViewInnerClss.value;
6931
- const xOpts = computeXOpts.value;
6932
- const yOpts = computeYOpts.value;
6965
+ const xVisible = computeXVisible.value;
6966
+ const yVisible = computeYVisible.value;
6933
6967
  const defaultSlot = slots.default;
6934
6968
  return h('div', {
6935
6969
  ref: refElem,
@@ -6937,14 +6971,14 @@ var VxeScrollbarComponent = defineVxeComponent({
6937
6971
  class: wrapperClss,
6938
6972
  style: wrapperStyle
6939
6973
  }, [
6940
- h('div', Object.assign({ ref: refViewElem, class: viewClss, onScroll: scrollEvent }, viewAttrs), [
6974
+ h('div', Object.assign({ ref: refViewElem, class: viewClss, onScroll: scrollEvent, id: viewId || null }, viewAttrs), [
6941
6975
  h('div', {
6942
6976
  key: 'vi',
6943
6977
  ref: refViewInnerElem,
6944
6978
  class: viewInnerClss
6945
6979
  }, defaultSlot ? defaultSlot({}) : [])
6946
6980
  ]),
6947
- native || xOpts.visible === 'hidden'
6981
+ native || xVisible === false
6948
6982
  ? renderEmptyElement($xeScrollbar)
6949
6983
  : h('div', {
6950
6984
  ref: refTrackXElem,
@@ -6961,7 +6995,7 @@ var VxeScrollbarComponent = defineVxeComponent({
6961
6995
  onLostpointercapture: cleatPointerThumbEvent
6962
6996
  })
6963
6997
  ]),
6964
- native || yOpts.visible === 'hidden'
6998
+ native || yVisible === false
6965
6999
  ? renderEmptyElement($xeScrollbar)
6966
7000
  : h('div', {
6967
7001
  ref: refTrackYElem,
@@ -7009,6 +7043,16 @@ var VxeScrollbarComponent = defineVxeComponent({
7009
7043
  watch(() => props.syncResize, () => {
7010
7044
  reFlag.value++;
7011
7045
  });
7046
+ watch(computeXVisible, () => {
7047
+ nextTick(() => {
7048
+ reFlag.value++;
7049
+ });
7050
+ });
7051
+ watch(computeYVisible, () => {
7052
+ nextTick(() => {
7053
+ reFlag.value++;
7054
+ });
7055
+ });
7012
7056
  watch(reFlag, () => {
7013
7057
  $xeScrollbar.recalculate().then(() => {
7014
7058
  $xeScrollbar.recalculate();
@@ -7118,6 +7162,19 @@ var VxeCardComponent = defineVxeComponent({
7118
7162
  const computeScrollbarOpts = computed(() => {
7119
7163
  return Object.assign({}, getConfig$4().card.scrollbarConfig, props.scrollbarConfig);
7120
7164
  });
7165
+ const computeScrollbarProps = computed(() => {
7166
+ const scrollbarOpts = computeScrollbarOpts.value;
7167
+ return {
7168
+ width: scrollbarOpts.width,
7169
+ height: scrollbarOpts.height,
7170
+ autoHide: scrollbarOpts.autoHide,
7171
+ visible: scrollbarOpts.visible,
7172
+ xConfig: scrollbarOpts.xConfig,
7173
+ yConfig: scrollbarOpts.yConfig,
7174
+ className: scrollbarOpts.className,
7175
+ viewAttrs: scrollbarOpts.viewAttrs
7176
+ };
7177
+ });
7121
7178
  const computeMaps = {
7122
7179
  computeSize
7123
7180
  };
@@ -7149,6 +7206,7 @@ var VxeCardComponent = defineVxeComponent({
7149
7206
  const vSize = computeSize.value;
7150
7207
  const cardStyle = computeCardStyle.value;
7151
7208
  const scrollbarOpts = computeScrollbarOpts.value;
7209
+ const scrollbarProps = computeScrollbarProps.value;
7152
7210
  const { viewClassName, viewInnerClassName } = scrollbarOpts;
7153
7211
  return h('div', {
7154
7212
  ref: refElem,
@@ -7183,7 +7241,7 @@ var VxeCardComponent = defineVxeComponent({
7183
7241
  }, [
7184
7242
  leftSlot
7185
7243
  ? (useScrollbar
7186
- ? h(VxeScrollbar, Object.assign(Object.assign({ class: 'vxe-card--body-scrollbar-left' }, scrollbarOpts), { viewClassName: 'vxe-card--body-scrollbar-left-view', viewInnerClassName: 'vxe-card--body-scrollbar-left-inner' }), {
7244
+ ? h(VxeScrollbar, Object.assign(Object.assign({ class: 'vxe-card--body-scrollbar-left' }, scrollbarProps), { viewClassName: 'vxe-card--body-scrollbar-left-view', viewInnerClassName: 'vxe-card--body-scrollbar-left-inner' }), {
7187
7245
  default: () => getSlotVNs(leftSlot({}))
7188
7246
  })
7189
7247
  : h('div', {
@@ -7191,7 +7249,7 @@ var VxeCardComponent = defineVxeComponent({
7191
7249
  }, getSlotVNs(leftSlot({}))))
7192
7250
  : renderEmptyElement$1($xeCard),
7193
7251
  useScrollbar
7194
- ? h(VxeScrollbar, Object.assign(Object.assign({ class: 'vxe-card--body-scrollbar-content' }, scrollbarOpts), { viewClassName: 'vxe-card--body-scrollbar-content-view' + (viewClassName ? (' ' + viewClassName) : ''), viewInnerClassName: 'vxe-card--body-scrollbar-content-inner' + (viewClassName ? (' ' + viewInnerClassName) : '') }), {
7252
+ ? h(VxeScrollbar, Object.assign(Object.assign({ class: 'vxe-card--body-scrollbar-content' }, scrollbarProps), { viewClassName: 'vxe-card--body-scrollbar-content-view' + (viewClassName ? (' ' + viewClassName) : ''), viewInnerClassName: 'vxe-card--body-scrollbar-content-inner' + (viewClassName ? (' ' + viewInnerClassName) : '') }), {
7195
7253
  default: () => defaultSlot ? getSlotVNs(defaultSlot({})) : []
7196
7254
  })
7197
7255
  : h('div', {
@@ -7199,7 +7257,7 @@ var VxeCardComponent = defineVxeComponent({
7199
7257
  }, defaultSlot ? getSlotVNs(defaultSlot({})) : []),
7200
7258
  rightSlot
7201
7259
  ? (useScrollbar
7202
- ? h(VxeScrollbar, Object.assign(Object.assign({ class: 'vxe-card--body-scrollbar-right' }, scrollbarOpts), { viewClassName: 'vxe-card--body-scrollbar-right-view', viewInnerClassName: 'vxe-card--body-scrollbar-right-inner' }), {
7260
+ ? h(VxeScrollbar, Object.assign(Object.assign({ class: 'vxe-card--body-scrollbar-right' }, scrollbarProps), { viewClassName: 'vxe-card--body-scrollbar-right-view', viewInnerClassName: 'vxe-card--body-scrollbar-right-inner' }), {
7203
7261
  default: () => getSlotVNs(rightSlot({}))
7204
7262
  })
7205
7263
  : h('div', {
@@ -7787,6 +7845,9 @@ function createReactData$m() {
7787
7845
  updateCheckboxFlag: 1,
7788
7846
  isAllChecked: false,
7789
7847
  isAllIndeterminate: false,
7848
+ // 滚动条
7849
+ yThumbHeight: 0,
7850
+ xThumbWidth: 0,
7790
7851
  insertRowFlag: 1,
7791
7852
  removeRowFlag: 1,
7792
7853
  dragRow: null,
@@ -7796,13 +7857,18 @@ function createReactData$m() {
7796
7857
  }
7797
7858
  function createInternalData$l() {
7798
7859
  return {
7799
- resizeObserver: undefined,
7800
7860
  fullData: [],
7801
7861
  afterList: [],
7802
7862
  fullKeyMaps: {},
7803
7863
  rowMaps: {},
7804
- lastScrollLeft: 0,
7864
+ // 滚动条
7865
+ // resizeObserver: undefined,
7866
+ // isThumbDrag: false,
7867
+ thumbDragOffset: 0,
7868
+ yThumbTop: 0,
7869
+ xThumbLeft: 0,
7805
7870
  lastScrollTop: 0,
7871
+ lastScrollLeft: 0,
7806
7872
  scrollYStore: {
7807
7873
  startIndex: 0,
7808
7874
  endIndex: 0,
@@ -7856,7 +7922,12 @@ var VxeListComponent = defineVxeComponent({
7856
7922
  dragConfig: Object,
7857
7923
  menuConfig: Object,
7858
7924
  virtualYConfig: Object,
7859
- scrollY: Object
7925
+ scrollY: Object,
7926
+ useScrollbar: {
7927
+ type: Boolean,
7928
+ default: () => getConfig$4().list.useScrollbar
7929
+ },
7930
+ scrollbarConfig: Object
7860
7931
  },
7861
7932
  emits: [
7862
7933
  'update:checkRowKey',
@@ -7889,6 +7960,10 @@ var VxeListComponent = defineVxeComponent({
7889
7960
  const refFooterElem = ref();
7890
7961
  const refVirtualWrapper = ref();
7891
7962
  const refVirtualBody = ref();
7963
+ const refTrackXElem = ref();
7964
+ const refTrackYElem = ref();
7965
+ const refThumbXElem = ref();
7966
+ const refThumbYElem = ref();
7892
7967
  const refDragRowLineElem = ref();
7893
7968
  const refDragTipElem = ref();
7894
7969
  const refMaps = {
@@ -7937,11 +8012,20 @@ var VxeListComponent = defineVxeComponent({
7937
8012
  });
7938
8013
  const computeWrapperStyles = computed(() => {
7939
8014
  const rowHeight = computeRowHeight.value;
7940
- const style = {};
8015
+ const scrollbarOpts = computeScrollbarOpts.value;
8016
+ const scrollbarXOpts = computeScrollbarXOpts.value;
8017
+ const scrollbarYOpts = computeScrollbarYOpts.value;
8018
+ const barWidth = getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), getConfig$4().scrollbar.width);
8019
+ const barHeight = getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), getConfig$4().scrollbar.height);
8020
+ const stys = {};
7941
8021
  if (rowHeight) {
7942
- style['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
8022
+ stys['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
7943
8023
  }
7944
- return style;
8024
+ if (barWidth || barHeight) {
8025
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight);
8026
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth);
8027
+ }
8028
+ return stys;
7945
8029
  });
7946
8030
  const computeVirtualStyles = computed(() => {
7947
8031
  const { height, maxHeight } = props;
@@ -7956,6 +8040,69 @@ var VxeListComponent = defineVxeComponent({
7956
8040
  }
7957
8041
  return style;
7958
8042
  });
8043
+ const computeScrollbarOpts = computed(() => {
8044
+ return Object.assign({}, getConfig$4().list.scrollbarConfig, props.scrollbarConfig);
8045
+ });
8046
+ const computeScrollbarXOpts = computed(() => {
8047
+ const scrollbarOpts = computeScrollbarOpts.value;
8048
+ return Object.assign({}, getConfig$4().scrollbar.xConfig, scrollbarOpts.xConfig);
8049
+ });
8050
+ const computeScrollbarYOpts = computed(() => {
8051
+ const scrollbarOpts = computeScrollbarOpts.value;
8052
+ return Object.assign({}, getConfig$4().scrollbar.yConfig, scrollbarOpts.yConfig);
8053
+ });
8054
+ const computeScrollXVisible = computed(() => {
8055
+ const scrollbarOpts = computeScrollbarOpts.value;
8056
+ const scrollbarXOpts = computeScrollbarXOpts.value;
8057
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible);
8058
+ });
8059
+ const computeScrollYVisible = computed(() => {
8060
+ const scrollbarOpts = computeScrollbarOpts.value;
8061
+ const scrollbarYOpts = computeScrollbarYOpts.value;
8062
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible);
8063
+ });
8064
+ const computeScrollXAutoHide = computed(() => {
8065
+ const scrollbarOpts = computeScrollbarOpts.value;
8066
+ const scrollbarXOpts = computeScrollbarXOpts.value;
8067
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig$4().scrollbar.autoHide);
8068
+ });
8069
+ const computeScrollYAutoHide = computed(() => {
8070
+ const scrollbarOpts = computeScrollbarOpts.value;
8071
+ const scrollbarYOpts = computeScrollbarYOpts.value;
8072
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig$4().scrollbar.autoHide);
8073
+ });
8074
+ const computeScrollbarWrapperClss = computed(() => {
8075
+ const scrollbarOpts = computeScrollbarOpts.value;
8076
+ const { padding } = scrollbarOpts;
8077
+ const { yThumbHeight, xThumbWidth } = reactData;
8078
+ const scrollbarXToTop = computeScrollbarXToTop.value;
8079
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
8080
+ const scrollXVisible = computeScrollXVisible.value;
8081
+ const scrollYVisible = computeScrollYVisible.value;
8082
+ const scrollXAutoHide = computeScrollXAutoHide.value;
8083
+ const scrollYAutoHide = computeScrollYAutoHide.value;
8084
+ return domUtils$1.buildClass([
8085
+ 'vxe-scrollbar is--virtual',
8086
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
8087
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
8088
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
8089
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
8090
+ ], {
8091
+ 'is--padding': padding,
8092
+ 'ov-x--auto-hide': scrollXAutoHide,
8093
+ 'ov-y--auto-hide': scrollYAutoHide,
8094
+ 'overflow-y': yThumbHeight,
8095
+ 'overflow-x': xThumbWidth
8096
+ });
8097
+ });
8098
+ const computeScrollbarXToTop = computed(() => {
8099
+ const scrollbarXOpts = computeScrollbarXOpts.value;
8100
+ return scrollbarXOpts.position === 'top';
8101
+ });
8102
+ const computeScrollbarYToLeft = computed(() => {
8103
+ const scrollbarYOpts = computeScrollbarYOpts.value;
8104
+ return scrollbarYOpts.position === 'left';
8105
+ });
7959
8106
  const dispatchEvent = (type, params, evnt) => {
7960
8107
  emit(type, createEvent$1(evnt, { $list: $xeList }, params));
7961
8108
  };
@@ -8112,6 +8259,7 @@ var VxeListComponent = defineVxeComponent({
8112
8259
  */
8113
8260
  const refreshScroll = () => {
8114
8261
  const { lastScrollLeft, lastScrollTop } = internalData;
8262
+ updateScrollbar();
8115
8263
  return clearScroll().then(() => {
8116
8264
  if (lastScrollLeft || lastScrollTop) {
8117
8265
  internalData.lastScrollLeft = 0;
@@ -8120,6 +8268,10 @@ var VxeListComponent = defineVxeComponent({
8120
8268
  }
8121
8269
  });
8122
8270
  };
8271
+ const updateScrollbar = () => {
8272
+ updateThumbSize();
8273
+ updateThumbOffset();
8274
+ };
8123
8275
  /**
8124
8276
  * 重新计算列表
8125
8277
  */
@@ -8137,6 +8289,7 @@ var VxeListComponent = defineVxeComponent({
8137
8289
  parentHeight = parentEl.clientHeight - Math.ceil(XEUtils.toNumber(parentStyle.paddingLeft) + XEUtils.toNumber(parentStyle.paddingRight));
8138
8290
  }
8139
8291
  reactData.parentHeight = parentHeight;
8292
+ updateScrollbar();
8140
8293
  updateHeight();
8141
8294
  if (el.clientWidth && el.clientHeight) {
8142
8295
  return computeScrollLoad();
@@ -8166,6 +8319,7 @@ var VxeListComponent = defineVxeComponent({
8166
8319
  const scrollLeft = scrollBodyElem.scrollLeft;
8167
8320
  const isX = scrollLeft !== internalData.lastScrollLeft;
8168
8321
  const isY = scrollTop !== internalData.lastScrollTop;
8322
+ updateThumbOffset();
8169
8323
  internalData.lastScrollTop = scrollTop;
8170
8324
  internalData.lastScrollLeft = scrollLeft;
8171
8325
  if (reactData.scrollYLoad) {
@@ -9462,6 +9616,162 @@ var VxeListComponent = defineVxeComponent({
9462
9616
  hideDropTip();
9463
9617
  }
9464
9618
  };
9619
+ const updateThumbSize = () => {
9620
+ const viewEl = refVirtualWrapper.value;
9621
+ if (!viewEl) {
9622
+ return;
9623
+ }
9624
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
9625
+ return;
9626
+ }
9627
+ const trackXEl = refTrackXElem.value;
9628
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
9629
+ const thumbXElem = refThumbXElem.value;
9630
+ if (thumbXElem) {
9631
+ thumbXElem.style.width = xThumbWidth + 'px';
9632
+ }
9633
+ reactData.xThumbWidth = xThumbWidth;
9634
+ const trackYEl = refTrackYElem.value;
9635
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
9636
+ const thumbYElem = refThumbYElem.value;
9637
+ if (thumbYElem) {
9638
+ thumbYElem.style.height = yThumbHeight + 'px';
9639
+ }
9640
+ reactData.yThumbHeight = yThumbHeight;
9641
+ };
9642
+ const updateThumbOffset = () => {
9643
+ const viewEl = refVirtualWrapper.value;
9644
+ if (!viewEl) {
9645
+ return;
9646
+ }
9647
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
9648
+ return;
9649
+ }
9650
+ const { xThumbWidth, yThumbHeight } = reactData;
9651
+ const trackXEl = refTrackXElem.value;
9652
+ const thumbXElem = refThumbXElem.value;
9653
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
9654
+ internalData.xThumbLeft = xThumbLeft;
9655
+ if (thumbXElem && xThumbWidth) {
9656
+ thumbXElem.style.width = xThumbWidth + 'px';
9657
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
9658
+ }
9659
+ const trackYEl = refTrackYElem.value;
9660
+ const thumbYElem = refThumbYElem.value;
9661
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
9662
+ internalData.yThumbTop = yThumbTop;
9663
+ if (thumbYElem && yThumbHeight) {
9664
+ thumbYElem.style.height = yThumbHeight + 'px';
9665
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
9666
+ }
9667
+ };
9668
+ const clickTrackXEvent = (evnt) => {
9669
+ const trackEl = evnt.currentTarget;
9670
+ if (trackEl !== evnt.target) {
9671
+ return;
9672
+ }
9673
+ const viewEl = refVirtualWrapper.value;
9674
+ if (!viewEl) {
9675
+ return;
9676
+ }
9677
+ const { xThumbWidth } = reactData;
9678
+ const trackRect = trackEl.getBoundingClientRect();
9679
+ viewEl.scrollTo({
9680
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
9681
+ behavior: 'auto'
9682
+ });
9683
+ };
9684
+ const clickTrackYEvent = (evnt) => {
9685
+ const trackEl = evnt.currentTarget;
9686
+ if (trackEl !== evnt.target) {
9687
+ return;
9688
+ }
9689
+ const viewEl = refVirtualWrapper.value;
9690
+ if (!viewEl) {
9691
+ return;
9692
+ }
9693
+ const { yThumbHeight } = reactData;
9694
+ const trackRect = trackEl.getBoundingClientRect();
9695
+ viewEl.scrollTo({
9696
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
9697
+ behavior: 'auto'
9698
+ });
9699
+ };
9700
+ const pointerdownThumbXEvent = (evnt) => {
9701
+ const thumbEl = evnt.currentTarget;
9702
+ internalData.isThumbDrag = true;
9703
+ thumbEl.setPointerCapture(evnt.pointerId);
9704
+ const viewEl = refVirtualWrapper.value;
9705
+ if (!viewEl) {
9706
+ return;
9707
+ }
9708
+ const { xThumbWidth } = reactData;
9709
+ const trackEl = thumbEl.parentElement;
9710
+ const trackRect = trackEl.getBoundingClientRect();
9711
+ const pointerPosition = evnt.clientX - trackRect.left;
9712
+ // 记录 thumb 的偏移
9713
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
9714
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
9715
+ };
9716
+ const pointermoveThumbXEvent = (evnt) => {
9717
+ const thumbEl = evnt.currentTarget;
9718
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
9719
+ return;
9720
+ }
9721
+ const { isThumbDrag, thumbDragOffset } = internalData;
9722
+ if (isThumbDrag) {
9723
+ const viewEl = refVirtualWrapper.value;
9724
+ if (!viewEl) {
9725
+ return;
9726
+ }
9727
+ const { xThumbWidth } = reactData;
9728
+ const thumbEl = evnt.currentTarget;
9729
+ const trackEl = thumbEl.parentElement;
9730
+ const trackRect = trackEl.getBoundingClientRect();
9731
+ // 更新偏移
9732
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
9733
+ }
9734
+ };
9735
+ const cleatPointerThumbEvent = (evnt) => {
9736
+ const thumbEl = evnt.currentTarget;
9737
+ thumbEl.releasePointerCapture(evnt.pointerId);
9738
+ internalData.isThumbDrag = false;
9739
+ };
9740
+ const pointerdownThumbYEvent = (evnt) => {
9741
+ const thumbEl = evnt.currentTarget;
9742
+ internalData.isThumbDrag = true;
9743
+ thumbEl.setPointerCapture(evnt.pointerId);
9744
+ const viewEl = refVirtualWrapper.value;
9745
+ if (!viewEl) {
9746
+ return;
9747
+ }
9748
+ const { yThumbHeight } = reactData;
9749
+ const trackEl = thumbEl.parentElement;
9750
+ const trackRect = trackEl.getBoundingClientRect();
9751
+ const pointerPosition = evnt.clientY - trackRect.top;
9752
+ // 记录 thumb 的偏移
9753
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
9754
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
9755
+ };
9756
+ const pointermoveThumbYEvent = (evnt) => {
9757
+ const thumbEl = evnt.currentTarget;
9758
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
9759
+ return;
9760
+ }
9761
+ const { isThumbDrag, thumbDragOffset } = internalData;
9762
+ if (isThumbDrag) {
9763
+ const viewEl = refVirtualWrapper.value;
9764
+ if (!viewEl) {
9765
+ return;
9766
+ }
9767
+ const { yThumbHeight } = reactData;
9768
+ const thumbEl = evnt.currentTarget;
9769
+ const trackEl = thumbEl.parentElement;
9770
+ const trackRect = trackEl.getBoundingClientRect();
9771
+ // 更新偏移
9772
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
9773
+ }
9774
+ };
9465
9775
  Object.assign($xeList, listMethods, listPrivateMethods);
9466
9776
  const renderDragTip = () => {
9467
9777
  const { dragRow, dragTipText } = reactData;
@@ -9658,8 +9968,8 @@ var VxeListComponent = defineVxeComponent({
9658
9968
  }], rowid: hasKey && keyField ? rowid : undefined }, rowOns), ctVNs);
9659
9969
  };
9660
9970
  const renderVN = () => {
9661
- const { showCheckbox, className, loading } = props;
9662
- const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData;
9971
+ const { showCheckbox, className, loading, useScrollbar } = props;
9972
+ const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate, xThumbWidth, yThumbHeight } = reactData;
9663
9973
  const defaultSlot = slots.default;
9664
9974
  const headerSlot = slots.header;
9665
9975
  const footerSlot = slots.footer;
@@ -9674,16 +9984,38 @@ var VxeListComponent = defineVxeComponent({
9674
9984
  const rowOpts = computeRowOpts.value;
9675
9985
  const { isHover, padding } = rowOpts;
9676
9986
  const isDrag = computeIsDrag.value;
9987
+ const scrollbarOpts = computeScrollbarOpts.value;
9988
+ const scrollXVisible = computeScrollXVisible.value;
9989
+ const scrollYVisible = computeScrollYVisible.value;
9990
+ const scrollbarXToTop = computeScrollbarXToTop.value;
9991
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
9992
+ const scrollXAutoHide = computeScrollXAutoHide.value;
9993
+ const scrollYAutoHide = computeScrollYAutoHide.value;
9994
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
9677
9995
  const showDefChekboxHead = showCheckbox && showHeader !== false;
9678
9996
  const leOns = {};
9679
9997
  if (isCrossListDrag && !rowList.length) {
9680
9998
  leOns.onDragover = $xeList.handleCrossListRowDragoverEmptyEvent;
9681
9999
  }
9682
- return h('div', Object.assign({ ref: refElem, class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
10000
+ return h('div', Object.assign({ ref: refElem, class: [
10001
+ 'vxe-list',
10002
+ useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
10003
+ useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
10004
+ useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
10005
+ useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
10006
+ className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '',
10007
+ {
9683
10008
  [`size--${vSize}`]: vSize,
10009
+ 'is--virtual-scrollbar': useScrollbar,
10010
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
10011
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
10012
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
10013
+ 'overflow-y': yThumbHeight,
10014
+ 'overflow-x': xThumbWidth,
9684
10015
  'is--drag': isDrag,
9685
10016
  'is--loading': loading
9686
- }], style: wrapperStyles }, leOns), [
10017
+ }
10018
+ ], style: wrapperStyles }, leOns), [
9687
10019
  headerSlot || showDefChekboxHead
9688
10020
  ? h('div', {
9689
10021
  ref: refHeaderElem,
@@ -9748,6 +10080,49 @@ var VxeListComponent = defineVxeComponent({
9748
10080
  class: 'vxe-list--footer-wrapper'
9749
10081
  }, footerSlot({ items: rowList, $list: $xeList }))
9750
10082
  : renderEmptyElement$1($xeList),
10083
+ /**
10084
+ * 滚动条
10085
+ */
10086
+ useScrollbar
10087
+ ? h('div', {
10088
+ class: scrollbarWrapperClss
10089
+ }, [
10090
+ scrollXVisible === false
10091
+ ? renderEmptyElement$1($xeList)
10092
+ : h('div', {
10093
+ ref: refTrackXElem,
10094
+ class: 'vxe-scrollbar--track-x',
10095
+ onClick: clickTrackXEvent
10096
+ }, [
10097
+ h('div', {
10098
+ ref: refThumbXElem,
10099
+ class: 'vxe-scrollbar--thumb-x',
10100
+ onPointerdown: pointerdownThumbXEvent,
10101
+ onPointermove: pointermoveThumbXEvent,
10102
+ onPointerup: cleatPointerThumbEvent,
10103
+ onPointercancel: cleatPointerThumbEvent,
10104
+ onLostpointercapture: cleatPointerThumbEvent
10105
+ })
10106
+ ]),
10107
+ scrollYVisible === false
10108
+ ? renderEmptyElement$1($xeList)
10109
+ : h('div', {
10110
+ ref: refTrackYElem,
10111
+ class: 'vxe-scrollbar--track-y',
10112
+ onClick: clickTrackYEvent
10113
+ }, [
10114
+ h('div', {
10115
+ ref: refThumbYElem,
10116
+ class: 'vxe-scrollbar--thumb-y',
10117
+ onPointerdown: pointerdownThumbYEvent,
10118
+ onPointermove: pointermoveThumbYEvent,
10119
+ onPointerup: cleatPointerThumbEvent,
10120
+ onPointercancel: cleatPointerThumbEvent,
10121
+ onLostpointercapture: cleatPointerThumbEvent
10122
+ })
10123
+ ])
10124
+ ])
10125
+ : renderEmptyElement$1($xeList),
9751
10126
  /**
9752
10127
  * 拖拽提示
9753
10128
  */
@@ -9781,11 +10156,24 @@ var VxeListComponent = defineVxeComponent({
9781
10156
  watch(() => props.syncResize, () => {
9782
10157
  reFlag.value++;
9783
10158
  });
10159
+ watch(() => props.useScrollbar, () => {
10160
+ reFlag.value++;
10161
+ });
9784
10162
  watch(computeRowHeight, () => {
9785
10163
  reFlag.value++;
9786
10164
  });
9787
- watch(reFlag, () => {
10165
+ watch(computeScrollXVisible, () => {
10166
+ nextTick(() => {
10167
+ reFlag.value++;
10168
+ });
10169
+ });
10170
+ watch(computeScrollYVisible, () => {
9788
10171
  nextTick(() => {
10172
+ reFlag.value++;
10173
+ });
10174
+ });
10175
+ watch(reFlag, () => {
10176
+ recalculate().then(() => {
9789
10177
  recalculate();
9790
10178
  });
9791
10179
  });
@@ -9803,13 +10191,15 @@ var VxeListComponent = defineVxeComponent({
9803
10191
  updateCheckboxModeValue();
9804
10192
  });
9805
10193
  onActivated(() => {
9806
- recalculate().then(() => refreshScroll());
10194
+ recalculate().then(() => {
10195
+ refreshScroll();
10196
+ });
9807
10197
  });
9808
10198
  nextTick(() => {
9809
10199
  loadData(props.data || []);
9810
10200
  });
9811
10201
  onMounted(() => {
9812
- const { showSeq, showRadio, showCheckbox } = props;
10202
+ const { showSeq, showRadio, showCheckbox, autoResize, useScrollbar } = props;
9813
10203
  const rowOpts = computeRowOpts.value;
9814
10204
  const { useKey } = rowOpts;
9815
10205
  const isDrag = computeIsDrag.value;
@@ -9831,17 +10221,27 @@ var VxeListComponent = defineVxeComponent({
9831
10221
  if (useKey && !keyField) {
9832
10222
  errLog$j('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField']);
9833
10223
  }
9834
- if (props.autoResize) {
10224
+ if (useScrollbar || autoResize) {
9835
10225
  const el = refElem.value;
9836
- const resizeObserver = globalResize$1.create(() => recalculate());
9837
- resizeObserver.observe(el);
10226
+ const viewInnerEl = refVirtualBody.value;
10227
+ const resizeObserver = globalResize$1.create(() => {
10228
+ reFlag.value++;
10229
+ });
9838
10230
  if (el) {
9839
- resizeObserver.observe(el.parentElement);
10231
+ resizeObserver.observe(el);
10232
+ if (autoResize) {
10233
+ resizeObserver.observe(el.parentElement);
10234
+ }
10235
+ }
10236
+ if (viewInnerEl) {
10237
+ resizeObserver.observe(viewInnerEl);
9840
10238
  }
9841
10239
  internalData.resizeObserver = resizeObserver;
9842
10240
  }
9843
- recalculate();
9844
- globalEvents$1.on($xeList, 'resize', recalculate);
10241
+ reFlag.value++;
10242
+ globalEvents$1.on($xeList, 'resize', () => {
10243
+ reFlag.value++;
10244
+ });
9845
10245
  });
9846
10246
  onBeforeUnmount(() => {
9847
10247
  const { resizeObserver } = internalData;
@@ -29558,7 +29958,7 @@ var VxeLayoutAsideComponent = defineVxeComponent({
29558
29958
  const vSize = computeSize.value;
29559
29959
  const collapseOpts = computeCollapseOpts.value;
29560
29960
  const scrollbarOpts = computeScrollbarOpts.value;
29561
- const { native, yConfig, className, viewAttrs, viewClassName, viewInnerClassName } = scrollbarOpts;
29961
+ const { className, viewClassName, viewInnerClassName } = scrollbarOpts;
29562
29962
  const defaultSlot = slots.default;
29563
29963
  return h('aside', {
29564
29964
  ref: refElem,
@@ -29573,13 +29973,16 @@ var VxeLayoutAsideComponent = defineVxeComponent({
29573
29973
  }, [
29574
29974
  useScrollbar
29575
29975
  ? h(VxeScrollbar, {
29576
- native,
29976
+ width: scrollbarOpts.width,
29977
+ height: scrollbarOpts.height,
29978
+ autoHide: scrollbarOpts.autoHide,
29979
+ visible: scrollbarOpts.visible,
29577
29980
  xConfig: {
29578
- visible: 'hidden'
29981
+ visible: false
29579
29982
  },
29580
- yConfig,
29983
+ yConfig: scrollbarOpts.yConfig,
29581
29984
  className: 'vxe-layout-aside--scrollbar' + (className ? (' ' + className) : ''),
29582
- viewAttrs,
29985
+ viewAttrs: scrollbarOpts.viewAttrs,
29583
29986
  viewClassName: 'vxe-layout-aside--scrollbar-view' + (viewClassName ? (' ' + viewClassName) : ''),
29584
29987
  viewInnerClassName: 'vxe-layout-aside--scrollbar-inner' + (viewInnerClassName ? (' ' + viewInnerClassName) : '')
29585
29988
  }, {
@@ -29661,6 +30064,23 @@ var VxeLayoutBodyComponent = defineVxeComponent({
29661
30064
  const computeScrollbarOpts = computed(() => {
29662
30065
  return Object.assign({}, getConfig$4().layoutBody.scrollbarConfig, props.scrollbarConfig);
29663
30066
  });
30067
+ const computeScrollbarProps = computed(() => {
30068
+ const { showBacktop } = props;
30069
+ const scrollbarOpts = computeScrollbarOpts.value;
30070
+ const { className, viewClassName, viewInnerClassName } = scrollbarOpts;
30071
+ return {
30072
+ width: scrollbarOpts.width,
30073
+ height: scrollbarOpts.height,
30074
+ autoHide: scrollbarOpts.autoHide,
30075
+ visible: scrollbarOpts.visible,
30076
+ xConfig: scrollbarOpts.xConfig,
30077
+ yConfig: scrollbarOpts.yConfig,
30078
+ className: 'vxe-layout-body--scrollbar' + (className ? (' ' + className) : ''),
30079
+ viewAttrs: Object.assign(Object.assign({}, scrollbarOpts.viewAttrs), { id: showBacktop ? (backtopId || null) : null }),
30080
+ viewClassName: 'vxe-layout-body--scrollbar-view' + (viewClassName ? (' ' + viewClassName) : ''),
30081
+ viewInnerClassName: 'vxe-layout-body--scrollbar-inner' + (viewInnerClassName ? (' ' + viewInnerClassName) : '')
30082
+ };
30083
+ });
29664
30084
  const computeMaps = {
29665
30085
  computeSize
29666
30086
  };
@@ -29684,8 +30104,7 @@ var VxeLayoutBodyComponent = defineVxeComponent({
29684
30104
  const renderVN = () => {
29685
30105
  const { loading, padding, showBacktop, useScrollbar } = props;
29686
30106
  const backtopOpts = computeBacktopOpts.value;
29687
- const scrollbarOpts = computeScrollbarOpts.value;
29688
- const { native, xConfig, yConfig, className, viewAttrs, viewClassName, viewInnerClassName } = scrollbarOpts;
30107
+ const scrollbarProps = computeScrollbarProps.value;
29689
30108
  const vSize = computeSize.value;
29690
30109
  const defaultSlot = slots.default;
29691
30110
  const backtopSlot = slots.backtop;
@@ -29710,15 +30129,7 @@ var VxeLayoutBodyComponent = defineVxeComponent({
29710
30129
  }]
29711
30130
  }, [
29712
30131
  useScrollbar
29713
- ? h(VxeScrollbar, {
29714
- native,
29715
- xConfig,
29716
- yConfig,
29717
- className: 'vxe-layout-body--scrollbar' + (className ? (' ' + className) : ''),
29718
- viewAttrs: Object.assign(Object.assign({}, viewAttrs), { id: showBacktop ? (backtopId || null) : null }),
29719
- viewClassName: 'vxe-layout-body--scrollbar-view' + (viewClassName ? (' ' + viewClassName) : ''),
29720
- viewInnerClassName: 'vxe-layout-body--scrollbar-inner' + (viewInnerClassName ? (' ' + viewInnerClassName) : '')
29721
- }, {
30132
+ ? h(VxeScrollbar, scrollbarProps, {
29722
30133
  default: () => defaultSlot ? defaultSlot({}) : []
29723
30134
  })
29724
30135
  : h('div', {
@@ -41080,6 +41491,22 @@ var VxeTabsComponent = defineVxeComponent({
41080
41491
  const computeScrollbarOpts = computed(() => {
41081
41492
  return Object.assign({}, getConfig$4().tabs.scrollbarConfig, props.scrollbarConfig);
41082
41493
  });
41494
+ const computeScrollbarProps = computed(() => {
41495
+ const scrollbarOpts = computeScrollbarOpts.value;
41496
+ const { viewClassName, viewInnerClassName } = scrollbarOpts;
41497
+ return {
41498
+ width: scrollbarOpts.width,
41499
+ height: scrollbarOpts.height,
41500
+ autoHide: scrollbarOpts.autoHide,
41501
+ visible: scrollbarOpts.visible,
41502
+ xConfig: scrollbarOpts.xConfig,
41503
+ yConfig: scrollbarOpts.yConfig,
41504
+ className: scrollbarOpts.className,
41505
+ viewAttrs: scrollbarOpts.viewAttrs,
41506
+ viewClassName: 'vxe-tabs-pane--scrollbar-item-view' + (viewClassName ? (' ' + viewClassName) : ''),
41507
+ viewInnerClassName: 'vxe-tabs-pane--scrollbar-item-inner' + (viewClassName ? (' ' + viewInnerClassName) : '')
41508
+ };
41509
+ });
41083
41510
  const computeMaps = {};
41084
41511
  const $xeTabs = {
41085
41512
  xID,
@@ -41659,13 +42086,12 @@ var VxeTabsComponent = defineVxeComponent({
41659
42086
  const { initNames, activeName } = reactData;
41660
42087
  const { name, slots } = item;
41661
42088
  const defaultSlot = slots ? slots.default : null;
41662
- const scrollbarOpts = computeScrollbarOpts.value;
41663
- const { viewClassName, viewInnerClassName } = scrollbarOpts;
42089
+ const scrollbarProps = computeScrollbarProps.value;
41664
42090
  if (name && initNames.includes(name)) {
41665
42091
  return useScrollbar
41666
- ? h(VxeScrollbar, Object.assign(Object.assign({ key: `${name}`, class: ['vxe-tabs-pane--scrollbar-item', {
42092
+ ? h(VxeScrollbar, Object.assign({ key: `${name}`, class: ['vxe-tabs-pane--scrollbar-item', {
41667
42093
  'is--visible': activeName === name
41668
- }] }, scrollbarOpts), { viewClassName: 'vxe-tabs-pane--scrollbar-item-view' + (viewClassName ? (' ' + viewClassName) : ''), viewInnerClassName: 'vxe-tabs-pane--scrollbar-item-inner' + (viewClassName ? (' ' + viewInnerClassName) : '') }), {
42094
+ }] }, scrollbarProps), {
41669
42095
  default: () => defaultSlot ? callSlot(defaultSlot, { name }) : []
41670
42096
  })
41671
42097
  : h('div', {
@@ -43157,6 +43583,34 @@ const { menus, getConfig, getI18n, getIcon } = VxeUI;
43157
43583
  function getNodeUniqueId() {
43158
43584
  return XEUtils.uniqueId('node_');
43159
43585
  }
43586
+ function createReactData$2() {
43587
+ return {
43588
+ parentHeight: 0,
43589
+ customHeight: 0,
43590
+ customMinHeight: 0,
43591
+ customMaxHeight: 0,
43592
+ currentNode: null,
43593
+ scrollYLoad: false,
43594
+ bodyHeight: 0,
43595
+ topSpaceHeight: 0,
43596
+ selectRadioKey: null,
43597
+ treeList: [],
43598
+ updateExpandedFlag: 1,
43599
+ updateCheckboxFlag: 1,
43600
+ // 滚动条
43601
+ yThumbHeight: 0,
43602
+ xThumbWidth: 0,
43603
+ insertNodeFlag: 1,
43604
+ removeNodeFlag: 1,
43605
+ dragNode: null,
43606
+ dragTipText: '',
43607
+ isCrossDragNode: false,
43608
+ tooltipStore: {
43609
+ visible: false,
43610
+ node: null
43611
+ }
43612
+ };
43613
+ }
43160
43614
  function createInternalData$2() {
43161
43615
  return {
43162
43616
  // initialized: false,
@@ -43169,8 +43623,14 @@ function createInternalData$2() {
43169
43623
  indeterminateNodeMaps: {},
43170
43624
  treeExpandedMaps: {},
43171
43625
  treeExpandLazyLoadedMaps: {},
43172
- lastScrollLeft: 0,
43626
+ // 滚动条
43627
+ // resizeObserver: undefined,
43628
+ // isThumbDrag: false,
43629
+ thumbDragOffset: 0,
43630
+ yThumbTop: 0,
43631
+ xThumbLeft: 0,
43173
43632
  lastScrollTop: 0,
43633
+ lastScrollLeft: 0,
43174
43634
  scrollYStore: {
43175
43635
  startIndex: 0,
43176
43636
  endIndex: 0,
@@ -43187,31 +43647,6 @@ function createInternalData$2() {
43187
43647
  // hpTimeout: undefined
43188
43648
  };
43189
43649
  }
43190
- function createReactData$2() {
43191
- return {
43192
- parentHeight: 0,
43193
- customHeight: 0,
43194
- customMinHeight: 0,
43195
- customMaxHeight: 0,
43196
- currentNode: null,
43197
- scrollYLoad: false,
43198
- bodyHeight: 0,
43199
- topSpaceHeight: 0,
43200
- selectRadioKey: null,
43201
- treeList: [],
43202
- updateExpandedFlag: 1,
43203
- updateCheckboxFlag: 1,
43204
- insertNodeFlag: 1,
43205
- removeNodeFlag: 1,
43206
- dragNode: null,
43207
- dragTipText: '',
43208
- isCrossDragNode: false,
43209
- tooltipStore: {
43210
- visible: false,
43211
- node: null
43212
- }
43213
- };
43214
- }
43215
43650
  let crossTreeDragNodeObj = null;
43216
43651
  var VxeTreeComponent = defineVxeComponent({
43217
43652
  name: 'VxeTree',
@@ -43342,7 +43777,12 @@ var VxeTreeComponent = defineVxeComponent({
43342
43777
  type: String,
43343
43778
  default: () => getConfig().tree.size || getConfig().size
43344
43779
  },
43345
- virtualYConfig: Object
43780
+ virtualYConfig: Object,
43781
+ useScrollbar: {
43782
+ type: Boolean,
43783
+ default: () => getConfig().tree.useScrollbar
43784
+ },
43785
+ scrollbarConfig: Object
43346
43786
  },
43347
43787
  emits: [
43348
43788
  'update:modelValue',
@@ -43374,6 +43814,10 @@ var VxeTreeComponent = defineVxeComponent({
43374
43814
  const refFooterWrapperElem = ref();
43375
43815
  const refVirtualWrapper = ref();
43376
43816
  const refVirtualBody = ref();
43817
+ const refTrackXElem = ref();
43818
+ const refTrackYElem = ref();
43819
+ const refThumbXElem = ref();
43820
+ const refThumbYElem = ref();
43377
43821
  const refDragNodeLineElem = ref();
43378
43822
  const refDragTipElem = ref();
43379
43823
  const refTooltip = ref();
@@ -43445,6 +43889,19 @@ var VxeTreeComponent = defineVxeComponent({
43445
43889
  const computeMenuOpts = computed(() => {
43446
43890
  return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig);
43447
43891
  });
43892
+ const computeWrapperStyles = computed(() => {
43893
+ const scrollbarOpts = computeScrollbarOpts.value;
43894
+ const scrollbarXOpts = computeScrollbarXOpts.value;
43895
+ const scrollbarYOpts = computeScrollbarYOpts.value;
43896
+ const barWidth = getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width);
43897
+ const barHeight = getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height);
43898
+ const stys = {};
43899
+ if (barWidth || barHeight) {
43900
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight);
43901
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth);
43902
+ }
43903
+ return stys;
43904
+ });
43448
43905
  const computeTreeStyle = computed(() => {
43449
43906
  const { indent } = props;
43450
43907
  const { customHeight, customMinHeight, customMaxHeight } = reactData;
@@ -43477,6 +43934,71 @@ var VxeTreeComponent = defineVxeComponent({
43477
43934
  const computeFilterOpts = computed(() => {
43478
43935
  return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig);
43479
43936
  });
43937
+ const computeScrollbarOpts = computed(() => {
43938
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig);
43939
+ });
43940
+ const computeScrollbarXOpts = computed(() => {
43941
+ const scrollbarOpts = computeScrollbarOpts.value;
43942
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
43943
+ visible: false
43944
+ });
43945
+ });
43946
+ const computeScrollbarYOpts = computed(() => {
43947
+ const scrollbarOpts = computeScrollbarOpts.value;
43948
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
43949
+ });
43950
+ const computeScrollXVisible = computed(() => {
43951
+ const scrollbarOpts = computeScrollbarOpts.value;
43952
+ const scrollbarXOpts = computeScrollbarXOpts.value;
43953
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible);
43954
+ });
43955
+ const computeScrollYVisible = computed(() => {
43956
+ const scrollbarOpts = computeScrollbarOpts.value;
43957
+ const scrollbarYOpts = computeScrollbarYOpts.value;
43958
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible);
43959
+ });
43960
+ const computeScrollXAutoHide = computed(() => {
43961
+ const scrollbarOpts = computeScrollbarOpts.value;
43962
+ const scrollbarXOpts = computeScrollbarXOpts.value;
43963
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
43964
+ });
43965
+ const computeScrollYAutoHide = computed(() => {
43966
+ const scrollbarOpts = computeScrollbarOpts.value;
43967
+ const scrollbarYOpts = computeScrollbarYOpts.value;
43968
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
43969
+ });
43970
+ const computeScrollbarWrapperClss = computed(() => {
43971
+ const scrollbarOpts = computeScrollbarOpts.value;
43972
+ const { padding } = scrollbarOpts;
43973
+ const { yThumbHeight, xThumbWidth } = reactData;
43974
+ const scrollbarXToTop = computeScrollbarXToTop.value;
43975
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
43976
+ const scrollXVisible = computeScrollXVisible.value;
43977
+ const scrollYVisible = computeScrollYVisible.value;
43978
+ const scrollXAutoHide = computeScrollXAutoHide.value;
43979
+ const scrollYAutoHide = computeScrollYAutoHide.value;
43980
+ return domUtils$1.buildClass([
43981
+ 'vxe-scrollbar is--virtual',
43982
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
43983
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
43984
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
43985
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
43986
+ ], {
43987
+ 'is--padding': padding,
43988
+ 'ov-x--auto-hide': scrollXAutoHide,
43989
+ 'ov-y--auto-hide': scrollYAutoHide,
43990
+ 'overflow-y': yThumbHeight,
43991
+ 'overflow-x': xThumbWidth
43992
+ });
43993
+ });
43994
+ const computeScrollbarXToTop = computed(() => {
43995
+ const scrollbarXOpts = computeScrollbarXOpts.value;
43996
+ return scrollbarXOpts.position === 'top';
43997
+ });
43998
+ const computeScrollbarYToLeft = computed(() => {
43999
+ const scrollbarYOpts = computeScrollbarYOpts.value;
44000
+ return scrollbarYOpts.position === 'left';
44001
+ });
43480
44002
  const computeMaps = {
43481
44003
  computeKeyField,
43482
44004
  computeParentField,
@@ -43994,6 +44516,10 @@ var VxeTreeComponent = defineVxeComponent({
43994
44516
  }
43995
44517
  });
43996
44518
  };
44519
+ const updateScrollbar = () => {
44520
+ updateThumbSize();
44521
+ updateThumbOffset();
44522
+ };
43997
44523
  /**
43998
44524
  * 重新计算列表
43999
44525
  */
@@ -44015,6 +44541,7 @@ var VxeTreeComponent = defineVxeComponent({
44015
44541
  const parentPaddingSize = getPaddingTopBottomSize(parentEl);
44016
44542
  reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight);
44017
44543
  }
44544
+ updateScrollbar();
44018
44545
  updateHeight();
44019
44546
  return computeScrollLoad().then(() => {
44020
44547
  updateHeight();
@@ -44048,6 +44575,7 @@ var VxeTreeComponent = defineVxeComponent({
44048
44575
  const scrollLeft = scrollBodyElem.scrollLeft;
44049
44576
  const isX = scrollLeft !== internalData.lastScrollLeft;
44050
44577
  const isY = scrollTop !== internalData.lastScrollTop;
44578
+ updateThumbOffset();
44051
44579
  internalData.lastScrollTop = scrollTop;
44052
44580
  internalData.lastScrollLeft = scrollLeft;
44053
44581
  if (reactData.scrollYLoad) {
@@ -44592,13 +45120,6 @@ var VxeTreeComponent = defineVxeComponent({
44592
45120
  emitRadioMode(value);
44593
45121
  dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt);
44594
45122
  };
44595
- const handleGlobalResizeEvent = () => {
44596
- const el = refElem.value;
44597
- if (!el || !el.clientWidth) {
44598
- return;
44599
- }
44600
- recalculate();
44601
- };
44602
45123
  const insertTreeNode = (newRecords, isAppend) => {
44603
45124
  const { treeFullData, nodeMaps } = internalData;
44604
45125
  const keyField = computeKeyField.value;
@@ -46032,6 +46553,162 @@ var VxeTreeComponent = defineVxeComponent({
46032
46553
  hideDropTip();
46033
46554
  }
46034
46555
  };
46556
+ const updateThumbSize = () => {
46557
+ const viewEl = refVirtualWrapper.value;
46558
+ if (!viewEl) {
46559
+ return;
46560
+ }
46561
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
46562
+ return;
46563
+ }
46564
+ const trackXEl = refTrackXElem.value;
46565
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
46566
+ const thumbXElem = refThumbXElem.value;
46567
+ if (thumbXElem) {
46568
+ thumbXElem.style.width = xThumbWidth + 'px';
46569
+ }
46570
+ reactData.xThumbWidth = xThumbWidth;
46571
+ const trackYEl = refTrackYElem.value;
46572
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
46573
+ const thumbYElem = refThumbYElem.value;
46574
+ if (thumbYElem) {
46575
+ thumbYElem.style.height = yThumbHeight + 'px';
46576
+ }
46577
+ reactData.yThumbHeight = yThumbHeight;
46578
+ };
46579
+ const updateThumbOffset = () => {
46580
+ const viewEl = refVirtualWrapper.value;
46581
+ if (!viewEl) {
46582
+ return;
46583
+ }
46584
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
46585
+ return;
46586
+ }
46587
+ const { xThumbWidth, yThumbHeight } = reactData;
46588
+ const trackXEl = refTrackXElem.value;
46589
+ const thumbXElem = refThumbXElem.value;
46590
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
46591
+ internalData.xThumbLeft = xThumbLeft;
46592
+ if (thumbXElem && xThumbWidth) {
46593
+ thumbXElem.style.width = xThumbWidth + 'px';
46594
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
46595
+ }
46596
+ const trackYEl = refTrackYElem.value;
46597
+ const thumbYElem = refThumbYElem.value;
46598
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
46599
+ internalData.yThumbTop = yThumbTop;
46600
+ if (thumbYElem && yThumbHeight) {
46601
+ thumbYElem.style.height = yThumbHeight + 'px';
46602
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
46603
+ }
46604
+ };
46605
+ const clickTrackXEvent = (evnt) => {
46606
+ const trackEl = evnt.currentTarget;
46607
+ if (trackEl !== evnt.target) {
46608
+ return;
46609
+ }
46610
+ const viewEl = refVirtualWrapper.value;
46611
+ if (!viewEl) {
46612
+ return;
46613
+ }
46614
+ const { xThumbWidth } = reactData;
46615
+ const trackRect = trackEl.getBoundingClientRect();
46616
+ viewEl.scrollTo({
46617
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
46618
+ behavior: 'auto'
46619
+ });
46620
+ };
46621
+ const clickTrackYEvent = (evnt) => {
46622
+ const trackEl = evnt.currentTarget;
46623
+ if (trackEl !== evnt.target) {
46624
+ return;
46625
+ }
46626
+ const viewEl = refVirtualWrapper.value;
46627
+ if (!viewEl) {
46628
+ return;
46629
+ }
46630
+ const { yThumbHeight } = reactData;
46631
+ const trackRect = trackEl.getBoundingClientRect();
46632
+ viewEl.scrollTo({
46633
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
46634
+ behavior: 'auto'
46635
+ });
46636
+ };
46637
+ const pointerdownThumbXEvent = (evnt) => {
46638
+ const thumbEl = evnt.currentTarget;
46639
+ internalData.isThumbDrag = true;
46640
+ thumbEl.setPointerCapture(evnt.pointerId);
46641
+ const viewEl = refVirtualWrapper.value;
46642
+ if (!viewEl) {
46643
+ return;
46644
+ }
46645
+ const { xThumbWidth } = reactData;
46646
+ const trackEl = thumbEl.parentElement;
46647
+ const trackRect = trackEl.getBoundingClientRect();
46648
+ const pointerPosition = evnt.clientX - trackRect.left;
46649
+ // 记录 thumb 的偏移
46650
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
46651
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
46652
+ };
46653
+ const pointermoveThumbXEvent = (evnt) => {
46654
+ const thumbEl = evnt.currentTarget;
46655
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
46656
+ return;
46657
+ }
46658
+ const { isThumbDrag, thumbDragOffset } = internalData;
46659
+ if (isThumbDrag) {
46660
+ const viewEl = refVirtualWrapper.value;
46661
+ if (!viewEl) {
46662
+ return;
46663
+ }
46664
+ const { xThumbWidth } = reactData;
46665
+ const thumbEl = evnt.currentTarget;
46666
+ const trackEl = thumbEl.parentElement;
46667
+ const trackRect = trackEl.getBoundingClientRect();
46668
+ // 更新偏移
46669
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
46670
+ }
46671
+ };
46672
+ const cleatPointerThumbEvent = (evnt) => {
46673
+ const thumbEl = evnt.currentTarget;
46674
+ thumbEl.releasePointerCapture(evnt.pointerId);
46675
+ internalData.isThumbDrag = false;
46676
+ };
46677
+ const pointerdownThumbYEvent = (evnt) => {
46678
+ const thumbEl = evnt.currentTarget;
46679
+ internalData.isThumbDrag = true;
46680
+ thumbEl.setPointerCapture(evnt.pointerId);
46681
+ const viewEl = refVirtualWrapper.value;
46682
+ if (!viewEl) {
46683
+ return;
46684
+ }
46685
+ const { yThumbHeight } = reactData;
46686
+ const trackEl = thumbEl.parentElement;
46687
+ const trackRect = trackEl.getBoundingClientRect();
46688
+ const pointerPosition = evnt.clientY - trackRect.top;
46689
+ // 记录 thumb 的偏移
46690
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
46691
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
46692
+ };
46693
+ const pointermoveThumbYEvent = (evnt) => {
46694
+ const thumbEl = evnt.currentTarget;
46695
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
46696
+ return;
46697
+ }
46698
+ const { isThumbDrag, thumbDragOffset } = internalData;
46699
+ if (isThumbDrag) {
46700
+ const viewEl = refVirtualWrapper.value;
46701
+ if (!viewEl) {
46702
+ return;
46703
+ }
46704
+ const { yThumbHeight } = reactData;
46705
+ const thumbEl = evnt.currentTarget;
46706
+ const trackEl = thumbEl.parentElement;
46707
+ const trackRect = trackEl.getBoundingClientRect();
46708
+ // 更新偏移
46709
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
46710
+ }
46711
+ };
46035
46712
  Object.assign($xeTree, treeMethods, treePrivateMethods);
46036
46713
  const renderDragIcon = (node, nodeid) => {
46037
46714
  const { drag, transform } = props;
@@ -46341,13 +47018,14 @@ var VxeTreeComponent = defineVxeComponent({
46341
47018
  return renderEmptyElement$1($xeTree);
46342
47019
  };
46343
47020
  const renderVN = () => {
46344
- const { loading, trigger, showLine } = props;
46345
- const { bodyHeight, topSpaceHeight, treeList, tooltipStore } = reactData;
47021
+ const { loading, trigger, showLine, useScrollbar } = props;
47022
+ const { bodyHeight, topSpaceHeight, treeList, tooltipStore, xThumbWidth, yThumbHeight } = reactData;
46346
47023
  const vSize = computeSize.value;
46347
47024
  const radioOpts = computeRadioOpts.value;
46348
47025
  const checkboxOpts = computeCheckboxOpts.value;
46349
47026
  const loadingOpts = computeLoadingOpts.value;
46350
47027
  const isNodeHover = computeIsNodeHover.value;
47028
+ const wrapperStyles = computeWrapperStyles.value;
46351
47029
  const treeStyle = computeTreeStyle.value;
46352
47030
  const dragOpts = computeDragOpts.value;
46353
47031
  const tooltipOpts = computeTooltipOpts.value;
@@ -46355,19 +47033,40 @@ var VxeTreeComponent = defineVxeComponent({
46355
47033
  const headerSlot = slots.header;
46356
47034
  const footerSlot = slots.footer;
46357
47035
  const tooltipSlot = slots.tooltip;
47036
+ const scrollbarOpts = computeScrollbarOpts.value;
47037
+ const scrollXVisible = computeScrollXVisible.value;
47038
+ const scrollYVisible = computeScrollYVisible.value;
47039
+ const scrollbarXToTop = computeScrollbarXToTop.value;
47040
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
47041
+ const scrollXAutoHide = computeScrollXAutoHide.value;
47042
+ const scrollYAutoHide = computeScrollYAutoHide.value;
47043
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
46358
47044
  const teOns = {};
46359
47045
  if (dragOpts.isCrossTreeDrag && !treeList.length) {
46360
47046
  teOns.onDragover = $xeTree.handleCrossTreeNodeDragoverEmptyEvent;
46361
47047
  }
46362
- return h('div', Object.assign({ ref: refElem, class: ['vxe-tree', {
47048
+ return h('div', Object.assign({ ref: refElem, class: [
47049
+ 'vxe-tree',
47050
+ useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
47051
+ useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
47052
+ useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
47053
+ useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
47054
+ {
46363
47055
  [`size--${vSize}`]: vSize,
46364
47056
  'show--line': showLine,
47057
+ 'is--virtual-scrollbar': useScrollbar,
47058
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
47059
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
47060
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
47061
+ 'overflow-y': yThumbHeight,
47062
+ 'overflow-x': xThumbWidth,
46365
47063
  'checkbox--highlight': checkboxOpts.highlight,
46366
47064
  'radio--highlight': radioOpts.highlight,
46367
47065
  'node--hover': isNodeHover,
46368
47066
  'node--trigger': trigger === 'node',
46369
47067
  'is--loading': loading
46370
- }] }, teOns), [
47068
+ }
47069
+ ], style: wrapperStyles }, teOns), [
46371
47070
  headerSlot
46372
47071
  ? h('div', {
46373
47072
  ref: refHeaderWrapperElem,
@@ -46400,6 +47099,49 @@ var VxeTreeComponent = defineVxeComponent({
46400
47099
  class: 'vxe-tree--footer-wrapper'
46401
47100
  }, footerSlot({ $tree: $xeTree }))
46402
47101
  : renderEmptyElement$1($xeTree),
47102
+ /**
47103
+ * 滚动条
47104
+ */
47105
+ useScrollbar
47106
+ ? h('div', {
47107
+ class: scrollbarWrapperClss
47108
+ }, [
47109
+ scrollXVisible === false
47110
+ ? renderEmptyElement$1($xeTree)
47111
+ : h('div', {
47112
+ ref: refTrackXElem,
47113
+ class: 'vxe-scrollbar--track-x',
47114
+ onClick: clickTrackXEvent
47115
+ }, [
47116
+ h('div', {
47117
+ ref: refThumbXElem,
47118
+ class: 'vxe-scrollbar--thumb-x',
47119
+ onPointerdown: pointerdownThumbXEvent,
47120
+ onPointermove: pointermoveThumbXEvent,
47121
+ onPointerup: cleatPointerThumbEvent,
47122
+ onPointercancel: cleatPointerThumbEvent,
47123
+ onLostpointercapture: cleatPointerThumbEvent
47124
+ })
47125
+ ]),
47126
+ scrollYVisible === false
47127
+ ? renderEmptyElement$1($xeTree)
47128
+ : h('div', {
47129
+ ref: refTrackYElem,
47130
+ class: 'vxe-scrollbar--track-y',
47131
+ onClick: clickTrackYEvent
47132
+ }, [
47133
+ h('div', {
47134
+ ref: refThumbYElem,
47135
+ class: 'vxe-scrollbar--thumb-y',
47136
+ onPointerdown: pointerdownThumbYEvent,
47137
+ onPointermove: pointermoveThumbYEvent,
47138
+ onPointerup: cleatPointerThumbEvent,
47139
+ onPointercancel: cleatPointerThumbEvent,
47140
+ onLostpointercapture: cleatPointerThumbEvent
47141
+ })
47142
+ ])
47143
+ ])
47144
+ : renderEmptyElement$1($xeTree),
46403
47145
  /**
46404
47146
  * 拖拽提示
46405
47147
  */
@@ -46483,21 +47225,36 @@ var VxeTreeComponent = defineVxeComponent({
46483
47225
  watch(() => props.filterValue, () => {
46484
47226
  triggerSearchEvent(new Event('filter'));
46485
47227
  });
46486
- const hFlag = ref(0);
47228
+ const reFlag = ref(0);
46487
47229
  watch(() => props.height, () => {
46488
- hFlag.value++;
47230
+ reFlag.value++;
46489
47231
  });
46490
47232
  watch(() => props.minHeight, () => {
46491
- hFlag.value++;
47233
+ reFlag.value++;
46492
47234
  });
46493
47235
  watch(() => props.maxHeight, () => {
46494
- hFlag.value++;
47236
+ reFlag.value++;
46495
47237
  });
46496
- watch(hFlag, () => {
46497
- recalculate();
47238
+ watch(() => props.useScrollbar, () => {
47239
+ reFlag.value++;
47240
+ });
47241
+ watch(computeScrollXVisible, () => {
47242
+ nextTick(() => {
47243
+ reFlag.value++;
47244
+ });
47245
+ });
47246
+ watch(computeScrollYVisible, () => {
47247
+ nextTick(() => {
47248
+ reFlag.value++;
47249
+ });
47250
+ });
47251
+ watch(reFlag, () => {
47252
+ recalculate().then(() => {
47253
+ recalculate();
47254
+ });
46498
47255
  });
46499
47256
  onMounted(() => {
46500
- const { transform, drag, menuConfig, showOverflow, lazy, loadMethod } = props;
47257
+ const { transform, drag, menuConfig, showOverflow, lazy, loadMethod, autoResize, useScrollbar } = props;
46501
47258
  const dragOpts = computeDragOpts.value;
46502
47259
  if (!showOverflow) {
46503
47260
  errLog$2('vxe.error.errProp', ['show-overflow=false', 'show-overflow=true']);
@@ -46518,24 +47275,30 @@ var VxeTreeComponent = defineVxeComponent({
46518
47275
  if (menuConfig && !VxeUIContextMenu) {
46519
47276
  errLog$2('vxe.error.reqComp', ['vxe-context-menu']);
46520
47277
  }
46521
- if (props.autoResize) {
47278
+ if (useScrollbar || autoResize) {
46522
47279
  const el = refElem.value;
47280
+ const viewInnerEl = refVirtualBody.value;
46523
47281
  const parentEl = getParentElem();
46524
47282
  const resizeObserver = globalResize$1.create(() => {
46525
- if (props.autoResize) {
46526
- recalculate();
46527
- }
47283
+ reFlag.value++;
46528
47284
  });
46529
47285
  if (el) {
46530
47286
  resizeObserver.observe(el);
47287
+ if (autoResize) {
47288
+ if (parentEl) {
47289
+ resizeObserver.observe(parentEl);
47290
+ }
47291
+ }
46531
47292
  }
46532
- if (parentEl) {
46533
- resizeObserver.observe(parentEl);
47293
+ if (viewInnerEl) {
47294
+ resizeObserver.observe(viewInnerEl);
46534
47295
  }
46535
47296
  internalData.resizeObserver = resizeObserver;
46536
47297
  }
46537
- recalculate();
46538
- globalEvents$1.on($xeTree, 'resize', handleGlobalResizeEvent);
47298
+ reFlag.value++;
47299
+ globalEvents$1.on($xeTree, 'resize', () => {
47300
+ reFlag.value++;
47301
+ });
46539
47302
  });
46540
47303
  onBeforeUnmount(() => {
46541
47304
  const { resizeObserver } = internalData;