svelte-popperjs
Version:
Popper for Svelte with actions, no wrapper components required!
71 lines (66 loc) • 2.09 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var core = require('@popperjs/core');
var svelte = require('svelte');
function createPopperActions(initOptions) {
let popperInstance = null;
let referenceNode;
let contentNode;
let options = initOptions;
const initPopper = () => {
if (referenceNode !== undefined && contentNode !== undefined) {
popperInstance = core.createPopper(referenceNode, contentNode, options);
}
};
const deinitPopper = () => {
if (popperInstance !== null) {
popperInstance.destroy();
popperInstance = null;
}
};
const referenceAction = (node) => {
if ('subscribe' in node) {
setupVirtualElementObserver(node);
return {};
}
else {
referenceNode = node;
initPopper();
return {
destroy() {
deinitPopper();
},
};
}
};
const setupVirtualElementObserver = (node) => {
const unsubscribe = node.subscribe(($node) => {
if (referenceNode === undefined) {
referenceNode = $node;
initPopper();
}
else {
// Preserve the reference to the virtual element.
Object.assign(referenceNode, $node);
popperInstance?.update();
}
});
svelte.onDestroy(unsubscribe);
};
const contentAction = (node, contentOptions) => {
contentNode = node;
options = { ...initOptions, ...contentOptions };
initPopper();
return {
update(newContentOptions) {
options = { ...initOptions, ...newContentOptions };
popperInstance?.setOptions(options);
},
destroy() {
deinitPopper();
},
};
};
return [referenceAction, contentAction, () => popperInstance];
}
exports.createPopperActions = createPopperActions;
;