What is Vue 3 Popper
mainvue3-popper is a Vue 3 component designed for displaying popovers. It leverages the latest version of PopperJS to handle positioning logic. It is specifically built for Vue 3 and does not support Vue 2.x.repository·main·Indexed 42 days ago
https://github.com/valgeirb/vue3-popperA Vue 3 component library for creating and managing popover elements using PopperJS v2. It supports various trigger modes, customizable styling via CSS variables, and provides a flexible API with props for placement, delays, and manual visibility control. Version 1.4.2.
vue3-popper is a Vue 3 component designed for displaying popovers. It leverages the latest version of PopperJS to handle positioning logic. It is specifically built for Vue 3 and does not support Vue 2.x.The library provides the following capabilities:
To use Popper, import it from vue3-popper and register it in your component. You can provide content in two ways:
content prop for plain text.#content slot for HTML or complex Vue components.Note that the Popper component wraps a trigger element (like a button) which acts as the anchor for the popover.
<!-- Simple string content using the content prop -->
<template>
<Popper content="This is the Popper content">
<button>Trigger element</button>
</Popper>
</template>
<!-- Complex content using the #content slot -->
<template>
<Popper>
<button>Trigger element</button>
<template #content>
<div>This is the Popper content</div>
</template>
</Popper>
</template>
<script>
import { defineComponent } from "vue";
import Popper from "vue3-popper";
export default defineComponent({
components: {
Popper,
},
});
</script>You can install the vue3-popper package using either npm or yarn.
npm install vue3-popper
# or
yarn add vue3-popperTo define what appears inside the popover, you can either use the content prop for simple strings or the #content slot for complex HTML/components.
<!-- Using the content prop for simple strings -->
<template>
<Popper content="This is the Popper content">
<button>Trigger element</button>
</Popper>
</template><!-- Using the #content slot for complex content -->
<template>
<Popper>
<button>Trigger element</button>
<template #content>
<div>This is the Popper content</div>
</template>
</Popper>
</template>Install vue3-popper using your preferred package manager.
# Using yarn
$ yarn add vue3-popper
# Using NPM
$ npm i vue3-popperYou can register the Popper component globally in your Vue application or import it locally for specific components.
// Global registration
import { createApp } from "vue";
import Popper from "vue3-popper";
const app = createApp({});
app.component("Popper", Popper);<!-- Local registration -->
<template>
<Popper content="This is the Popper content 🍿">
<button>Trigger element</button>
</Popper>
</template>
<script>
import { defineComponent } from "vue";
import Popper from "vue3-popper";
export default defineComponent({
components: {
Popper,
},
});
</script>vue3-popper is written in Vue 3 and utilizes the latest version of PopperJS to provide a simple, themable API for managing popover positioning and behavior.To improve modularity and scalability, you can wrap Popper in your own component. This allows you to hardcode certain behaviors (like hover or openDelay) and provide a single point of change for your application.
<template>
<!-- Hardcoded "hover", "openDelay" and "closeDelay" -->
<Popper v-bind="$attrs" hover openDelay="200" closeDelay="100">
<slot />
<template #content="props">
<slot name="content" v-bind="props" />
</template>
</Popper>
</template>
<script>
import { defineComponent } from "vue";
import Popper from "vue3-popper";
export default defineComponent({
name: "MyPopperWrapper",
components: {
Popper,
},
});
</script>If you prefer not to use CSS variables, you can apply custom styles directly to the .popper class. When using <style scoped>, you must use the :deep() selector to target the Popper's internal elements.
<style scoped>
:deep(.popper) {
background: #e92791;
padding: 20px;
border-radius: 20px;
color: #fff;
font-weight: bold;
text-transform: uppercase;
}
:deep(.popper #arrow::before) {
background: #e92791;
}
:deep(.popper:hover),
:deep(.popper:hover > #arrow::before) {
background: #e92791;
}
</style>The Popper component uses a set of predefined CSS variables that you can overwrite to change its appearance. You can apply these globally via :root or locally within a component.
:root {
--popper-theme-background-color: #333333;
--popper-theme-background-color-hover: #333333;
--popper-theme-text-color: #ffffff;
--popper-theme-border-width: 0px;
--popper-theme-border-style: solid;
--popper-theme-border-radius: 6px;
--popper-theme-padding: 32px;
--popper-theme-box-shadow: 0 6px 30px -6px rgba(0, 0, 0, 0.25);
}You can listen to built-in events to trigger side-effects when the Popper opens or closes using @open:popper and @close:popper.
<template>
<Popper
arrow
@open:popper="openAlert"
@close:popper="closeAlert"
content="This is the Popper content 🍿"
>
<Button>Demo</Button>
</Popper>
</template>
<script>
import { defineComponent } from "vue";
export default defineComponent({
name: "PopperEvents",
methods: {
openAlert() {
alert("Opening Popper!");
},
closeAlert() {
alert("Closing Popper!");
},
},
});
</script>