mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-02-02 13:17:57 +01:00
feat(Tooltip): adding option to show popper arrow (#868)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
This commit is contained in:
5
docs/components/content/examples/TooltipExampleArrow.vue
Normal file
5
docs/components/content/examples/TooltipExampleArrow.vue
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<template>
|
||||||
|
<UTooltip text="Tooltip example" :shortcuts="['⌘', 'O']" :popper="{ arrow: true }">
|
||||||
|
<UButton color="gray" label="Hover me" />
|
||||||
|
</UTooltip>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<template>
|
||||||
|
<UTooltip text="Tooltip example" :shortcuts="['⌘', 'O']" :popper="{ offsetDistance: 16 }">
|
||||||
|
<UButton color="gray" label="Hover me" />
|
||||||
|
</UTooltip>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<template>
|
||||||
|
<UTooltip text="Tooltip example" :shortcuts="['⌘', 'O']" :popper="{ placement: 'right' }">
|
||||||
|
<UButton color="gray" label="Hover me" />
|
||||||
|
</UTooltip>
|
||||||
|
</template>
|
||||||
@@ -10,6 +10,22 @@ links:
|
|||||||
|
|
||||||
:component-example{component="tooltip-example"}
|
:component-example{component="tooltip-example"}
|
||||||
|
|
||||||
|
## Popper
|
||||||
|
|
||||||
|
Use the `popper` prop to customize the tootip.
|
||||||
|
|
||||||
|
### Arrow
|
||||||
|
|
||||||
|
:component-example{component="tooltip-example-arrow"}
|
||||||
|
|
||||||
|
### Placement
|
||||||
|
|
||||||
|
:component-example{component="tooltip-example-placement"}
|
||||||
|
|
||||||
|
### Offset
|
||||||
|
|
||||||
|
:component-example{component="tooltip-example-offset"}
|
||||||
|
|
||||||
## Slots
|
## Slots
|
||||||
|
|
||||||
### `text`
|
### `text`
|
||||||
|
|||||||
@@ -6,17 +6,21 @@
|
|||||||
|
|
||||||
<div v-if="open && !prevent" ref="container" :class="[ui.container, ui.width]">
|
<div v-if="open && !prevent" ref="container" :class="[ui.container, ui.width]">
|
||||||
<Transition appear v-bind="ui.transition">
|
<Transition appear v-bind="ui.transition">
|
||||||
<div :class="[ui.base, ui.background, ui.color, ui.rounded, ui.shadow, ui.ring]">
|
<div>
|
||||||
<slot name="text">
|
<div v-if="popper.arrow" data-popper-arrow :class="['invisible before:visible before:block before:rotate-45 before:z-[-1]', Object.values(ui.arrow)]" />
|
||||||
{{ text }}
|
|
||||||
</slot>
|
|
||||||
|
|
||||||
<span v-if="shortcuts?.length" :class="ui.shortcuts">
|
<div :class="[ui.base, ui.background, ui.color, ui.rounded, ui.shadow, ui.ring]">
|
||||||
<span class="mx-1 text-gray-700 dark:text-gray-200">·</span>
|
<slot name="text">
|
||||||
<UKbd v-for="shortcut of shortcuts" :key="shortcut" size="xs">
|
{{ text }}
|
||||||
{{ shortcut }}
|
</slot>
|
||||||
</Ukbd>
|
|
||||||
</span>
|
<span v-if="shortcuts?.length" :class="ui.shortcuts">
|
||||||
|
<span class="mx-1 text-gray-700 dark:text-gray-200">·</span>
|
||||||
|
<UKbd v-for="shortcut of shortcuts" :key="shortcut" size="xs">
|
||||||
|
{{ shortcut }}
|
||||||
|
</Ukbd>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Transition>
|
</Transition>
|
||||||
</div>
|
</div>
|
||||||
@@ -127,6 +131,8 @@ export default defineComponent({
|
|||||||
// eslint-disable-next-line vue/no-dupe-keys
|
// eslint-disable-next-line vue/no-dupe-keys
|
||||||
ui,
|
ui,
|
||||||
attrs,
|
attrs,
|
||||||
|
// eslint-disable-next-line vue/no-dupe-keys
|
||||||
|
popper,
|
||||||
trigger,
|
trigger,
|
||||||
container,
|
container,
|
||||||
open,
|
open,
|
||||||
|
|||||||
@@ -8,12 +8,13 @@ import offset from '@popperjs/core/lib/modifiers/offset'
|
|||||||
import preventOverflow from '@popperjs/core/lib/modifiers/preventOverflow'
|
import preventOverflow from '@popperjs/core/lib/modifiers/preventOverflow'
|
||||||
import computeStyles from '@popperjs/core/lib/modifiers/computeStyles'
|
import computeStyles from '@popperjs/core/lib/modifiers/computeStyles'
|
||||||
import eventListeners from '@popperjs/core/lib/modifiers/eventListeners'
|
import eventListeners from '@popperjs/core/lib/modifiers/eventListeners'
|
||||||
|
import arrowModifier from '@popperjs/core/lib/modifiers/arrow'
|
||||||
import { unrefElement } from '@vueuse/core'
|
import { unrefElement } from '@vueuse/core'
|
||||||
import type { MaybeElement } from '@vueuse/core'
|
import type { MaybeElement } from '@vueuse/core'
|
||||||
import type { PopperOptions } from '../types/popper'
|
import type { PopperOptions } from '../types/popper'
|
||||||
|
|
||||||
export const createPopper = popperGenerator({
|
export const createPopper = popperGenerator({
|
||||||
defaultModifiers: [...defaultModifiers, offset, flip, preventOverflow, computeStyles, eventListeners]
|
defaultModifiers: [...defaultModifiers, offset, flip, preventOverflow, computeStyles, eventListeners, arrowModifier]
|
||||||
})
|
})
|
||||||
|
|
||||||
export function usePopper ({
|
export function usePopper ({
|
||||||
@@ -25,6 +26,7 @@ export function usePopper ({
|
|||||||
adaptive = true,
|
adaptive = true,
|
||||||
scroll = true,
|
scroll = true,
|
||||||
resize = true,
|
resize = true,
|
||||||
|
arrow = false,
|
||||||
placement,
|
placement,
|
||||||
strategy
|
strategy
|
||||||
}: PopperOptions, virtualReference?: Ref<Element | VirtualElement>) {
|
}: PopperOptions, virtualReference?: Ref<Element | VirtualElement>) {
|
||||||
@@ -75,6 +77,10 @@ export function usePopper ({
|
|||||||
scroll,
|
scroll,
|
||||||
resize
|
resize
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'arrow',
|
||||||
|
enabled: arrow
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
1
src/runtime/types/popper.d.ts
vendored
1
src/runtime/types/popper.d.ts
vendored
@@ -11,4 +11,5 @@ export interface PopperOptions {
|
|||||||
adaptive?: boolean
|
adaptive?: boolean
|
||||||
scroll?: boolean
|
scroll?: boolean
|
||||||
resize?: boolean
|
resize?: boolean
|
||||||
|
arrow?: boolean
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -988,14 +988,14 @@ export const slideover = {
|
|||||||
|
|
||||||
export const tooltip = {
|
export const tooltip = {
|
||||||
wrapper: 'relative inline-flex',
|
wrapper: 'relative inline-flex',
|
||||||
container: 'z-20',
|
container: 'z-20 group',
|
||||||
width: 'max-w-xs',
|
width: 'max-w-xs',
|
||||||
background: 'bg-white dark:bg-gray-900',
|
background: 'bg-white dark:bg-gray-900',
|
||||||
color: 'text-gray-900 dark:text-white',
|
color: 'text-gray-900 dark:text-white',
|
||||||
shadow: 'shadow',
|
shadow: 'shadow',
|
||||||
rounded: 'rounded',
|
rounded: 'rounded',
|
||||||
ring: 'ring-1 ring-gray-200 dark:ring-gray-800',
|
ring: 'ring-1 ring-gray-200 dark:ring-gray-800',
|
||||||
base: '[@media(pointer:coarse)]:hidden h-6 px-2 py-1 text-xs font-normal truncate',
|
base: '[@media(pointer:coarse)]:hidden h-6 px-2 py-1 text-xs font-normal truncate relative',
|
||||||
shortcuts: 'hidden md:inline-flex flex-shrink-0 gap-0.5',
|
shortcuts: 'hidden md:inline-flex flex-shrink-0 gap-0.5',
|
||||||
// Syntax for `<Transition>` component https://vuejs.org/guide/built-ins/transition.html#css-based-transitions
|
// Syntax for `<Transition>` component https://vuejs.org/guide/built-ins/transition.html#css-based-transitions
|
||||||
transition: {
|
transition: {
|
||||||
@@ -1008,6 +1008,14 @@ export const tooltip = {
|
|||||||
},
|
},
|
||||||
popper: {
|
popper: {
|
||||||
strategy: 'fixed'
|
strategy: 'fixed'
|
||||||
|
},
|
||||||
|
arrow: {
|
||||||
|
base: 'before:w-2 before:h-2',
|
||||||
|
ring: 'before:ring-1 before:ring-gray-200 dark:before:ring-gray-800',
|
||||||
|
rounded: 'before:rounded-sm',
|
||||||
|
background: 'before:bg-white dark:before:bg-gray-900',
|
||||||
|
shadow: 'before:shadow',
|
||||||
|
placement: 'group-data-[popper-placement=right]:-left-1 group-data-[popper-placement=left]:-right-1 group-data-[popper-placement=top]:-bottom-1 group-data-[popper-placement=bottom]:-top-1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user