105 lines
3.2 KiB
JavaScript
105 lines
3.2 KiB
JavaScript
import { createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
|
|
// Styles
|
|
import "./VTabs.css";
|
|
|
|
// Components
|
|
import { VTab } from "./VTab.mjs";
|
|
import { makeVSlideGroupProps, VSlideGroup } from "../VSlideGroup/VSlideGroup.mjs"; // Composables
|
|
import { useBackgroundColor } from "../../composables/color.mjs";
|
|
import { provideDefaults } from "../../composables/defaults.mjs";
|
|
import { makeDensityProps, useDensity } from "../../composables/density.mjs";
|
|
import { useProxiedModel } from "../../composables/proxiedModel.mjs";
|
|
import { makeTagProps } from "../../composables/tag.mjs"; // Utilities
|
|
import { computed, toRef } from 'vue';
|
|
import { convertToUnit, genericComponent, isObject, propsFactory, useRender } from "../../util/index.mjs"; // Types
|
|
import { VTabsSymbol } from "./shared.mjs";
|
|
function parseItems(items) {
|
|
if (!items) return [];
|
|
return items.map(item => {
|
|
if (!isObject(item)) return {
|
|
text: item,
|
|
value: item
|
|
};
|
|
return item;
|
|
});
|
|
}
|
|
export const makeVTabsProps = propsFactory({
|
|
alignTabs: {
|
|
type: String,
|
|
default: 'start'
|
|
},
|
|
color: String,
|
|
fixedTabs: Boolean,
|
|
items: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
stacked: Boolean,
|
|
bgColor: String,
|
|
grow: Boolean,
|
|
height: {
|
|
type: [Number, String],
|
|
default: undefined
|
|
},
|
|
hideSlider: Boolean,
|
|
sliderColor: String,
|
|
...makeVSlideGroupProps({
|
|
mandatory: 'force'
|
|
}),
|
|
...makeDensityProps(),
|
|
...makeTagProps()
|
|
}, 'VTabs');
|
|
export const VTabs = genericComponent()({
|
|
name: 'VTabs',
|
|
props: makeVTabsProps(),
|
|
emits: {
|
|
'update:modelValue': v => true
|
|
},
|
|
setup(props, _ref) {
|
|
let {
|
|
slots
|
|
} = _ref;
|
|
const model = useProxiedModel(props, 'modelValue');
|
|
const parsedItems = computed(() => parseItems(props.items));
|
|
const {
|
|
densityClasses
|
|
} = useDensity(props);
|
|
const {
|
|
backgroundColorClasses,
|
|
backgroundColorStyles
|
|
} = useBackgroundColor(toRef(props, 'bgColor'));
|
|
provideDefaults({
|
|
VTab: {
|
|
color: toRef(props, 'color'),
|
|
direction: toRef(props, 'direction'),
|
|
stacked: toRef(props, 'stacked'),
|
|
fixed: toRef(props, 'fixedTabs'),
|
|
sliderColor: toRef(props, 'sliderColor'),
|
|
hideSlider: toRef(props, 'hideSlider')
|
|
}
|
|
});
|
|
useRender(() => {
|
|
const slideGroupProps = VSlideGroup.filterProps(props);
|
|
return _createVNode(VSlideGroup, _mergeProps(slideGroupProps, {
|
|
"modelValue": model.value,
|
|
"onUpdate:modelValue": $event => model.value = $event,
|
|
"class": ['v-tabs', `v-tabs--${props.direction}`, `v-tabs--align-tabs-${props.alignTabs}`, {
|
|
'v-tabs--fixed-tabs': props.fixedTabs,
|
|
'v-tabs--grow': props.grow,
|
|
'v-tabs--stacked': props.stacked
|
|
}, densityClasses.value, backgroundColorClasses.value, props.class],
|
|
"style": [{
|
|
'--v-tabs-height': convertToUnit(props.height)
|
|
}, backgroundColorStyles.value, props.style],
|
|
"role": "tablist",
|
|
"symbol": VTabsSymbol
|
|
}), {
|
|
default: () => [slots.default ? slots.default() : parsedItems.value.map(item => _createVNode(VTab, _mergeProps(item, {
|
|
"key": item.text
|
|
}), null))]
|
|
});
|
|
});
|
|
return {};
|
|
}
|
|
});
|
|
//# sourceMappingURL=VTabs.mjs.map
|