diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/c-tooltip/c-tooltip.demo.vue | 18 | ||||
-rw-r--r-- | src/ui/c-tooltip/c-tooltip.vue | 15 |
2 files changed, 29 insertions, 4 deletions
diff --git a/src/ui/c-tooltip/c-tooltip.demo.vue b/src/ui/c-tooltip/c-tooltip.demo.vue index d385257..edd1364 100644 --- a/src/ui/c-tooltip/c-tooltip.demo.vue +++ b/src/ui/c-tooltip/c-tooltip.demo.vue @@ -1,3 +1,7 @@ +<script lang="ts" setup> +const positions = ['top', 'bottom', 'left', 'right'] as const; +</script> + <template> <div> <c-tooltip> @@ -14,4 +18,18 @@ Hover me </c-tooltip> </div> + + <div mt-5> + <h2>Tooltip positions</h2> + + <div class="flex flex-wrap gap-4"> + <div v-for="position in positions" :key="position"> + <c-tooltip :position="position" :tooltip="`Tooltip ${position}`"> + <c-button> + {{ position }} + </c-button> + </c-tooltip> + </div> + </div> + </div> </template> diff --git a/src/ui/c-tooltip/c-tooltip.vue b/src/ui/c-tooltip/c-tooltip.vue index 095315f..0f47e71 100644 --- a/src/ui/c-tooltip/c-tooltip.vue +++ b/src/ui/c-tooltip/c-tooltip.vue @@ -1,23 +1,30 @@ <script setup lang="ts"> -const props = withDefaults(defineProps<{ tooltip?: string }>(), { tooltip: '' }); -const { tooltip } = toRefs(props); +const props = withDefaults(defineProps<{ tooltip?: string; position?: 'top' | 'bottom' | 'left' | 'right' }>(), { + tooltip: undefined, + position: 'top', +}); +const { tooltip, position } = toRefs(props); const targetRef = ref(); const isTargetHovered = useElementHover(targetRef); </script> <template> - <div class="relative" inline-block> + <div relative inline-block> <div ref="targetRef"> <slot /> </div> <div v-if="tooltip || $slots.tooltip" - class="absolute bottom-100% left-50% z-10 mb-5px whitespace-nowrap rounded bg-black px-12px py-6px text-sm text-white shadow-lg transition transition transition-duration-0.2s -translate-x-1/2" + class="absolute z-10 whitespace-nowrap rounded bg-black px-12px py-6px text-sm text-white shadow-lg transition transition transition-duration-0.2s" :class="{ 'op-0 scale-0': isTargetHovered === false, 'op-100 scale-100': isTargetHovered, + 'bottom-100% left-50% -translate-x-1/2 mb-5px': position === 'top', + 'top-100% left-50% -translate-x-1/2 mt-5px': position === 'bottom', + 'right-100% top-50% -translate-y-1/2 mr-5px': position === 'left', + 'left-100% top-50% -translate-y-1/2 ml-5px': position === 'right', }" > <slot |