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'
}
}