import React, { CSSProperties, forwardRef, HTMLAttributes, useMemo } from 'react';
import cn from 'classnames';
import { ELEVATION_PROPS } from './card_elevation_props';
import merge from 'lodash/merge';
export type CardVariant = 'flat';
const variantClasses = {
variant_flat: 'ds-bg-[#f9f9f9] ds-border ds-border-solid ds-border-[#f0f0f0]',
};
interface Props {
component?: string;
className?: string;
containerRef?: any;
elevation?: 0 | 1 | 'drawer';
style?: CSSProperties;
classes?: { container?: string };
customClasses?: { container?: string };
variant?: CardVariant;
}
const CardComponent = forwardRef & Props>(
(
{
component: Component = 'div',
className,
containerRef,
elevation = 1,
style,
customClasses: oldCustomClasses = {},
classes: receivedClasses = {},
variant,
...other
},
ref
) => {
const mergedClasses = useMemo(() => merge({}, oldCustomClasses, receivedClasses), [
JSON.stringify(oldCustomClasses),
JSON.stringify(receivedClasses),
]);
const stylePropsFromVariant = useMemo(() => {
if (!variant) {
return ELEVATION_PROPS.regular;
}
return ELEVATION_PROPS?.[variant];
}, [variant]);
const styleProps = {
...stylePropsFromVariant?.[elevation],
};
const variantClass = variant && variantClasses[`variant_${variant}` as const];
return React.createElement(Component || 'div', {
ref: containerRef || ref,
className: cn(
'ds-w-fit ds-bg-white ds-rounded ds-p-2.5 ds-font-w3d',
mergedClasses.container,
variantClass,
className
),
style: {
...(stylePropsFromVariant && styleProps),
...style,
} as any,
...other,
});
}
);
export const Card = CardComponent;