1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- <script setup lang="ts">
- import type { TabsEmits, TabsProps } from './types';
- import { useForwardPropsEmits } from '@vben-core/composables';
- import { ChevronLeft, ChevronRight } from '@vben-core/icons';
- import { VbenScrollbar } from '@vben-core/shadcn-ui';
- import { Tabs, TabsChrome } from './components';
- import { useTabsDrag } from './use-tabs-drag';
- import { useTabsViewScroll } from './use-tabs-view-scroll';
- interface Props extends TabsProps {}
- defineOptions({
- name: 'TabsView',
- });
- const props = withDefaults(defineProps<Props>(), {
- contentClass: 'vben-tabs-content',
- draggable: true,
- styleType: 'chrome',
- });
- const emit = defineEmits<TabsEmits>();
- const forward = useForwardPropsEmits(props, emit);
- const {
- handleScrollAt,
- scrollbarRef,
- scrollDirection,
- scrollIsAtLeft,
- scrollIsAtRight,
- showScrollButton,
- } = useTabsViewScroll(props);
- useTabsDrag(props, emit);
- </script>
- <template>
- <div class="flex h-full flex-1 overflow-hidden">
- <!-- 左侧滚动按钮 -->
- <span
- v-show="showScrollButton"
- :class="{
- 'hover:bg-muted text-muted-foreground cursor-pointer': !scrollIsAtLeft,
- 'pointer-events-none opacity-30': scrollIsAtLeft,
- }"
- class="border-r px-2"
- @click="scrollDirection('left')"
- >
- <ChevronLeft class="size-4 h-full" />
- </span>
- <div
- :class="{
- 'pt-[3px]': styleType === 'chrome',
- }"
- class="size-full flex-1 overflow-hidden"
- >
- <VbenScrollbar
- ref="scrollbarRef"
- :shadow-bottom="false"
- :shadow-top="false"
- class="h-full"
- horizontal
- scroll-bar-class="z-10 hidden "
- shadow
- shadow-left
- shadow-right
- @scroll-at="handleScrollAt"
- >
- <TabsChrome
- v-if="styleType === 'chrome'"
- v-bind="{ ...forward, ...$attrs, ...$props }"
- />
- <Tabs v-else v-bind="{ ...forward, ...$attrs, ...$props }" />
- </VbenScrollbar>
- </div>
- <!-- 右侧滚动按钮 -->
- <span
- v-show="showScrollButton"
- :class="{
- 'hover:bg-muted text-muted-foreground cursor-pointer': !scrollIsAtRight,
- 'pointer-events-none opacity-30': scrollIsAtRight,
- }"
- class="hover:bg-muted text-muted-foreground cursor-pointer border-l px-2"
- @click="scrollDirection('right')"
- >
- <ChevronRight class="size-4 h-full" />
- </span>
- </div>
- </template>
|