Blame view

泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/components/preview-group.vue 2.81 KB
383e20a3   杨鑫   拉取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  <script setup lang="ts">
  import type { SetupContext } from 'vue';
  
  import { computed, ref, useSlots } from 'vue';
  
  import { VbenTooltip } from '@vben-core/shadcn-ui';
  
  import { Code } from 'lucide-vue-next';
  import {
    TabsContent,
    TabsIndicator,
    TabsList,
    TabsRoot,
    TabsTrigger,
  } from 'radix-vue';
  
  defineOptions({
    inheritAttrs: false,
  });
  
  const props = withDefaults(
    defineProps<{
      files?: string[];
    }>(),
    { files: () => [] },
  );
  
  const open = ref(false);
  
  const slots: SetupContext['slots'] = useSlots();
  
  const tabs = computed(() => {
    return props.files.map((file) => {
      return {
        component: slots[file],
        label: file,
      };
    });
  });
  
  const currentTab = ref('index.vue');
  
  const toggleOpen = () => {
    open.value = !open.value;
  };
  </script>
  
  <template>
    <TabsRoot
      v-model="currentTab"
      class="bg-background-deep border-border overflow-hidden rounded-b-xl border-t"
      @update:model-value="open = true"
    >
      <div class="border-border bg-background flex border-b-2 pr-2">
        <div class="flex w-full items-center justify-between text-[13px]">
          <TabsList class="relative flex">
            <template v-if="open">
              <TabsIndicator
                class="absolute bottom-0 left-0 h-[2px] w-[--radix-tabs-indicator-size] translate-x-[--radix-tabs-indicator-position] rounded-full transition-[width,transform] duration-300"
              >
                <div class="size-full bg-[var(--vp-c-indigo-1)]"></div>
              </TabsIndicator>
              <TabsTrigger
                v-for="(tab, index) in tabs"
                :key="index"
                :value="tab.label"
                class="border-box text-foreground px-4 py-3 data-[state=active]:text-[var(--vp-c-indigo-1)]"
                tabindex="-1"
              >
                {{ tab.label }}
              </TabsTrigger>
            </template>
          </TabsList>
  
          <div
            :class="{
              'py-2': !open,
            }"
            class="flex items-center"
          >
            <VbenTooltip side="top">
              <template #trigger>
                <Code
                  class="hover:bg-accent size-7 cursor-pointer rounded-full p-1.5"
                  @click="toggleOpen"
                />
              </template>
              {{ open ? 'Collapse code' : 'Expand code' }}
            </VbenTooltip>
          </div>
        </div>
      </div>
      <div
        :class="`${open ? 'h-[unset] max-h-[80vh]' : 'h-0'}`"
        class="block overflow-y-scroll bg-[var(--vp-code-block-bg)] transition-all duration-300"
      >
        <TabsContent
          v-for="tab in tabs"
          :key="tab.label"
          :value="tab.label"
          as-child
          class="rounded-xl"
        >
          <div class="text-foreground relative rounded-xl">
            <component :is="tab.component" class="border-0" />
          </div>
        </TabsContent>
      </div>
    </TabsRoot>
  </template>