mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-04 06:23:17 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <div>
 | 
						|
    <TabGroup :default-index="defaultIndex" @change="onChange">
 | 
						|
      <TabList
 | 
						|
        :class="[
 | 
						|
          'flex border-b border-grey-light',
 | 
						|
          'relative overflow-x-auto overflow-y-hidden',
 | 
						|
          'lg:pb-0 lg:ml-0',
 | 
						|
        ]"
 | 
						|
      >
 | 
						|
        <Tab
 | 
						|
          v-for="(tab, index) in tabs"
 | 
						|
          v-slot="{ selected }"
 | 
						|
          :key="index"
 | 
						|
          as="template"
 | 
						|
        >
 | 
						|
          <button
 | 
						|
            :class="[
 | 
						|
              'px-8 py-2 text-sm leading-5 font-medium flex items-center relative border-b-2 mt-4 focus:outline-none whitespace-nowrap',
 | 
						|
              selected
 | 
						|
                ? ' border-primary-400 text-black font-medium'
 | 
						|
                : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300',
 | 
						|
            ]"
 | 
						|
          >
 | 
						|
            {{ tab.title }}
 | 
						|
 | 
						|
            <BaseBadge
 | 
						|
              v-if="tab.count"
 | 
						|
              class="!rounded-full overflow-hidden ml-2"
 | 
						|
              :variant="tab['count-variant']"
 | 
						|
              default-class="flex items-center justify-center w-5 h-5 p-1 rounded-full text-medium"
 | 
						|
            >
 | 
						|
              {{ tab.count }}
 | 
						|
            </BaseBadge>
 | 
						|
          </button>
 | 
						|
        </Tab>
 | 
						|
      </TabList>
 | 
						|
 | 
						|
      <slot name="before-tabs" />
 | 
						|
 | 
						|
      <TabPanels>
 | 
						|
        <slot />
 | 
						|
      </TabPanels>
 | 
						|
    </TabGroup>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script setup>
 | 
						|
import { computed, useSlots } from 'vue'
 | 
						|
import { TabGroup, TabList, Tab, TabPanels } from '@headlessui/vue'
 | 
						|
 | 
						|
const props = defineProps({
 | 
						|
  defaultIndex: {
 | 
						|
    type: Number,
 | 
						|
    default: 0,
 | 
						|
  },
 | 
						|
  filter: {
 | 
						|
    type: String,
 | 
						|
    default: null,
 | 
						|
  },
 | 
						|
})
 | 
						|
 | 
						|
const emit = defineEmits(['change'])
 | 
						|
 | 
						|
const slots = useSlots()
 | 
						|
 | 
						|
const tabs = computed(() => slots.default().map((tab) => tab.props))
 | 
						|
 | 
						|
function onChange(d) {
 | 
						|
  emit('change', tabs.value[d])
 | 
						|
}
 | 
						|
</script>
 |