Files
avz-site/node_modules/@radix-ui/react-slot/dist/index.mjs
T
2026-06-10 12:14:46 -03:00

138 lines
5.5 KiB
JavaScript

// src/slot.tsx
import * as React from "react";
import { useComposedRefs } from "@radix-ui/react-compose-refs";
// @__NO_SIDE_EFFECTS__
function createSlot(ownerName) {
const Slot2 = React.forwardRef((props, forwardedRef) => {
let { children, ...slotProps } = props;
let slottableElement = null;
let hasSlottable = false;
const newChildren = [];
if (isLazyComponent(children) && typeof use === "function") {
children = use(children._payload);
}
React.Children.forEach(children, (maybeSlottable) => {
if (isSlottable(maybeSlottable)) {
hasSlottable = true;
const slottable = maybeSlottable;
let child = "child" in slottable.props ? slottable.props.child : slottable.props.children;
if (isLazyComponent(child) && typeof use === "function") {
child = use(child._payload);
}
slottableElement = getSlottableElementFromSlottable(slottable, child);
newChildren.push(slottableElement?.props?.children);
} else {
newChildren.push(maybeSlottable);
}
});
if (slottableElement) {
slottableElement = React.cloneElement(slottableElement, void 0, newChildren);
} else if (
// A `Slottable` was found but it didn't resolve to a single element (e.g.
// it wrapped multiple elements, text, or a render-prop `child` that
// wasn't an element). Don't fall back to treating the `Slottable` wrapper
// itself as the slot target — throw a descriptive error below instead.
!hasSlottable && React.Children.count(children) === 1 && React.isValidElement(children)
) {
slottableElement = children;
}
const slottableElementRef = slottableElement ? getElementRef(slottableElement) : void 0;
const composedRef = useComposedRefs(forwardedRef, slottableElementRef);
if (!slottableElement) {
if (children || children === 0) {
throw new Error(
hasSlottable ? createSlottableError(ownerName) : createSlotError(ownerName)
);
}
return children;
}
const mergedProps = mergeProps(slotProps, slottableElement.props ?? {});
if (slottableElement.type !== React.Fragment) {
mergedProps.ref = forwardedRef ? composedRef : slottableElementRef;
}
return React.cloneElement(slottableElement, mergedProps);
});
Slot2.displayName = `${ownerName}.Slot`;
return Slot2;
}
var Slot = /* @__PURE__ */ createSlot("Slot");
var SLOTTABLE_IDENTIFIER = Symbol.for("radix.slottable");
// @__NO_SIDE_EFFECTS__
function createSlottable(ownerName) {
const Slottable2 = (props) => "child" in props ? props.children(props.child) : props.children;
Slottable2.displayName = `${ownerName}.Slottable`;
Slottable2.__radixId = SLOTTABLE_IDENTIFIER;
return Slottable2;
}
var Slottable = /* @__PURE__ */ createSlottable("Slottable");
var getSlottableElementFromSlottable = (slottable, child) => {
if ("child" in slottable.props) {
const child2 = slottable.props.child;
if (!React.isValidElement(child2)) return null;
return React.cloneElement(child2, void 0, slottable.props.children(child2.props.children));
}
return React.isValidElement(child) ? child : null;
};
function mergeProps(slotProps, childProps) {
const overrideProps = { ...childProps };
for (const propName in childProps) {
const slotPropValue = slotProps[propName];
const childPropValue = childProps[propName];
const isHandler = /^on[A-Z]/.test(propName);
if (isHandler) {
if (slotPropValue && childPropValue) {
overrideProps[propName] = (...args) => {
const result = childPropValue(...args);
slotPropValue(...args);
return result;
};
} else if (slotPropValue) {
overrideProps[propName] = slotPropValue;
}
} else if (propName === "style") {
overrideProps[propName] = { ...slotPropValue, ...childPropValue };
} else if (propName === "className") {
overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
}
}
return { ...slotProps, ...overrideProps };
}
function getElementRef(element) {
let getter = Object.getOwnPropertyDescriptor(element.props, "ref")?.get;
let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.ref;
}
getter = Object.getOwnPropertyDescriptor(element, "ref")?.get;
mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.props.ref;
}
return element.props.ref || element.ref;
}
function isSlottable(child) {
return React.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
}
var REACT_LAZY_TYPE = Symbol.for("react.lazy");
function isLazyComponent(element) {
return element != null && typeof element === "object" && "$$typeof" in element && element.$$typeof === REACT_LAZY_TYPE && "_payload" in element && isPromiseLike(element._payload);
}
function isPromiseLike(value) {
return typeof value === "object" && value !== null && "then" in value;
}
var createSlotError = (ownerName) => {
return `${ownerName} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`;
};
var createSlottableError = (ownerName) => {
return `${ownerName} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`;
};
var use = React[" use ".trim().toString()];
export {
Slot as Root,
Slot,
Slottable,
createSlot,
createSlottable
};
//# sourceMappingURL=index.mjs.map