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
@@ -1,12 +1,13 @@
1
1
  import { h, ref, computed, onBeforeUnmount, watch, reactive, nextTick, onActivated, onMounted } from 'vue';
2
2
  import { defineVxeComponent } from '../../ui/src/comp';
3
3
  import XEUtils from 'xe-utils';
4
- import { VxeUI, getConfig, getIcon, getI18n, menus, globalEvents, globalResize, createEvent, useSize, renderEmptyElement } from '../../ui';
4
+ import { VxeUI, getConfig, getIcon, getI18n, domUtils, menus, globalEvents, globalResize, useSize, createEvent, renderEmptyElement } from '../../ui';
5
5
  import { getCrossListDragRowInfo } from './store';
6
6
  import { isScale, removeClass, addClass, getTpImg, toCssUnit, hasClass } from '../../ui/src/dom';
7
- import { isEnableConf, getText, enModelValue, deModelValue } from '../../ui/src/utils';
7
+ import { isEnableConf, getText, enModelValue, deModelValue, getDefaultConfig } from '../../ui/src/utils';
8
8
  import { createComponentLog } from '../../ui/src/log';
9
9
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
10
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from '../../scrollbar/src/util';
10
11
  import { getItemCacheObj } from './util';
11
12
  import VxeLoadingComponent from '../../loading';
12
13
  const { warnLog, errLog } = createComponentLog('tree');
@@ -36,6 +37,9 @@ function createReactData() {
36
37
  updateCheckboxFlag: 1,
37
38
  isAllChecked: false,
38
39
  isAllIndeterminate: false,
40
+ // 滚动条
41
+ yThumbHeight: 0,
42
+ xThumbWidth: 0,
39
43
  insertRowFlag: 1,
40
44
  removeRowFlag: 1,
41
45
  dragRow: null,
@@ -45,13 +49,18 @@ function createReactData() {
45
49
  }
46
50
  function createInternalData() {
47
51
  return {
48
- resizeObserver: undefined,
49
52
  fullData: [],
50
53
  afterList: [],
51
54
  fullKeyMaps: {},
52
55
  rowMaps: {},
53
- lastScrollLeft: 0,
56
+ // 滚动条
57
+ // resizeObserver: undefined,
58
+ // isThumbDrag: false,
59
+ thumbDragOffset: 0,
60
+ yThumbTop: 0,
61
+ xThumbLeft: 0,
54
62
  lastScrollTop: 0,
63
+ lastScrollLeft: 0,
55
64
  scrollYStore: {
56
65
  startIndex: 0,
57
66
  endIndex: 0,
@@ -105,7 +114,12 @@ export default defineVxeComponent({
105
114
  dragConfig: Object,
106
115
  menuConfig: Object,
107
116
  virtualYConfig: Object,
108
- scrollY: Object
117
+ scrollY: Object,
118
+ useScrollbar: {
119
+ type: Boolean,
120
+ default: () => getConfig().list.useScrollbar
121
+ },
122
+ scrollbarConfig: Object
109
123
  },
110
124
  emits: [
111
125
  'update:checkRowKey',
@@ -138,6 +152,10 @@ export default defineVxeComponent({
138
152
  const refFooterElem = ref();
139
153
  const refVirtualWrapper = ref();
140
154
  const refVirtualBody = ref();
155
+ const refTrackXElem = ref();
156
+ const refTrackYElem = ref();
157
+ const refThumbXElem = ref();
158
+ const refThumbYElem = ref();
141
159
  const refDragRowLineElem = ref();
142
160
  const refDragTipElem = ref();
143
161
  const refMaps = {
@@ -186,11 +204,20 @@ export default defineVxeComponent({
186
204
  });
187
205
  const computeWrapperStyles = computed(() => {
188
206
  const rowHeight = computeRowHeight.value;
189
- const style = {};
207
+ const scrollbarOpts = computeScrollbarOpts.value;
208
+ const scrollbarXOpts = computeScrollbarXOpts.value;
209
+ const scrollbarYOpts = computeScrollbarYOpts.value;
210
+ const barWidth = getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width);
211
+ const barHeight = getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height);
212
+ const stys = {};
190
213
  if (rowHeight) {
191
- style['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
214
+ stys['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
192
215
  }
193
- return style;
216
+ if (barWidth || barHeight) {
217
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight);
218
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth);
219
+ }
220
+ return stys;
194
221
  });
195
222
  const computeVirtualStyles = computed(() => {
196
223
  const { height, maxHeight } = props;
@@ -205,6 +232,69 @@ export default defineVxeComponent({
205
232
  }
206
233
  return style;
207
234
  });
235
+ const computeScrollbarOpts = computed(() => {
236
+ return Object.assign({}, getConfig().list.scrollbarConfig, props.scrollbarConfig);
237
+ });
238
+ const computeScrollbarXOpts = computed(() => {
239
+ const scrollbarOpts = computeScrollbarOpts.value;
240
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig);
241
+ });
242
+ const computeScrollbarYOpts = computed(() => {
243
+ const scrollbarOpts = computeScrollbarOpts.value;
244
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
245
+ });
246
+ const computeScrollXVisible = computed(() => {
247
+ const scrollbarOpts = computeScrollbarOpts.value;
248
+ const scrollbarXOpts = computeScrollbarXOpts.value;
249
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible);
250
+ });
251
+ const computeScrollYVisible = computed(() => {
252
+ const scrollbarOpts = computeScrollbarOpts.value;
253
+ const scrollbarYOpts = computeScrollbarYOpts.value;
254
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible);
255
+ });
256
+ const computeScrollXAutoHide = computed(() => {
257
+ const scrollbarOpts = computeScrollbarOpts.value;
258
+ const scrollbarXOpts = computeScrollbarXOpts.value;
259
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
260
+ });
261
+ const computeScrollYAutoHide = computed(() => {
262
+ const scrollbarOpts = computeScrollbarOpts.value;
263
+ const scrollbarYOpts = computeScrollbarYOpts.value;
264
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
265
+ });
266
+ const computeScrollbarWrapperClss = computed(() => {
267
+ const scrollbarOpts = computeScrollbarOpts.value;
268
+ const { padding } = scrollbarOpts;
269
+ const { yThumbHeight, xThumbWidth } = reactData;
270
+ const scrollbarXToTop = computeScrollbarXToTop.value;
271
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
272
+ const scrollXVisible = computeScrollXVisible.value;
273
+ const scrollYVisible = computeScrollYVisible.value;
274
+ const scrollXAutoHide = computeScrollXAutoHide.value;
275
+ const scrollYAutoHide = computeScrollYAutoHide.value;
276
+ return domUtils.buildClass([
277
+ 'vxe-scrollbar is--virtual',
278
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
279
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
280
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
281
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
282
+ ], {
283
+ 'is--padding': padding,
284
+ 'ov-x--auto-hide': scrollXAutoHide,
285
+ 'ov-y--auto-hide': scrollYAutoHide,
286
+ 'overflow-y': yThumbHeight,
287
+ 'overflow-x': xThumbWidth
288
+ });
289
+ });
290
+ const computeScrollbarXToTop = computed(() => {
291
+ const scrollbarXOpts = computeScrollbarXOpts.value;
292
+ return scrollbarXOpts.position === 'top';
293
+ });
294
+ const computeScrollbarYToLeft = computed(() => {
295
+ const scrollbarYOpts = computeScrollbarYOpts.value;
296
+ return scrollbarYOpts.position === 'left';
297
+ });
208
298
  const dispatchEvent = (type, params, evnt) => {
209
299
  emit(type, createEvent(evnt, { $list: $xeList }, params));
210
300
  };
@@ -361,6 +451,7 @@ export default defineVxeComponent({
361
451
  */
362
452
  const refreshScroll = () => {
363
453
  const { lastScrollLeft, lastScrollTop } = internalData;
454
+ updateScrollbar();
364
455
  return clearScroll().then(() => {
365
456
  if (lastScrollLeft || lastScrollTop) {
366
457
  internalData.lastScrollLeft = 0;
@@ -369,6 +460,10 @@ export default defineVxeComponent({
369
460
  }
370
461
  });
371
462
  };
463
+ const updateScrollbar = () => {
464
+ updateThumbSize();
465
+ updateThumbOffset();
466
+ };
372
467
  /**
373
468
  * 重新计算列表
374
469
  */
@@ -386,6 +481,7 @@ export default defineVxeComponent({
386
481
  parentHeight = parentEl.clientHeight - Math.ceil(XEUtils.toNumber(parentStyle.paddingLeft) + XEUtils.toNumber(parentStyle.paddingRight));
387
482
  }
388
483
  reactData.parentHeight = parentHeight;
484
+ updateScrollbar();
389
485
  updateHeight();
390
486
  if (el.clientWidth && el.clientHeight) {
391
487
  return computeScrollLoad();
@@ -415,6 +511,7 @@ export default defineVxeComponent({
415
511
  const scrollLeft = scrollBodyElem.scrollLeft;
416
512
  const isX = scrollLeft !== internalData.lastScrollLeft;
417
513
  const isY = scrollTop !== internalData.lastScrollTop;
514
+ updateThumbOffset();
418
515
  internalData.lastScrollTop = scrollTop;
419
516
  internalData.lastScrollLeft = scrollLeft;
420
517
  if (reactData.scrollYLoad) {
@@ -1711,6 +1808,162 @@ export default defineVxeComponent({
1711
1808
  hideDropTip();
1712
1809
  }
1713
1810
  };
1811
+ const updateThumbSize = () => {
1812
+ const viewEl = refVirtualWrapper.value;
1813
+ if (!viewEl) {
1814
+ return;
1815
+ }
1816
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
1817
+ return;
1818
+ }
1819
+ const trackXEl = refTrackXElem.value;
1820
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
1821
+ const thumbXElem = refThumbXElem.value;
1822
+ if (thumbXElem) {
1823
+ thumbXElem.style.width = xThumbWidth + 'px';
1824
+ }
1825
+ reactData.xThumbWidth = xThumbWidth;
1826
+ const trackYEl = refTrackYElem.value;
1827
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
1828
+ const thumbYElem = refThumbYElem.value;
1829
+ if (thumbYElem) {
1830
+ thumbYElem.style.height = yThumbHeight + 'px';
1831
+ }
1832
+ reactData.yThumbHeight = yThumbHeight;
1833
+ };
1834
+ const updateThumbOffset = () => {
1835
+ const viewEl = refVirtualWrapper.value;
1836
+ if (!viewEl) {
1837
+ return;
1838
+ }
1839
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
1840
+ return;
1841
+ }
1842
+ const { xThumbWidth, yThumbHeight } = reactData;
1843
+ const trackXEl = refTrackXElem.value;
1844
+ const thumbXElem = refThumbXElem.value;
1845
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
1846
+ internalData.xThumbLeft = xThumbLeft;
1847
+ if (thumbXElem && xThumbWidth) {
1848
+ thumbXElem.style.width = xThumbWidth + 'px';
1849
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
1850
+ }
1851
+ const trackYEl = refTrackYElem.value;
1852
+ const thumbYElem = refThumbYElem.value;
1853
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
1854
+ internalData.yThumbTop = yThumbTop;
1855
+ if (thumbYElem && yThumbHeight) {
1856
+ thumbYElem.style.height = yThumbHeight + 'px';
1857
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
1858
+ }
1859
+ };
1860
+ const clickTrackXEvent = (evnt) => {
1861
+ const trackEl = evnt.currentTarget;
1862
+ if (trackEl !== evnt.target) {
1863
+ return;
1864
+ }
1865
+ const viewEl = refVirtualWrapper.value;
1866
+ if (!viewEl) {
1867
+ return;
1868
+ }
1869
+ const { xThumbWidth } = reactData;
1870
+ const trackRect = trackEl.getBoundingClientRect();
1871
+ viewEl.scrollTo({
1872
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
1873
+ behavior: 'auto'
1874
+ });
1875
+ };
1876
+ const clickTrackYEvent = (evnt) => {
1877
+ const trackEl = evnt.currentTarget;
1878
+ if (trackEl !== evnt.target) {
1879
+ return;
1880
+ }
1881
+ const viewEl = refVirtualWrapper.value;
1882
+ if (!viewEl) {
1883
+ return;
1884
+ }
1885
+ const { yThumbHeight } = reactData;
1886
+ const trackRect = trackEl.getBoundingClientRect();
1887
+ viewEl.scrollTo({
1888
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
1889
+ behavior: 'auto'
1890
+ });
1891
+ };
1892
+ const pointerdownThumbXEvent = (evnt) => {
1893
+ const thumbEl = evnt.currentTarget;
1894
+ internalData.isThumbDrag = true;
1895
+ thumbEl.setPointerCapture(evnt.pointerId);
1896
+ const viewEl = refVirtualWrapper.value;
1897
+ if (!viewEl) {
1898
+ return;
1899
+ }
1900
+ const { xThumbWidth } = reactData;
1901
+ const trackEl = thumbEl.parentElement;
1902
+ const trackRect = trackEl.getBoundingClientRect();
1903
+ const pointerPosition = evnt.clientX - trackRect.left;
1904
+ // 记录 thumb 的偏移
1905
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
1906
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
1907
+ };
1908
+ const pointermoveThumbXEvent = (evnt) => {
1909
+ const thumbEl = evnt.currentTarget;
1910
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
1911
+ return;
1912
+ }
1913
+ const { isThumbDrag, thumbDragOffset } = internalData;
1914
+ if (isThumbDrag) {
1915
+ const viewEl = refVirtualWrapper.value;
1916
+ if (!viewEl) {
1917
+ return;
1918
+ }
1919
+ const { xThumbWidth } = reactData;
1920
+ const thumbEl = evnt.currentTarget;
1921
+ const trackEl = thumbEl.parentElement;
1922
+ const trackRect = trackEl.getBoundingClientRect();
1923
+ // 更新偏移
1924
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
1925
+ }
1926
+ };
1927
+ const cleatPointerThumbEvent = (evnt) => {
1928
+ const thumbEl = evnt.currentTarget;
1929
+ thumbEl.releasePointerCapture(evnt.pointerId);
1930
+ internalData.isThumbDrag = false;
1931
+ };
1932
+ const pointerdownThumbYEvent = (evnt) => {
1933
+ const thumbEl = evnt.currentTarget;
1934
+ internalData.isThumbDrag = true;
1935
+ thumbEl.setPointerCapture(evnt.pointerId);
1936
+ const viewEl = refVirtualWrapper.value;
1937
+ if (!viewEl) {
1938
+ return;
1939
+ }
1940
+ const { yThumbHeight } = reactData;
1941
+ const trackEl = thumbEl.parentElement;
1942
+ const trackRect = trackEl.getBoundingClientRect();
1943
+ const pointerPosition = evnt.clientY - trackRect.top;
1944
+ // 记录 thumb 的偏移
1945
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
1946
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
1947
+ };
1948
+ const pointermoveThumbYEvent = (evnt) => {
1949
+ const thumbEl = evnt.currentTarget;
1950
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
1951
+ return;
1952
+ }
1953
+ const { isThumbDrag, thumbDragOffset } = internalData;
1954
+ if (isThumbDrag) {
1955
+ const viewEl = refVirtualWrapper.value;
1956
+ if (!viewEl) {
1957
+ return;
1958
+ }
1959
+ const { yThumbHeight } = reactData;
1960
+ const thumbEl = evnt.currentTarget;
1961
+ const trackEl = thumbEl.parentElement;
1962
+ const trackRect = trackEl.getBoundingClientRect();
1963
+ // 更新偏移
1964
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
1965
+ }
1966
+ };
1714
1967
  Object.assign($xeList, listMethods, listPrivateMethods);
1715
1968
  const renderDragTip = () => {
1716
1969
  const { dragRow, dragTipText } = reactData;
@@ -1907,8 +2160,8 @@ export default defineVxeComponent({
1907
2160
  }], rowid: hasKey && keyField ? rowid : undefined }, rowOns), ctVNs);
1908
2161
  };
1909
2162
  const renderVN = () => {
1910
- const { showCheckbox, className, loading } = props;
1911
- const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData;
2163
+ const { showCheckbox, className, loading, useScrollbar } = props;
2164
+ const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate, xThumbWidth, yThumbHeight } = reactData;
1912
2165
  const defaultSlot = slots.default;
1913
2166
  const headerSlot = slots.header;
1914
2167
  const footerSlot = slots.footer;
@@ -1923,16 +2176,38 @@ export default defineVxeComponent({
1923
2176
  const rowOpts = computeRowOpts.value;
1924
2177
  const { isHover, padding } = rowOpts;
1925
2178
  const isDrag = computeIsDrag.value;
2179
+ const scrollbarOpts = computeScrollbarOpts.value;
2180
+ const scrollXVisible = computeScrollXVisible.value;
2181
+ const scrollYVisible = computeScrollYVisible.value;
2182
+ const scrollbarXToTop = computeScrollbarXToTop.value;
2183
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
2184
+ const scrollXAutoHide = computeScrollXAutoHide.value;
2185
+ const scrollYAutoHide = computeScrollYAutoHide.value;
2186
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
1926
2187
  const showDefChekboxHead = showCheckbox && showHeader !== false;
1927
2188
  const leOns = {};
1928
2189
  if (isCrossListDrag && !rowList.length) {
1929
2190
  leOns.onDragover = $xeList.handleCrossListRowDragoverEmptyEvent;
1930
2191
  }
1931
- return h('div', Object.assign({ ref: refElem, class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
2192
+ return h('div', Object.assign({ ref: refElem, class: [
2193
+ 'vxe-list',
2194
+ useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
2195
+ useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
2196
+ useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
2197
+ useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
2198
+ className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '',
2199
+ {
1932
2200
  [`size--${vSize}`]: vSize,
2201
+ 'is--virtual-scrollbar': useScrollbar,
2202
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
2203
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
2204
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
2205
+ 'overflow-y': yThumbHeight,
2206
+ 'overflow-x': xThumbWidth,
1933
2207
  'is--drag': isDrag,
1934
2208
  'is--loading': loading
1935
- }], style: wrapperStyles }, leOns), [
2209
+ }
2210
+ ], style: wrapperStyles }, leOns), [
1936
2211
  headerSlot || showDefChekboxHead
1937
2212
  ? h('div', {
1938
2213
  ref: refHeaderElem,
@@ -1997,6 +2272,49 @@ export default defineVxeComponent({
1997
2272
  class: 'vxe-list--footer-wrapper'
1998
2273
  }, footerSlot({ items: rowList, $list: $xeList }))
1999
2274
  : renderEmptyElement($xeList),
2275
+ /**
2276
+ * 滚动条
2277
+ */
2278
+ useScrollbar
2279
+ ? h('div', {
2280
+ class: scrollbarWrapperClss
2281
+ }, [
2282
+ scrollXVisible === false
2283
+ ? renderEmptyElement($xeList)
2284
+ : h('div', {
2285
+ ref: refTrackXElem,
2286
+ class: 'vxe-scrollbar--track-x',
2287
+ onClick: clickTrackXEvent
2288
+ }, [
2289
+ h('div', {
2290
+ ref: refThumbXElem,
2291
+ class: 'vxe-scrollbar--thumb-x',
2292
+ onPointerdown: pointerdownThumbXEvent,
2293
+ onPointermove: pointermoveThumbXEvent,
2294
+ onPointerup: cleatPointerThumbEvent,
2295
+ onPointercancel: cleatPointerThumbEvent,
2296
+ onLostpointercapture: cleatPointerThumbEvent
2297
+ })
2298
+ ]),
2299
+ scrollYVisible === false
2300
+ ? renderEmptyElement($xeList)
2301
+ : h('div', {
2302
+ ref: refTrackYElem,
2303
+ class: 'vxe-scrollbar--track-y',
2304
+ onClick: clickTrackYEvent
2305
+ }, [
2306
+ h('div', {
2307
+ ref: refThumbYElem,
2308
+ class: 'vxe-scrollbar--thumb-y',
2309
+ onPointerdown: pointerdownThumbYEvent,
2310
+ onPointermove: pointermoveThumbYEvent,
2311
+ onPointerup: cleatPointerThumbEvent,
2312
+ onPointercancel: cleatPointerThumbEvent,
2313
+ onLostpointercapture: cleatPointerThumbEvent
2314
+ })
2315
+ ])
2316
+ ])
2317
+ : renderEmptyElement($xeList),
2000
2318
  /**
2001
2319
  * 拖拽提示
2002
2320
  */
@@ -2030,11 +2348,24 @@ export default defineVxeComponent({
2030
2348
  watch(() => props.syncResize, () => {
2031
2349
  reFlag.value++;
2032
2350
  });
2351
+ watch(() => props.useScrollbar, () => {
2352
+ reFlag.value++;
2353
+ });
2033
2354
  watch(computeRowHeight, () => {
2034
2355
  reFlag.value++;
2035
2356
  });
2036
- watch(reFlag, () => {
2357
+ watch(computeScrollXVisible, () => {
2037
2358
  nextTick(() => {
2359
+ reFlag.value++;
2360
+ });
2361
+ });
2362
+ watch(computeScrollYVisible, () => {
2363
+ nextTick(() => {
2364
+ reFlag.value++;
2365
+ });
2366
+ });
2367
+ watch(reFlag, () => {
2368
+ recalculate().then(() => {
2038
2369
  recalculate();
2039
2370
  });
2040
2371
  });
@@ -2052,13 +2383,15 @@ export default defineVxeComponent({
2052
2383
  updateCheckboxModeValue();
2053
2384
  });
2054
2385
  onActivated(() => {
2055
- recalculate().then(() => refreshScroll());
2386
+ recalculate().then(() => {
2387
+ refreshScroll();
2388
+ });
2056
2389
  });
2057
2390
  nextTick(() => {
2058
2391
  loadData(props.data || []);
2059
2392
  });
2060
2393
  onMounted(() => {
2061
- const { showSeq, showRadio, showCheckbox } = props;
2394
+ const { showSeq, showRadio, showCheckbox, autoResize, useScrollbar } = props;
2062
2395
  const rowOpts = computeRowOpts.value;
2063
2396
  const { useKey } = rowOpts;
2064
2397
  const isDrag = computeIsDrag.value;
@@ -2080,17 +2413,27 @@ export default defineVxeComponent({
2080
2413
  if (useKey && !keyField) {
2081
2414
  errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField']);
2082
2415
  }
2083
- if (props.autoResize) {
2416
+ if (useScrollbar || autoResize) {
2084
2417
  const el = refElem.value;
2085
- const resizeObserver = globalResize.create(() => recalculate());
2086
- resizeObserver.observe(el);
2418
+ const viewInnerEl = refVirtualBody.value;
2419
+ const resizeObserver = globalResize.create(() => {
2420
+ reFlag.value++;
2421
+ });
2087
2422
  if (el) {
2088
- resizeObserver.observe(el.parentElement);
2423
+ resizeObserver.observe(el);
2424
+ if (autoResize) {
2425
+ resizeObserver.observe(el.parentElement);
2426
+ }
2427
+ }
2428
+ if (viewInnerEl) {
2429
+ resizeObserver.observe(viewInnerEl);
2089
2430
  }
2090
2431
  internalData.resizeObserver = resizeObserver;
2091
2432
  }
2092
- recalculate();
2093
- globalEvents.on($xeList, 'resize', recalculate);
2433
+ reFlag.value++;
2434
+ globalEvents.on($xeList, 'resize', () => {
2435
+ reFlag.value++;
2436
+ });
2094
2437
  });
2095
2438
  onBeforeUnmount(() => {
2096
2439
  const { resizeObserver } = internalData;
package/es/list/style.css CHANGED
@@ -374,4 +374,47 @@
374
374
  .vxe-list--radio-option .vxe-radio--label {
375
375
  padding-left: 0.4em;
376
376
  vertical-align: middle;
377
+ }
378
+
379
+ .vxe-list.ov-padding.overflow-x.sx-pos--top {
380
+ padding-top: var(--vxe-ui-scrollbar-x-height);
381
+ }
382
+ .vxe-list.ov-padding.overflow-x.sx-pos--bottom {
383
+ padding-bottom: var(--vxe-ui-scrollbar-x-height);
384
+ }
385
+ .vxe-list.ov-padding.overflow-y.sy-pos--left {
386
+ padding-left: var(--vxe-ui-scrollbar-y-width);
387
+ }
388
+ .vxe-list.ov-padding.overflow-y.sy-pos--right {
389
+ padding-right: var(--vxe-ui-scrollbar-y-width);
390
+ }
391
+ .vxe-list.ov-x--hidden > .vxe-list--virtual-wrapper {
392
+ overflow-x: hidden;
393
+ }
394
+ .vxe-list.ov-y--hidden > .vxe-list--virtual-wrapper {
395
+ overflow-y: hidden;
396
+ }
397
+ .vxe-list.is--virtual-scrollbar.ov-x--auto-hide:hover > .vxe-scrollbar > .vxe-scrollbar--track-x {
398
+ opacity: 1;
399
+ }
400
+ .vxe-list.is--virtual-scrollbar.ov-x--auto-hide > .vxe-scrollbar > .vxe-scrollbar--track-x {
401
+ opacity: 0;
402
+ transition: opacity 0.8s ease-in-out;
403
+ }
404
+ .vxe-list.is--virtual-scrollbar.ov-y--auto-hide:hover > .vxe-scrollbar > .vxe-scrollbar--track-y {
405
+ opacity: 1;
406
+ }
407
+ .vxe-list.is--virtual-scrollbar.ov-y--auto-hide > .vxe-scrollbar > .vxe-scrollbar--track-y {
408
+ opacity: 0;
409
+ transition: opacity 0.8s ease-in-out;
410
+ }
411
+ .vxe-list > .vxe-scrollbar {
412
+ position: unset;
413
+ }
414
+ .vxe-list.is--virtual-scrollbar > .vxe-list--virtual-wrapper {
415
+ scrollbar-width: none;
416
+ -ms-overflow-style: none;
417
+ }
418
+ .vxe-list.is--virtual-scrollbar > .vxe-list--virtual-wrapper::-webkit-scrollbar {
419
+ display: none;
377
420
  }
@@ -1 +1 @@
1
- @charset "UTF-8";.vxe-list{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-default);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-default)}.vxe-list.size--medium{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-medium);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-medium)}.vxe-list.size--small{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-small);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-small)}.vxe-list.size--mini{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-mini);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-mini)}.vxe-list{position:relative;display:block;padding:0;font-size:var(--vxe-ui-list-current-font-size);color:var(--vxe-ui-font-color);font-family:var(--vxe-ui-font-family);direction:ltr}.vxe-list .vxe-list--virtual-wrapper{position:relative;overflow-x:auto;overflow-y:auto;outline:0}.vxe-list .vxe-list--y-space{width:0;float:left}.vxe-list .vxe-list--body,.vxe-list .vxe-list--virtual-wrapper{padding:0;margin:0;border:0;outline:0}.vxe-list--header-wrapper{display:flex;flex-direction:row;align-items:center;min-height:var(--vxe-ui-list-row-height)}.vxe-list--header-left{display:flex;flex-direction:row;align-items:center;flex-shrink:0}.vxe-list--header-content{flex-grow:1;overflow:auto}.vxe-list--body.trigger--row>.vxe-list--row:not(.is--drag-disabled):active{cursor:grabbing}.vxe-list--body.is--padding>.vxe-list--row{padding:0 var(--vxe-ui-list-current-padding)}.vxe-list--body.checkbox--highlight .vxe-list--row.is-checkbox--checked{background-color:var(--vxe-ui-list-row-checkbox-checked-background-color)}.vxe-list--body.radio--highlight .vxe-list--row.is-radio--checked{background-color:var(--vxe-ui-list-row-radio-checked-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover{background-color:var(--vxe-ui-list-row-hover-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover.is--current{background-color:var(--vxe-ui-list-row-hover-current-background-color)}.vxe-list--body.row--hover.radio--highlight .vxe-list--row.is-radio--checked:hover{background-color:var(--vxe-ui-list-row-hover-radio-checked-background-color)}.vxe-list--body.row--hover.checkbox--highlight .vxe-list--row.is-checkbox--checked:hover{background-color:var(--vxe-ui-list-row-hover-checkbox-checked-background-color)}.vxe-list--row.is--current{background-color:var(--vxe-ui-list-row-current-background-color)}.vxe-list--virtual-wrapper{height:100px}.vxe-list--row{display:flex;flex-direction:row;align-items:center}.vxe-list--row-content,.vxe-list--row-drag,.vxe-list--row-extra{display:flex;flex-direction:row;align-items:center}.vxe-list--row-drag{flex-shrink:0;padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--row-content{flex-grow:1;height:var(--vxe-ui-list-row-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--row-extra{flex-shrink:0}.vxe-list--drag-handle:not(.is--disabled){cursor:grab}.vxe-list--drag-handle:not(.is--disabled):active{cursor:grabbing}.vxe-list--drag-handle:not(.is--disabled):hover{color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-handle.is--disabled{color:var(--vxe-ui-input-disabled-color);cursor:not-allowed}.vxe-list--row.row--drag-move{transition:transform .5s ease}.vxe-list--row.row--drag-origin{opacity:.3}.vxe-list--drag-row-line{display:none;position:absolute;top:0;left:0;z-index:11;pointer-events:none}.vxe-list--drag-row-line{width:100%;height:1px;border:2px solid transparent}.vxe-list--drag-row-line[drag-pos=top]{border-top-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-pos=bottom]{border-bottom-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-to-child=y]{border-top-color:transparent;border-bottom-color:transparent;border-left-color:var(--vxe-ui-status-success-color)}.vxe-list--drag-row-line.is--guides{background-color:var(--vxe-ui-list-drag-over-background-color)}.vxe-body--row-list-move{transition-property:transform;transition-duration:.35s}.vxe-list--drag-sort-tip{display:none;position:absolute;top:0;left:0;padding:.6em 1.4em;max-width:50%;min-width:100px;border-radius:var(--vxe-ui-border-radius);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none;background-color:var(--vxe-ui-layout-background-color);box-shadow:0 0 10px 0 rgba(0,0,0,.2);z-index:33}.vxe-list--drag-sort-tip[drag-status=normal] .vxe-list--drag-sort-tip-normal-status{display:block}.vxe-list--drag-sort-tip[drag-status=sub] .vxe-list--drag-sort-tip-sub-status{display:block}.vxe-list--drag-sort-tip[drag-status=disabled] .vxe-list--drag-sort-tip-disabled-status{display:block}.vxe-list--drag-sort-tip-wrapper{display:flex;flex-direction:row;align-items:center}.vxe-list--drag-sort-tip-status{padding-right:.4em}.vxe-list--drag-sort-tip-disabled-status{display:none;flex-shrink:0;color:var(--vxe-ui-status-error-color)}.vxe-list--drag-sort-tip-normal-status,.vxe-list--drag-sort-tip-sub-status{display:none}.vxe-list--drag-sort-tip-content{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--checkbox-header{padding-right:var(--vxe-ui-list-current-padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header{cursor:pointer}.vxe-list--checkbox-header .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-header .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header.is--checked,.vxe-list--checkbox-header.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-header.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--hidden{cursor:default}.vxe-list--checkbox-header.is--readonly{cursor:auto}.vxe-list--checkbox-header.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-header.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-header .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--checkbox-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--checkbox-option{cursor:pointer}.vxe-list--checkbox-option .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-option .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-option.is--checked,.vxe-list--checkbox-option.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-option.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--hidden{cursor:default}.vxe-list--checkbox-option.is--readonly{cursor:auto}.vxe-list--checkbox-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-option.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-option .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--radio-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--radio-option{cursor:pointer}.vxe-list--radio-option .vxe-radio--icon{font-size:1.26em;transition:all .2s ease-in-out}.vxe-list--radio-option .vxe-radio--icon{color:var(--vxe-ui-input-border-color);border-radius:50%;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--radio-option.is--checked{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--checked .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option:not(.is--disabled):hover .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--readonly{cursor:auto}.vxe-list--radio-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--radio-option.is--disabled .vxe-radio--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--radio-option .vxe-radio--label{padding-left:.4em;vertical-align:middle}
1
+ @charset "UTF-8";.vxe-list{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-default);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-default)}.vxe-list.size--medium{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-medium);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-medium)}.vxe-list.size--small{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-small);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-small)}.vxe-list.size--mini{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-mini);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-mini)}.vxe-list{position:relative;display:block;padding:0;font-size:var(--vxe-ui-list-current-font-size);color:var(--vxe-ui-font-color);font-family:var(--vxe-ui-font-family);direction:ltr}.vxe-list .vxe-list--virtual-wrapper{position:relative;overflow-x:auto;overflow-y:auto;outline:0}.vxe-list .vxe-list--y-space{width:0;float:left}.vxe-list .vxe-list--body,.vxe-list .vxe-list--virtual-wrapper{padding:0;margin:0;border:0;outline:0}.vxe-list--header-wrapper{display:flex;flex-direction:row;align-items:center;min-height:var(--vxe-ui-list-row-height)}.vxe-list--header-left{display:flex;flex-direction:row;align-items:center;flex-shrink:0}.vxe-list--header-content{flex-grow:1;overflow:auto}.vxe-list--body.trigger--row>.vxe-list--row:not(.is--drag-disabled):active{cursor:grabbing}.vxe-list--body.is--padding>.vxe-list--row{padding:0 var(--vxe-ui-list-current-padding)}.vxe-list--body.checkbox--highlight .vxe-list--row.is-checkbox--checked{background-color:var(--vxe-ui-list-row-checkbox-checked-background-color)}.vxe-list--body.radio--highlight .vxe-list--row.is-radio--checked{background-color:var(--vxe-ui-list-row-radio-checked-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover{background-color:var(--vxe-ui-list-row-hover-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover.is--current{background-color:var(--vxe-ui-list-row-hover-current-background-color)}.vxe-list--body.row--hover.radio--highlight .vxe-list--row.is-radio--checked:hover{background-color:var(--vxe-ui-list-row-hover-radio-checked-background-color)}.vxe-list--body.row--hover.checkbox--highlight .vxe-list--row.is-checkbox--checked:hover{background-color:var(--vxe-ui-list-row-hover-checkbox-checked-background-color)}.vxe-list--row.is--current{background-color:var(--vxe-ui-list-row-current-background-color)}.vxe-list--virtual-wrapper{height:100px}.vxe-list--row{display:flex;flex-direction:row;align-items:center}.vxe-list--row-content,.vxe-list--row-drag,.vxe-list--row-extra{display:flex;flex-direction:row;align-items:center}.vxe-list--row-drag{flex-shrink:0;padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--row-content{flex-grow:1;height:var(--vxe-ui-list-row-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--row-extra{flex-shrink:0}.vxe-list--drag-handle:not(.is--disabled){cursor:grab}.vxe-list--drag-handle:not(.is--disabled):active{cursor:grabbing}.vxe-list--drag-handle:not(.is--disabled):hover{color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-handle.is--disabled{color:var(--vxe-ui-input-disabled-color);cursor:not-allowed}.vxe-list--row.row--drag-move{transition:transform .5s ease}.vxe-list--row.row--drag-origin{opacity:.3}.vxe-list--drag-row-line{display:none;position:absolute;top:0;left:0;z-index:11;pointer-events:none}.vxe-list--drag-row-line{width:100%;height:1px;border:2px solid transparent}.vxe-list--drag-row-line[drag-pos=top]{border-top-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-pos=bottom]{border-bottom-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-to-child=y]{border-top-color:transparent;border-bottom-color:transparent;border-left-color:var(--vxe-ui-status-success-color)}.vxe-list--drag-row-line.is--guides{background-color:var(--vxe-ui-list-drag-over-background-color)}.vxe-body--row-list-move{transition-property:transform;transition-duration:.35s}.vxe-list--drag-sort-tip{display:none;position:absolute;top:0;left:0;padding:.6em 1.4em;max-width:50%;min-width:100px;border-radius:var(--vxe-ui-border-radius);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none;background-color:var(--vxe-ui-layout-background-color);box-shadow:0 0 10px 0 rgba(0,0,0,.2);z-index:33}.vxe-list--drag-sort-tip[drag-status=normal] .vxe-list--drag-sort-tip-normal-status{display:block}.vxe-list--drag-sort-tip[drag-status=sub] .vxe-list--drag-sort-tip-sub-status{display:block}.vxe-list--drag-sort-tip[drag-status=disabled] .vxe-list--drag-sort-tip-disabled-status{display:block}.vxe-list--drag-sort-tip-wrapper{display:flex;flex-direction:row;align-items:center}.vxe-list--drag-sort-tip-status{padding-right:.4em}.vxe-list--drag-sort-tip-disabled-status{display:none;flex-shrink:0;color:var(--vxe-ui-status-error-color)}.vxe-list--drag-sort-tip-normal-status,.vxe-list--drag-sort-tip-sub-status{display:none}.vxe-list--drag-sort-tip-content{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--checkbox-header{padding-right:var(--vxe-ui-list-current-padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header{cursor:pointer}.vxe-list--checkbox-header .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-header .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header.is--checked,.vxe-list--checkbox-header.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-header.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--hidden{cursor:default}.vxe-list--checkbox-header.is--readonly{cursor:auto}.vxe-list--checkbox-header.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-header.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-header .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--checkbox-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--checkbox-option{cursor:pointer}.vxe-list--checkbox-option .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-option .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-option.is--checked,.vxe-list--checkbox-option.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-option.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--hidden{cursor:default}.vxe-list--checkbox-option.is--readonly{cursor:auto}.vxe-list--checkbox-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-option.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-option .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--radio-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--radio-option{cursor:pointer}.vxe-list--radio-option .vxe-radio--icon{font-size:1.26em;transition:all .2s ease-in-out}.vxe-list--radio-option .vxe-radio--icon{color:var(--vxe-ui-input-border-color);border-radius:50%;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--radio-option.is--checked{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--checked .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option:not(.is--disabled):hover .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--readonly{cursor:auto}.vxe-list--radio-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--radio-option.is--disabled .vxe-radio--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--radio-option .vxe-radio--label{padding-left:.4em;vertical-align:middle}.vxe-list.ov-padding.overflow-x.sx-pos--top{padding-top:var(--vxe-ui-scrollbar-x-height)}.vxe-list.ov-padding.overflow-x.sx-pos--bottom{padding-bottom:var(--vxe-ui-scrollbar-x-height)}.vxe-list.ov-padding.overflow-y.sy-pos--left{padding-left:var(--vxe-ui-scrollbar-y-width)}.vxe-list.ov-padding.overflow-y.sy-pos--right{padding-right:var(--vxe-ui-scrollbar-y-width)}.vxe-list.ov-x--hidden>.vxe-list--virtual-wrapper{overflow-x:hidden}.vxe-list.ov-y--hidden>.vxe-list--virtual-wrapper{overflow-y:hidden}.vxe-list.is--virtual-scrollbar.ov-x--auto-hide:hover>.vxe-scrollbar>.vxe-scrollbar--track-x{opacity:1}.vxe-list.is--virtual-scrollbar.ov-x--auto-hide>.vxe-scrollbar>.vxe-scrollbar--track-x{opacity:0;transition:opacity .8s ease-in-out}.vxe-list.is--virtual-scrollbar.ov-y--auto-hide:hover>.vxe-scrollbar>.vxe-scrollbar--track-y{opacity:1}.vxe-list.is--virtual-scrollbar.ov-y--auto-hide>.vxe-scrollbar>.vxe-scrollbar--track-y{opacity:0;transition:opacity .8s ease-in-out}.vxe-list>.vxe-scrollbar{position:unset}.vxe-list.is--virtual-scrollbar>.vxe-list--virtual-wrapper{scrollbar-width:none;-ms-overflow-style:none}.vxe-list.is--virtual-scrollbar>.vxe-list--virtual-wrapper::-webkit-scrollbar{display:none}