@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
106 lines (104 loc) • 4.39 kB
JavaScript
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
const require_ref = require('../../utils/ref.cjs');
const require_utils_index = require('../../utils/index.cjs');
const require_conditions = require('../css/conditions.cjs');
const require_styles = require('../css/styles.cjs');
let react = require("react");
react = require_rolldown_runtime.__toESM(react);
let react_fast_compare = require("react-fast-compare");
react_fast_compare = require_rolldown_runtime.__toESM(react_fast_compare);
//#region src/core/components/props.ts
function isEvent(key) {
return /^on[A-Z]/.test(key);
}
const cssProps = new Set([...require_conditions.conditionProperties, ...require_styles.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] = require_ref.mergeRefs(result[key], props[key]);
continue;
}
if (mergeEvent && isEvent(key) && (0, require_utils_index.utils_exports.isFunction)(result[key]) && (0, require_utils_index.utils_exports.isFunction)(props[key])) {
result[key] = (0, require_utils_index.utils_exports.handlerAll)(result[key], props[key]);
continue;
}
if (mergeClassName && (key === "className" || key === "class")) {
result[key] = (0, require_utils_index.utils_exports.cx)(result[key], props[key]);
continue;
}
if (mergeStyle && key === "style") {
result[key] = (0, require_utils_index.utils_exports.merge)(result[key] ?? {}, props[key] ?? {});
continue;
}
if (mergeCSS && key === "css") {
if ((0, require_utils_index.utils_exports.isArray)(result[key])) result[key].push(props[key]);
else {
result[key] ??= [];
result[key] = [result[key], props[key]];
}
continue;
}
result[key] = !(0, require_utils_index.utils_exports.isUndefined)(props[key]) ? props[key] : result[key];
}
for (const key in props) if ((0, require_utils_index.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, require_utils_index.utils_exports.isFunction)(a) ? a(b) : mergeProps(a, b)(options);
};
return props.reduce(function(a, b) {
return function(c = {}) {
const d = (0, require_utils_index.utils_exports.isFunction)(a) ? a(c) : mergeProps(a, c)(options);
return (0, require_utils_index.utils_exports.isFunction)(b) ? b(d) : mergeProps(b, d)(options);
};
});
};
}
function isEqualProps(a, b, omitKeys = []) {
return (0, react_fast_compare.default)((0, require_utils_index.utils_exports.omitObject)(a, omitKeys), (0, require_utils_index.utils_exports.omitObject)(b, omitKeys));
}
function useSplitProps(props, keys) {
return (0, react.useMemo)(() => (0, require_utils_index.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, require_utils_index.utils_exports.merge)(result, { [key]: value });
else if ((0, require_utils_index.utils_exports.isObject)(value)) {
value = extractProps(value, keys);
if ((0, require_utils_index.utils_exports.isEmptyObject)(value)) return;
result = (0, require_utils_index.utils_exports.merge)(result, { [key]: value });
}
});
return result;
}
function useExtractProps(props, keys) {
return (0, react.useMemo)(() => extractProps(props, keys), [props, keys]);
}
//#endregion
exports.chainProps = chainProps;
exports.createShouldForwardProp = createShouldForwardProp;
exports.cssProps = cssProps;
exports.extractProps = extractProps;
exports.isEqualProps = isEqualProps;
exports.mergeProps = mergeProps;
exports.useExtractProps = useExtractProps;
exports.useSplitProps = useSplitProps;
//# sourceMappingURL=props.cjs.map