11import { type ReactNode , type HTMLAttributes } from 'react'
22import { useTranslation } from 'react-i18next'
33import { cn } from '../../lib/cn'
4+ import { Button } from '@/components/ui'
45import { X } from 'lucide-react'
56
67export type AlertVariant = 'info' | 'success' | 'warning' | 'danger'
@@ -20,10 +21,10 @@ export interface AlertBannerProps extends HTMLAttributes<HTMLDivElement> {
2021}
2122
2223const alertVariantMap : Record < AlertVariant , { border : string ; bg : string ; text : string ; titleText : string } > = {
23- info : { border : 'border-neon-cyan/20 ' , bg : 'bg-neon-cyan/5 ' , text : 'text-cyan-800 dark:text-cyan-200 ' , titleText : 'text-cyan-800 dark:text-cyan-300 ' } ,
24- success : { border : 'border-neon-green/20 ' , bg : 'bg-neon-green/5 ' , text : 'text-emerald-800 dark:text-emerald-200 ' , titleText : 'text-emerald-800 dark:text-emerald-300 ' } ,
25- warning : { border : 'border-neon-amber/20 ' , bg : 'bg-neon-amber/5 ' , text : 'text-amber-800 dark:text-amber-200 ' , titleText : 'text-amber-800 dark:text-amber-300 ' } ,
26- danger : { border : 'border-neon-red/20 ' , bg : 'bg-neon-red/5 ' , text : 'text-rose-800 dark:text-rose-200 ' , titleText : 'text-rose-800 dark:text-rose-300 ' } ,
24+ info : { border : 'border-neon-cyan/25 ' , bg : 'bg-neon-cyan/10 ' , text : 'text-cyan-800 dark:text-cyan-100 ' , titleText : 'text-cyan-900 dark:text-cyan-200 ' } ,
25+ success : { border : 'border-neon-green/25 ' , bg : 'bg-neon-green/10 ' , text : 'text-emerald-800 dark:text-emerald-100 ' , titleText : 'text-emerald-900 dark:text-emerald-200 ' } ,
26+ warning : { border : 'border-neon-amber/25 ' , bg : 'bg-neon-amber/10 ' , text : 'text-amber-800 dark:text-amber-100 ' , titleText : 'text-amber-900 dark:text-amber-200 ' } ,
27+ danger : { border : 'border-neon-red/25 ' , bg : 'bg-neon-red/10 ' , text : 'text-rose-800 dark:text-rose-100 ' , titleText : 'text-rose-900 dark:text-rose-200 ' } ,
2728}
2829
2930/**
@@ -49,24 +50,26 @@ export function AlertBanner({ variant, title, children, onClose, icon, className
4950 const { t } = useTranslation ( )
5051 const v = alertVariantMap [ variant ] ?? alertVariantMap . info
5152 return (
52- < div className = { cn ( 'flex items-start gap-3 rounded-xl border p-4 backdrop-blur-sm' , v . border , v . bg , className ) } { ...props } >
53+ < div className = { cn ( 'flex items-start gap-3.5 rounded-panel border p-4 shadow-e1 backdrop-blur-sm' , v . border , v . bg , className ) } { ...props } >
5354 { icon && < div className = { cn ( 'shrink-0 mt-0.5' , v . titleText ) } aria-hidden > { icon } </ div > }
5455 < div className = "flex-1 min-w-0" >
55- { title && < p className = { cn ( 'text-sm font-medium ' , v . titleText ) } > { title } </ p > }
56- < div className = { cn ( 'text-xs ' , v . text , title && 'mt-0.5 ' ) } > { children } </ div >
56+ { title && < p className = { cn ( 'text-sm font-semibold ' , v . titleText ) } > { title } </ p > }
57+ < div className = { cn ( 'text-sm leading-relaxed ' , v . text , title && 'mt-1 ' ) } > { children } </ div >
5758 </ div >
5859 { onClose && (
59- < button
60+ < Button
6061 type = "button"
62+ variant = "ghost"
63+ size = "sm"
6164 onClick = { onClose }
6265 aria-label = { closeLabel ?? t ( 'common.dismiss' , 'Dismiss' ) }
6366 className = { cn (
64- 'shrink-0 rounded-lg p-1.5 transition-colors hover:bg-[var(--surface-2)] focus:outline-none focus-visible:ring-2 focus-visible:ring-current' ,
67+ 'h-8 w-8 shrink-0 rounded-shape-md p-0 transition-colors hover:bg-[var(--surface-2)] focus-visible:ring-current' ,
6568 v . text ,
6669 ) }
6770 >
68- < X className = "h-3.5 w-3.5 " aria-hidden />
69- </ button >
71+ < X className = "h-4 w-4 " aria-hidden />
72+ </ Button >
7073 ) }
7174 </ div >
7275 )
0 commit comments