{"version":3,"file":"tab-nav.mjs","sources":["../../../../../../packages/components/tab/src/tab-nav.ts"],"sourcesContent":["import {\r\n  h,\r\n  defineComponent,\r\n  ref,\r\n  inject,\r\n  computed,\r\n  onUpdated,\r\n  onMounted,\r\n  watch,\r\n} from 'vue'\r\nimport { capitalize } from '@vue/shared'\r\nimport {\r\n  useResizeObserver,\r\n  useDocumentVisibility,\r\n  useWindowFocus,\r\n} from '@vueuse/core'\r\nimport { buildProps, definePropType } from '@sgui-plus/utils/props'\r\nimport { mutable } from '@sgui-plus/utils/types'\r\nimport { EVENT_CODE } from '@sgui-plus/utils/aria'\r\nimport { throwError } from '@sgui-plus/utils/error'\r\nimport { SgIcon } from '@sgui-plus/components/icon'\r\nimport { ArrowLeft, ArrowRight, Close } from '@sgui-plus/icons-vue'\r\nimport { TabRootContextKey } from './constants'\r\nimport TabBar from './tab-bar.vue'\r\nimport type { ExtractPropTypes, CSSProperties } from 'vue'\r\nimport type { TabPaneContext } from './constants'\r\nimport type { TabPaneName } from './tab'\r\n\r\nexport interface Scrollable {\r\n  next?: boolean\r\n  prev?: number\r\n}\r\n\r\nexport const tabNavProps = buildProps({\r\n  panes: {\r\n    type: definePropType<TabPaneContext[]>(Array),\r\n    default: () => mutable([] as const),\r\n  },\r\n  currentName: {\r\n    type: [String, Number],\r\n    default: '',\r\n  },\r\n  closable: Boolean,\r\n  type: {\r\n    type: String,\r\n    values: ['card', 'border-card', 'button', 'button-round', ''],\r\n    default: '',\r\n  },\r\n  stretch: Boolean,\r\n  labelWidth: {\r\n    type: definePropType<number | string>([Number, String]),\r\n    default: ''\r\n  }\r\n} as const)\r\n\r\nexport const tabNavEmits = {\r\n  tabClick: (tab: TabPaneContext, tabName: TabPaneName, ev: Event) => ev instanceof Event,\r\n  tabDblclick: (tab: TabPaneContext, tabName: TabPaneName, ev: Event) => ev instanceof Event,\r\n  tabRemove: (tab: TabPaneContext, ev: Event) => ev instanceof Event,\r\n}\r\n\r\nexport type TabNavProps = ExtractPropTypes<typeof tabNavProps>\r\n\r\nconst COMPONENT_NAME = 'SgTabNav'\r\nexport default defineComponent({\r\n  name: COMPONENT_NAME,\r\n  props: tabNavProps,\r\n  emits: tabNavEmits,\r\n\r\n  setup(props, { expose, emit }) {\r\n    const visibility = useDocumentVisibility()\r\n    const focused = useWindowFocus()\r\n\r\n    const rootTabs = inject(TabRootContextKey)\r\n    if (!rootTabs)\r\n      throwError(COMPONENT_NAME, `SgTabNav must be nested inside SgTabs`)\r\n\r\n    const scrollable = ref<false | Scrollable>(false)\r\n    const navOffset = ref(0)\r\n    const isFocus = ref(false)\r\n    const focusable = ref(true)\r\n\r\n    const navScroll$ = ref<HTMLDivElement>()\r\n    const nav$ = ref<HTMLDivElement>()\r\n    const el$ = ref<HTMLDivElement>()\r\n\r\n    let clickCount = 0\r\n    let clickTimer: null | NodeJS.Timeout = null\r\n\r\n    const sizeName = computed(() =>\r\n      ['top', 'bottom'].includes(rootTabs.props.tabPosition)\r\n        ? 'width'\r\n        : 'height'\r\n    )\r\n    const navStyle = computed<CSSProperties>(() => {\r\n      const dir = sizeName.value === 'width' ? 'X' : 'Y'\r\n      return {\r\n        transform: `translate${dir}(-${navOffset.value}px)`,\r\n      }\r\n    })\r\n\r\n    const scrollPrev = () => {\r\n      if (!navScroll$.value) return\r\n\r\n      const containerSize =\r\n        navScroll$.value[`offset${capitalize(sizeName.value)}`]\r\n      const currentOffset = navOffset.value\r\n\r\n      if (!currentOffset) return\r\n\r\n      const newOffset =\r\n        currentOffset > containerSize ? currentOffset - containerSize : 0\r\n\r\n      navOffset.value = newOffset\r\n    }\r\n\r\n    const scrollNext = () => {\r\n      if (!navScroll$.value || !nav$.value) return\r\n\r\n      const navSize = nav$.value[`offset${capitalize(sizeName.value)}`]\r\n      const containerSize =\r\n        navScroll$.value[`offset${capitalize(sizeName.value)}`]\r\n      const currentOffset = navOffset.value\r\n\r\n      if (navSize - currentOffset <= containerSize) return\r\n\r\n      const newOffset =\r\n        navSize - currentOffset > containerSize * 2\r\n          ? currentOffset + containerSize\r\n          : navSize - containerSize\r\n\r\n      navOffset.value = newOffset\r\n    }\r\n\r\n    const scrollToActiveTab = () => {\r\n      const nav = nav$.value\r\n      if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return\r\n\r\n      const activeTab = el$.value.querySelector('.is-active')\r\n      if (!activeTab) return\r\n\r\n      const navScroll = navScroll$.value\r\n      const isHorizontal = ['top', 'bottom'].includes(\r\n        rootTabs.props.tabPosition\r\n      )\r\n      const activeTabBounding = activeTab.getBoundingClientRect()\r\n      const navScrollBounding = navScroll.getBoundingClientRect()\r\n      const maxOffset = isHorizontal\r\n        ? nav.offsetWidth - navScrollBounding.width\r\n        : nav.offsetHeight - navScrollBounding.height\r\n      const currentOffset = navOffset.value\r\n      let newOffset = currentOffset\r\n\r\n      if (isHorizontal) {\r\n        if (activeTabBounding.left < navScrollBounding.left) {\r\n          newOffset =\r\n            currentOffset - (navScrollBounding.left - activeTabBounding.left)\r\n        }\r\n        if (activeTabBounding.right > navScrollBounding.right) {\r\n          newOffset =\r\n            currentOffset + activeTabBounding.right - navScrollBounding.right\r\n        }\r\n      } else {\r\n        if (activeTabBounding.top < navScrollBounding.top) {\r\n          newOffset =\r\n            currentOffset - (navScrollBounding.top - activeTabBounding.top)\r\n        }\r\n        if (activeTabBounding.bottom > navScrollBounding.bottom) {\r\n          newOffset =\r\n            currentOffset +\r\n            (activeTabBounding.bottom - navScrollBounding.bottom)\r\n        }\r\n      }\r\n      newOffset = Math.max(newOffset, 0)\r\n      navOffset.value = Math.min(newOffset, maxOffset)\r\n    }\r\n\r\n    const update = () => {\r\n      if (!nav$.value || !navScroll$.value) return\r\n\r\n      const navSize = nav$.value[`offset${capitalize(sizeName.value)}`]\r\n      const containerSize =\r\n        navScroll$.value[`offset${capitalize(sizeName.value)}`]\r\n      const currentOffset = navOffset.value\r\n\r\n      if (containerSize < navSize) {\r\n        const currentOffset = navOffset.value\r\n        scrollable.value = scrollable.value || {}\r\n        scrollable.value.prev = currentOffset\r\n        scrollable.value.next = currentOffset + containerSize < navSize\r\n        if (navSize - currentOffset < containerSize) {\r\n          navOffset.value = navSize - containerSize\r\n        }\r\n      } else {\r\n        scrollable.value = false\r\n        if (currentOffset > 0) {\r\n          navOffset.value = 0\r\n        }\r\n      }\r\n    }\r\n\r\n    const changeTab = (e: KeyboardEvent) => {\r\n      const code = e.code\r\n\r\n      const { up, down, left, right } = EVENT_CODE\r\n      if (![up, down, left, right].includes(code)) return\r\n\r\n      // 左右上下键更换tab\r\n      const tabList = Array.from(\r\n        (e.currentTarget as HTMLDivElement).querySelectorAll<HTMLDivElement>(\r\n          '[role=tab]'\r\n        )\r\n      )\r\n      const currentIndex = tabList.indexOf(e.target as HTMLDivElement)\r\n\r\n      let nextIndex: number\r\n      if (code === left || code === up) {\r\n        // left\r\n        if (currentIndex === 0) {\r\n          // first\r\n          nextIndex = tabList.length - 1\r\n        } else {\r\n          nextIndex = currentIndex - 1\r\n        }\r\n      } else {\r\n        // right\r\n        if (currentIndex < tabList.length - 1) {\r\n          // not last\r\n          nextIndex = currentIndex + 1\r\n        } else {\r\n          nextIndex = 0\r\n        }\r\n      }\r\n      tabList[nextIndex].focus() // 改变焦点元素\r\n      tabList[nextIndex].click() // 选中下一个tab\r\n      setFocus()\r\n    }\r\n\r\n    const setFocus = () => {\r\n      if (focusable.value) isFocus.value = true\r\n    }\r\n    const removeFocus = () => (isFocus.value = false)\r\n\r\n    watch(visibility, (visibility:any) => {\r\n      if (visibility === 'hidden') {\r\n        focusable.value = false\r\n      } else if (visibility === 'visible') {\r\n        setTimeout(() => (focusable.value = true), 50)\r\n      }\r\n    })\r\n    watch(focused, (focused) => {\r\n      if (focused) {\r\n        setTimeout(() => (focusable.value = true), 50)\r\n      } else {\r\n        focusable.value = false\r\n      }\r\n    })\r\n\r\n    useResizeObserver(el$, update)\r\n\r\n    onMounted(() => setTimeout(() => scrollToActiveTab(), 0))\r\n    onUpdated(() => update())\r\n\r\n    expose({\r\n      scrollToActiveTab,\r\n      removeFocus,\r\n    })\r\n\r\n    return () => {\r\n      const scrollBtn = scrollable.value\r\n        ? [\r\n            h(\r\n              'span',\r\n              {\r\n                class: [\r\n                  'sg-tab__nav-prev',\r\n                  scrollable.value.prev ? '' : 'is-disabled',\r\n                ],\r\n                onClick: scrollPrev,\r\n              },\r\n              [h(SgIcon, {}, { default: () => h(ArrowLeft) })]\r\n            ),\r\n            h(\r\n              'span',\r\n              {\r\n                class: [\r\n                  'sg-tab__nav-next',\r\n                  scrollable.value.next ? '' : 'is-disabled',\r\n                ],\r\n                onClick: scrollNext,\r\n              },\r\n              [h(SgIcon, {}, { default: () => h(ArrowRight) })]\r\n            ),\r\n          ]\r\n        : null\r\n\r\n      const tabs = props.panes.map((pane, index) => {\r\n        const tabName = pane.props.name || pane.index || `${index}`\r\n        const closable = pane.isClosable || props.closable\r\n        // const labelWidth = pane.props.labelWidth || props.labelWidth\r\n\r\n        pane.index = `${index}`\r\n\r\n        const btnClose = closable\r\n          ? h(\r\n              SgIcon,\r\n              {\r\n                class: 'is-icon-close',\r\n                onClick: (ev: MouseEvent) => emit('tabRemove', pane, ev),\r\n              },\r\n              { default: () => h(Close) }\r\n            )\r\n          : null\r\n\r\n        const tabLabelContent =\r\n          pane.instance.slots.label?.() || pane.props.label\r\n        const tabindex = pane.active ? 0 : -1\r\n\r\n        return h(\r\n          'div',\r\n          {\r\n            class: {\r\n              'sg-tab__item': true,\r\n              [`is-${rootTabs.props.tabPosition}`]: true,\r\n              'is-active': pane.active,\r\n              'is-disabled': pane.props.disabled,\r\n              'is-closable': closable,\r\n              'is-focus': isFocus,\r\n            },\r\n            id: `tab-${tabName}`,\r\n            key: `tab-${tabName}`,\r\n            'aria-controls': `pane-${tabName}`,\r\n            role: 'tab',\r\n            'aria-selected': pane.active,\r\n            ref: `tab-${tabName}`,\r\n            tabindex,\r\n            onFocus: () => setFocus(),\r\n            onBlur: () => removeFocus(),\r\n            onClick: (ev: MouseEvent) => {\r\n              clickCount++\r\n              if (clickCount === 1) {\r\n                clickTimer = setTimeout(() => {\r\n                  removeFocus()\r\n                  emit('tabClick', pane, tabName, ev)\r\n                  clickCount = 0\r\n                }, 300)\r\n              } else {\r\n                clickTimer && clearTimeout(clickTimer)\r\n                emit('tabDblclick', pane, tabName, ev)\r\n                clickCount = 0\r\n              }\r\n            },\r\n            onKeydown: (ev: KeyboardEvent) => {\r\n              if (\r\n                closable &&\r\n                (ev.code === EVENT_CODE.delete ||\r\n                  ev.code === EVENT_CODE.backspace)\r\n              ) {\r\n                emit('tabRemove', pane, ev)\r\n              }\r\n            },\r\n          },\r\n          [tabLabelContent, btnClose]\r\n        )\r\n      })\r\n\r\n      return h(\r\n        'div',\r\n        {\r\n          ref: el$,\r\n          class: [\r\n            'sg-tab__nav-wrap',\r\n            scrollable.value ? 'is-scrollable' : '',\r\n            `is-${rootTabs.props.tabPosition}`,\r\n          ],\r\n        },\r\n        [\r\n          scrollBtn,\r\n          h(\r\n            'div',\r\n            {\r\n              class: 'sg-tab__nav-scroll',\r\n              ref: navScroll$,\r\n            },\r\n            [\r\n              h(\r\n                'div',\r\n                {\r\n                  class: [\r\n                    'sg-tab__nav',\r\n                    `is-${rootTabs.props.tabPosition}`,\r\n                    props.stretch &&\r\n                    ['top', 'bottom'].includes(rootTabs.props.tabPosition)\r\n                      ? 'is-stretch'\r\n                      : '',\r\n                  ],\r\n                  ref: nav$,\r\n                  style: navStyle.value,\r\n                  role: 'tablist',\r\n                  onKeydown: changeTab,\r\n                },\r\n                [\r\n                  !props.type\r\n                    ? h(TabBar, {\r\n                        tabs: [...props.panes],\r\n                      })\r\n                    : null,\r\n                  tabs,\r\n                ]\r\n              ),\r\n            ]\r\n          ),\r\n        ]\r\n      )\r\n    }\r\n  },\r\n})\r\n"],"names":[],"mappings":"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"}