|
@@ -1,28 +1,73 @@
|
|
|
<script setup lang="ts">
|
|
|
-import { inject, ref } from 'vue'
|
|
|
-import TagView from './TagView.vue'
|
|
|
-import type { Ref } from 'vue'
|
|
|
+import { type PropType, ref, useSlots } from 'vue'
|
|
|
+import ShowTag from './showTag.vue'
|
|
|
|
|
|
-const __sdk: any = inject('__sdk')
|
|
|
+const props = defineProps({
|
|
|
+ tag: {
|
|
|
+ type: Object as PropType<TagContent>,
|
|
|
+ required: true,
|
|
|
+ },
|
|
|
+})
|
|
|
+const slots = useSlots()
|
|
|
|
|
|
-const tags: Ref<Array<any>> = ref([])
|
|
|
+const emit = defineEmits(['click', 'mouseEnter', 'mouseLeave'])
|
|
|
|
|
|
-__sdk.TagManager.on('loaded', (data: any) => __sdk.TagManager.load((tags.value = data) && tags.value))
|
|
|
+const isShow = ref<boolean>(false)
|
|
|
+const isClick = ref<boolean>(false)
|
|
|
+const handleMouseEnter = (event: MouseEvent, tag: any, index?: number | undefined) => {
|
|
|
+ // console.log('in', event)
|
|
|
+ isShow.value = true
|
|
|
+ emit('mouseEnter', { ...event, ...tag })
|
|
|
+}
|
|
|
+const handleMouseLeave = (event: MouseEvent, tag: any, index?: number | undefined) => {
|
|
|
+ // console.log('out', event)
|
|
|
+ isShow.value = false
|
|
|
+ emit('mouseLeave', { ...event, ...tag })
|
|
|
+ // isClick.value = false
|
|
|
+}
|
|
|
|
|
|
-const handleTagview = (data: any) => {
|
|
|
- console.log('tag', data)
|
|
|
+const handleTagClick = (tagId: string) => {
|
|
|
+ isClick.value = !isClick.value
|
|
|
+ emit('click', {
|
|
|
+ id: tagId,
|
|
|
+ isClick: isClick.value,
|
|
|
+ })
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
- <Teleport v-if="tags.length" to=".kankan-plugins">
|
|
|
- <div xui_tags_view>
|
|
|
- <TagView v-for="(item, index) in tags" :key="index" :tag="item" @click="handleTagview" />
|
|
|
- </div>
|
|
|
- </Teleport>
|
|
|
+ <div
|
|
|
+ :data-tag-id="tag.sid"
|
|
|
+ :style="{ transform: `translate(${props.tag.x}px,${props.tag.y}px)`, display: props.tag.visible ? 'block' : 'none' }"
|
|
|
+ @mouseleave.prevent="handleMouseLeave($event, tag)"
|
|
|
+ >
|
|
|
+ <slot v-if="slots.content" :id="tag.sid" name="content" :data="tag" :is-click="isClick" :visible="tag.visible" :is-show="isShow" :x="tag.x" :y="tag.y" />
|
|
|
+ <template v-else>
|
|
|
+ <span
|
|
|
+ class="tag-icon animate"
|
|
|
+ style="background-image: url(http://4dkk.4dage.com/v4/sdk/4.2.2/images/tag_icon_default.svg)"
|
|
|
+ @click="handleTagClick(tag.sid)"
|
|
|
+ @mouseenter.prevent="handleMouseEnter($event, tag)"
|
|
|
+ />
|
|
|
+
|
|
|
+ <div class="content">
|
|
|
+ <div class="trans" :class="{ active: isShow || isClick }">
|
|
|
+ <template v-if="isShow || isClick">
|
|
|
+ <div :id="`arrow_${tag.sid}`" class="arrow" />
|
|
|
+ <ShowTag :id="tag.sid" :title="tag.title" :type="tag.type" :content="tag.content" :media="tag.media" />
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<style scoped>
|
|
|
+/* div {
|
|
|
+ position: absolute;
|
|
|
+} */
|
|
|
+</style>
|
|
|
+<style>
|
|
|
[xui_tags_view] {
|
|
|
position: absolute;
|
|
|
width: 100%;
|
|
@@ -72,4 +117,36 @@ const handleTagview = (data: any) => {
|
|
|
transform: scale(1);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+[xui_tags_view] .content .trans {
|
|
|
+ padding: 0 40px 0 0;
|
|
|
+ position: absolute;
|
|
|
+ right: 35px;
|
|
|
+ top: 50%;
|
|
|
+ min-width: 420px;
|
|
|
+ min-height: 60px;
|
|
|
+ z-index: 1000;
|
|
|
+ transform: translateY(-50%) scale(0);
|
|
|
+ transform-origin: center right;
|
|
|
+ transition: all 0.3s cubic-bezier(0.35, 0.32, 0.65, 0.63);
|
|
|
+ pointer-events: none;
|
|
|
+ /* background-color: rgba(0, 0, 0, 0.8); */
|
|
|
+}
|
|
|
+
|
|
|
+[xui_tags_view] .content .trans .arrow {
|
|
|
+ pointer-events: auto;
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ right: 0;
|
|
|
+ width: 0;
|
|
|
+ height: 0;
|
|
|
+ border-top: 15px solid transparent;
|
|
|
+ border-bottom: 15px solid transparent;
|
|
|
+ border-left: 40px solid rgba(27, 27, 28, 0.8);
|
|
|
+ transform: translateY(-50%);
|
|
|
+}
|
|
|
+[xui_tags_view] .content .trans.active {
|
|
|
+ transform: translateY(-50%) scale(1);
|
|
|
+}
|
|
|
</style>
|