summaryrefslogtreecommitdiff
path: root/packages/client/src/components/ui/tooltip.vue
diff options
context:
space:
mode:
Diffstat (limited to 'packages/client/src/components/ui/tooltip.vue')
-rw-r--r--packages/client/src/components/ui/tooltip.vue92
1 files changed, 92 insertions, 0 deletions
diff --git a/packages/client/src/components/ui/tooltip.vue b/packages/client/src/components/ui/tooltip.vue
new file mode 100644
index 0000000000..c003895c14
--- /dev/null
+++ b/packages/client/src/components/ui/tooltip.vue
@@ -0,0 +1,92 @@
+<template>
+<transition name="tooltip" appear @after-leave="$emit('closed')">
+ <div class="buebdbiu _acrylic _shadow" v-show="showing" ref="content" :style="{ maxWidth: maxWidth + 'px' }">
+ <slot>{{ text }}</slot>
+ </div>
+</transition>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+
+export default defineComponent({
+ props: {
+ showing: {
+ type: Boolean,
+ required: true,
+ },
+ source: {
+ required: true,
+ },
+ text: {
+ type: String,
+ required: false
+ },
+ maxWidth: {
+ type: Number,
+ required: false,
+ default: 250,
+ },
+ },
+
+ emits: ['closed'],
+
+ mounted() {
+ this.$nextTick(() => {
+ if (this.source == null) {
+ this.$emit('closed');
+ return;
+ }
+
+ const rect = this.source.getBoundingClientRect();
+
+ const contentWidth = this.$refs.content.offsetWidth;
+ const contentHeight = this.$refs.content.offsetHeight;
+
+ let left = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
+ let top = rect.top + window.pageYOffset - contentHeight;
+
+ left -= (this.$el.offsetWidth / 2);
+
+ if (left + contentWidth - window.pageXOffset > window.innerWidth) {
+ left = window.innerWidth - contentWidth + window.pageXOffset - 1;
+ }
+
+ if (top - window.pageYOffset < 0) {
+ top = rect.top + window.pageYOffset + this.source.offsetHeight;
+ this.$refs.content.style.transformOrigin = 'center top';
+ }
+
+ this.$el.style.left = left + 'px';
+ this.$el.style.top = top + 'px';
+ });
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+.tooltip-enter-active,
+.tooltip-leave-active {
+ opacity: 1;
+ transform: scale(1);
+ transition: transform 200ms cubic-bezier(0.23, 1, 0.32, 1), opacity 200ms cubic-bezier(0.23, 1, 0.32, 1);
+}
+.tooltip-enter-from,
+.tooltip-leave-active {
+ opacity: 0;
+ transform: scale(0.75);
+}
+
+.buebdbiu {
+ position: absolute;
+ z-index: 11000;
+ font-size: 0.8em;
+ padding: 8px 12px;
+ box-sizing: border-box;
+ text-align: center;
+ border-radius: 4px;
+ border: solid 0.5px var(--divider);
+ pointer-events: none;
+ transform-origin: center bottom;
+}
+</style>