UNPKG

svelte-popperjs

Version:

Popper for Svelte with actions, no wrapper components required!

71 lines (66 loc) 2.09 kB
'use strict'; 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;