'use client'; import { AlertCircleIcon, CheckCircleIcon, DownloadIcon, InfoIcon, SaveIcon, SendIcon, TrashIcon, UploadIcon, UserPlusIcon, XCircleIcon, } from 'lucide-react'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { Input } from '@kit/ui/input'; import { Label } from '@kit/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@kit/ui/select'; import { Toaster, toast } from '@kit/ui/sonner'; import { Switch } from '@kit/ui/switch'; import { Textarea } from '@kit/ui/textarea'; import { generateImportStatement, generatePropsString, useStoryControls, } from '../lib/story-utils'; import { ComponentStoryLayout } from './story-layout'; interface SonnerStoryControls { position: | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center'; variant: 'default' | 'success' | 'error' | 'warning' | 'info' | 'loading'; duration: number; dismissible: boolean; richColors: boolean; expand: boolean; customTitle: string; customDescription: string; } export default function SonnerStory() { const { controls, updateControl } = useStoryControls({ position: 'bottom-right', variant: 'default', duration: 4000, dismissible: true, richColors: true, expand: false, customTitle: 'Custom notification', customDescription: 'This is a custom toast notification message.', }); const generateCode = () => { const toasterPropsString = generatePropsString( { position: controls.position, richColors: controls.richColors, expand: controls.expand, }, { position: 'bottom-right', richColors: false, expand: false, }, ); const toastOptions = generatePropsString( { description: controls.customDescription !== 'This is a custom toast notification message.' ? `"${controls.customDescription}"` : undefined, duration: controls.duration !== 4000 ? controls.duration : undefined, dismissible: !controls.dismissible ? false : undefined, }, {}, ); const imports = generateImportStatement( ['toast', 'Toaster'], '@kit/ui/sonner', ); const toastCall = controls.variant === 'default' ? `toast('${controls.customTitle}'${toastOptions ? `, {${toastOptions} }` : ''})` : `toast.${controls.variant}('${controls.customTitle}'${toastOptions ? `, {${toastOptions} }` : ''})`; return `${imports}\n\n// Add Toaster to your app root\nfunction App() {\n return (\n <>\n {/* Your app content */}\n \n \n );\n}\n\n// Use anywhere in your components\nfunction MyComponent() {\n const showToast = () => {\n ${toastCall};\n };\n\n return ;\n}`; }; const showToast = () => { const options = { duration: controls.duration, dismissible: controls.dismissible, }; switch (controls.variant) { case 'success': toast.success(controls.customTitle, { description: controls.customDescription, ...options, }); break; case 'error': toast.error(controls.customTitle, { description: controls.customDescription, ...options, }); break; case 'warning': toast.warning(controls.customTitle, { description: controls.customDescription, ...options, }); break; case 'info': toast.info(controls.customTitle, { description: controls.customDescription, ...options, }); break; case 'loading': toast.loading(controls.customTitle, { description: controls.customDescription, ...options, }); break; default: toast(controls.customTitle, { description: controls.customDescription, ...options, }); } }; const controlsContent = ( Sonner Controls
updateControl('duration', Number(e.target.value))} className="w-full" />
updateControl('dismissible', checked) } />
updateControl('richColors', checked) } />
updateControl('expand', checked)} />
updateControl('customTitle', e.target.value)} placeholder="Enter toast title..." />