mirror of
https://github.com/hpware/news-analyze.git
synced 2025-06-23 21:14:23 +00:00
59 lines
1.5 KiB
Vue
59 lines
1.5 KiB
Vue
<script setup lang="ts">
|
|
import { useThrottleFn } from "@vueuse/core";
|
|
|
|
const props = defineProps<{
|
|
title: string;
|
|
}>();
|
|
|
|
const emit = defineEmits(["close"]);
|
|
const title = computed(() => props.title || "Popup Window");
|
|
|
|
const dragging = ref(false);
|
|
const position = ref({
|
|
x: Math.floor(window.innerWidth / 2 - parseInt(props.width || "400") / 2),
|
|
y: Math.floor(window.innerHeight / 2 - parseInt(props.height || "200") / 2),
|
|
});
|
|
|
|
const offset = ref({ x: 0, y: 0 });
|
|
|
|
const doDrag = useThrottleFn((e: MouseEvent) => {
|
|
if (!dragging.value) return;
|
|
requestAnimationFrame(() => {
|
|
position.value = {
|
|
x: Math.max(
|
|
0,
|
|
Math.min(window.innerWidth - 400, e.clientX - offset.value.x),
|
|
),
|
|
y: Math.max(
|
|
0,
|
|
Math.min(window.innerHeight - 300, e.clientY - offset.value.y),
|
|
),
|
|
};
|
|
});
|
|
}, 16);
|
|
|
|
const startDrag = (e: MouseEvent) => {
|
|
dragging.value = true;
|
|
offset.value = {
|
|
x: e.clientX - position.value.x,
|
|
y: e.clientY - position.value.y,
|
|
};
|
|
document.addEventListener("mousemove", doDrag);
|
|
document.addEventListener("mouseup", stopDrag);
|
|
};
|
|
|
|
const stopDrag = () => {
|
|
dragging.value = false;
|
|
document.removeEventListener("mousemove", doDrag);
|
|
document.removeEventListener("mouseup", stopDrag);
|
|
};
|
|
</script>
|
|
<template>
|
|
<div class="flex flex-col rounded-xl gray-500/80 backdrop-blur-sm">
|
|
<div
|
|
class="flex flex-row absolute inset-x-0 top-0 h-8 bg-gray-600/80"
|
|
></div>
|
|
<div class="">Yo a popup!</div>
|
|
<button @click="">OK!</button>
|
|
</div>
|
|
</template>
|