vxe-pc-ui 4.6.35 → 4.6.36

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 (44) hide show
  1. package/es/icon/style.css +1 -1
  2. package/es/style.css +1 -1
  3. package/es/style.min.css +1 -1
  4. package/es/tabs/src/tabs.js +290 -89
  5. package/es/tabs/style.css +431 -156
  6. package/es/tabs/style.min.css +1 -1
  7. package/es/ui/index.js +3 -1
  8. package/es/ui/src/log.js +1 -1
  9. package/es/vxe-tabs/style.css +431 -156
  10. package/es/vxe-tabs/style.min.css +1 -1
  11. package/lib/icon/style/style.css +1 -1
  12. package/lib/icon/style/style.min.css +1 -1
  13. package/lib/index.umd.js +310 -84
  14. package/lib/index.umd.min.js +1 -1
  15. package/lib/style.css +1 -1
  16. package/lib/style.min.css +1 -1
  17. package/lib/tabs/src/tabs.js +306 -82
  18. package/lib/tabs/src/tabs.min.js +1 -1
  19. package/lib/tabs/style/style.css +431 -156
  20. package/lib/tabs/style/style.min.css +1 -1
  21. package/lib/ui/index.js +3 -1
  22. package/lib/ui/index.min.js +1 -1
  23. package/lib/ui/src/log.js +1 -1
  24. package/lib/ui/src/log.min.js +1 -1
  25. package/lib/vxe-tabs/style/style.css +431 -156
  26. package/lib/vxe-tabs/style/style.min.css +1 -1
  27. package/package.json +1 -1
  28. package/packages/tabs/src/tabs.ts +299 -90
  29. package/packages/ui/index.ts +2 -0
  30. package/styles/components/tabs.scss +534 -183
  31. package/types/components/tabs.d.ts +22 -6
  32. package/types/ui/global-icon.d.ts +2 -0
  33. /package/es/icon/{iconfont.1750910542831.ttf → iconfont.1751108492990.ttf} +0 -0
  34. /package/es/icon/{iconfont.1750910542831.woff → iconfont.1751108492990.woff} +0 -0
  35. /package/es/icon/{iconfont.1750910542831.woff2 → iconfont.1751108492990.woff2} +0 -0
  36. /package/es/{iconfont.1750910542831.ttf → iconfont.1751108492990.ttf} +0 -0
  37. /package/es/{iconfont.1750910542831.woff → iconfont.1751108492990.woff} +0 -0
  38. /package/es/{iconfont.1750910542831.woff2 → iconfont.1751108492990.woff2} +0 -0
  39. /package/lib/icon/style/{iconfont.1750910542831.ttf → iconfont.1751108492990.ttf} +0 -0
  40. /package/lib/icon/style/{iconfont.1750910542831.woff → iconfont.1751108492990.woff} +0 -0
  41. /package/lib/icon/style/{iconfont.1750910542831.woff2 → iconfont.1751108492990.woff2} +0 -0
  42. /package/lib/{iconfont.1750910542831.ttf → iconfont.1751108492990.ttf} +0 -0
  43. /package/lib/{iconfont.1750910542831.woff → iconfont.1751108492990.woff} +0 -0
  44. /package/lib/{iconfont.1750910542831.woff2 → iconfont.1751108492990.woff2} +0 -0
@@ -1 +1 @@
1
- .vxe-tabs{display:flex;flex-direction:column;color:var(--vxe-ui-font-color);font-family:var(--vxe-ui-font-family)}.vxe-tabs.is--padding .vxe-tabs-pane--item{padding:var(--vxe-ui-layout-padding-default)}.vxe-tabs.trigger--default .vxe-tabs-header--item{cursor:pointer}.vxe-tabs.trigger--default .vxe-tabs-header--item:hover .vxe-tabs-header--item-name{color:var(--vxe-ui-font-primary-color)}.vxe-tabs-header{display:flex;flex-direction:row}.vxe-tabs-header--bar{position:relative;display:flex;flex-direction:row;align-items:center;justify-content:center;flex-shrink:0;width:2em;border:1px solid var(--vxe-ui-input-border-color);cursor:pointer}.vxe-tabs-header--bar::after{content:"";position:absolute;top:0;width:1px;height:100%;background-color:var(--vxe-ui-input-border-color);z-index:3}.vxe-tabs-header--bar:focus{color:var(--vxe-ui-font-darken-color)}.vxe-tabs-header--bar:hover{color:var(--vxe-ui-font-primary-lighten-color);background-color:var(--vxe-ui-font-tinge-color)}.vxe-tabs-header--bar:active{color:var(--vxe-ui-font-primary-darken-color)}.vxe-tabs-header--left-bar{border-right:0;box-shadow:8px 0 10px -5px var(--vxe-ui-tabs-bar-scrolling-box-shadow-color)}.vxe-tabs-header--left-bar::after{right:-1px}.vxe-tabs-header--right-bar{border-left:0;box-shadow:-8px 0 10px -5px var(--vxe-ui-tabs-bar-scrolling-box-shadow-color)}.vxe-tabs-header--right-bar::after{left:-1px}.vxe-tabs-header--extra{display:flex;flex-direction:row;align-items:center;justify-content:center;flex-shrink:0;border-bottom:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--wrapper{position:relative;flex-grow:1}.vxe-tabs-header--wrapper::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:var(--vxe-ui-input-border-color);z-index:0}.vxe-tabs-header--item-wrapper{position:relative;display:flex;flex-direction:row;overflow-y:hidden;overflow-x:auto;outline:0}.vxe-tabs-header--item{position:relative;flex-shrink:0;padding:0 .5em}.vxe-tabs-header--item.is--active .vxe-tabs-header--item-content{color:var(--vxe-ui-font-primary-color)}.vxe-tabs-header--item.align--left{text-align:left}.vxe-tabs-header--item.align--center{text-align:center}.vxe-tabs-header--item.align--right{text-align:right}.vxe-tabs-header--item-inner{display:flex;flex-direction:row;align-items:center}.vxe-tabs-header--item-content{flex-grow:1}.vxe-tabs-header--item-icon{padding:0 .6em}.vxe-tabs-header--item-icon+.vxe-tabs-header--item-name{padding-left:0}.vxe-tabs-header--item-name{padding:0 .6em}.vxe-tabs-header--close-btn,.vxe-tabs-header--refresh-btn{font-size:.8em;border-radius:50%;width:1.5em;height:1.5em;margin:0 .2em;line-height:1.5em;text-align:center}.vxe-tabs-header--close-btn:hover,.vxe-tabs-header--refresh-btn:hover{color:var(--vxe-ui-font-color);background:var(--vxe-ui-tabs-close-hover-background-color)}.vxe-tabs-header--close-btn:active,.vxe-tabs-header--refresh-btn:active{color:var(--vxe-ui-font-primary-color)}.vxe-tabs-header--close-btn>i,.vxe-tabs-header--refresh-btn>i{font-size:1em}.vxe-tabs-header--item-inner{transition:color .1s ease-in-out}.vxe-tabs-pane{flex-grow:1;overflow:hidden}.vxe-tabs-pane--item{display:none;height:100%;overflow:auto;outline:0}.vxe-tabs-pane--item.is--visible{display:block}.vxe-tabs-header--active-line{display:none}.vxe-tabs-header--active-line.type--default{display:block;position:absolute;bottom:0;left:0;height:2px;width:4px;background-color:var(--vxe-ui-font-primary-color);z-index:2;transition:all .3s ease-in-out}.vxe-tabs-header--active-line.type--card{display:block;position:absolute;top:0;left:0;width:4px;border:1px solid var(--vxe-ui-font-primary-color);pointer-events:none;z-index:1;box-shadow:0 0 8px rgba(0,0,0,.1);transition:color,left .3s ease-in-out}.vxe-tabs-header--active-line.type--border-card{display:block;position:absolute;top:0;left:0;width:4px;border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color);pointer-events:none;z-index:1}.vxe-tabs--border-card,.vxe-tabs--card,.vxe-tabs--default,.vxe-tabs--round-card{border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0;background-color:var(--vxe-ui-layout-background-color)}.vxe-tabs--default .vxe-tabs-header--item-inner{border-bottom:2px solid transparent}.vxe-tabs--card .vxe-tabs-header--bar{border-top:0}.vxe-tabs--card .vxe-tabs-header--left-bar{border-left:0}.vxe-tabs--card .vxe-tabs-header--right-bar{border-right:0}.vxe-tabs--card .vxe-tabs-header{border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0;border-top:1px solid var(--vxe-ui-input-border-color);border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs--card .vxe-tabs-header .vxe-tabs-header--wrapper{border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0}.vxe-tabs--card .vxe-tabs-header--item{border-left:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs--card .vxe-tabs-header--item:first-child{border-left:0}.vxe-tabs--card .vxe-tabs-header--item:last-child{border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs--border-card .vxe-tabs-header--item-wrapper{z-index:2}.vxe-tabs--border-card .vxe-tabs-header--bar{border-top:0}.vxe-tabs--border-card .vxe-tabs-header--left-bar{border-left:0}.vxe-tabs--border-card .vxe-tabs-header--right-bar{border-right:0}.vxe-tabs--border-card.is--height .vxe-tabs-pane--item,.vxe-tabs--border-card.is--padding .vxe-tabs-pane--item{border-bottom:1px solid var(--vxe-ui-input-border-color);border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs--border-card .vxe-tabs-pane--item.has--content{border-bottom:1px solid var(--vxe-ui-input-border-color);border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs--border-card .vxe-tabs-header{border-top:1px solid var(--vxe-ui-input-border-color);border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color);background-color:var(--vxe-ui-tabs-card-header-background-color)}.vxe-tabs--border-card .vxe-tabs-header .vxe-tabs-header--wrapper{border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0}.vxe-tabs--border-card .vxe-tabs-header--item.is--active{background-color:var(--vxe-ui-layout-background-color)}.vxe-tabs--round-card .vxe-tabs-header--item-wrapper{z-index:2}.vxe-tabs--round-card .vxe-tabs-header--item{position:relative;z-index:2;margin:0 2px;border-top:1px solid var(--vxe-ui-input-border-color);border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color);border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0;background-color:rgba(0,0,0,.02);transition:color .3s ease-in-out}.vxe-tabs--round-card .vxe-tabs-header--item.is--active{background-color:var(--vxe-ui-layout-background-color)}.vxe-tabs--round-card .vxe-tabs-header--item:first-child{margin-left:0}.vxe-tabs--round-card .vxe-tabs-header--item:last-child{margin-right:0}.vxe-tabs--round-card.is--height .vxe-tabs-pane--item,.vxe-tabs--round-card.is--padding .vxe-tabs-pane--item{border-bottom:1px solid var(--vxe-ui-input-border-color);border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs--round-card .vxe-tabs-pane--item.has--content{border-bottom:1px solid var(--vxe-ui-input-border-color);border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs--round-card .vxe-tabs-pane{background-color:var(--vxe-ui-layout-background-color)}.vxe-tabs .vxe-tabs-header--wrapper{height:var(--vxe-ui-tabs-header-height-default);overflow:hidden}.vxe-tabs .vxe-tabs-header--item-inner{height:var(--vxe-ui-tabs-header-height-default)}.vxe-tabs .vxe-tabs-header--active-line.type--card{height:calc(var(--vxe-ui-tabs-header-height-default) - 1px)}.vxe-tabs .vxe-tabs-header--active-line.type--border-card{height:calc(var(--vxe-ui-tabs-header-height-default) + 1px);line-height:calc(var(--vxe-ui-tabs-header-height-default) + 1px)}
1
+ .vxe-tabs{display:flex;color:var(--vxe-ui-font-color);font-family:var(--vxe-ui-font-family)}.vxe-tabs.pos--bottom,.vxe-tabs.pos--top{flex-direction:column}.vxe-tabs.pos--left,.vxe-tabs.pos--right{flex-direction:row}.vxe-tabs.trigger--default .vxe-tabs-header--item{cursor:pointer}.vxe-tabs.trigger--default .vxe-tabs-header--item:hover .vxe-tabs-header--item-name{color:var(--vxe-ui-font-primary-color)}.vxe-tabs-header--bar{position:relative;display:flex;flex-direction:row;align-items:center;justify-content:center;flex-shrink:0;cursor:pointer}.vxe-tabs-header--bar::after{content:"";position:absolute;background-color:var(--vxe-ui-input-border-color);z-index:3}.vxe-tabs-header--bar:focus{color:var(--vxe-ui-font-darken-color)}.vxe-tabs-header--bar:hover{color:var(--vxe-ui-font-primary-lighten-color)}.vxe-tabs-header--bar:active{color:var(--vxe-ui-font-primary-darken-color)}.vxe-tabs-header--bar.type--border-card,.vxe-tabs-header--bar.type--card,.vxe-tabs-header--bar.type--default,.vxe-tabs-header--bar.type--round-card{border:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--bar.type--round-card{background-color:rgba(0,0,0,.02)}.vxe-tabs-header--bar.pos--bottom,.vxe-tabs-header--bar.pos--top{width:1.6em}.vxe-tabs-header--bar.pos--bottom::after,.vxe-tabs-header--bar.pos--top::after{top:0;width:1px;height:100%}.vxe-tabs-header--bar.pos--left,.vxe-tabs-header--bar.pos--right{width:100%;height:1.6em}.vxe-tabs-header--bar.pos--left::after,.vxe-tabs-header--bar.pos--right::after{left:0;width:100%;height:1px}.vxe-tabs-header--prev-bar.type--default.pos--bottom,.vxe-tabs-header--prev-bar.type--default.pos--top{border-right:0}.vxe-tabs-header--prev-bar.type--default.pos--left,.vxe-tabs-header--prev-bar.type--default.pos--right{border-bottom:0}.vxe-tabs-header--prev-bar.type--card.pos--top{border-bottom:0;border-right:0}.vxe-tabs-header--prev-bar.type--card.pos--bottom{border-top:0;border-right:0}.vxe-tabs-header--prev-bar.type--card.pos--left{border-left:0;border-bottom:0}.vxe-tabs-header--prev-bar.type--card.pos--right{border-right:0;border-bottom:0}.vxe-tabs-header--prev-bar.type--border-card.pos--top{border-top:0;border-right:0}.vxe-tabs-header--prev-bar.type--border-card.pos--bottom{border-right:0;border-bottom:0}.vxe-tabs-header--prev-bar.type--border-card.pos--left{border-left:0;border-bottom:0}.vxe-tabs-header--prev-bar.type--border-card.pos--right{border-right:0;border-bottom:0}.vxe-tabs-header--prev-bar.type--round-card.pos--top{border-right:0}.vxe-tabs-header--prev-bar.type--round-card.pos--bottom{border-right:0}.vxe-tabs-header--prev-bar.type--round-card.pos--left{border-bottom:0}.vxe-tabs-header--prev-bar.type--round-card.pos--right{border-bottom:0}.vxe-tabs-header--prev-bar.pos--bottom::after,.vxe-tabs-header--prev-bar.pos--top::after{right:0}.vxe-tabs-header--prev-bar.pos--left::after,.vxe-tabs-header--prev-bar.pos--right::after{bottom:0}.vxe-tabs-header--prev-bar.scrolling--middle.pos--bottom,.vxe-tabs-header--prev-bar.scrolling--middle.pos--top{box-shadow:4px 0 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color)}.vxe-tabs-header--prev-bar.scrolling--middle.pos--left,.vxe-tabs-header--prev-bar.scrolling--middle.pos--right{box-shadow:0 4px 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color)}.vxe-tabs-header--next-bar.type--default.pos--bottom,.vxe-tabs-header--next-bar.type--default.pos--top{border-left:0}.vxe-tabs-header--next-bar.type--default.pos--left,.vxe-tabs-header--next-bar.type--default.pos--right{border-top:0}.vxe-tabs-header--next-bar.type--card.pos--top{border-top:0;border-left:0}.vxe-tabs-header--next-bar.type--card.pos--bottom{border-bottom:0;border-left:0}.vxe-tabs-header--next-bar.type--card.pos--left{border-top:0;border-right:0}.vxe-tabs-header--next-bar.type--card.pos--right{border-top:0;border-left:0}.vxe-tabs-header--next-bar.type--border-card.pos--top{border-left:0;border-top:0}.vxe-tabs-header--next-bar.type--border-card.pos--bottom{border-left:0;border-bottom:0}.vxe-tabs-header--next-bar.type--border-card.pos--left{border-left:0;border-top:0}.vxe-tabs-header--next-bar.type--border-card.pos--right{border-right:0;border-top:0}.vxe-tabs-header--next-bar.type--round-card.pos--top{border-left:0}.vxe-tabs-header--next-bar.type--round-card.pos--bottom{border-left:0;border-bottom:0}.vxe-tabs-header--next-bar.type--round-card.pos--left{border-top:0}.vxe-tabs-header--next-bar.type--round-card.pos--right{border-top:0}.vxe-tabs-header--next-bar.pos--bottom::after,.vxe-tabs-header--next-bar.pos--top::after{left:0}.vxe-tabs-header--next-bar.pos--left::after,.vxe-tabs-header--next-bar.pos--right::after{top:0}.vxe-tabs-header--next-bar.scrolling--middle.pos--bottom,.vxe-tabs-header--next-bar.scrolling--middle.pos--top{box-shadow:-4px 0 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color)}.vxe-tabs-header--next-bar.scrolling--middle.pos--left,.vxe-tabs-header--next-bar.scrolling--middle.pos--right{box-shadow:0 -4px 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color)}.vxe-tabs-header--prefix,.vxe-tabs-header--suffix{display:flex;flex-direction:row;align-items:center;justify-content:center;flex-shrink:0}.vxe-tabs-header--prefix.type--border-card.pos--top,.vxe-tabs-header--prefix.type--default.pos--top,.vxe-tabs-header--prefix.type--round-card.pos--top,.vxe-tabs-header--suffix.type--border-card.pos--top,.vxe-tabs-header--suffix.type--default.pos--top,.vxe-tabs-header--suffix.type--round-card.pos--top{border-bottom:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--prefix.type--border-card.pos--bottom,.vxe-tabs-header--prefix.type--default.pos--bottom,.vxe-tabs-header--prefix.type--round-card.pos--bottom,.vxe-tabs-header--suffix.type--border-card.pos--bottom,.vxe-tabs-header--suffix.type--default.pos--bottom,.vxe-tabs-header--suffix.type--round-card.pos--bottom{border-top:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--prefix.type--border-card.pos--left,.vxe-tabs-header--prefix.type--default.pos--left,.vxe-tabs-header--prefix.type--round-card.pos--left,.vxe-tabs-header--suffix.type--border-card.pos--left,.vxe-tabs-header--suffix.type--default.pos--left,.vxe-tabs-header--suffix.type--round-card.pos--left{border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--prefix.type--border-card.pos--right,.vxe-tabs-header--prefix.type--default.pos--right,.vxe-tabs-header--prefix.type--round-card.pos--right,.vxe-tabs-header--suffix.type--border-card.pos--right,.vxe-tabs-header--suffix.type--default.pos--right,.vxe-tabs-header--suffix.type--round-card.pos--right{border-left:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item-wrapper{position:relative;display:flex;outline:0}.vxe-tabs-header--item{position:relative;flex-shrink:0;padding:0 .5em}.vxe-tabs-header--item.is--active .vxe-tabs-header--item-content{color:var(--vxe-ui-font-primary-color)}.vxe-tabs-header--item.align--left{text-align:left}.vxe-tabs-header--item.align--center{text-align:center}.vxe-tabs-header--item.align--right{text-align:right}.vxe-tabs-header--item.type--card.pos--top{border-top:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--card.pos--bottom{border-bottom:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--card.pos--bottom,.vxe-tabs-header--item.type--card.pos--top{border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--card.pos--bottom:first-child,.vxe-tabs-header--item.type--card.pos--top:first-child{border-left:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--card.pos--left{border-left:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--card.pos--right{border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--card.pos--left,.vxe-tabs-header--item.type--card.pos--right{border-bottom:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--card.pos--left:first-child,.vxe-tabs-header--item.type--card.pos--right:first-child{border-top:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--item.type--border-card.is--active{background-color:var(--vxe-ui-layout-background-color)}.vxe-tabs-header--item.type--round-card{z-index:2;border:1px solid var(--vxe-ui-input-border-color);background-color:rgba(0,0,0,.02);transition:color .3s ease-in-out}.vxe-tabs-header--item.type--round-card.is--active{background-color:var(--vxe-ui-layout-background-color)}.vxe-tabs-header--item.type--round-card.pos--top{border-bottom:0;border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0}.vxe-tabs-header--item.type--round-card.pos--bottom{border-top:0;border-radius:0 0 var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius)}.vxe-tabs-header--item.type--round-card.pos--bottom,.vxe-tabs-header--item.type--round-card.pos--top{margin:0 2px}.vxe-tabs-header--item.type--round-card.pos--bottom:first-child,.vxe-tabs-header--item.type--round-card.pos--top:first-child{margin-left:0}.vxe-tabs-header--item.type--round-card.pos--bottom:last-child,.vxe-tabs-header--item.type--round-card.pos--top:last-child{margin-right:0}.vxe-tabs-header--item.type--round-card.pos--left{border-right:0;border-radius:var(--vxe-ui-base-border-radius) 0 0 var(--vxe-ui-base-border-radius)}.vxe-tabs-header--item.type--round-card.pos--right{border-left:0;border-radius:0 var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0}.vxe-tabs-header--item.type--round-card.pos--left,.vxe-tabs-header--item.type--round-card.pos--right{margin:2px 0}.vxe-tabs-header--item.type--round-card.pos--left:first-child,.vxe-tabs-header--item.type--round-card.pos--right:first-child{margin-top:0}.vxe-tabs-header--item.type--round-card.pos--left:last-child,.vxe-tabs-header--item.type--round-card.pos--right:last-child{margin-bottom:0}.vxe-tabs-header--item-inner{display:flex;flex-direction:row;align-items:center}.vxe-tabs-header--item-content{flex-grow:1;max-width:30em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-tabs-header--item-icon{padding:0 .6em}.vxe-tabs-header--item-icon+.vxe-tabs-header--item-name{padding-left:0}.vxe-tabs-header--item-name{padding:0 .6em}.vxe-tabs-header--close-btn,.vxe-tabs-header--refresh-btn{font-size:.8em;border-radius:50%;width:1.5em;height:1.5em;margin:0 .2em;line-height:1.5em;text-align:center}.vxe-tabs-header--close-btn:hover,.vxe-tabs-header--refresh-btn:hover{color:var(--vxe-ui-font-color);background:var(--vxe-ui-tabs-close-hover-background-color)}.vxe-tabs-header--close-btn:active,.vxe-tabs-header--refresh-btn:active{color:var(--vxe-ui-font-primary-color)}.vxe-tabs-header--close-btn>i,.vxe-tabs-header--refresh-btn>i{font-size:1em}.vxe-tabs-header--refresh-btn{visibility:hidden}.vxe-tabs-header--refresh-btn.is--active{visibility:visible}.vxe-tabs-header--item-inner{transition:color .1s ease-in-out}.vxe-tabs-pane--wrapper{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.vxe-tabs-pane--body{flex-grow:1;overflow:hidden}.vxe-tabs-pane--body.is--padding{padding:var(--vxe-ui-layout-padding-default)}.vxe-tabs-pane--body.type--border-card,.vxe-tabs-pane--body.type--round-card{border:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-pane--body.type--border-card.pos--top,.vxe-tabs-pane--body.type--round-card.pos--top{border-top:0}.vxe-tabs-pane--body.type--border-card.pos--bottom,.vxe-tabs-pane--body.type--round-card.pos--bottom{border-bottom:0}.vxe-tabs-pane--body.type--border-card.pos--left,.vxe-tabs-pane--body.type--round-card.pos--left{border-left:0}.vxe-tabs-pane--body.type--border-card.pos--right,.vxe-tabs-pane--body.type--round-card.pos--right{border-right:0}.vxe-tabs-pane--footer,.vxe-tabs-pane--top{flex-shrink:0;overflow:auto}.vxe-tabs-pane--item{display:none;height:100%;overflow:auto;outline:0}.vxe-tabs-pane--item.is--visible{display:block}.vxe-tabs-header{display:flex}.vxe-tabs-header.pos--bottom,.vxe-tabs-header.pos--top{flex-direction:row}.vxe-tabs-header.pos--left,.vxe-tabs-header.pos--right{flex-direction:column}.vxe-tabs-header.type--card.pos--top{border-bottom:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header.type--card.pos--bottom{border-top:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header.type--card.pos--left{border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header.type--card.pos--right{border-left:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header.type--border-card{background-color:var(--vxe-ui-tabs-card-header-background-color);border:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header.type--border-card.pos--top{border-bottom:0}.vxe-tabs-header.type--border-card.pos--bottom{border-top:0}.vxe-tabs-header.type--border-card.pos--left{border-right:0}.vxe-tabs-header.type--border-card.pos--right{border-left:0}.vxe-tabs-header--wrapper{position:relative;flex-grow:1;overflow:hidden}.vxe-tabs-header--wrapper.type--border-card,.vxe-tabs-header--wrapper.type--default,.vxe-tabs-header--wrapper.type--round-card{position:relative}.vxe-tabs-header--wrapper.type--border-card::after,.vxe-tabs-header--wrapper.type--default::after,.vxe-tabs-header--wrapper.type--round-card::after{content:"";position:absolute;background-color:var(--vxe-ui-input-border-color);z-index:0}.vxe-tabs-header--wrapper.type--border-card.pos--top::after,.vxe-tabs-header--wrapper.type--default.pos--top::after,.vxe-tabs-header--wrapper.type--round-card.pos--top::after{bottom:0}.vxe-tabs-header--wrapper.type--border-card.pos--bottom::after,.vxe-tabs-header--wrapper.type--default.pos--bottom::after,.vxe-tabs-header--wrapper.type--round-card.pos--bottom::after{top:0}.vxe-tabs-header--wrapper.type--border-card.pos--bottom::after,.vxe-tabs-header--wrapper.type--border-card.pos--top::after,.vxe-tabs-header--wrapper.type--default.pos--bottom::after,.vxe-tabs-header--wrapper.type--default.pos--top::after,.vxe-tabs-header--wrapper.type--round-card.pos--bottom::after,.vxe-tabs-header--wrapper.type--round-card.pos--top::after{left:0;width:100%;height:1px}.vxe-tabs-header--wrapper.type--border-card.pos--left::after,.vxe-tabs-header--wrapper.type--default.pos--left::after,.vxe-tabs-header--wrapper.type--round-card.pos--left::after{right:0}.vxe-tabs-header--wrapper.type--border-card.pos--right::after,.vxe-tabs-header--wrapper.type--default.pos--right::after,.vxe-tabs-header--wrapper.type--round-card.pos--right::after{left:0}.vxe-tabs-header--wrapper.type--border-card.pos--left::after,.vxe-tabs-header--wrapper.type--border-card.pos--right::after,.vxe-tabs-header--wrapper.type--default.pos--left::after,.vxe-tabs-header--wrapper.type--default.pos--right::after,.vxe-tabs-header--wrapper.type--round-card.pos--left::after,.vxe-tabs-header--wrapper.type--round-card.pos--right::after{top:0;width:1px;height:100%}.vxe-tabs-header--wrapper.type--border-card.pos--top{border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0}.vxe-tabs-header--wrapper.type--border-card.pos--bottom{border-radius:0 0 var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius)}.vxe-tabs-header--wrapper.type--border-card>.vxe-tabs-header--item-wrapper,.vxe-tabs-header--wrapper.type--round-card>.vxe-tabs-header--item-wrapper{z-index:2}.vxe-tabs-header--wrapper.pos--bottom,.vxe-tabs-header--wrapper.pos--top{height:var(--vxe-ui-tabs-header-height-default)}.vxe-tabs-header--wrapper.pos--bottom .vxe-tabs-header--item-wrapper,.vxe-tabs-header--wrapper.pos--top .vxe-tabs-header--item-wrapper{flex-direction:row;width:100%;overflow-y:hidden;overflow-x:auto}.vxe-tabs-header--wrapper.pos--left .vxe-tabs-header--item-wrapper,.vxe-tabs-header--wrapper.pos--right .vxe-tabs-header--item-wrapper{flex-direction:column;height:100%;overflow-y:auto;overflow-x:hidden}.vxe-tabs-header--active-line{display:none}.vxe-tabs-header--active-line.type--default{display:block;position:absolute;background-color:var(--vxe-ui-font-primary-color);z-index:2;transition:all .3s ease-in-out}.vxe-tabs-header--active-line.type--default.pos--top{bottom:0}.vxe-tabs-header--active-line.type--default.pos--bottom{top:0}.vxe-tabs-header--active-line.type--default.pos--bottom,.vxe-tabs-header--active-line.type--default.pos--top{left:0;height:2px;width:4px}.vxe-tabs-header--active-line.type--default.pos--left{right:0}.vxe-tabs-header--active-line.type--default.pos--right{left:0}.vxe-tabs-header--active-line.type--default.pos--left,.vxe-tabs-header--active-line.type--default.pos--right{top:0;height:4px;width:2px}.vxe-tabs-header--active-line.type--card{display:block;position:absolute;top:0;left:0;border:1px solid var(--vxe-ui-font-primary-color);pointer-events:none;z-index:1;box-shadow:0 0 8px rgba(0,0,0,.1)}.vxe-tabs-header--active-line.type--card.pos--bottom,.vxe-tabs-header--active-line.type--card.pos--top{width:4px;transition:color,left .3s ease-in-out}.vxe-tabs-header--active-line.type--card.pos--left,.vxe-tabs-header--active-line.type--card.pos--right{width:100%;transition:color,top .3s ease-in-out}.vxe-tabs-header--active-line.type--border-card{display:block;position:absolute;top:0;left:0;pointer-events:none;z-index:1}.vxe-tabs-header--active-line.type--border-card.pos--bottom,.vxe-tabs-header--active-line.type--border-card.pos--top{width:4px;border-left:1px solid var(--vxe-ui-input-border-color);border-right:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs-header--active-line.type--border-card.pos--left,.vxe-tabs-header--active-line.type--border-card.pos--right{width:100%;border-top:1px solid var(--vxe-ui-input-border-color);border-bottom:1px solid var(--vxe-ui-input-border-color)}.vxe-tabs .vxe-tabs-header--item-inner{height:var(--vxe-ui-tabs-header-height-default)}.vxe-tabs .vxe-tabs-header--active-line.type--card{height:var(--vxe-ui-tabs-header-height-default)}.vxe-tabs .vxe-tabs-header--active-line.type--border-card{height:calc(var(--vxe-ui-tabs-header-height-default) + 1px);line-height:calc(var(--vxe-ui-tabs-header-height-default) + 1px)}.vxe-tabs--border-card,.vxe-tabs--card,.vxe-tabs--default,.vxe-tabs--round-card{border-radius:var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0;background-color:var(--vxe-ui-layout-background-color)}.vxe-tabs--default .vxe-tabs-header--item-inner{border-bottom:2px solid transparent}.vxe-tabs--card .vxe-tabs-header--item-inner,.vxe-tabs--round-card .vxe-tabs-header--item-inner{height:calc(var(--vxe-ui-tabs-header-height-default) - 1px)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vxe-pc-ui",
3
- "version": "4.6.35",
3
+ "version": "4.6.36",
4
4
  "description": "A vue based PC component library",
5
5
  "scripts": {
6
6
  "update": "npm install --legacy-peer-deps",
@@ -2,23 +2,31 @@ import { ref, h, reactive, inject, PropType, provide, computed, onUnmounted, wat
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import { createEvent, getConfig, getIcon, globalEvents, permission, renderEmptyElement } from '../../ui'
4
4
  import { getSlotVNs } from '../../ui/src/vn'
5
- import { toCssUnit } from '../../ui/src/dom'
5
+ import { toCssUnit, addClass, removeClass } from '../../ui/src/dom'
6
6
  import { isEnableConf } from '../../ui/src/utils'
7
7
  import { warnLog, errLog } from '../../ui/src/log'
8
8
  import XEUtils from 'xe-utils'
9
9
 
10
- import type { VxeTabsPropTypes, VxeTabPaneProps, VxeTabsEmits, TabsInternalData, TabsReactData, TabsPrivateRef, VxeTabsPrivateComputed, VxeTabsConstructor, VxeTabsPrivateMethods, VxeTabPaneDefines, ValueOf, TabsMethods, TabsPrivateMethods } from '../../../types'
10
+ import type { VxeTabsPropTypes, VxeTabPaneProps, VxeTabsEmits, TabsInternalData, TabsReactData, TabsPrivateRef, VxeTabsPrivateComputed, VxeTabsConstructor, VxeTabsPrivateMethods, VxeTabPaneDefines, ValueOf, TabsMethods, TabsPrivateMethods, VxeComponentStyleType } from '../../../types'
11
11
 
12
12
  export default defineVxeComponent({
13
13
  name: 'VxeTabs',
14
14
  props: {
15
15
  modelValue: [String, Number, Boolean] as PropType<VxeTabsPropTypes.ModelValue>,
16
16
  options: Array as PropType<VxeTabsPropTypes.Options>,
17
+ width: [String, Number] as PropType<VxeTabsPropTypes.Width>,
17
18
  height: [String, Number] as PropType<VxeTabsPropTypes.Height>,
18
19
  destroyOnClose: Boolean as PropType<VxeTabsPropTypes.DestroyOnClose>,
19
20
  titleWidth: [String, Number] as PropType<VxeTabsPropTypes.TitleWidth>,
20
21
  titleAlign: [String, Number] as PropType<VxeTabsPropTypes.TitleAlign>,
21
- type: String as PropType<VxeTabsPropTypes.Type>,
22
+ type: {
23
+ type: String as PropType<VxeTabsPropTypes.Type>,
24
+ default: () => getConfig().tabs.type
25
+ },
26
+ position: {
27
+ type: String as PropType<VxeTabsPropTypes.Position>,
28
+ default: () => getConfig().tabs.position
29
+ },
22
30
  showClose: Boolean as PropType<VxeTabsPropTypes.ShowClose>,
23
31
  padding: {
24
32
  type: Boolean as PropType<VxeTabsPropTypes.Padding>,
@@ -50,13 +58,18 @@ export default defineVxeComponent({
50
58
 
51
59
  const refElem = ref<HTMLDivElement>()
52
60
  const refHeadWrapperElem = ref<HTMLDivElement>()
61
+ const refHeadPrevElem = ref<HTMLDivElement>()
62
+ const refHeadNextElem = ref<HTMLDivElement>()
53
63
 
54
64
  const reactData = reactive<TabsReactData>({
55
65
  staticTabs: [],
56
66
  activeName: null,
57
67
  initNames: [],
58
68
  lintLeft: 0,
69
+ lintTop: 0,
59
70
  lintWidth: 0,
71
+ lintHeight: 0,
72
+ scrollbarWidth: 0,
60
73
  isTabOver: false,
61
74
  resizeFlag: 1,
62
75
  cacheTabMaps: {}
@@ -70,6 +83,47 @@ export default defineVxeComponent({
70
83
  refElem
71
84
  }
72
85
 
86
+ const computeTabType = computed(() => {
87
+ const { type } = props
88
+ return type || 'default'
89
+ })
90
+
91
+ const computeTabPosition = computed(() => {
92
+ const { position } = props
93
+ return position || 'top'
94
+ })
95
+
96
+ const computeLrPosition = computed(() => {
97
+ const tabPosition = computeTabPosition.value
98
+ return tabPosition === 'left' || tabPosition === 'right'
99
+ })
100
+
101
+ const computeLineStyle = computed(() => {
102
+ const { lintLeft, lintTop, lintWidth, lintHeight } = reactData
103
+ const lrPosition = computeLrPosition.value
104
+ return lrPosition
105
+ ? {
106
+ top: `${lintTop}px`,
107
+ height: `${lintHeight}px`
108
+ }
109
+ : {
110
+ left: `${lintLeft}px`,
111
+ width: `${lintWidth}px`
112
+ }
113
+ })
114
+
115
+ const computeWrapperStyle = computed(() => {
116
+ const { width, height } = props
117
+ const stys: VxeComponentStyleType = {}
118
+ if (width) {
119
+ stys.width = toCssUnit(width)
120
+ }
121
+ if (width) {
122
+ stys.height = toCssUnit(height)
123
+ }
124
+ return stys
125
+ })
126
+
73
127
  const computeCloseOpts = computed(() => {
74
128
  return Object.assign({}, getConfig().tabs.closeConfig, props.closeConfig)
75
129
  })
@@ -123,41 +177,100 @@ export default defineVxeComponent({
123
177
  return []
124
178
  }
125
179
 
180
+ const checkScrolling = () => {
181
+ const lrPosition = computeLrPosition.value
182
+ const headerWrapperEl = refHeadWrapperElem.value
183
+ const headPrevEl = refHeadPrevElem.value
184
+ const headNextEl = refHeadNextElem.value
185
+ if (headerWrapperEl) {
186
+ const { scrollLeft, scrollTop, clientWidth, clientHeight, scrollWidth, scrollHeight } = headerWrapperEl
187
+ if (headPrevEl) {
188
+ if ((lrPosition ? scrollTop : scrollLeft) > 0) {
189
+ addClass(headPrevEl, 'scrolling--middle')
190
+ } else {
191
+ removeClass(headPrevEl, 'scrolling--middle')
192
+ }
193
+ }
194
+ if (headNextEl) {
195
+ if (lrPosition ? (clientHeight < scrollHeight - Math.ceil(scrollTop)) : (clientWidth < scrollWidth - Math.ceil(scrollLeft))) {
196
+ addClass(headNextEl, 'scrolling--middle')
197
+ } else {
198
+ removeClass(headNextEl, 'scrolling--middle')
199
+ }
200
+ }
201
+ }
202
+ }
203
+
126
204
  const updateTabStyle = () => {
127
- nextTick(() => {
128
- const { type } = props
205
+ const handleStyle = () => {
129
206
  const { activeName } = reactData
207
+ const tabType = computeTabType.value
130
208
  const tabOptions = computeTabOptions.value
131
209
  const tabStaticOptions = computeTabStaticOptions.value
132
210
  const headerWrapperEl = refHeadWrapperElem.value
211
+ const lrPosition = computeLrPosition.value
133
212
  let lintWidth = 0
213
+ let lintHeight = 0
134
214
  let lintLeft = 0
215
+ let lintTop = 0
216
+ let scrollbarWidth = 0
135
217
  let isOver = false
136
218
  if (headerWrapperEl) {
137
219
  const index = XEUtils.findIndexOf(tabStaticOptions.length ? tabStaticOptions : tabOptions, item => item.name === activeName)
138
- const { children, scrollWidth, clientWidth } = headerWrapperEl
139
- isOver = scrollWidth !== clientWidth
140
- if (index > -1) {
141
- const tabEl = children[index] as HTMLDivElement
142
- const tabWidth = tabEl.clientWidth
143
- if (type) {
144
- if (type === 'card') {
145
- lintWidth = tabWidth + 2
146
- lintLeft = tabEl.offsetLeft
147
- } else if (type === 'border-card') {
148
- lintWidth = tabWidth + 2
149
- lintLeft = tabEl.offsetLeft - 1
220
+ const { children, offsetWidth, scrollWidth, scrollHeight, clientWidth, clientHeight } = headerWrapperEl
221
+ scrollbarWidth = offsetWidth - clientWidth
222
+ if (lrPosition) {
223
+ isOver = scrollHeight !== clientHeight
224
+ if (index > -1) {
225
+ const tabEl = children[index] as HTMLDivElement
226
+ if (tabEl) {
227
+ const tabHeight = tabEl.clientHeight
228
+ const tabWidth = tabEl.clientWidth
229
+ if (tabType === 'card') {
230
+ lintWidth = tabWidth
231
+ lintHeight = tabHeight
232
+ lintTop = tabEl.offsetTop
233
+ } else if (tabType === 'border-card') {
234
+ lintWidth = tabWidth
235
+ lintHeight = tabHeight
236
+ lintTop = tabEl.offsetTop - 1
237
+ } else {
238
+ lintHeight = Math.max(4, Math.floor(tabHeight * 0.6))
239
+ lintTop = tabEl.offsetTop + Math.floor((tabHeight - lintHeight) / 2)
240
+ }
241
+ }
242
+ }
243
+ } else {
244
+ isOver = scrollWidth !== clientWidth
245
+ if (index > -1) {
246
+ const tabEl = children[index] as HTMLDivElement
247
+ if (tabEl) {
248
+ const tabWidth = tabEl.clientWidth
249
+ if (tabType === 'card') {
250
+ lintWidth = tabWidth
251
+ lintLeft = tabEl.offsetLeft
252
+ } else if (tabType === 'border-card') {
253
+ lintWidth = tabWidth
254
+ lintLeft = tabEl.offsetLeft - 1
255
+ } else {
256
+ lintWidth = Math.max(4, Math.floor(tabWidth * 0.6))
257
+ lintLeft = tabEl.offsetLeft + Math.floor((tabWidth - lintWidth) / 2)
258
+ }
150
259
  }
151
- } else {
152
- lintWidth = Math.max(4, Math.floor(tabWidth * 0.6))
153
- lintLeft = tabEl.offsetLeft + Math.floor((tabWidth - lintWidth) / 2)
154
260
  }
155
261
  }
156
262
  }
263
+ reactData.scrollbarWidth = scrollbarWidth
157
264
  reactData.lintLeft = lintLeft
265
+ reactData.lintTop = lintTop
158
266
  reactData.lintWidth = lintWidth
267
+ reactData.lintHeight = lintHeight
159
268
  reactData.isTabOver = isOver
160
- })
269
+ checkScrolling()
270
+ }
271
+
272
+ handleStyle()
273
+ nextTick(handleStyle)
161
274
  }
162
275
 
163
276
  const dispatchEvent = (type: ValueOf<VxeTabsEmits>, params: Record<string, any>, evnt: Event | null) => {
@@ -283,7 +396,9 @@ export default defineVxeComponent({
283
396
 
284
397
  const startScrollAnimation = (offsetPos: number, offsetSize: number) => {
285
398
  const { slTimeout } = internalData
286
- let offsetLeft = offsetSize
399
+ const lrPosition = computeLrPosition.value
400
+ let offsetLeft = lrPosition ? 0 : offsetSize
401
+ let offsetTop = lrPosition ? offsetSize : 0
287
402
  let scrollCount = 6
288
403
  let delayNum = 35
289
404
  if (slTimeout) {
@@ -295,19 +410,36 @@ export default defineVxeComponent({
295
410
  if (scrollCount > 0) {
296
411
  scrollCount--
297
412
  if (headerWrapperEl) {
298
- const { clientWidth, scrollWidth, scrollLeft } = headerWrapperEl
299
- offsetLeft = Math.floor(offsetLeft / 2)
300
- if (offsetPos > 0) {
301
- if (clientWidth + scrollLeft < scrollWidth) {
302
- headerWrapperEl.scrollLeft += offsetLeft
303
- delayNum -= 4
304
- internalData.slTimeout = setTimeout(scrollAnimate, delayNum)
413
+ const { clientWidth, clientHeight, scrollWidth, scrollHeight, scrollLeft, scrollTop } = headerWrapperEl
414
+ if (lrPosition) {
415
+ offsetTop = Math.floor(offsetTop / 2)
416
+ if (offsetPos > 0) {
417
+ if (clientHeight + scrollTop < scrollHeight) {
418
+ headerWrapperEl.scrollTop += offsetTop
419
+ delayNum -= 4
420
+ internalData.slTimeout = setTimeout(scrollAnimate, delayNum)
421
+ }
422
+ } else {
423
+ if (scrollTop > 0) {
424
+ headerWrapperEl.scrollTop -= offsetTop
425
+ delayNum -= 4
426
+ internalData.slTimeout = setTimeout(scrollAnimate, delayNum)
427
+ }
305
428
  }
306
429
  } else {
307
- if (scrollLeft > 0) {
308
- headerWrapperEl.scrollLeft -= offsetLeft
309
- delayNum -= 4
310
- internalData.slTimeout = setTimeout(scrollAnimate, delayNum)
430
+ offsetLeft = Math.floor(offsetLeft / 2)
431
+ if (offsetPos > 0) {
432
+ if (clientWidth + scrollLeft < scrollWidth) {
433
+ headerWrapperEl.scrollLeft += offsetLeft
434
+ delayNum -= 4
435
+ internalData.slTimeout = setTimeout(scrollAnimate, delayNum)
436
+ }
437
+ } else {
438
+ if (scrollLeft > 0) {
439
+ headerWrapperEl.scrollLeft -= offsetLeft
440
+ delayNum -= 4
441
+ internalData.slTimeout = setTimeout(scrollAnimate, delayNum)
442
+ }
311
443
  }
312
444
  }
313
445
  updateTabStyle()
@@ -318,9 +450,11 @@ export default defineVxeComponent({
318
450
  }
319
451
 
320
452
  const handleScrollToLeft = (offsetPos: number) => {
453
+ const lrPosition = computeLrPosition.value
321
454
  const headerWrapperEl = refHeadWrapperElem.value
322
455
  if (headerWrapperEl) {
323
- const offsetSize = Math.floor(headerWrapperEl.clientWidth * 0.75)
456
+ const { clientWidth, clientHeight } = headerWrapperEl
457
+ const offsetSize = Math.floor((lrPosition ? clientHeight : clientWidth) * 0.75)
324
458
  startScrollAnimation(offsetPos, offsetSize)
325
459
  }
326
460
  }
@@ -336,24 +470,39 @@ export default defineVxeComponent({
336
470
  const scrollToTab = (name: VxeTabsPropTypes.ModelValue) => {
337
471
  const tabOptions = computeTabOptions.value
338
472
  const tabStaticOptions = computeTabStaticOptions.value
473
+ const lrPosition = computeLrPosition.value
339
474
  return nextTick().then(() => {
340
475
  const headerWrapperEl = refHeadWrapperElem.value
341
476
  if (headerWrapperEl) {
342
477
  const index = XEUtils.findIndexOf(tabStaticOptions.length ? tabStaticOptions : tabOptions, item => item.name === name)
343
478
  if (index > -1) {
344
- const { scrollLeft, clientWidth, children } = headerWrapperEl
479
+ const { scrollLeft, scrollTop, clientWidth, clientHeight, children } = headerWrapperEl
345
480
  const tabEl = children[index] as HTMLDivElement
346
481
  if (tabEl) {
347
- const tabOffsetLeft = tabEl.offsetLeft
348
- const tabClientWidth = tabEl.clientWidth
349
- // 如果右侧被挡
350
- const overSize = (tabOffsetLeft + tabClientWidth) - (scrollLeft + clientWidth)
351
- if (overSize > 0) {
352
- headerWrapperEl.scrollLeft += overSize
353
- }
354
- // 如果左侧被挡,优先
355
- if (tabOffsetLeft < scrollLeft) {
356
- headerWrapperEl.scrollLeft = tabOffsetLeft
482
+ if (lrPosition) {
483
+ const tabOffsetTop = tabEl.offsetTop
484
+ const tabClientHeight = tabEl.clientHeight
485
+ // 如果顶部被挡
486
+ const overSize = (tabOffsetTop + tabClientHeight) - (scrollTop + clientHeight)
487
+ if (overSize > 0) {
488
+ headerWrapperEl.scrollTop += overSize
489
+ }
490
+ // 如果底部被挡,优先
491
+ if (tabOffsetTop < scrollTop) {
492
+ headerWrapperEl.scrollTop = tabOffsetTop
493
+ }
494
+ } else {
495
+ const tabOffsetLeft = tabEl.offsetLeft
496
+ const tabClientWidth = tabEl.clientWidth
497
+ // 如果右侧被挡
498
+ const overSize = (tabOffsetLeft + tabClientWidth) - (scrollLeft + clientWidth)
499
+ if (overSize > 0) {
500
+ headerWrapperEl.scrollLeft += overSize
501
+ }
502
+ // 如果左侧被挡,优先
503
+ if (tabOffsetLeft < scrollLeft) {
504
+ headerWrapperEl.scrollLeft = tabOffsetLeft
505
+ }
357
506
  }
358
507
  }
359
508
  }
@@ -415,33 +564,51 @@ export default defineVxeComponent({
415
564
  Object.assign($xeTabs, tabsMethods, tabsPrivateMethods)
416
565
 
417
566
  const renderTabHeader = (tabList: VxeTabsPropTypes.Options | VxeTabPaneDefines.TabConfig[]) => {
418
- const { type, titleWidth: allTitleWidth, titleAlign: allTitleAlign, showClose, closeConfig, refreshConfig } = props
419
- const { activeName, lintLeft, lintWidth, isTabOver, cacheTabMaps } = reactData
420
- const extraSlot = slots.extra
567
+ const { titleWidth: allTitleWidth, titleAlign: allTitleAlign, showClose, closeConfig, refreshConfig } = props
568
+ const { activeName, scrollbarWidth, isTabOver, cacheTabMaps } = reactData
569
+ const tabType = computeTabType.value
570
+ const tabPosition = computeTabPosition.value
571
+ const lrPosition = computeLrPosition.value
572
+ const lineStyle = computeLineStyle.value
573
+ const prefixSlot = slots.prefix
574
+ const suffixSlot = slots.suffix || slots.extra
421
575
  const closeOpts = computeCloseOpts.value
422
576
  const closeVisibleMethod = closeOpts.visibleMethod
423
577
  const refreshOpts = computeRefreshOpts.value
424
578
  const refreshVisibleMethod = refreshOpts.visibleMethod
425
579
 
426
580
  return h('div', {
427
- class: 'vxe-tabs-header'
581
+ key: 'th',
582
+ class: ['vxe-tabs-header', `type--${tabType}`, `pos--${tabPosition}`]
428
583
  }, [
584
+ prefixSlot
585
+ ? h('div', {
586
+ class: ['vxe-tabs-header--prefix', `type--${tabType}`, `pos--${tabPosition}`]
587
+ }, getSlotVNs(prefixSlot({ name: activeName })))
588
+ : renderEmptyElement($xeTabs),
429
589
  isTabOver
430
590
  ? h('div', {
431
- class: 'vxe-tabs-header--bar vxe-tabs-header--left-bar',
591
+ ref: refHeadPrevElem,
592
+ class: ['vxe-tabs-header--bar vxe-tabs-header--prev-bar', `type--${tabType}`, `pos--${tabPosition}`],
432
593
  onClick: scrollLeftEvent
433
594
  }, [
434
595
  h('span', {
435
- class: getIcon().TABS_TAB_BUTTON_LEFT
596
+ class: lrPosition ? getIcon().TABS_TAB_BUTTON_TOP : getIcon().TABS_TAB_BUTTON_LEFT
436
597
  })
437
598
  ])
438
599
  : renderEmptyElement($xeTabs),
439
600
  h('div', {
440
- class: 'vxe-tabs-header--wrapper'
601
+ class: ['vxe-tabs-header--wrapper', `type--${tabType}`, `pos--${tabPosition}`]
441
602
  }, [
442
603
  h('div', {
443
604
  ref: refHeadWrapperElem,
444
- class: 'vxe-tabs-header--item-wrapper'
605
+ class: 'vxe-tabs-header--item-wrapper',
606
+ style: lrPosition && scrollbarWidth
607
+ ? {
608
+ marginRight: `-${scrollbarWidth}px`
609
+ }
610
+ : undefined,
611
+ onScroll: checkScrolling
445
612
  }, tabList.map((item, index) => {
446
613
  const { title, titleWidth, titleAlign, icon, name, slots } = item
447
614
  const titleSlot = slots ? (slots.title || slots.tab) : null
@@ -453,14 +620,14 @@ export default defineVxeComponent({
453
620
  const isLoading = cacheItem ? cacheItem.loading : false
454
621
  return h('div', {
455
622
  key: `${name}`,
456
- class: ['vxe-tabs-header--item', itemAlign ? `align--${itemAlign}` : '', {
623
+ class: ['vxe-tabs-header--item', `type--${tabType}`, `pos--${tabPosition}`, itemAlign ? `align--${itemAlign}` : '', {
457
624
  'is--active': isActive
458
625
  }],
459
626
  style: itemWidth
460
627
  ? {
461
628
  width: toCssUnit(itemWidth)
462
629
  }
463
- : null,
630
+ : undefined,
464
631
  onClick (evnt: KeyboardEvent) {
465
632
  clickEvent(evnt, item)
466
633
  }
@@ -484,9 +651,11 @@ export default defineVxeComponent({
484
651
  class: 'vxe-tabs-header--item-name'
485
652
  }, titleSlot ? callSlot(titleSlot, { name, title }) : `${title}`)
486
653
  ]),
487
- (isEnableConf(refreshConfig) || refreshOpts.enabled) && (refreshVisibleMethod ? refreshVisibleMethod(params) : isActive)
654
+ (isEnableConf(refreshConfig) || refreshOpts.enabled) && (refreshVisibleMethod ? refreshVisibleMethod(params) : true)
488
655
  ? h('div', {
489
- class: 'vxe-tabs-header--refresh-btn',
656
+ class: ['vxe-tabs-header--refresh-btn', {
657
+ 'is--active': isActive
658
+ }],
490
659
  onClick (evnt: KeyboardEvent) {
491
660
  handleRefreshTabEvent(evnt, item)
492
661
  }
@@ -498,7 +667,9 @@ export default defineVxeComponent({
498
667
  : renderEmptyElement($xeTabs),
499
668
  (showClose || (isEnableConf(closeConfig) || closeOpts.enabled)) && (!closeVisibleMethod || closeVisibleMethod(params))
500
669
  ? h('div', {
501
- class: 'vxe-tabs-header--close-btn',
670
+ class: ['vxe-tabs-header--close-btn', {
671
+ 'is--active': isActive
672
+ }],
502
673
  onClick (evnt: KeyboardEvent) {
503
674
  handleCloseTabEvent(evnt, item, index, tabList)
504
675
  }
@@ -513,28 +684,26 @@ export default defineVxeComponent({
513
684
  }).concat([
514
685
  h('span', {
515
686
  key: 'line',
516
- class: `vxe-tabs-header--active-line type--${type || 'default'}`,
517
- style: {
518
- left: `${lintLeft}px`,
519
- width: `${lintWidth}px`
520
- }
687
+ class: ['vxe-tabs-header--active-line', `type--${tabType}`, `pos--${tabPosition}`],
688
+ style: lineStyle
521
689
  })
522
690
  ]))
523
691
  ]),
524
692
  isTabOver
525
693
  ? h('div', {
526
- class: 'vxe-tabs-header--bar vxe-tabs-header--right-bar',
694
+ ref: refHeadNextElem,
695
+ class: ['vxe-tabs-header--bar vxe-tabs-header--next-bar', `type--${tabType}`, `pos--${tabPosition}`],
527
696
  onClick: scrollRightEvent
528
697
  }, [
529
698
  h('span', {
530
- class: getIcon().TABS_TAB_BUTTON_RIGHT
699
+ class: lrPosition ? getIcon().TABS_TAB_BUTTON_BOTTOM : getIcon().TABS_TAB_BUTTON_RIGHT
531
700
  })
532
701
  ])
533
702
  : renderEmptyElement($xeTabs),
534
- extraSlot
703
+ suffixSlot
535
704
  ? h('div', {
536
- class: 'vxe-tabs-header--extra'
537
- }, getSlotVNs(extraSlot({})))
705
+ class: ['vxe-tabs-header--suffix', `type--${tabType}`, `pos--${tabPosition}`]
706
+ }, getSlotVNs(suffixSlot({ name: activeName })))
538
707
  : renderEmptyElement($xeTabs)
539
708
  ])
540
709
  }
@@ -564,41 +733,81 @@ export default defineVxeComponent({
564
733
  return tabList.map((item) => renderTabPane(item))
565
734
  }
566
735
 
736
+ const rendetTabBody = (tabList: VxeTabsPropTypes.Options | VxeTabPaneDefines.TabConfig[]) => {
737
+ const { height, padding } = props
738
+ const { activeName } = reactData
739
+ const tabType = computeTabType.value
740
+ const tabPosition = computeTabPosition.value
741
+ const topSlot = slots.top
742
+ const footerSlot = slots.footer
743
+ const defParams = { name: activeName }
744
+ return h('div', {
745
+ key: 'tb',
746
+ class: ['vxe-tabs-pane--wrapper', `type--${tabType}`, `pos--${tabPosition}`]
747
+ }, [
748
+ topSlot
749
+ ? h('div', {
750
+ class: 'vxe-tabs-pane--top'
751
+ }, callSlot(topSlot, defParams))
752
+ : renderEmptyElement($xeTabs),
753
+ h('div', {
754
+ class: ['vxe-tabs-pane--body', `type--${tabType}`, `pos--${tabPosition}`, {
755
+ 'is--padding': padding,
756
+ 'is--height': height
757
+ }]
758
+ }, renderTabContent(tabList)),
759
+ footerSlot
760
+ ? h('div', {
761
+ class: 'vxe-tabs-pane--footer'
762
+ }, callSlot(footerSlot, defParams))
763
+ : renderEmptyElement($xeTabs)
764
+ ])
765
+ }
766
+
567
767
  const renderVN = () => {
568
- const { type, height, padding, trigger } = props
768
+ const { height, padding, trigger } = props
769
+ const { activeName } = reactData
569
770
  const tabOptions = computeTabOptions.value
570
771
  const tabStaticOptions = computeTabStaticOptions.value
772
+ const tabType = computeTabType.value
773
+ const tabPosition = computeTabPosition.value
774
+ const wrapperStyle = computeWrapperStyle.value
571
775
  const defaultSlot = slots.default
572
- const footerSlot = slots.footer
573
776
  const tabList = defaultSlot ? tabStaticOptions : tabOptions
574
777
 
778
+ const vns = [
779
+ h('div', {
780
+ key: 'ts',
781
+ class: 'vxe-tabs-slots'
782
+ }, defaultSlot ? defaultSlot({ name: activeName }) : [])
783
+ ]
784
+
785
+ if (tabPosition === 'right' || tabPosition === 'bottom') {
786
+ vns.push(
787
+ rendetTabBody(tabList),
788
+ renderTabHeader(tabList)
789
+ )
790
+ } else {
791
+ vns.push(
792
+ renderTabHeader(tabList),
793
+ rendetTabBody(tabList)
794
+ )
795
+ }
796
+
575
797
  return h('div', {
576
798
  ref: refElem,
577
- class: ['vxe-tabs', `vxe-tabs--${type || 'default'}`, `trigger--${trigger === 'manual' ? 'trigger' : 'default'}`, {
799
+ class: ['vxe-tabs', `pos--${tabPosition}`, `vxe-tabs--${tabType}`, `trigger--${trigger === 'manual' ? 'trigger' : 'default'}`, {
578
800
  'is--padding': padding,
579
801
  'is--height': height
580
802
  }],
581
- style: height
582
- ? {
583
- height: toCssUnit(height)
584
- }
585
- : null
586
- }, [
587
- h('div', {
588
- class: 'vxe-tabs-slots'
589
- }, defaultSlot ? defaultSlot({}) : []),
590
- renderTabHeader(tabList),
591
- h('div', {
592
- class: 'vxe-tabs-pane'
593
- }, renderTabContent(tabList)),
594
- footerSlot
595
- ? h('div', {
596
- class: 'vxe-tabs-footer'
597
- }, callSlot(footerSlot, {}))
598
- : renderEmptyElement($xeTabs)
599
- ])
803
+ style: wrapperStyle
804
+ }, vns)
600
805
  }
601
806
 
807
+ watch(() => props.position, () => {
808
+ updateTabStyle()
809
+ })
810
+
602
811
  watch(() => props.modelValue, (val) => {
603
812
  addInitName(val, null)
604
813
  reactData.activeName = val
@@ -559,6 +559,8 @@ setIcon({
559
559
  TABLE_SELECT_CLOSE: iconPrefix + 'caret-down',
560
560
 
561
561
  // tabs
562
+ TABS_TAB_BUTTON_TOP: iconPrefix + 'arrow-up',
563
+ TABS_TAB_BUTTON_BOTTOM: iconPrefix + 'arrow-down',
562
564
  TABS_TAB_BUTTON_LEFT: iconPrefix + 'arrow-left',
563
565
  TABS_TAB_BUTTON_RIGHT: iconPrefix + 'arrow-right',
564
566
  TABS_TAB_CLOSE: iconPrefix + 'close',