|
<template> |
|
<div class="tabs" |
|
:class="{ |
|
'card': card, |
|
'space-around': spaceAround, |
|
'space-between': spaceBetween, |
|
}" |
|
:style="tabsStyle || {}" |
|
> |
|
<div |
|
class="tab" |
|
:class="{ 'active': tab.key === value }" |
|
v-for="tab in tabs" |
|
:key="tab.key" |
|
:style="{ |
|
...(tabStyle || {}), |
|
'--color': tab.color, |
|
}" |
|
@click="emit('update:value', tab.key)" |
|
>{{tab.label}}</div> |
|
</div> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { type CSSProperties } from 'vue' |
|
|
|
interface TabItem { |
|
key: string |
|
label: string |
|
color?: string |
|
} |
|
|
|
withDefaults(defineProps<{ |
|
value: string |
|
tabs: TabItem[] |
|
card?: boolean |
|
tabsStyle?: CSSProperties |
|
tabStyle?: CSSProperties |
|
spaceAround?: boolean |
|
spaceBetween?: boolean |
|
}>(), { |
|
card: false, |
|
spaceAround: false, |
|
spaceBetween: false, |
|
}) |
|
|
|
const emit = defineEmits<{ |
|
(event: 'update:value', payload: string): void |
|
}>() |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
.tabs { |
|
display: flex; |
|
user-select: none; |
|
line-height: 1; |
|
|
|
&:not(.card) { |
|
font-size: 13px; |
|
align-items: center; |
|
justify-content: flex-start; |
|
border-bottom: 1px solid $borderColor; |
|
|
|
&.space-around { |
|
justify-content: space-around; |
|
} |
|
&.space-between { |
|
justify-content: space-between; |
|
} |
|
|
|
.tab { |
|
text-align: center; |
|
border-bottom: 2px solid transparent; |
|
padding: 8px 10px; |
|
cursor: pointer; |
|
|
|
&.active { |
|
border-bottom: 2px solid var(--color, $themeColor); |
|
} |
|
} |
|
} |
|
|
|
&.card { |
|
height: 40px; |
|
font-size: 12px; |
|
flex-shrink: 0; |
|
|
|
.tab { |
|
flex: 1; |
|
display: flex; |
|
justify-content: center; |
|
align-items: center; |
|
background-color: $lightGray; |
|
border-bottom: 1px solid $borderColor; |
|
cursor: pointer; |
|
|
|
&.active { |
|
background-color: transparent; |
|
border-bottom-color: transparent; |
|
} |
|
|
|
& + .tab { |
|
border-left: 1px solid $borderColor; |
|
} |
|
} |
|
} |
|
} |
|
</style> |