🔧 chore: wip simple toast render
This commit is contained in:
parent
98a4d7be07
commit
d3013719e6
@ -0,0 +1,48 @@
|
||||
import { VariantProps, tv } from 'tailwind-variants';
|
||||
|
||||
export const simpleToastTheme = tv(
|
||||
{
|
||||
slots: {
|
||||
wrapper: [
|
||||
'flex',
|
||||
'py-2',
|
||||
'pl-2',
|
||||
'pr-1.5',
|
||||
'gap-2',
|
||||
'rounded-full',
|
||||
'mx-auto',
|
||||
'mt-3',
|
||||
'w-fit',
|
||||
'overflow-hidden',
|
||||
'bg-surface-high-contrast',
|
||||
'shadow-sm',
|
||||
],
|
||||
icon: ['flex', 'items-center', 'justify-center', 'w-5', 'h-5'],
|
||||
title: ['text-sm', 'text-elements-on-high-contrast'],
|
||||
},
|
||||
variants: {
|
||||
variant: {
|
||||
success: {
|
||||
icon: ['text-elements-success'],
|
||||
},
|
||||
error: {
|
||||
icon: ['text-elements-danger'],
|
||||
},
|
||||
warning: {
|
||||
icon: ['text-elements-warning'],
|
||||
},
|
||||
info: {
|
||||
icon: ['text-elements-info'],
|
||||
},
|
||||
loading: {
|
||||
icon: ['text-elements-info'],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
responsiveVariants: true,
|
||||
},
|
||||
);
|
||||
|
||||
export type SimpleToastTheme = VariantProps<typeof simpleToastTheme>;
|
@ -0,0 +1,43 @@
|
||||
import React, { useMemo } from 'react';
|
||||
import * as ToastPrimitive from '@radix-ui/react-toast';
|
||||
import { ToastProps } from '@radix-ui/react-toast';
|
||||
import { simpleToastTheme, type SimpleToastTheme } from './SimpleToast.theme';
|
||||
import { CheckIcon, CheckRoundFilledIcon } from 'components/shared/CustomIcon';
|
||||
import { cloneIcon } from 'utils/cloneIcon';
|
||||
|
||||
export interface SimpleToastProps extends ToastProps {
|
||||
title: string;
|
||||
variant?: SimpleToastTheme['variant'];
|
||||
}
|
||||
|
||||
export const SimpleToast = ({
|
||||
className,
|
||||
title,
|
||||
variant = 'success',
|
||||
...props
|
||||
}: SimpleToastProps) => {
|
||||
const {
|
||||
wrapper: wrapperCls,
|
||||
icon: iconCls,
|
||||
title: titleCls,
|
||||
} = simpleToastTheme({ variant });
|
||||
|
||||
const Icon = useMemo(() => {
|
||||
if (variant === 'success') return <CheckRoundFilledIcon />;
|
||||
if (variant === 'error') return <CheckIcon />;
|
||||
if (variant === 'warning') return <CheckIcon />;
|
||||
if (variant === 'info') return <CheckIcon />;
|
||||
return <CheckIcon />; // variant === 'loading'
|
||||
}, [variant]);
|
||||
|
||||
return (
|
||||
<ToastPrimitive.Root {...props} asChild>
|
||||
<div className={wrapperCls({ class: className })}>
|
||||
{cloneIcon(Icon, { className: iconCls() })}
|
||||
<ToastPrimitive.Title asChild>
|
||||
<p className={titleCls()}>{title}</p>
|
||||
</ToastPrimitive.Title>
|
||||
</div>
|
||||
</ToastPrimitive.Root>
|
||||
);
|
||||
};
|
Loading…
Reference in New Issue
Block a user