UNPKG

@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
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