@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
96 lines (94 loc) • 3.52 kB
JavaScript
import { mergeRefs } from "../../utils/ref.js";
import { utils_exports } from "../../utils/index.js";
import { conditionProperties } from "../css/conditions.js";
import { styleProperties } from "../css/styles.js";
import { useMemo } from "react";
import isEqual from "react-fast-compare";
//#region src/core/components/props.ts
function isEvent(key) {
return /^on[A-Z]/.test(key);
}
const cssProps = new Set([...conditionProperties, ...styleProperties]);
function createShouldForwardProp(forwardProps = []) {
return function(prop) {
if (forwardProps.includes(prop)) return true;
if (prop.startsWith("--")) return false;
return !cssProps.has(prop);
};
}
function mergeProps(...args) {
return function({ mergeClassName = true, mergeCSS = true, mergeEvent = true, mergeRef = true, mergeStyle = true } = {}) {
let result = {};
for (const props of args) {
for (const key in result) {
if (mergeRef && key === "ref") {
result[key] = mergeRefs(result[key], props[key]);
continue;
}
if (mergeEvent && isEvent(key) && (0, utils_exports.isFunction)(result[key]) && (0, utils_exports.isFunction)(props[key])) {
result[key] = (0, utils_exports.handlerAll)(result[key], props[key]);
continue;
}
if (mergeClassName && (key === "className" || key === "class")) {
result[key] = (0, utils_exports.cx)(result[key], props[key]);
continue;
}
if (mergeStyle && key === "style") {
result[key] = (0, utils_exports.merge)(result[key] ?? {}, props[key] ?? {});
continue;
}
if (mergeCSS && key === "css") {
if ((0, utils_exports.isArray)(result[key])) result[key].push(props[key]);
else {
result[key] ??= [];
result[key] = [result[key], props[key]];
}
continue;
}
result[key] = !(0, utils_exports.isUndefined)(props[key]) ? props[key] : result[key];
}
for (const key in props) if ((0, utils_exports.isUndefined)(result[key])) result[key] = props[key];
}
return result;
};
}
function chainProps(...props) {
return function(options = {}) {
if (!props.length) return (a) => a;
if (props.length === 1) return function(b) {
const a = props[0] ?? {};
return (0, utils_exports.isFunction)(a) ? a(b) : mergeProps(a, b)(options);
};
return props.reduce(function(a, b) {
return function(c = {}) {
const d = (0, utils_exports.isFunction)(a) ? a(c) : mergeProps(a, c)(options);
return (0, utils_exports.isFunction)(b) ? b(d) : mergeProps(b, d)(options);
};
});
};
}
function isEqualProps(a, b, omitKeys = []) {
return isEqual((0, utils_exports.omitObject)(a, omitKeys), (0, utils_exports.omitObject)(b, omitKeys));
}
function useSplitProps(props, keys) {
return useMemo(() => (0, utils_exports.splitObject)(props, keys), [props, keys]);
}
function extractProps(props, keys) {
let result = {};
Object.entries(props).forEach(([key, value]) => {
if (!cssProps.has(key)) return;
if (keys.includes(key)) result = (0, utils_exports.merge)(result, { [key]: value });
else if ((0, utils_exports.isObject)(value)) {
value = extractProps(value, keys);
if ((0, utils_exports.isEmptyObject)(value)) return;
result = (0, utils_exports.merge)(result, { [key]: value });
}
});
return result;
}
function useExtractProps(props, keys) {
return useMemo(() => extractProps(props, keys), [props, keys]);
}
//#endregion
export { chainProps, createShouldForwardProp, cssProps, extractProps, isEqualProps, mergeProps, useExtractProps, useSplitProps };
//# sourceMappingURL=props.js.map