primevue
Version:
PrimeVue is a premium UI library for Vue featuring a rich set of 90+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeBlock, wh
251 lines (245 loc) • 9.8 kB
JavaScript
import ChevronLeft from '@primeicons/vue/chevron-left';
import ChevronRight from '@primeicons/vue/chevron-right';
import { cn } from '@primeuix/utils';
import { getWidth, findSingle, isRTL } from '@primeuix/utils/dom';
import Ripple from 'primevue/ripple';
import BaseComponent from '@primevue/core/basecomponent';
import TabListStyle from 'primevue/tablist/style';
import { resolveDirective, openBlock, createElementBlock, mergeProps, withDirectives, createBlock, resolveDynamicComponent, createCommentVNode, createElementVNode, renderSlot } from 'vue';
var script$1 = {
name: 'BaseTabList',
"extends": BaseComponent,
props: {},
style: TabListStyle,
provide: function provide() {
return {
$pcTabList: this,
$parentInstance: this
};
}
};
var script = {
name: 'TabList',
"extends": script$1,
inheritAttrs: false,
inject: ['$pcTabs'],
data: function data() {
return {
isPrevButtonEnabled: false,
isNextButtonEnabled: true
};
},
resizeObserver: undefined,
inkBarObserver: undefined,
mountTimer: null,
watch: {
showNavigators: function showNavigators(newValue) {
newValue ? this.bindResizeObserver() : this.unbindResizeObserver();
},
activeValue: {
flush: 'post',
handler: function handler() {
this.updateInkBar();
this.bindInkBarObserver();
var content = this.$refs.content;
var activeTab = content ? findSingle(content, '[data-pc-name="tab"][data-p-active="true"]') : null;
if (content && activeTab) this.$pcTabs.scrollToActiveTab(content, activeTab);
}
}
},
mounted: function mounted() {
var _this = this;
this.mountTimer = setTimeout(function () {
_this.mountTimer = null;
_this.updateInkBar();
_this.bindInkBarObserver();
}, 150);
if (this.showNavigators) {
this.updateButtonState();
this.bindResizeObserver();
}
},
updated: function updated() {
this.showNavigators && this.updateButtonState();
},
beforeUnmount: function beforeUnmount() {
if (this.mountTimer) {
clearTimeout(this.mountTimer);
this.mountTimer = null;
}
this.unbindResizeObserver();
this.unbindInkBarObserver();
},
methods: {
onScroll: function onScroll(event) {
this.showNavigators && this.updateButtonState();
event.preventDefault();
},
onPrevButtonClick: function onPrevButtonClick() {
var content = this.$refs.content;
var buttonWidths = this.getVisibleButtonWidths();
var width = getWidth(content) - buttonWidths;
var currentScrollLeft = Math.abs(content.scrollLeft);
var scrollStep = width * 0.8;
var targetScrollLeft = currentScrollLeft - scrollStep;
var scrollLeft = Math.max(targetScrollLeft, 0);
content.scrollLeft = isRTL(content) ? -1 * scrollLeft : scrollLeft;
},
onNextButtonClick: function onNextButtonClick() {
var content = this.$refs.content;
var buttonWidths = this.getVisibleButtonWidths();
var width = getWidth(content) - buttonWidths;
var currentScrollLeft = Math.abs(content.scrollLeft);
var scrollStep = width * 0.8;
var targetScrollLeft = currentScrollLeft + scrollStep;
var maxScrollLeft = content.scrollWidth - width;
var scrollLeft = Math.min(targetScrollLeft, maxScrollLeft);
content.scrollLeft = isRTL(content) ? -1 * scrollLeft : scrollLeft;
},
bindResizeObserver: function bindResizeObserver() {
var _this2 = this;
this.resizeObserver = new ResizeObserver(function () {
return _this2.updateButtonState();
});
this.resizeObserver.observe(this.$refs.list);
},
unbindResizeObserver: function unbindResizeObserver() {
var _this$resizeObserver;
(_this$resizeObserver = this.resizeObserver) === null || _this$resizeObserver === void 0 || _this$resizeObserver.unobserve(this.$refs.list);
this.resizeObserver = undefined;
},
bindInkBarObserver: function bindInkBarObserver() {
var _this3 = this;
this.unbindInkBarObserver();
var content = this.$refs.content;
var activeTab = findSingle(content, '[data-pc-name="tab"][data-p-active="true"]');
if (activeTab) {
this.inkBarObserver = new ResizeObserver(function () {
return _this3.updateInkBar();
});
this.inkBarObserver.observe(activeTab);
}
},
unbindInkBarObserver: function unbindInkBarObserver() {
var _this$inkBarObserver;
(_this$inkBarObserver = this.inkBarObserver) === null || _this$inkBarObserver === void 0 || _this$inkBarObserver.disconnect();
this.inkBarObserver = undefined;
},
updateInkBar: function updateInkBar() {
var _this$$refs = this.$refs,
content = _this$$refs.content,
inkbar = _this$$refs.inkbar;
if (!inkbar) return;
var activeTab = findSingle(content, '[data-pc-name="tab"][data-p-active="true"]');
if (!activeTab) return;
inkbar.style.setProperty('--px-active-bar-width', activeTab.offsetWidth + 'px');
inkbar.style.setProperty('--px-active-bar-height', activeTab.offsetHeight + 'px');
inkbar.style.setProperty('--px-active-bar-left', activeTab.offsetLeft + 'px');
inkbar.style.setProperty('--px-active-bar-top', activeTab.offsetTop + 'px');
},
updateButtonState: function updateButtonState() {
var _this$$refs2 = this.$refs,
list = _this$$refs2.list,
content = _this$$refs2.content;
var scrollWidth = content.scrollWidth,
offsetWidth = content.offsetWidth;
var scrollLeft = Math.abs(content.scrollLeft);
var width = getWidth(content);
this.isPrevButtonEnabled = scrollLeft !== 0;
this.isNextButtonEnabled = list.offsetWidth >= offsetWidth && parseInt(scrollLeft) !== scrollWidth - width;
},
getVisibleButtonWidths: function getVisibleButtonWidths() {
var _this$$refs3 = this.$refs,
prevButton = _this$$refs3.prevButton,
nextButton = _this$$refs3.nextButton;
var width = 0;
if (this.showNavigators) {
width = ((prevButton === null || prevButton === void 0 ? void 0 : prevButton.offsetWidth) || 0) + ((nextButton === null || nextButton === void 0 ? void 0 : nextButton.offsetWidth) || 0);
}
return width;
}
},
computed: {
templates: function templates() {
return this.$pcTabs.$slots;
},
activeValue: function activeValue() {
return this.$pcTabs.d_value;
},
showNavigators: function showNavigators() {
return this.$pcTabs.showNavigators;
},
prevButtonAriaLabel: function prevButtonAriaLabel() {
return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.previous : undefined;
},
nextButtonAriaLabel: function nextButtonAriaLabel() {
return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.next : undefined;
},
dataP: function dataP() {
return cn({
scrollable: this.$pcTabs.scrollable
});
}
},
components: {
ChevronLeft: ChevronLeft,
ChevronRight: ChevronRight
},
directives: {
ripple: Ripple
}
};
var _hoisted_1 = ["data-p"];
var _hoisted_2 = ["aria-label", "tabindex"];
var _hoisted_3 = ["aria-label", "tabindex"];
function render(_ctx, _cache, $props, $setup, $data, $options) {
var _directive_ripple = resolveDirective("ripple");
return openBlock(), createElementBlock("div", mergeProps({
ref: "list",
"class": _ctx.cx('root'),
"data-p": $options.dataP
}, _ctx.ptmi('root')), [$options.showNavigators && $data.isPrevButtonEnabled ? withDirectives((openBlock(), createElementBlock("button", mergeProps({
key: 0,
ref: "prevButton",
type: "button",
"class": _ctx.cx('prevButton'),
"aria-label": $options.prevButtonAriaLabel,
tabindex: $options.$pcTabs.tabindex,
onClick: _cache[0] || (_cache[0] = function () {
return $options.onPrevButtonClick && $options.onPrevButtonClick.apply($options, arguments);
})
}, _ctx.ptm('prevButton'), {
"data-pc-group-section": "navigator"
}), [(openBlock(), createBlock(resolveDynamicComponent($options.templates.previcon || 'ChevronLeft'), mergeProps({
"aria-hidden": "true"
}, _ctx.ptm('prevIcon')), null, 16))], 16, _hoisted_2)), [[_directive_ripple]]) : createCommentVNode("", true), createElementVNode("div", mergeProps({
ref: "content",
"class": _ctx.cx('content'),
role: "tablist",
"aria-orientation": "horizontal",
onScroll: _cache[1] || (_cache[1] = function () {
return $options.onScroll && $options.onScroll.apply($options, arguments);
})
}, _ctx.ptm('content')), [renderSlot(_ctx.$slots, "default"), createElementVNode("span", mergeProps({
ref: "inkbar",
"class": _ctx.cx('activeBar'),
role: "presentation",
"aria-hidden": "true"
}, _ctx.ptm('activeBar')), null, 16)], 16), $options.showNavigators && $data.isNextButtonEnabled ? withDirectives((openBlock(), createElementBlock("button", mergeProps({
key: 1,
ref: "nextButton",
type: "button",
"class": _ctx.cx('nextButton'),
"aria-label": $options.nextButtonAriaLabel,
tabindex: $options.$pcTabs.tabindex,
onClick: _cache[2] || (_cache[2] = function () {
return $options.onNextButtonClick && $options.onNextButtonClick.apply($options, arguments);
})
}, _ctx.ptm('nextButton'), {
"data-pc-group-section": "navigator"
}), [(openBlock(), createBlock(resolveDynamicComponent($options.templates.nexticon || 'ChevronRight'), mergeProps({
"aria-hidden": "true"
}, _ctx.ptm('nextIcon')), null, 16))], 16, _hoisted_3)), [[_directive_ripple]]) : createCommentVNode("", true)], 16, _hoisted_1);
}
script.render = render;
export { script as default };