UNPKG

@ark-ui/vue

Version:

A collection of unstyled, accessible UI components for Vue, utilizing state machines for seamless interaction.

51 lines (48 loc) 1.72 kB
import * as collapsible from '@zag-js/collapsible'; import { useMachine, normalizeProps } from '@zag-js/vue'; import { useId, computed, toValue, ref, watch } from 'vue'; import { useEnvironmentContext, DEFAULT_ENVIRONMENT } from '../../providers/environment/use-environment-context.js'; import { useLocaleContext, DEFAULT_LOCALE } from '../../providers/locale/use-locale-context.js'; import { cleanProps } from '../../utils/clean-props.js'; const useCollapsible = (props = {}, emits) => { const id = useId(); const env = useEnvironmentContext(DEFAULT_ENVIRONMENT); const locale = useLocaleContext(DEFAULT_LOCALE); const context = computed(() => { const localeProps = toValue(props); return { id, dir: locale.value.dir, getRootNode: env?.value.getRootNode, ...cleanProps(localeProps), onExitComplete: () => { emits?.("exitComplete"); localeProps.onExitComplete?.(); }, onOpenChange: (details) => { emits?.("openChange", details); emits?.("update:open", details.open); localeProps.onOpenChange?.(details); } }; }); const service = useMachine(collapsible.machine, context); const api = computed(() => collapsible.connect(service, normalizeProps)); const wasVisible = ref(false); watch( () => api.value.visible, () => { if (api.value.visible) { wasVisible.value = true; } } ); return computed(() => { const localeProps = toValue(props); return { ...api.value, unmounted: !api.value.visible && !wasVisible.value && localeProps.lazyMount || localeProps.unmountOnExit && !api.value.visible && wasVisible.value }; }); }; export { useCollapsible };