codecheck
66 строк · 1.4 Кб
1<script setup lang="ts">
2interface Props {
3name: string;
4}
5const props = defineProps<Props>();
6
7const slots: any = useSlots();
8const tabTitles = ref(slots.default().map((tab: any) => tab.props.title));
9// const selectedTitle = ;
10const selectedTitle = useState(props.name, () => tabTitles.value[0]);
11
12provide("selectedTitle", selectedTitle);
13
14const emit = defineEmits(["tab"]);
15
16const clickTab = (title: string) => {
17emit("tab", title);
18selectedTitle.value = title;
19};
20</script>
21
22<template>
23<div class="tabs">
24<button
25v-for="title in tabTitles"
26:key="title"
27@click="clickTab(title)"
28class="tabs__tab"
29:class="{ tab_active: selectedTitle == title }"
30>
31{{ title }}
32</button>
33</div>
34<div class="tabs__body">
35<slot class="tabs__top" name="top" />
36<slot class="tabs__main" />
37<slot class="tabs__bottom" name="bottom" />
38</div>
39</template>
40
41<style scoped lang="scss">
42.tabs {
43border-bottom: 1px var(--color-border-primary) solid;
44&__top {
45}
46&__body {
47display: flex;
48flex-direction: column;
49gap: 1rem;
50margin-top: 2rem;
51padding: 0 1rem;
52}
53&__tab {
54background: none;
55padding: 1rem 1.2rem;
56font-size: 1rem;
57margin-bottom: -1px;
58border-bottom: 1px var(--color-border-primary) solid;
59&.tab_active {
60color: var(--color-primary);
61// background: rgba(128, 128, 128, 0.225);
62border-bottom: 1px var(--color-primary) solid;
63}
64}
65}
66</style>
67