forked from cerc-io/snowballtools-base
🔧 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