'use client'
import { createElement, forwardRef } from 'react'
import classNames from 'classnames'
import {
getLayoutStyles,
getMarginStyles,
splitByLayoutProps,
splitByMarginProps,
} from '~/src/types/props-helpers'
import { type BoxProps } from './Box.types'
import styles from './Box.module.scss'
/**
* `Box` is a primitive layout component. It provides an easy way to access design tokens.
* @example
*
* ```tsx
*
* { ... }
*
* ```
*/
export const Box = forwardRef(
function Box(props, forwardedRef) {
const [marginProps, marginRest] = splitByMarginProps(props)
const [layoutProps, layoutRest] = splitByLayoutProps(marginRest)
const marginStyles = getMarginStyles(marginProps)
const layoutStyles = getLayoutStyles(layoutProps)
const {
children,
style,
className,
as = 'div',
display,
...rest
} = layoutRest
/**
* NOTE: Using the createElement function directly because of a ref type related error.
* TODO: Fix type error.
*/
return createElement(
as,
{
ref: forwardedRef,
style: {
...marginStyles.style,
...layoutStyles.style,
...style,
},
className: classNames(
styles.Box,
display && styles[`display-${display}`],
marginStyles.className,
layoutStyles.className,
className
),
'data-testid': 'bezier-box',
...rest,
},
children
)
}
)