Skip to content

Commit d5c6a2c

Browse files
author
Valgeir Bjornsson
committed
Updates
- Add `interactive` prop - Make Popper hoverable by default - Rename offset props for more clarity
1 parent 4f16c55 commit d5c6a2c

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

src/component/Popper.vue

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<template>
2-
<div v-click-away="{ handler: handleClose, enabled: enableClickAway }">
2+
<div
3+
:style="interactiveStyle"
4+
@mouseleave="hover && handleClose()"
5+
v-click-away="{ handler: handleClose, enabled: enableClickAway }"
6+
>
37
<div
48
ref="triggerNode"
59
@mouseover="hover && handleOpen()"
6-
@mouseleave="hover && handleClose()"
710
@click="handleToggle"
811
@focus="handleOpen"
912
@blur="handleClose"
@@ -15,6 +18,7 @@
1518
</div>
1619
<Transition name="fade">
1720
<div
21+
@click="!interactive && handleToggle()"
1822
v-show="shouldShowPopper"
1923
:class="['popper', shouldShowPopper ? 'inline-block' : null]"
2024
ref="popperNode"
@@ -80,16 +84,16 @@
8084
default: false,
8185
},
8286
/**
83-
* Distance in pixels along the trigger element
87+
* Offset in pixels along the trigger element
8488
*/
85-
offsetX: {
89+
offsetSkid: {
8690
type: String,
8791
default: "0",
8892
},
8993
/**
90-
* Distance in pixels away from the trigger element
94+
* Offset in pixels away from the trigger element
9195
*/
92-
offsetY: {
96+
offsetDistance: {
9397
type: String,
9498
default: "12",
9599
},
@@ -135,6 +139,10 @@
135139
type: String,
136140
default: "0",
137141
},
142+
interactive: {
143+
type: Boolean,
144+
default: true,
145+
},
138146
},
139147
setup(props, { slots, emit }) {
140148
const children = slots.default();
@@ -150,21 +158,22 @@
150158
const modifiedIsOpen = ref(false);
151159
152160
const {
153-
offsetX,
154-
offsetY,
161+
offsetSkid,
162+
offsetDistance,
155163
arrowPadding,
156164
placement,
157165
disabled,
158166
disableClickAway,
159167
openDelay,
160168
closeDelay,
169+
interactive,
161170
} = toRefs(props);
162171
163172
const { isOpen, open, close } = usePopper({
164173
popperNode,
165174
triggerNode,
166-
offsetX,
167-
offsetY,
175+
offsetSkid,
176+
offsetDistance,
168177
arrowPadding,
169178
placement,
170179
emit,
@@ -218,6 +227,12 @@
218227
const invalid = computed(() => disabled.value || !hasContent.value);
219228
const shouldShowPopper = computed(() => isOpen.value && !invalid.value);
220229
const enableClickAway = computed(() => !disableClickAway.value);
230+
// Add an invisible border to keep the Popper open when hovering from the trigger into it
231+
const interactiveStyle = computed(() =>
232+
interactive.value
233+
? `border: ${offsetDistance.value}px solid transparent; margin: -${offsetDistance.value}px;`
234+
: null,
235+
);
221236
222237
return {
223238
popperNode,
@@ -230,6 +245,8 @@
230245
shouldShowPopper,
231246
enableClickAway,
232247
modifiedIsOpen,
248+
interactive,
249+
interactiveStyle,
233250
};
234251
},
235252
});

src/composables/usePopper.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ export default function usePopper({
1212
triggerNode,
1313
placement,
1414
arrowPadding,
15-
offsetX,
16-
offsetY,
15+
offsetSkid,
16+
offsetDistance,
1717
emit,
1818
}) {
1919
const state = reactive({
@@ -64,7 +64,7 @@ export default function usePopper({
6464
{
6565
name: "offset",
6666
options: {
67-
offset: [toInt(offsetX.value), toInt(offsetY.value)],
67+
offset: [toInt(offsetSkid.value), toInt(offsetDistance.value)],
6868
},
6969
},
7070
],

0 commit comments

Comments
 (0)