primevue
Version:
PrimeVue is an open source UI library for Vue featuring a rich set of 80+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeBloc
241 lines (235 loc) • 9.42 kB
JavaScript
import { cn } from '@primeuix/utils';
import { getWidth, getHeight, findSingle, getOuterHeight, getOffset, getOuterWidth, isRTL } from '@primeuix/utils/dom';
import ChevronLeftIcon from '@primevue/icons/chevronleft';
import ChevronRightIcon from '@primevue/icons/chevronright';
import Ripple from 'primevue/ripple';
import BaseComponent from '@primevue/core/basecomponent';
import TabListStyle from 'primevue/tablist/style';
import { resolveDirective, createElementBlock, openBlock, mergeProps, withDirectives, createCommentVNode, createElementVNode, createBlock, resolveDynamicComponent, 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,
watch: {
showNavigators: function showNavigators(newValue) {
newValue ? this.bindResizeObserver() : this.unbindResizeObserver();
},
activeValue: {
flush: 'post',
handler: function handler() {
this.updateInkBar();
}
}
},
mounted: function mounted() {
var _this = this;
setTimeout(function () {
_this.updateInkBar();
}, 150);
if (this.showNavigators) {
this.updateButtonState();
this.bindResizeObserver();
}
},
updated: function updated() {
this.showNavigators && this.updateButtonState();
},
beforeUnmount: function beforeUnmount() {
this.unbindResizeObserver();
},
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;
},
updateInkBar: function updateInkBar() {
var _this$$refs = this.$refs,
content = _this$$refs.content,
inkbar = _this$$refs.inkbar,
tabs = _this$$refs.tabs;
if (!inkbar) return;
var activeTab = findSingle(content, '[data-pc-name="tab"][data-p-active="true"]');
if (this.$pcTabs.isVertical()) {
inkbar.style.height = getOuterHeight(activeTab) + 'px';
inkbar.style.top = getOffset(activeTab).top - getOffset(tabs).top + 'px';
} else {
inkbar.style.width = getOuterWidth(activeTab) + 'px';
inkbar.style.left = getOffset(activeTab).left - getOffset(tabs).left + 'px';
}
},
updateButtonState: function updateButtonState() {
var _this$$refs2 = this.$refs,
list = _this$$refs2.list,
content = _this$$refs2.content;
var scrollTop = content.scrollTop,
scrollWidth = content.scrollWidth,
scrollHeight = content.scrollHeight,
offsetWidth = content.offsetWidth,
offsetHeight = content.offsetHeight;
var scrollLeft = Math.abs(content.scrollLeft);
var _ref = [getWidth(content), getHeight(content)],
width = _ref[0],
height = _ref[1];
if (this.$pcTabs.isVertical()) {
this.isPrevButtonEnabled = scrollTop !== 0;
this.isNextButtonEnabled = list.offsetHeight >= offsetHeight && parseInt(scrollTop) !== scrollHeight - height;
} else {
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.scrollable && 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: {
ChevronLeftIcon: ChevronLeftIcon,
ChevronRightIcon: ChevronRightIcon
},
directives: {
ripple: Ripple
}
};
var _hoisted_1 = ["data-p"];
var _hoisted_2 = ["aria-label", "tabindex"];
var _hoisted_3 = ["data-p"];
var _hoisted_4 = ["aria-orientation"];
var _hoisted_5 = ["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 || 'ChevronLeftIcon'), 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'),
onScroll: _cache[1] || (_cache[1] = function () {
return $options.onScroll && $options.onScroll.apply($options, arguments);
}),
"data-p": $options.dataP
}, _ctx.ptm('content')), [createElementVNode("div", mergeProps({
ref: "tabs",
"class": _ctx.cx('tabList'),
role: "tablist",
"aria-orientation": $options.$pcTabs.orientation || 'horizontal'
}, _ctx.ptm('tabList')), [renderSlot(_ctx.$slots, "default"), createElementVNode("span", mergeProps({
ref: "inkbar",
"class": _ctx.cx('activeBar'),
role: "presentation",
"aria-hidden": "true"
}, _ctx.ptm('activeBar')), null, 16)], 16, _hoisted_4)], 16, _hoisted_3), $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 || 'ChevronRightIcon'), mergeProps({
"aria-hidden": "true"
}, _ctx.ptm('nextIcon')), null, 16))], 16, _hoisted_5)), [[_directive_ripple]]) : createCommentVNode("", true)], 16, _hoisted_1);
}
script.render = render;
export { script as default };
//# sourceMappingURL=index.mjs.map