vue-data-ui
Version:
A user-empowering data visualization Vue 3 components library for eloquent data storytelling
2 lines (1 loc) • 2.64 kB
JavaScript
const t=require("vue"),p=require("./index-_gyicZFE.cjs");function y({tooltip:e,chart:l,clientPosition:o,positionPreference:u="center",defaultOffsetY:a=24,blockShiftY:f=!1}){const n=t.ref(0),s=t.ref(a);if(e&&l){const{width:r,height:c}=e.getBoundingClientRect(),{right:i,left:d,bottom:v}=l.getBoundingClientRect();u==="center"&&(o.x+r/2>i?n.value=-r+(i-o.x):o.x-r/2<d?n.value=-r+(r-(o.x-d)):n.value=-r/2),u==="right"&&(o.x+r>i?n.value=-r+(i-o.x):n.value=0),u==="left"&&(o.x<d+r?n.value=-r+(r-(o.x-d)):n.value=-r),o.y+c>v&&!f&&(s.value=-c-a)}return{top:o.y+s.value,left:o.x+n.value}}function b(e,l,o){t.onMounted(()=>e.addEventListener(l,o)),t.onUnmounted(()=>e.removeEventListener(l,o))}function m(){const e=t.ref(0),l=t.ref(0);return b(window,"mousemove",o=>{e.value=o.clientX,l.value=o.clientY}),{x:e,y:l}}const h=["aria-hidden"],g=["innerHTML"],x={__name:"Tooltip",props:{backgroundColor:{type:String,default:"#FFFFFF"},color:{type:String,default:"#000000"},content:String,maxWidth:{type:String,default:"300px"},parent:{type:Object},show:{type:Boolean,default:!1},isCustom:{type:Boolean,default:!1},fontSize:{type:[Number,String],default:14},borderRadius:{type:Number,default:4},borderColor:{type:String,default:"#e1e5e8"},borderWidth:{type:Number,default:1},backgroundOpacity:{type:Number,default:100},position:{type:String,default:"center"},offsetY:{type:Number,default:24},blockShiftY:{type:Boolean,default:!1},isFullscreen:{type:Boolean,default:!1}},setup(e){const l=e,o=t.ref(null),u=t.ref(m(l.parent)),a=t.computed(()=>y({tooltip:o.value,chart:l.parent,clientPosition:u.value,positionPreference:l.position,defaultOffsetY:l.offsetY,blockShiftY:l.blockShiftY})),f=t.computed(()=>p.setOpacity(l.backgroundColor,l.backgroundOpacity));return(n,s)=>(t.openBlock(),t.createBlock(t.Teleport,{to:e.isFullscreen?e.parent:"body"},[e.show?(t.openBlock(),t.createElementBlock("div",{key:0,ref_key:"tooltip",ref:o,role:"tooltip","aria-hidden":!e.show,"aria-live":"polite",class:t.normalizeClass({"vue-data-ui-custom-tooltip":e.isCustom,"vue-data-ui-tooltip":!e.isCustom}),style:t.normalizeStyle(`pointer-events:none;top:${a.value.top}px;left:${a.value.left}px;${e.isCustom?"":`background:${f.value};color:${e.color};max-width:${e.maxWidth};font-size:${e.fontSize}px`};border-radius:${e.borderRadius}px;border:${e.borderWidth}px solid ${e.borderColor};z-index:2147483647;`)},[t.renderSlot(n.$slots,"tooltip-before"),t.renderSlot(n.$slots,"default"),t.createElementVNode("div",{innerHTML:e.content},null,8,g),t.renderSlot(n.$slots,"tooltip-after")],14,h)):t.createCommentVNode("",!0)],8,["to"]))}};exports._sfc_main=x;exports.useMouse=m;
;