jedmund-svelte/src/lib/stores/toast.ts
Justin Edmund 1a155e5657 feat: implement toast notification system
- Create toast store wrapping svelte-sonner
- Add Toaster component to root layout
- Configure admin-aware positioning
- Style toasts to match design system
- Add helper functions for common toast types

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-24 01:47:35 +01:00

85 lines
No EOL
1.7 KiB
TypeScript

import { toast as sonnerToast } from 'svelte-sonner'
export interface ToastOptions {
duration?: number
position?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
description?: string
action?: {
label: string
onClick: () => void
}
cancel?: {
label: string
onClick: () => void
}
}
const defaultOptions: ToastOptions = {
duration: 4000,
position: 'bottom-right'
}
export const toast = {
success: (message: string, options?: ToastOptions) => {
return sonnerToast.success(message, {
...defaultOptions,
...options
})
},
error: (message: string, options?: ToastOptions) => {
return sonnerToast.error(message, {
...defaultOptions,
...options,
duration: options?.duration ?? 6000 // Errors show longer by default
})
},
warning: (message: string, options?: ToastOptions) => {
return sonnerToast.warning(message, {
...defaultOptions,
...options
})
},
info: (message: string, options?: ToastOptions) => {
return sonnerToast.info(message, {
...defaultOptions,
...options
})
},
loading: (message: string, options?: ToastOptions) => {
return sonnerToast.loading(message, {
...defaultOptions,
...options
})
},
promise: <T>(
promise: Promise<T>,
messages: {
loading: string
success: string | ((data: T) => string)
error: string | ((error: any) => string)
},
options?: ToastOptions
) => {
return sonnerToast.promise(promise, messages, {
...defaultOptions,
...options
})
},
dismiss: (toastId?: string | number) => {
return sonnerToast.dismiss(toastId)
},
// Custom toast with full control
custom: (component: any, options?: ToastOptions) => {
return sonnerToast.custom(component, {
...defaultOptions,
...options
})
}
}