UNPKG

vite-plugin-entry-shaking-debugger

Version:
47 lines (41 loc) 1.53 kB
import type { Ref } from 'vue'; import { computed, ref, watchEffect } from 'vue'; import { isComponentInstance } from '#utils'; import type { ButtonInstance } from '@components/Button/Button.types'; import { useMenu } from '@composables/useMenu'; import type { VerticalTab, VerticalTabsProps } from './VerticalTabs.types'; export function useVerticalTabs( props: VerticalTabsProps, tabs: Ref<(ButtonInstance | HTMLButtonElement | null)[]>, ) { const activeTabId = props.activeTabId ? Math.max( 0, props.tabs.findIndex((tab) => tab.id === props.activeTabId), ) : 0; const menuItems = ref<(HTMLButtonElement | null)[]>([]); const menu = useMenu('y', menuItems, activeTabId); const ids = useVerticalTabsIds(props); const tablistWidth = computed(() => (props.iconOnly ? 'auto' : props.width)); const setActiveTab = (index: number) => { menu.setNthItem(index); }; watchEffect(() => { menuItems.value = tabs.value.map((item) => isComponentInstance(item) ? item!.reference : item, ); }); return { ids, menu, tablistWidth, setActiveTab }; } export function useVerticalTabsIds(props: VerticalTabsProps) { const prefix = computed(() => `tabs_${props.id}`); const getTabId = (tabId: VerticalTab['id']) => `${prefix.value}_${tabId}`; const getTabPanelId = (tabId: VerticalTab['id']) => `${getTabId(tabId)}_tab`; const getTabButtonId = (tabId: VerticalTab['id']) => `${getTabId(tabId)}_btn`; return { getTabId, getTabPanelId, getTabButtonId, }; }