'use client' import { createElement, forwardRef } from 'react' import classNames from 'classnames' import { getLayoutStyles, getMarginStyles, splitByLayoutProps, splitByMarginProps, } from '~/src/types/props-helpers' import { cssDimension } from '~/src/utils/style' import type { HStackProps, StackProps, VStackProps } from './Stack.types' import styles from './Stack.module.scss' /** * `Stack` is a layout component used to group elements together and apply a space between them. * @example * * ```tsx * *
{ ... }
*
{ ... }
*
* ``` */ export const Stack = forwardRef( function Stack(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 = 'flex', direction, justify, align, spacing, reverse, wrap, ...rest } = layoutRest return createElement( as, { ref: forwardedRef, style: { '--b-stack-spacing': cssDimension(spacing), ...marginStyles.style, ...layoutStyles.style, ...style, }, className: classNames( styles.Stack, display && styles[`display-${display}`], direction && styles[`direction-${direction}`], justify && styles[`justify-${justify}`], align && styles[`align-${align}`], reverse && styles.reverse, wrap && styles.wrap, marginStyles.className, layoutStyles.className, className ), 'data-testid': 'bezier-stack', ...rest, }, children ) } ) /** * `HStack` is a shorthand component equivalent to `Stack` with a horizontal direction property. * @see Stack */ export const HStack = forwardRef( function HStack(props, forwardedRef) { return createElement(Stack, { ...props, direction: 'horizontal', ref: forwardedRef, }) } ) /** * `VStack` is a shorthand component equivalent to `Stack` with a vertical direction property. * @see Stack */ export const VStack = forwardRef( function VStack(props, forwardedRef) { return createElement(Stack, { ...props, direction: 'vertical', ref: forwardedRef, }) } )