@gfazioli/mantine-flip
Version:
Flip component is a wrapper for any component that can be flipped. It is used to create cards, flip boxes and more.
127 lines (123 loc) • 3.89 kB
JavaScript
'use client';
;
var React = require('react');
var core = require('@mantine/core');
var hooks = require('@mantine/hooks');
var Flip_context = require('./Flip.context.cjs');
var FlipTarget = require('./FlipTarget/FlipTarget.cjs');
var Flip_module = require('./Flip.module.css.cjs');
const defaultProps = {
direction: "horizontal",
directionFlipIn: "negative",
directionFlipOut: "positive"
};
const varsResolver = core.createVarsResolver((_, { perspective, easing, duration }) => ({
root: {
"--flip-perspective": perspective === void 0 ? "1000px" : perspective,
"--flip-transition-duration": duration === void 0 ? ".8s" : `${duration}s`,
"--flip-transition-timing-function": easing === void 0 ? "ease-in-out" : easing
}
}));
const Flip = core.polymorphicFactory((_props, ref) => {
const props = core.useProps("Flip", defaultProps, _props);
const {
perspective,
duration,
easing,
classNames,
style,
styles,
unstyled,
vars,
children,
className,
flipped,
defaultFlipped,
direction,
directionFlipIn,
directionFlipOut,
onChange,
onBack,
onFront,
...others
} = props;
const containerRef = React.useRef(null);
const [rotateValue, setRotateValue] = React.useState(defaultFlipped ? -180 : 0);
const [_flipped, setFlipped] = hooks.useUncontrolled({
value: flipped,
defaultValue: defaultFlipped,
finalValue: false,
onChange
});
const getStyles = core.useStyles({
name: "Flip",
props,
classes: Flip_module,
className,
style,
classNames,
styles,
unstyled,
vars,
varsResolver
});
hooks.useDidUpdate(() => {
setRotateValue(0);
}, [directionFlipIn, directionFlipOut, direction]);
hooks.useDidUpdate(() => {
if (directionFlipIn === "negative" && directionFlipOut === "positive") {
setRotateValue((v) => v ? v + 180 : -180);
}
if (directionFlipIn === "negative" && directionFlipOut === "negative") {
setRotateValue((v) => v - 180);
}
if (directionFlipIn === "positive" && directionFlipOut === "negative") {
setRotateValue((v) => v ? v - 180 : 180);
}
if (directionFlipIn === "positive" && directionFlipOut === "positive") {
setRotateValue((v) => v + 180);
}
}, [_flipped]);
const childrenArray = React.Children.toArray(children);
if (childrenArray.length !== 2) {
throw new Error("Flip component must have exactly two children");
}
function getDirectionIn() {
if (direction === "horizontal") {
return { transform: `rotateY(${rotateValue}deg)` };
}
return { transform: `rotateX(${rotateValue}deg)` };
}
function getBackRotation() {
if (direction === "horizontal") {
return { transform: "rotateY(180deg)" };
}
return { transform: "rotateX(180deg)" };
}
const frontChild = childrenArray[0];
const backChild = childrenArray[1];
const front = () => {
setFlipped(false);
_flipped && onFront?.();
};
const back = () => {
setFlipped(true);
!_flipped && onBack?.();
};
const toggleFlip = () => _flipped ? front() : back();
return /* @__PURE__ */ React.createElement(
Flip_context.FlipContextProvider,
{
value: {
toggleFlip,
flipped: _flipped
}
},
/* @__PURE__ */ React.createElement(core.Box, { ref, ...getStyles("root"), ...others }, /* @__PURE__ */ React.createElement("div", { ref: containerRef, ...getStyles("flip-inner"), style: getDirectionIn() }, /* @__PURE__ */ React.createElement("div", { ...getStyles("flip-content"), style: { zIndex: 0 } }, frontChild), /* @__PURE__ */ React.createElement("div", { ...getStyles("flip-content"), style: getBackRotation() }, backChild)))
);
});
Flip.classes = Flip_module;
Flip.displayName = "Flip";
Flip.Target = FlipTarget.FlipTarget;
exports.Flip = Flip;
//# sourceMappingURL=Flip.cjs.map