Popover
Rich content tooltip
Usage
Simple Usage
preview
vue
<template>
<p-popover>
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Remove?
</a>
</template>
<template #default="{ hide }">
<div class="space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
</template>
Async Usage
preview
vue
<template>
<p-popover v-bind="popoverPromise.bind()">
<template #activator>
<a href="javascript:void" @click.prevent="confirmDelete()">
Remove?
</a>
</template>
<template #default>
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="popoverPromise.finish(true)">
Yes
</p-button>
<p-button color="danger" size="xs" @click="popoverPromise.finish(false)">
Cancel
</p-button>
</div>
</template>
</p-popover>
</template>
<script lang="ts" setup>
import { dialog, usePopoverPromise } from '@privyid/persona/core'
const popoverPromise = usePopoverPromise<boolean>()
async function confirmDelete () {
const result = await popoverPromise.start()
if (result === true) {
dialog.alert({
title: 'Info',
text : 'Deleted',
})
}
}
</script>
Color
You can change popover color using props color
, valid value is white
and black
, default is white
Placement
You can change popup placement via placement
prop. Valid options is:
top
bottom
right
left
vue
<template>
<p-popover placement="top">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Top
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
<p-popover placement="bottom">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Bottom
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
<p-popover placement="left">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Left
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
<p-popover placement="right">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Right
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
</template>
Placement Align
You can combine placement with suffix *-start
and *-end
to set popup position align
vue
<template>
<p-popover placement="bottom">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Bottom
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
<p-popover placement="bottom-start">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Bottom Start
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
<p-popover placement="bottom-end">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Bottom End
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
</template>
Binding v-model
You can programmatically toggle popover using v-model
preview
vue
<template>
<p-checkbox v-model="show">Show Popover</p-checkbox>
<p-popover placement="bottom" v-model="show">
<template #activator="{ show }">
<a href="javascript:void" @click.prevent="show">
Popover
</a>
</template>
<template #default="{ hide }">
<div class="flex items-center space-x-2">
<span>Are you sure?</span>
<p-button color="success" size="xs" @click="hide">
Yes
</p-button>
<p-button color="danger" size="xs" @click="hide">
Cancel
</p-button>
</div>
</template>
</p-popover>
</template>
API
Props
Props | Type | Default | Description |
---|---|---|---|
color | String | primary | Popover color variant, valid value is white , black |
disabled | Boolean | false | Disable state |
placement | String | top | Popover placement, valid value is top , top-start , top-end ,bottom , bottom-start , bottom-end ,right , right-start , right-end ,left , left-start , left-end |
modelValue | Boolean | false | v-model value for show and hide |
Slots
Name | Description |
---|---|
default | Popover menu content |
activator | Popover target content |
Events
Name | Arguments | Description |
---|---|---|
show | - | Event when popover shown |
hide | - | Event when popover hidden |