|
- import { watchEffect, watch, onMounted, type CSSProperties, defineComponent, ref } from "vue";
-
- const carrierStyle = {
- opacity: "0",
- display: "block",
- pointerEvents: "none",
- backgroundColor: "black",
- border: "white solid 1px",
- color: "white",
- padding: "10px",
- position: "absolute",
- zIndex: "1",
- overflow: "hidden",
- height: "0",
- width: "0",
- transition: "opacity 200ms, height 200ms, width 200ms",
- } satisfies CSSProperties;
-
- const textCarrierStyle = {
- fontSize: '16px',
- fontFamily: "Roboto, serif",
- display: "block",
- overflow: "hidden",
- } satisfies CSSProperties;
-
- const defaultWidth = 350;
-
- export default defineComponent({
- name: "dj-sexy-tooltip",
- props: {
- tooltip: {
- type: String,
- required: true,
- },
- },
- setup(props, { slots, attrs }) {
- const active = ref(false);
-
- const carrier = ref<HTMLElement | null>(null);
- const textCarrier = ref<HTMLElement | null>(null);
-
- onMounted(() => {
- document.addEventListener("mousemove", (event) => {
- const pos = { x: event.pageX, y: event.pageY };
- if (carrier.value && getComputedStyle(carrier.value).opacity !== "0") {
- if (pos.x + 15 + carrier.value.clientWidth <= document.body.scrollWidth) {
- carrier.value.style.left = (pos.x + 15) + "px";
- } else {
- carrier.value.style.left = (document.body.scrollWidth - carrier.value.clientWidth - 5) + "px";
- }
- if (pos.y + carrier.value.clientHeight <= document.body.scrollHeight) {
- carrier.value.style.top = pos.y + "px";
- } else {
- carrier.value.style.top = (document.body.scrollHeight - carrier.value.clientHeight - 5) + "px";
- }
- }
- });
- });
-
- watchEffect(() => {
- if (carrier.value) {
- carrier.value.style.height = active.value ? '16px' : '0';
- carrier.value.style.opacity = active.value ? '1' : '0';
- carrier.value.style.width = active.value ? '350px' : '0';
- }
- });
-
- return () => <>
- <div class="tooltip-container" {...attrs}
- onMouseenter={() => { active.value = true; }}
- onMouseleave={() => { active.value = false; }}
- >
- {slots.default && <slots.default />}
- </div>
- <div style={carrierStyle} ref={carrier}>
- <span style={textCarrierStyle}>{props.tooltip}</span>
- </div>
- </>;
- },
- });
|