UNPKG

ui-ingredients

Version:

Headless component library for Svelte powered by zag

40 lines (39 loc) 1.33 kB
import * as presence from '@zag-js/presence'; import { normalizeProps, useMachine } from '@zag-js/svelte'; import { createAttachmentKey } from 'svelte/attachments'; export function createPresence(props) { const { present, immediate, lazyMount = false, keepMounted = true, animateOnMount = true, onExitComplete, } = $derived(props()); const service = useMachine(presence.machine, () => ({ present, immediate, onExitComplete, })); const api = $derived(presence.connect(service, normalizeProps)); function getPresenceProps() { return { hidden: !api.present, 'data-state': api.skip && !animateOnMount ? undefined : present ? 'open' : 'closed', [createAttachmentKey()]: (node) => { api.setNode(node); return api.setNode(null); }, }; } let wasPresent = $state(false); $effect.pre(() => { if (api.present) { wasPresent = true; } }); const unmounted = $derived.by(() => { if (!api.present && !wasPresent && lazyMount) return true; if (!keepMounted && !api.present && wasPresent) return true; return false; }); return () => ({ getPresenceProps, mounted: !unmounted, }); }