@radix-ui/react-presence
Advanced tools
Comparing version 1.1.0-rc.2 to 1.1.0-rc.3
"use strict"; | ||
"use client"; | ||
(() => { | ||
var __create = Object.create; | ||
var __defProp = Object.defineProperty; | ||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
var __getOwnPropNames = Object.getOwnPropertyNames; | ||
var __getProtoOf = Object.getPrototypeOf; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { | ||
get: (a, b) => (typeof require !== "undefined" ? require : a)[b] | ||
}) : x)(function(x) { | ||
if (typeof require !== "undefined") return require.apply(this, arguments); | ||
throw Error('Dynamic require of "' + x + '" is not supported'); | ||
}); | ||
var __copyProps = (to, from, except, desc) => { | ||
if (from && typeof from === "object" || typeof from === "function") { | ||
for (let key of __getOwnPropNames(from)) | ||
if (!__hasOwnProp.call(to, key) && key !== except) | ||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
} | ||
return to; | ||
}; | ||
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( | ||
// If the importer is in node compatibility mode or this is not an ESM | ||
// file that has been converted to a CommonJS file using a Babel- | ||
// compatible transform (i.e. "__esModule" has not been set), then set | ||
// "default" to the CommonJS "module.exports" for node compatibility. | ||
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, | ||
mod | ||
)); | ||
var __create = Object.create; | ||
var __defProp = Object.defineProperty; | ||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
var __getOwnPropNames = Object.getOwnPropertyNames; | ||
var __getProtoOf = Object.getPrototypeOf; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __export = (target, all) => { | ||
for (var name in all) | ||
__defProp(target, name, { get: all[name], enumerable: true }); | ||
}; | ||
var __copyProps = (to, from, except, desc) => { | ||
if (from && typeof from === "object" || typeof from === "function") { | ||
for (let key of __getOwnPropNames(from)) | ||
if (!__hasOwnProp.call(to, key) && key !== except) | ||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
} | ||
return to; | ||
}; | ||
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( | ||
// If the importer is in node compatibility mode or this is not an ESM | ||
// file that has been converted to a CommonJS file using a Babel- | ||
// compatible transform (i.e. "__esModule" has not been set), then set | ||
// "default" to the CommonJS "module.exports" for node compatibility. | ||
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, | ||
mod | ||
)); | ||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
// packages/react/presence/src/Presence.tsx | ||
var React2 = __toESM(__require("react")); | ||
var ReactDOM = __toESM(__require("react-dom")); | ||
var import_react_compose_refs = __require("@radix-ui/react-compose-refs"); | ||
var import_react_use_layout_effect = __require("@radix-ui/react-use-layout-effect"); | ||
// packages/react/presence/src/index.ts | ||
var src_exports = {}; | ||
__export(src_exports, { | ||
Presence: () => Presence | ||
}); | ||
module.exports = __toCommonJS(src_exports); | ||
// packages/react/presence/src/useStateMachine.tsx | ||
var React = __toESM(__require("react")); | ||
function useStateMachine(initialState, machine) { | ||
return React.useReducer((state, event) => { | ||
const nextState = machine[state][event]; | ||
return nextState ?? state; | ||
}, initialState); | ||
} | ||
// packages/react/presence/src/Presence.tsx | ||
var React2 = __toESM(require("react")); | ||
var ReactDOM = __toESM(require("react-dom")); | ||
var import_react_compose_refs = require("@radix-ui/react-compose-refs"); | ||
var import_react_use_layout_effect = require("@radix-ui/react-use-layout-effect"); | ||
// packages/react/presence/src/Presence.tsx | ||
var Presence = (props) => { | ||
const { present, children } = props; | ||
const presence = usePresence(present); | ||
const child = typeof children === "function" ? children({ present: presence.isPresent }) : React2.Children.only(children); | ||
const ref = (0, import_react_compose_refs.useComposedRefs)(presence.ref, child.ref); | ||
const forceMount = typeof children === "function"; | ||
return forceMount || presence.isPresent ? React2.cloneElement(child, { ref }) : null; | ||
}; | ||
Presence.displayName = "Presence"; | ||
function usePresence(present) { | ||
const [node, setNode] = React2.useState(); | ||
const stylesRef = React2.useRef({}); | ||
const prevPresentRef = React2.useRef(present); | ||
const prevAnimationNameRef = React2.useRef("none"); | ||
const initialState = present ? "mounted" : "unmounted"; | ||
const [state, send] = useStateMachine(initialState, { | ||
mounted: { | ||
UNMOUNT: "unmounted", | ||
ANIMATION_OUT: "unmountSuspended" | ||
}, | ||
unmountSuspended: { | ||
MOUNT: "mounted", | ||
ANIMATION_END: "unmounted" | ||
}, | ||
unmounted: { | ||
MOUNT: "mounted" | ||
} | ||
}); | ||
React2.useEffect(() => { | ||
const currentAnimationName = getAnimationName(stylesRef.current); | ||
prevAnimationNameRef.current = state === "mounted" ? currentAnimationName : "none"; | ||
}, [state]); | ||
(0, import_react_use_layout_effect.useLayoutEffect)(() => { | ||
const styles = stylesRef.current; | ||
const wasPresent = prevPresentRef.current; | ||
const hasPresentChanged = wasPresent !== present; | ||
if (hasPresentChanged) { | ||
const prevAnimationName = prevAnimationNameRef.current; | ||
const currentAnimationName = getAnimationName(styles); | ||
if (present) { | ||
send("MOUNT"); | ||
} else if (currentAnimationName === "none" || styles?.display === "none") { | ||
// packages/react/presence/src/useStateMachine.tsx | ||
var React = __toESM(require("react")); | ||
function useStateMachine(initialState, machine) { | ||
return React.useReducer((state, event) => { | ||
const nextState = machine[state][event]; | ||
return nextState ?? state; | ||
}, initialState); | ||
} | ||
// packages/react/presence/src/Presence.tsx | ||
var Presence = (props) => { | ||
const { present, children } = props; | ||
const presence = usePresence(present); | ||
const child = typeof children === "function" ? children({ present: presence.isPresent }) : React2.Children.only(children); | ||
const ref = (0, import_react_compose_refs.useComposedRefs)(presence.ref, child.ref); | ||
const forceMount = typeof children === "function"; | ||
return forceMount || presence.isPresent ? React2.cloneElement(child, { ref }) : null; | ||
}; | ||
Presence.displayName = "Presence"; | ||
function usePresence(present) { | ||
const [node, setNode] = React2.useState(); | ||
const stylesRef = React2.useRef({}); | ||
const prevPresentRef = React2.useRef(present); | ||
const prevAnimationNameRef = React2.useRef("none"); | ||
const initialState = present ? "mounted" : "unmounted"; | ||
const [state, send] = useStateMachine(initialState, { | ||
mounted: { | ||
UNMOUNT: "unmounted", | ||
ANIMATION_OUT: "unmountSuspended" | ||
}, | ||
unmountSuspended: { | ||
MOUNT: "mounted", | ||
ANIMATION_END: "unmounted" | ||
}, | ||
unmounted: { | ||
MOUNT: "mounted" | ||
} | ||
}); | ||
React2.useEffect(() => { | ||
const currentAnimationName = getAnimationName(stylesRef.current); | ||
prevAnimationNameRef.current = state === "mounted" ? currentAnimationName : "none"; | ||
}, [state]); | ||
(0, import_react_use_layout_effect.useLayoutEffect)(() => { | ||
const styles = stylesRef.current; | ||
const wasPresent = prevPresentRef.current; | ||
const hasPresentChanged = wasPresent !== present; | ||
if (hasPresentChanged) { | ||
const prevAnimationName = prevAnimationNameRef.current; | ||
const currentAnimationName = getAnimationName(styles); | ||
if (present) { | ||
send("MOUNT"); | ||
} else if (currentAnimationName === "none" || styles?.display === "none") { | ||
send("UNMOUNT"); | ||
} else { | ||
const isAnimating = prevAnimationName !== currentAnimationName; | ||
if (wasPresent && isAnimating) { | ||
send("ANIMATION_OUT"); | ||
} else { | ||
send("UNMOUNT"); | ||
} else { | ||
const isAnimating = prevAnimationName !== currentAnimationName; | ||
if (wasPresent && isAnimating) { | ||
send("ANIMATION_OUT"); | ||
} else { | ||
send("UNMOUNT"); | ||
} | ||
} | ||
prevPresentRef.current = present; | ||
} | ||
}, [present, send]); | ||
(0, import_react_use_layout_effect.useLayoutEffect)(() => { | ||
if (node) { | ||
const handleAnimationEnd = (event) => { | ||
const currentAnimationName = getAnimationName(stylesRef.current); | ||
const isCurrentAnimation = currentAnimationName.includes(event.animationName); | ||
if (event.target === node && isCurrentAnimation) { | ||
ReactDOM.flushSync(() => send("ANIMATION_END")); | ||
} | ||
}; | ||
const handleAnimationStart = (event) => { | ||
if (event.target === node) { | ||
prevAnimationNameRef.current = getAnimationName(stylesRef.current); | ||
} | ||
}; | ||
node.addEventListener("animationstart", handleAnimationStart); | ||
node.addEventListener("animationcancel", handleAnimationEnd); | ||
node.addEventListener("animationend", handleAnimationEnd); | ||
return () => { | ||
node.removeEventListener("animationstart", handleAnimationStart); | ||
node.removeEventListener("animationcancel", handleAnimationEnd); | ||
node.removeEventListener("animationend", handleAnimationEnd); | ||
}; | ||
} else { | ||
send("ANIMATION_END"); | ||
} | ||
}, [node, send]); | ||
return { | ||
isPresent: ["mounted", "unmountSuspended"].includes(state), | ||
ref: React2.useCallback((node2) => { | ||
if (node2) stylesRef.current = getComputedStyle(node2); | ||
setNode(node2); | ||
}, []) | ||
}; | ||
} | ||
function getAnimationName(styles) { | ||
return styles?.animationName || "none"; | ||
} | ||
})(); | ||
prevPresentRef.current = present; | ||
} | ||
}, [present, send]); | ||
(0, import_react_use_layout_effect.useLayoutEffect)(() => { | ||
if (node) { | ||
const handleAnimationEnd = (event) => { | ||
const currentAnimationName = getAnimationName(stylesRef.current); | ||
const isCurrentAnimation = currentAnimationName.includes(event.animationName); | ||
if (event.target === node && isCurrentAnimation) { | ||
ReactDOM.flushSync(() => send("ANIMATION_END")); | ||
} | ||
}; | ||
const handleAnimationStart = (event) => { | ||
if (event.target === node) { | ||
prevAnimationNameRef.current = getAnimationName(stylesRef.current); | ||
} | ||
}; | ||
node.addEventListener("animationstart", handleAnimationStart); | ||
node.addEventListener("animationcancel", handleAnimationEnd); | ||
node.addEventListener("animationend", handleAnimationEnd); | ||
return () => { | ||
node.removeEventListener("animationstart", handleAnimationStart); | ||
node.removeEventListener("animationcancel", handleAnimationEnd); | ||
node.removeEventListener("animationend", handleAnimationEnd); | ||
}; | ||
} else { | ||
send("ANIMATION_END"); | ||
} | ||
}, [node, send]); | ||
return { | ||
isPresent: ["mounted", "unmountSuspended"].includes(state), | ||
ref: React2.useCallback((node2) => { | ||
if (node2) stylesRef.current = getComputedStyle(node2); | ||
setNode(node2); | ||
}, []) | ||
}; | ||
} | ||
function getAnimationName(styles) { | ||
return styles?.animationName || "none"; | ||
} | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@radix-ui/react-presence", | ||
"version": "1.1.0-rc.2", | ||
"version": "1.1.0-rc.3", | ||
"license": "MIT", | ||
@@ -31,4 +31,4 @@ "exports": { | ||
"dependencies": { | ||
"@radix-ui/react-compose-refs": "1.1.0-rc.2", | ||
"@radix-ui/react-use-layout-effect": "1.1.0-rc.2" | ||
"@radix-ui/react-compose-refs": "1.1.0-rc.3", | ||
"@radix-ui/react-use-layout-effect": "1.1.0-rc.3" | ||
}, | ||
@@ -35,0 +35,0 @@ "peerDependencies": { |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
260
0
29878
+ Added@radix-ui/react-compose-refs@1.1.0-rc.3(transitive)
+ Added@radix-ui/react-use-layout-effect@1.1.0-rc.3(transitive)
- Removed@radix-ui/react-compose-refs@1.1.0-rc.2(transitive)
- Removed@radix-ui/react-use-layout-effect@1.1.0-rc.2(transitive)