import { useMemo } from 'react' import { flattenDeep, omit, compact } from 'es-toolkit' export interface StyleProps { styles?: StyleDefinition style?: React.CSSProperties } export type StyleMap = Record export type StyleFunc = (...deps: D) => StyleMap export type StyleDefinition = | undefined | StyleMap | StyleFunc | StyleDefinition[] type FlatStyleList = (StyleMap | StyleFunc)[] const composeStyles = ( ...stylesList: StyleDefinition[] ): StyleFunc => { return (...deps: D) => { const computedStyles: StyleMap = {} const flatStylesList: FlatStyleList = compact( flattenDeep(stylesList as any) ) for (const i in flatStylesList) { const styles = flatStylesList[i] const result = typeof styles === 'function' ? styles(...deps) : styles for (const elem in result) { if (computedStyles[elem] === undefined) computedStyles[elem] = {} Object.assign(computedStyles[elem], result[elem]) } } return computedStyles } } const useStyles =

, R extends any[] = []>( styles: StyleDefinition<[P, ...R]>, [props, ...restDeps]: [P, ...R] ): StyleMap => { const computeStyles = useMemo(() => { const items: StyleDefinition<[P, ...R]>[] = [styles, props.styles] if (props.style !== undefined) items.push({ root: props.style }) return composeStyles(items) }, [styles, props.styles, props.style]) return useMemo( () => computeStyles(props, ...restDeps), [props, ...restDeps] ) } const omitStyleProps =

( props: P ): Omit => // @ts-ignore omit(props, ['style', 'styles']) as Omit /* const extendComponentStyles = (Component, styles) => forwardRef((props, ref) => ( )) */ export { composeStyles, useStyles, omitStyleProps }