UNPKG

@pandacss/studio

Version:

The automated token documentation for Panda CSS

81 lines (63 loc) 2.91 kB
import { createElement, forwardRef, useMemo } from 'react' import { css, cx, cva } from '../css/index.mjs'; import { defaultShouldForwardProp, composeShouldForwardProps, composeCvaFn, getDisplayName } from './factory-helper.mjs'; import { splitProps, normalizeHTMLProps } from '../helpers.mjs'; import { isCssProperty } from './is-valid-prop.mjs'; function styledFn(Dynamic, configOrCva = {}, options = {}) { const cvaFn = configOrCva.__cva__ || configOrCva.__recipe__ ? configOrCva : cva(configOrCva) const forwardFn = options.shouldForwardProp || defaultShouldForwardProp const shouldForwardProp = (prop) => forwardFn(prop, cvaFn.variantKeys) const defaultProps = Object.assign( options.dataAttr && configOrCva.__name__ ? { 'data-recipe': configOrCva.__name__ } : {}, options.defaultProps, ) const __cvaFn__ = composeCvaFn(Dynamic.__cva__, cvaFn) const __shouldForwardProps__ = composeShouldForwardProps(Dynamic, shouldForwardProp) const __base__ = Dynamic.__base__ || Dynamic const PandaComponent = /* @__PURE__ */ forwardRef(function PandaComponent(props, ref) { const { as: Element = __base__, children, ...restProps } = props const combinedProps = useMemo(() => Object.assign({}, defaultProps, restProps), [restProps]) const [htmlProps, forwardedProps, variantProps, styleProps, elementProps] = useMemo(() => { return splitProps(combinedProps, normalizeHTMLProps.keys, __shouldForwardProps__, __cvaFn__.variantKeys, isCssProperty) }, [combinedProps]) function recipeClass() { const { css: cssStyles, ...propStyles } = styleProps const compoundVariantStyles = __cvaFn__.__getCompoundVariantCss__?.(variantProps) return cx(__cvaFn__(variantProps, false), css(compoundVariantStyles, propStyles, cssStyles), combinedProps.className) } function cvaClass() { const { css: cssStyles, ...propStyles } = styleProps const cvaStyles = __cvaFn__.raw(variantProps) return cx(css(cvaStyles, propStyles, cssStyles), combinedProps.className) } const classes = configOrCva.__recipe__ ? recipeClass : cvaClass return createElement(Element, { ref, ...forwardedProps, ...elementProps, ...normalizeHTMLProps(htmlProps), className: classes(), }, combinedProps.children ?? children) }) const name = getDisplayName(__base__) PandaComponent.displayName = `panda.${name}` PandaComponent.__cva__ = __cvaFn__ PandaComponent.__base__ = __base__ PandaComponent.__shouldForwardProps__ = shouldForwardProp return PandaComponent } function createJsxFactory() { const cache = new Map() return new Proxy(styledFn, { apply(_, __, args) { return styledFn(...args) }, get(_, el) { if (!cache.has(el)) { cache.set(el, styledFn(el)) } return cache.get(el) }, }) } export const panda = /* @__PURE__ */ createJsxFactory()