import { forwardRef, ElementType, ForwardedRef } from 'react';
import { clsx } from 'clsx';
import {
SentimentSurfaceComponentProps,
SentimentSurfaceComponent,
} from './SentimentSurface.types';
import { useTheme } from '@wise/components-theming';
/**
* SentimentSurface is a polymorphic container component that exposes and, optionally, applies
* contextual colour tokens as CSS custom properties, based on sentiment types (`negative`,
* `warning`, `neutral`, `success`, `proposition`).
*
* @param {ElementType} [as='div'] - Optional prop to override the HTML element rendered.
* @param {Sentiment} sentiment - Required prop to set the sentiment type (negative, warning, neutral, success, proposition).
* @param {Emphasis} [emphasis='base'] - Optional prop to specify the emphasis level (base or elevated).
* @param {boolean} [hasBaseStyles=true] - If true, sets the `background-color` and `color` on the container. Otherwise, only exposes the tokens as CSS custom properties without rendering.
* @param {ReactNode} [children] - Content to render inside the surface.
* @param {string} [className] - Additional CSS classes to apply.
* @param {CSSProperties} [style] - Inline styles to apply.
* @param {string} [id] - Unique identifier for the component.
* @param {string} [data-testid] - A unique string that appears as data attribute `data-testid` in the rendered code.
*
* @component
* @example
* ```tsx
* // Basic usage with negative sentiment
*
* Your payment has failed
*
* ```
*
* @see {@link SentimentSurface} for further information.
* @see {@link https://storybook.wise.design/?path=/docs/sentiment-surface--docs|Storybook Wise Design}
*/
// @ts-expect-error - Generic forwardRef limitation. See: https://fettblog.eu/typescript-react-generic-forward-refs/
const SentimentSurface: SentimentSurfaceComponent = forwardRef(function SentimentSurface<
T extends ElementType = 'div',
>(
{
as,
sentiment,
emphasis = 'base',
hasBaseStyles = true,
style,
className,
children,
id,
'data-testid': dataTestId,
...props
}: SentimentSurfaceComponentProps,
ref: ForwardedRef,
) {
const Element = as ?? 'div';
const BASE_CLASS = 'wds-sentiment-surface';
const { className: closestBrandTheme } = useTheme();
const classNames = clsx(
closestBrandTheme,
BASE_CLASS,
`${BASE_CLASS}-${sentiment}-${emphasis}`,
hasBaseStyles && `${BASE_CLASS}--hasBaseStyles`,
className,
);
const sentimentProps = {
ref,
id,
'data-testid': dataTestId,
className: classNames,
style,
...props,
};
return (
// @ts-expect-error - Generic forwardRef limitation. See: https://fettblog.eu/typescript-react-generic-forward-refs/
{children}
);
});
SentimentSurface.displayName = 'SentimentSurface';
export default SentimentSurface;