/*! * ======================================================================== * @rzl-zone/core-react * ------------------------------------------------------------------------ * Version: `0.0.14` * Author: `Rizalvin Dwiky ` * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/core-react` * ======================================================================== */ type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; type MergedProps = { [K in keyof UnionToIntersection]: K extends "className" ? string : K extends "style" ? UnionToIntersection[K] : Exclude[K], undefined> }; /** ------------------------------------------------------------------- * * ***Merges multiple props objects into a single props object with * predictable and React-friendly merging behavior.*** * -------------------------------------------------------------------- * * This utility is designed to safely merge component props where certain * keys require special handling instead of simple overwrites. * * - **Behavior:** * - Concatenates duplicate `className` values with a single space * - Shallow-merges duplicate `style` objects (later props take precedence) * - Chains duplicate function values (commonly event handlers), * executing them from left to right * - Skips merging `undefined` values * - Preserves identical primitive values without reassigning * - Throws an error for unsupported duplicate keys * * Later props in the argument list always have higher precedence * when conflicts occur. * * This makes the function especially suitable for **React / JSX props * composition**, such as combining props from hooks, components, * and user overrides. * * @typeParam T - A tuple of props object types to be merged. * @param props - One or more props objects. Later objects override * earlier ones when applicable. * * @returns A single merged props object with correctly inferred types, * including special handling for `className` and `style`. * * @throws {Error} If duplicate keys other than `className`, `style`, * or function values are encountered. * * @example * ```ts * mergeProps( * { className: "btn", onClick: () => console.log("a") }, * { className: "btn-primary", onClick: () => console.log("b") } * ); * // => { * // className: "btn btn-primary", * // onClick: () => { a(); b(); } * // } * ``` * * @example * ```ts * mergeProps( * { style: { color: "red", fontSize: 12 } }, * { style: { fontSize: 14 } } * ); * // => { style: { color: "red", fontSize: 14 } } * ``` */ declare function mergeProps(...props: T): MergedProps; export { mergeProps };