157 lines
6.4 KiB
JavaScript
157 lines
6.4 KiB
JavaScript
'use client';
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
Object.defineProperty(exports, "useTabAnimatedIndicatorStyles_unstable", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return useTabAnimatedIndicatorStyles_unstable;
|
|
}
|
|
});
|
|
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
|
|
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
const _react1 = require("@griffel/react");
|
|
const _TabListContext = require("../TabList/TabListContext");
|
|
const _reactutilities = require("@fluentui/react-utilities");
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
const tabIndicatorCssVars_unstable = {
|
|
offsetVar: '--fui-Tab__indicator--offset',
|
|
scaleVar: '--fui-Tab__indicator--scale'
|
|
};
|
|
const useActiveIndicatorStyles = /*#__PURE__*/ (0, _react1.__styles)({
|
|
base: {
|
|
B68tc82: 0,
|
|
Bmxbyg5: 0,
|
|
Bpg54ce: "f1gl81tg"
|
|
},
|
|
animated: {
|
|
Ba2ppi3: "fhwpy7i",
|
|
F2fol1: "f6zz20j",
|
|
B1dyfl9: "f1ai4sc1",
|
|
Bu93a1u: "f1rnm8gg",
|
|
Bdasjez: "f1x3cmqg"
|
|
},
|
|
horizontal: {
|
|
sjv3b2: [
|
|
"fug4aj8",
|
|
"f1i5xzg7"
|
|
],
|
|
b1kco5: "f1q7ujh"
|
|
},
|
|
vertical: {
|
|
sjv3b2: "f1hqboyk",
|
|
b1kco5: "f1dxupa6"
|
|
}
|
|
}, {
|
|
d: [
|
|
[
|
|
".f1gl81tg{overflow:visible;}",
|
|
{
|
|
p: -1
|
|
}
|
|
],
|
|
".fhwpy7i::after{transition-property:transform;}",
|
|
".f6zz20j::after{transition-duration:var(--durationSlow);}",
|
|
".f1ai4sc1::after{transition-timing-function:var(--curveDecelerateMax);}",
|
|
".fug4aj8::after{transform-origin:left;}",
|
|
".f1i5xzg7::after{transform-origin:right;}",
|
|
".f1q7ujh::after{transform:translateX(var(--fui-Tab__indicator--offset)) scaleX(var(--fui-Tab__indicator--scale));}",
|
|
".f1hqboyk::after{transform-origin:top;}",
|
|
".f1dxupa6::after{transform:translateY(var(--fui-Tab__indicator--offset)) scaleY(var(--fui-Tab__indicator--scale));}"
|
|
],
|
|
m: [
|
|
[
|
|
"@media (prefers-reduced-motion: reduce){.f1rnm8gg::after{transition-property:none;}}",
|
|
{
|
|
m: "(prefers-reduced-motion: reduce)"
|
|
}
|
|
],
|
|
[
|
|
"@media (prefers-reduced-motion: reduce){.f1x3cmqg::after{transition-duration:0.01ms;}}",
|
|
{
|
|
m: "(prefers-reduced-motion: reduce)"
|
|
}
|
|
]
|
|
]
|
|
});
|
|
const calculateTabRect = (element)=>{
|
|
if (element) {
|
|
var _element_parentElement;
|
|
const parentRect = ((_element_parentElement = element.parentElement) === null || _element_parentElement === void 0 ? void 0 : _element_parentElement.getBoundingClientRect()) || {
|
|
x: 0,
|
|
y: 0,
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
const tabRect = element.getBoundingClientRect();
|
|
return {
|
|
x: tabRect.x - parentRect.x,
|
|
y: tabRect.y - parentRect.y,
|
|
width: tabRect.width,
|
|
height: tabRect.height
|
|
};
|
|
}
|
|
return undefined;
|
|
};
|
|
const getRegisteredTabRect = (registeredTabs, value)=>{
|
|
var _registeredTabs_JSON_stringify;
|
|
const element = isValueDefined(value) ? (_registeredTabs_JSON_stringify = registeredTabs[JSON.stringify(value)]) === null || _registeredTabs_JSON_stringify === void 0 ? void 0 : _registeredTabs_JSON_stringify.ref.current : undefined;
|
|
return element ? calculateTabRect(element) : undefined;
|
|
};
|
|
// eslint-disable-next-line eqeqeq
|
|
const isValueDefined = (value)=>value != null;
|
|
const useTabAnimatedIndicatorStyles_unstable = (state)=>{
|
|
const { disabled, selected, vertical } = state;
|
|
const activeIndicatorStyles = useActiveIndicatorStyles();
|
|
const [lastAnimatedFrom, setLastAnimatedFrom] = _react.useState();
|
|
const [animationValues, setAnimationValues] = _react.useState({
|
|
offset: 0,
|
|
scale: 1
|
|
});
|
|
const getRegisteredTabs = (0, _TabListContext.useTabListContext_unstable)((ctx)=>ctx.getRegisteredTabs);
|
|
const [requestAnimationFrame] = (0, _reactutilities.useAnimationFrame)();
|
|
if (selected) {
|
|
const { previousSelectedValue, selectedValue, registeredTabs } = getRegisteredTabs();
|
|
if (isValueDefined(previousSelectedValue) && lastAnimatedFrom !== previousSelectedValue) {
|
|
const previousSelectedTabRect = getRegisteredTabRect(registeredTabs, previousSelectedValue);
|
|
const selectedTabRect = getRegisteredTabRect(registeredTabs, selectedValue);
|
|
if (selectedTabRect && previousSelectedTabRect) {
|
|
const offset = vertical ? previousSelectedTabRect.y - selectedTabRect.y : previousSelectedTabRect.x - selectedTabRect.x;
|
|
const scale = vertical ? previousSelectedTabRect.height / selectedTabRect.height : previousSelectedTabRect.width / selectedTabRect.width;
|
|
setAnimationValues({
|
|
offset,
|
|
scale
|
|
});
|
|
setLastAnimatedFrom(previousSelectedValue);
|
|
// Reset the animation values after the animation is complete
|
|
requestAnimationFrame(()=>setAnimationValues({
|
|
offset: 0,
|
|
scale: 1
|
|
}));
|
|
}
|
|
}
|
|
} else if (isValueDefined(lastAnimatedFrom)) {
|
|
// need to clear the last animated from so that if this tab is selected again
|
|
// from the same previous tab as last time, that animation still happens.
|
|
setLastAnimatedFrom(undefined);
|
|
}
|
|
// do not apply any animation if the tab is disabled
|
|
if (disabled) {
|
|
return state;
|
|
}
|
|
// the animation should only happen as the selection indicator returns to its
|
|
// original position and not when set at the previous tabs position.
|
|
const animating = animationValues.offset === 0 && animationValues.scale === 1;
|
|
state.root.className = (0, _react1.mergeClasses)(state.root.className, selected && activeIndicatorStyles.base, selected && animating && activeIndicatorStyles.animated, selected && (vertical ? activeIndicatorStyles.vertical : activeIndicatorStyles.horizontal));
|
|
const rootCssVars = {
|
|
[tabIndicatorCssVars_unstable.offsetVar]: `${animationValues.offset}px`,
|
|
[tabIndicatorCssVars_unstable.scaleVar]: `${animationValues.scale}`
|
|
};
|
|
state.root.style = {
|
|
...rootCssVars,
|
|
...state.root.style
|
|
};
|
|
return state;
|
|
};
|