UNPKG

@base-ui-components/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

48 lines 1.51 kB
import * as React from 'react'; import { getStyleHookProps } from './getStyleHookProps.js'; import { resolveClassName } from './resolveClassName.js'; import { evaluateRenderProp } from './evaluateRenderProp.js'; import { useRenderPropForkRef } from './useRenderPropForkRef.js'; import { defaultRenderFunctions } from './defaultRenderFunctions.js'; /** * Returns a function that renders a Base UI component. * * @ignore - internal hook. */ export function useComponentRenderer(settings) { const { render: renderProp, className: classNameProp, state, ref, propGetter = props => props, extraProps, customStyleHookMapping } = settings; const className = resolveClassName(classNameProp, state); const styleHooks = React.useMemo(() => { return getStyleHookProps(state, customStyleHookMapping); }, [state, customStyleHookMapping]); const ownProps = { ...styleHooks, ...extraProps }; let resolvedRenderProp; if (typeof renderProp === 'string') { resolvedRenderProp = defaultRenderFunctions[renderProp]; } else { resolvedRenderProp = renderProp; } const renderedElementProps = propGetter(ownProps); const propsWithRef = { ...renderedElementProps, ref: useRenderPropForkRef(resolvedRenderProp, ref, renderedElementProps.ref) }; if (className !== undefined) { propsWithRef.className = className; } const renderElement = () => evaluateRenderProp(resolvedRenderProp, propsWithRef, state); return { renderElement }; }