diff --git a/docs/components/content/examples/TooltipExampleArrow.vue b/docs/components/content/examples/TooltipExampleArrow.vue new file mode 100644 index 00000000..16b56205 --- /dev/null +++ b/docs/components/content/examples/TooltipExampleArrow.vue @@ -0,0 +1,5 @@ + diff --git a/docs/components/content/examples/TooltipExampleOffset.vue b/docs/components/content/examples/TooltipExampleOffset.vue new file mode 100644 index 00000000..c48d1f8c --- /dev/null +++ b/docs/components/content/examples/TooltipExampleOffset.vue @@ -0,0 +1,5 @@ + diff --git a/docs/components/content/examples/TooltipExamplePlacement.vue b/docs/components/content/examples/TooltipExamplePlacement.vue new file mode 100644 index 00000000..2723c071 --- /dev/null +++ b/docs/components/content/examples/TooltipExamplePlacement.vue @@ -0,0 +1,5 @@ + diff --git a/docs/content/6.overlays/4.tooltip.md b/docs/content/6.overlays/4.tooltip.md index 74c4d291..511627f7 100644 --- a/docs/content/6.overlays/4.tooltip.md +++ b/docs/content/6.overlays/4.tooltip.md @@ -10,6 +10,22 @@ links: :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 ### `text` diff --git a/src/runtime/components/overlays/Tooltip.vue b/src/runtime/components/overlays/Tooltip.vue index bda34efc..d915362e 100644 --- a/src/runtime/components/overlays/Tooltip.vue +++ b/src/runtime/components/overlays/Tooltip.vue @@ -6,17 +6,21 @@
-
- - {{ text }} - +
+
- - · - - {{ shortcut }} - - +
+ + {{ text }} + + + + · + + {{ shortcut }} + + +
@@ -127,6 +131,8 @@ export default defineComponent({ // eslint-disable-next-line vue/no-dupe-keys ui, attrs, + // eslint-disable-next-line vue/no-dupe-keys + popper, trigger, container, open, diff --git a/src/runtime/composables/usePopper.ts b/src/runtime/composables/usePopper.ts index ffc2f174..04ae43b5 100644 --- a/src/runtime/composables/usePopper.ts +++ b/src/runtime/composables/usePopper.ts @@ -8,12 +8,13 @@ import offset from '@popperjs/core/lib/modifiers/offset' import preventOverflow from '@popperjs/core/lib/modifiers/preventOverflow' import computeStyles from '@popperjs/core/lib/modifiers/computeStyles' import eventListeners from '@popperjs/core/lib/modifiers/eventListeners' +import arrowModifier from '@popperjs/core/lib/modifiers/arrow' import { unrefElement } from '@vueuse/core' import type { MaybeElement } from '@vueuse/core' import type { PopperOptions } from '../types/popper' export const createPopper = popperGenerator({ - defaultModifiers: [...defaultModifiers, offset, flip, preventOverflow, computeStyles, eventListeners] + defaultModifiers: [...defaultModifiers, offset, flip, preventOverflow, computeStyles, eventListeners, arrowModifier] }) export function usePopper ({ @@ -25,6 +26,7 @@ export function usePopper ({ adaptive = true, scroll = true, resize = true, + arrow = false, placement, strategy }: PopperOptions, virtualReference?: Ref) { @@ -75,6 +77,10 @@ export function usePopper ({ scroll, resize } + }, + { + name: 'arrow', + enabled: arrow } ] } diff --git a/src/runtime/types/popper.d.ts b/src/runtime/types/popper.d.ts index 138b0af2..260e6d3d 100644 --- a/src/runtime/types/popper.d.ts +++ b/src/runtime/types/popper.d.ts @@ -11,4 +11,5 @@ export interface PopperOptions { adaptive?: boolean scroll?: boolean resize?: boolean + arrow?: boolean } diff --git a/src/runtime/ui.config.ts b/src/runtime/ui.config.ts index 0d311562..1af8d5b2 100644 --- a/src/runtime/ui.config.ts +++ b/src/runtime/ui.config.ts @@ -988,14 +988,14 @@ export const slideover = { export const tooltip = { wrapper: 'relative inline-flex', - container: 'z-20', + container: 'z-20 group', width: 'max-w-xs', background: 'bg-white dark:bg-gray-900', color: 'text-gray-900 dark:text-white', shadow: 'shadow', rounded: 'rounded', 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', // Syntax for `` component https://vuejs.org/guide/built-ins/transition.html#css-based-transitions transition: { @@ -1008,6 +1008,14 @@ export const tooltip = { }, popper: { 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' } }