This commit is contained in:
Nadar
2026-03-17 13:24:22 +03:00
commit 82e5ac9d81
554 changed files with 29637 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
import type { InjectionKey } from 'vue'
import type { TabsContext } from './types'
export const tabsContextKey: InjectionKey<TabsContext>
= Symbol('UI_TABS')

View File

@@ -0,0 +1,41 @@
<template>
<div :class="cn.b()">
<UiTabsOption
v-for="(option, index) in options"
:key="index"
:size="size"
v-bind="option"
/>
</div>
</template>
<script setup lang="ts">
import UiTabsOption from './option.vue'
import type { ModelValue, Props } from './types'
import { tabsContextKey } from './constants'
defineOptions({
name: 'UiTabs',
})
const props = defineProps<Props>()
const emit = defineEmits<{
'update:modelValue': [state: ModelValue]
}>()
const cn = useClassname('ui-tabs')
function handleOptionClick(value: ModelValue) {
emit('update:modelValue', value)
}
provide(tabsContextKey, {
modelValue: toRef(props, 'modelValue'),
handleOptionClick,
})
</script>
<style lang="scss">
@use 'styles';
</style>

View File

@@ -0,0 +1,27 @@
<template>
<UiButton
:class="cn.b()"
:type="active ? 'filled' : 'ghost'"
:color="active ? 'primary' : 'secondary'"
:icon="icon"
:size="size"
@click="tabs.handleOptionClick(value)"
>
<template v-if="label">
{{ label }}
</template>
</UiButton>
</template>
<script setup lang="ts">
import type { OptionProps } from './types.js'
import { tabsContextKey } from './constants'
const props = defineProps<OptionProps>()
const tabs = inject(tabsContextKey)!
const cn = useClassname('ui-tabs-option')
const active = computed(() => tabs.modelValue.value === props.value)
</script>

View File

@@ -0,0 +1,7 @@
@use '../../styles/variables' as *;
@use '../../styles/mixins' as *;
.ui-tabs {
display: flex;
gap: 8px;
}

View File

@@ -0,0 +1,22 @@
import type { Props as ButtonProps } from '../button/index.vue'
import type { UiIcon } from '#build/types/ui/icons'
export type ModelValue = string | number
export interface OptionProps {
label?: string
icon?: UiIcon
value: ModelValue
size?: ButtonProps['size']
}
export interface Props {
options: Omit<OptionProps, 'size'>[]
modelValue?: ModelValue
size?: ButtonProps['size']
}
export interface TabsContext {
modelValue?: ModelValue
handleOptionClick: (value: ModelValue) => void
}