UNPKG

@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
'use client'; 'use strict'; 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