react-toastique 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var D=0,w=()=>(D+=1,`toast-${Date.now()}-${D}`),I=(...t)=>t.filter(Boolean).join(" ");var O={success:"\u2713",error:"\u2715",warning:"\u26A0",info:"\u2139",loading:"\u25CC"},v=({toast:t,onDismiss:o})=>{let[a,n]=react.useState(false),[i,c]=react.useState(false);react.useEffect(()=>{requestAnimationFrame(()=>{n(true);});},[]);let u=()=>{c(true),setTimeout(()=>{o(t.id);},200);},l=f=>{f.key==="Escape"&&t.options.dismissible&&u();};return jsxRuntime.jsxs("div",{role:"alert","aria-live":t.type==="error"?"assertive":"polite",tabIndex:0,onKeyDown:l,className:I("toastique-toast",`toastique-toast--${t.type}`,a&&"toastique-toast--visible",i&&"toastique-toast--exiting",t.options.className),children:[jsxRuntime.jsx("span",{className:"toastique-toast__icon","aria-hidden":"true",children:t.options.icon||O[t.type]}),jsxRuntime.jsx("span",{className:"toastique-toast__message",children:t.message}),t.options.dismissible&&t.type!=="loading"&&jsxRuntime.jsx("button",{type:"button",className:"toastique-toast__close",onClick:u,"aria-label":"Dismiss notification",children:"\u2715"})]})};var N={"top-left":"toastique-container--top-left","top-center":"toastique-container--top-center","top-right":"toastique-container--top-right","bottom-left":"toastique-container--bottom-left","bottom-center":"toastique-container--bottom-center","bottom-right":"toastique-container--bottom-right"},k=({toasts:t,onDismiss:o})=>{let a=react.useMemo(()=>{let n={"top-left":[],"top-center":[],"top-right":[],"bottom-left":[],"bottom-center":[],"bottom-right":[]};return t.forEach(i=>{n[i.options.position].push(i);}),n},[t]);return jsxRuntime.jsx(jsxRuntime.Fragment,{children:Object.keys(a).map(n=>{let i=a[n];return i.length===0?null:jsxRuntime.jsx("div",{className:`toastique-container ${N[n]}`,"aria-label":`Notifications ${n}`,children:i.map(c=>jsxRuntime.jsx(v,{toast:c,onDismiss:o},c.id))},n)})})};var U=(t,o)=>{switch(o.type){case "ADD":return [...t,o.payload];case "DISMISS":return t.filter(a=>a.id!==o.payload);case "DISMISS_ALL":return [];case "UPDATE":return t.map(a=>a.id===o.payload.id?{...a,...o.payload.updates}:a);default:return t}},q=react.createContext(null),V=4e3,Y="top-right",$=5,z=({children:t,defaultPosition:o=Y,defaultDuration:a=V,maxToasts:n=$})=>{let[i,c]=react.useReducer(U,[]),u=react.useCallback((e,s,r)=>{let p=w(),m={id:p,type:e,message:s,options:{duration:r?.duration??(e==="loading"?1/0:a),position:r?.position??o,dismissible:r?.dismissible??true,icon:r?.icon,className:r?.className,onClose:r?.onClose},createdAt:Date.now()};return c({type:"ADD",payload:m}),m.options.duration!==1/0&&setTimeout(()=>{c({type:"DISMISS",payload:p}),r?.onClose?.();},m.options.duration),p},[a,o]),l=react.useCallback(e=>{let s=i.find(r=>r.id===e);c({type:"DISMISS",payload:e}),s?.options.onClose?.();},[i]),f=react.useCallback(()=>{i.forEach(e=>e.options.onClose?.()),c({type:"DISMISS_ALL"});},[i]),T=react.useCallback((e,s)=>{c({type:"UPDATE",payload:{id:e,updates:s}});},[]),g=react.useMemo(()=>i.slice(-n),[i,n]),x=react.useMemo(()=>({toasts:g,addToast:u,dismissToast:l,dismissAll:f,updateToast:T}),[g,u,l,f,T]);return jsxRuntime.jsxs(q.Provider,{value:x,children:[t,jsxRuntime.jsx(k,{toasts:g,onDismiss:l})]})};var j=()=>{let t=react.useContext(q);if(!t)throw new Error("useToast must be used within a ToastProvider");let{addToast:o,dismissToast:a,dismissAll:n,updateToast:i}=t,c=react.useCallback((e,s)=>o("success",e,s),[o]),u=react.useCallback((e,s)=>o("error",e,s),[o]),l=react.useCallback((e,s)=>o("warning",e,s),[o]),f=react.useCallback((e,s)=>o("info",e,s),[o]),T=react.useCallback((e,s)=>o("loading",e,s),[o]),g=react.useCallback((e,s,r)=>{let p=o("loading",s.loading,{...r,duration:1/0}),m=typeof e=="function"?e():e;return m.then(y=>{let h=typeof s.success=="function"?s.success(y):s.success;i(p,{type:"success",message:h}),setTimeout(()=>{a(p);},r?.duration??4e3);}).catch(y=>{let h=typeof s.error=="function"?s.error(y):s.error;i(p,{type:"error",message:h}),setTimeout(()=>{a(p);},r?.duration??4e3);}),m},[o,i,a]),x=react.useCallback(e=>a(e),[a]);return {success:c,error:u,warning:l,info:f,loading:T,promise:g,dismiss:x,dismissAll:n}};exports.Toast=v;exports.ToastContainer=k;exports.ToastContext=q;exports.ToastProvider=z;exports.useToast=j;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/index.ts","../src/components/Toast.tsx","../src/components/ToastContainer.tsx","../src/context/ToastContext.tsx","../src/hooks/useToast.ts"],"names":["counter","generateId","classNames","classes","icons","Toast","toast","onDismiss","isVisible","setIsVisible","useState","isExiting","setIsExiting","useEffect","handleDismiss","handleKeyDown","e","jsxs","jsx","positionClasses","ToastContainer","toasts","groupedToasts","useMemo","groups","Fragment","position","positionToasts","toastReducer","state","action","ToastContext","createContext","DEFAULT_DURATION","DEFAULT_POSITION","DEFAULT_MAX_TOASTS","ToastProvider","children","defaultPosition","defaultDuration","maxToasts","dispatch","useReducer","addToast","useCallback","type","message","options","id","dismissToast","t","dismissAll","updateToast","updates","visibleToasts","value","useToast","context","useContext","success","error","warning","info","loading","promise","promiseOrFn","messages","data","successMessage","err","errorMessage","dismiss"],"mappings":"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","file":"index.cjs","sourcesContent":["let counter = 0;\n\nexport const generateId = (): string => {\n counter += 1;\n return `toast-${Date.now()}-${counter}`;\n};\n\nexport const classNames = (...classes: (string | undefined | false)[]): string => {\n return classes.filter(Boolean).join(' ');\n};\n","import { useEffect, useState } from 'react';\nimport type { Toast as ToastType } from '../types';\nimport { classNames } from '../utils';\nimport './Toast.css';\n\ninterface ToastProps {\n toast: ToastType;\n onDismiss: (id: string) => void;\n}\n\nconst icons: Record<ToastType['type'], string> = {\n success: '✓',\n error: '✕',\n warning: '⚠',\n info: 'ℹ',\n loading: '◌',\n};\n\nexport const Toast = ({ toast, onDismiss }: ToastProps) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n // Trigger enter animation\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n }, []);\n\n const handleDismiss = () => {\n setIsExiting(true);\n setTimeout(() => {\n onDismiss(toast.id);\n }, 200); // Match animation duration\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && toast.options.dismissible) {\n handleDismiss();\n }\n };\n\n return (\n <div\n role=\"alert\"\n aria-live={toast.type === 'error' ? 'assertive' : 'polite'}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={classNames(\n 'toastique-toast',\n `toastique-toast--${toast.type}`,\n isVisible && 'toastique-toast--visible',\n isExiting && 'toastique-toast--exiting',\n toast.options.className\n )}\n >\n <span className=\"toastique-toast__icon\" aria-hidden=\"true\">\n {toast.options.icon || icons[toast.type]}\n </span>\n <span className=\"toastique-toast__message\">{toast.message}</span>\n {toast.options.dismissible && toast.type !== 'loading' && (\n <button\n type=\"button\"\n className=\"toastique-toast__close\"\n onClick={handleDismiss}\n aria-label=\"Dismiss notification\"\n >\n ✕\n </button>\n )}\n </div>\n );\n};\n","import { useMemo } from 'react';\nimport type { Toast as ToastType, ToastPosition } from '../types';\nimport { Toast } from './Toast';\nimport './ToastContainer.css';\n\ninterface ToastContainerProps {\n toasts: ToastType[];\n onDismiss: (id: string) => void;\n}\n\nconst positionClasses: Record<ToastPosition, string> = {\n 'top-left': 'toastique-container--top-left',\n 'top-center': 'toastique-container--top-center',\n 'top-right': 'toastique-container--top-right',\n 'bottom-left': 'toastique-container--bottom-left',\n 'bottom-center': 'toastique-container--bottom-center',\n 'bottom-right': 'toastique-container--bottom-right',\n};\n\nexport const ToastContainer = ({ toasts, onDismiss }: ToastContainerProps) => {\n // Group toasts by position\n const groupedToasts = useMemo(() => {\n const groups: Record<ToastPosition, ToastType[]> = {\n 'top-left': [],\n 'top-center': [],\n 'top-right': [],\n 'bottom-left': [],\n 'bottom-center': [],\n 'bottom-right': [],\n };\n\n toasts.forEach((toast) => {\n groups[toast.options.position].push(toast);\n });\n\n return groups;\n }, [toasts]);\n\n return (\n <>\n {(Object.keys(groupedToasts) as ToastPosition[]).map((position) => {\n const positionToasts = groupedToasts[position];\n if (positionToasts.length === 0) return null;\n\n return (\n <div\n key={position}\n className={`toastique-container ${positionClasses[position]}`}\n aria-label={`Notifications ${position}`}\n >\n {positionToasts.map((toast) => (\n <Toast key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>\n );\n })}\n </>\n );\n};\n","import { createContext, useCallback, useReducer, useMemo } from 'react';\nimport type {\n Toast,\n ToastType,\n ToastOptions,\n ToastContextValue,\n ToastProviderProps,\n ToastPosition,\n} from '../types';\nimport { generateId } from '../utils';\nimport { ToastContainer } from '../components/ToastContainer';\n\ntype ToastAction =\n | { type: 'ADD'; payload: Toast }\n | { type: 'DISMISS'; payload: string }\n | { type: 'DISMISS_ALL' }\n | { type: 'UPDATE'; payload: { id: string; updates: Partial<Pick<Toast, 'type' | 'message'>> } };\n\nconst toastReducer = (state: Toast[], action: ToastAction): Toast[] => {\n switch (action.type) {\n case 'ADD':\n return [...state, action.payload];\n case 'DISMISS':\n return state.filter((toast) => toast.id !== action.payload);\n case 'DISMISS_ALL':\n return [];\n case 'UPDATE':\n return state.map((toast) =>\n toast.id === action.payload.id\n ? { ...toast, ...action.payload.updates }\n : toast\n );\n default:\n return state;\n }\n};\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\nconst DEFAULT_DURATION = 4000;\nconst DEFAULT_POSITION: ToastPosition = 'top-right';\nconst DEFAULT_MAX_TOASTS = 5;\n\nexport const ToastProvider = ({\n children,\n defaultPosition = DEFAULT_POSITION,\n defaultDuration = DEFAULT_DURATION,\n maxToasts = DEFAULT_MAX_TOASTS,\n}: ToastProviderProps) => {\n const [toasts, dispatch] = useReducer(toastReducer, []);\n\n const addToast = useCallback(\n (type: ToastType, message: string, options?: ToastOptions): string => {\n const id = generateId();\n const toast: Toast = {\n id,\n type,\n message,\n options: {\n duration: options?.duration ?? (type === 'loading' ? Infinity : defaultDuration),\n position: options?.position ?? defaultPosition,\n dismissible: options?.dismissible ?? true,\n icon: options?.icon,\n className: options?.className,\n onClose: options?.onClose,\n },\n createdAt: Date.now(),\n };\n\n dispatch({ type: 'ADD', payload: toast });\n\n // Auto dismiss (except for loading toasts)\n if (toast.options.duration !== Infinity) {\n setTimeout(() => {\n dispatch({ type: 'DISMISS', payload: id });\n options?.onClose?.();\n }, toast.options.duration);\n }\n\n return id;\n },\n [defaultDuration, defaultPosition]\n );\n\n const dismissToast = useCallback((id: string) => {\n const toast = toasts.find((t) => t.id === id);\n dispatch({ type: 'DISMISS', payload: id });\n toast?.options.onClose?.();\n }, [toasts]);\n\n const dismissAll = useCallback(() => {\n toasts.forEach((toast) => toast.options.onClose?.());\n dispatch({ type: 'DISMISS_ALL' });\n }, [toasts]);\n\n const updateToast = useCallback(\n (id: string, updates: Partial<Pick<Toast, 'type' | 'message'>>) => {\n dispatch({ type: 'UPDATE', payload: { id, updates } });\n },\n []\n );\n\n // Limit visible toasts\n const visibleToasts = useMemo(() => {\n return toasts.slice(-maxToasts);\n }, [toasts, maxToasts]);\n\n const value = useMemo(\n () => ({\n toasts: visibleToasts,\n addToast,\n dismissToast,\n dismissAll,\n updateToast,\n }),\n [visibleToasts, addToast, dismissToast, dismissAll, updateToast]\n );\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <ToastContainer toasts={visibleToasts} onDismiss={dismissToast} />\n </ToastContext.Provider>\n );\n};\n","import { useContext, useCallback } from 'react';\nimport { ToastContext } from '../context/ToastContext';\nimport type { ToastOptions, ToastPromiseOptions } from '../types';\n\nexport const useToast = () => {\n const context = useContext(ToastContext);\n\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n\n const { addToast, dismissToast, dismissAll, updateToast } = context;\n\n const success = useCallback(\n (message: string, options?: ToastOptions) => addToast('success', message, options),\n [addToast]\n );\n\n const error = useCallback(\n (message: string, options?: ToastOptions) => addToast('error', message, options),\n [addToast]\n );\n\n const warning = useCallback(\n (message: string, options?: ToastOptions) => addToast('warning', message, options),\n [addToast]\n );\n\n const info = useCallback(\n (message: string, options?: ToastOptions) => addToast('info', message, options),\n [addToast]\n );\n\n const loading = useCallback(\n (message: string, options?: ToastOptions) => addToast('loading', message, options),\n [addToast]\n );\n\n const promise = useCallback(\n <T>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n messages: ToastPromiseOptions,\n options?: ToastOptions\n ): Promise<T> => {\n const id = addToast('loading', messages.loading, { ...options, duration: Infinity });\n\n const promise = typeof promiseOrFn === 'function' ? promiseOrFn() : promiseOrFn;\n\n promise\n .then((data) => {\n const successMessage =\n typeof messages.success === 'function'\n ? messages.success(data)\n : messages.success;\n updateToast(id, { type: 'success', message: successMessage });\n\n // Auto dismiss after success\n setTimeout(() => {\n dismissToast(id);\n }, options?.duration ?? 4000);\n })\n .catch((err) => {\n const errorMessage =\n typeof messages.error === 'function'\n ? messages.error(err)\n : messages.error;\n updateToast(id, { type: 'error', message: errorMessage });\n\n // Auto dismiss after error\n setTimeout(() => {\n dismissToast(id);\n }, options?.duration ?? 4000);\n });\n\n return promise;\n },\n [addToast, updateToast, dismissToast]\n );\n\n const dismiss = useCallback(\n (id: string) => dismissToast(id),\n [dismissToast]\n );\n\n return {\n success,\n error,\n warning,\n info,\n loading,\n promise,\n dismiss,\n dismissAll,\n };\n};\n"]}
package/dist/index.css ADDED
@@ -0,0 +1,2 @@
1
+ .toastique-toast{display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:10px;background:#fff;box-shadow:0 4px 20px #0000001f,0 2px 8px #00000014;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.4;color:#1a1a1a;min-width:280px;max-width:400px;pointer-events:auto;opacity:0;transform:translate(100%);transition:all .2s ease-out}.toastique-toast:focus{outline:2px solid #3b82f6;outline-offset:2px}.toastique-toast--visible{opacity:1;transform:translate(0)}.toastique-toast--exiting{opacity:0;transform:translate(100%)}.toastique-toast__icon{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;font-size:12px;font-weight:600;flex-shrink:0}.toastique-toast__message{flex:1;word-break:break-word}.toastique-toast__close{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;color:#666;cursor:pointer;border-radius:4px;font-size:12px;flex-shrink:0;transition:background .15s,color .15s}.toastique-toast__close:hover{background:#00000014;color:#333}.toastique-toast--success{border-left:4px solid #22c55e}.toastique-toast--success .toastique-toast__icon{background:#dcfce7;color:#16a34a}.toastique-toast--error{border-left:4px solid #ef4444}.toastique-toast--error .toastique-toast__icon{background:#fee2e2;color:#dc2626}.toastique-toast--warning{border-left:4px solid #f59e0b}.toastique-toast--warning .toastique-toast__icon{background:#fef3c7;color:#d97706}.toastique-toast--info{border-left:4px solid #3b82f6}.toastique-toast--info .toastique-toast__icon{background:#dbeafe;color:#2563eb}.toastique-toast--loading{border-left:4px solid #8b5cf6}.toastique-toast--loading .toastique-toast__icon{background:#ede9fe;color:#7c3aed;animation:toastique-spin 1s linear infinite}@keyframes toastique-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media(prefers-color-scheme:dark){.toastique-toast{background:#1f2937;color:#f9fafb;box-shadow:0 4px 20px #0006,0 2px 8px #0000004d}.toastique-toast__close{color:#9ca3af}.toastique-toast__close:hover{background:#ffffff1a;color:#e5e7eb}.toastique-toast--success .toastique-toast__icon{background:#064e3b;color:#34d399}.toastique-toast--error .toastique-toast__icon{background:#7f1d1d;color:#f87171}.toastique-toast--warning .toastique-toast__icon{background:#78350f;color:#fbbf24}.toastique-toast--info .toastique-toast__icon{background:#1e3a5f;color:#60a5fa}.toastique-toast--loading .toastique-toast__icon{background:#4c1d95;color:#a78bfa}}@media(prefers-reduced-motion:reduce){.toastique-toast{transition:opacity .15s ease-out;transform:none}.toastique-toast--visible,.toastique-toast--exiting{transform:none}.toastique-toast--loading .toastique-toast__icon{animation:none}}.toastique-container{position:fixed;z-index:9999;display:flex;flex-direction:column;gap:10px;pointer-events:none;padding:16px;max-height:100vh;overflow:hidden}.toastique-container--top-left{top:0;left:0}.toastique-container--top-center{top:0;left:50%;transform:translate(-50%)}.toastique-container--top-right{top:0;right:0}.toastique-container--bottom-left{bottom:0;left:0;flex-direction:column-reverse}.toastique-container--bottom-center{bottom:0;left:50%;transform:translate(-50%);flex-direction:column-reverse}.toastique-container--bottom-right{bottom:0;right:0;flex-direction:column-reverse}.toastique-container--top-left .toastique-toast,.toastique-container--bottom-left .toastique-toast{transform:translate(-100%)}.toastique-container--top-left .toastique-toast--visible,.toastique-container--bottom-left .toastique-toast--visible{transform:translate(0)}.toastique-container--top-left .toastique-toast--exiting,.toastique-container--bottom-left .toastique-toast--exiting{transform:translate(-100%)}.toastique-container--top-center .toastique-toast,.toastique-container--bottom-center .toastique-toast{transform:translateY(-20px)}.toastique-container--top-center .toastique-toast--visible,.toastique-container--bottom-center .toastique-toast--visible{transform:translateY(0)}.toastique-container--top-center .toastique-toast--exiting,.toastique-container--bottom-center .toastique-toast--exiting{transform:translateY(-20px);opacity:0}.toastique-container--bottom-center .toastique-toast,.toastique-container--bottom-center .toastique-toast--exiting{transform:translateY(20px)}@media(max-width:480px){.toastique-container{left:0!important;right:0!important;transform:none!important;padding:12px}.toastique-container--top-left,.toastique-container--top-right,.toastique-container--top-center{top:0}.toastique-container--bottom-left,.toastique-container--bottom-right,.toastique-container--bottom-center{bottom:0}.toastique-toast{min-width:auto;max-width:none;width:100%}}
2
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Toast.css","../src/components/ToastContainer.css"],"sourcesContent":[".toastique-toast {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 10px;\n background: #fff;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n color: #1a1a1a;\n min-width: 280px;\n max-width: 400px;\n pointer-events: auto;\n opacity: 0;\n transform: translateX(100%);\n transition: all 0.2s ease-out;\n}\n\n.toastique-toast:focus {\n outline: 2px solid #3b82f6;\n outline-offset: 2px;\n}\n\n.toastique-toast--visible {\n opacity: 1;\n transform: translateX(0);\n}\n\n.toastique-toast--exiting {\n opacity: 0;\n transform: translateX(100%);\n}\n\n/* Icon */\n.toastique-toast__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n/* Message */\n.toastique-toast__message {\n flex: 1;\n word-break: break-word;\n}\n\n/* Close button */\n.toastique-toast__close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n background: transparent;\n color: #666;\n cursor: pointer;\n border-radius: 4px;\n font-size: 12px;\n flex-shrink: 0;\n transition: background 0.15s, color 0.15s;\n}\n\n.toastique-toast__close:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #333;\n}\n\n/* Type variants */\n.toastique-toast--success {\n border-left: 4px solid #22c55e;\n}\n\n.toastique-toast--success .toastique-toast__icon {\n background: #dcfce7;\n color: #16a34a;\n}\n\n.toastique-toast--error {\n border-left: 4px solid #ef4444;\n}\n\n.toastique-toast--error .toastique-toast__icon {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.toastique-toast--warning {\n border-left: 4px solid #f59e0b;\n}\n\n.toastique-toast--warning .toastique-toast__icon {\n background: #fef3c7;\n color: #d97706;\n}\n\n.toastique-toast--info {\n border-left: 4px solid #3b82f6;\n}\n\n.toastique-toast--info .toastique-toast__icon {\n background: #dbeafe;\n color: #2563eb;\n}\n\n.toastique-toast--loading {\n border-left: 4px solid #8b5cf6;\n}\n\n.toastique-toast--loading .toastique-toast__icon {\n background: #ede9fe;\n color: #7c3aed;\n animation: toastique-spin 1s linear infinite;\n}\n\n@keyframes toastique-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Dark mode support */\n@media (prefers-color-scheme: dark) {\n .toastique-toast {\n background: #1f2937;\n color: #f9fafb;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n\n .toastique-toast__close {\n color: #9ca3af;\n }\n\n .toastique-toast__close:hover {\n background: rgba(255, 255, 255, 0.1);\n color: #e5e7eb;\n }\n\n .toastique-toast--success .toastique-toast__icon {\n background: #064e3b;\n color: #34d399;\n }\n\n .toastique-toast--error .toastique-toast__icon {\n background: #7f1d1d;\n color: #f87171;\n }\n\n .toastique-toast--warning .toastique-toast__icon {\n background: #78350f;\n color: #fbbf24;\n }\n\n .toastique-toast--info .toastique-toast__icon {\n background: #1e3a5f;\n color: #60a5fa;\n }\n\n .toastique-toast--loading .toastique-toast__icon {\n background: #4c1d95;\n color: #a78bfa;\n }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .toastique-toast {\n transition: opacity 0.15s ease-out;\n transform: none;\n }\n\n .toastique-toast--visible {\n transform: none;\n }\n\n .toastique-toast--exiting {\n transform: none;\n }\n\n .toastique-toast--loading .toastique-toast__icon {\n animation: none;\n }\n}\n",".toastique-container {\n position: fixed;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n gap: 10px;\n pointer-events: none;\n padding: 16px;\n max-height: 100vh;\n overflow: hidden;\n}\n\n/* Top positions */\n.toastique-container--top-left {\n top: 0;\n left: 0;\n}\n\n.toastique-container--top-center {\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.toastique-container--top-right {\n top: 0;\n right: 0;\n}\n\n/* Bottom positions */\n.toastique-container--bottom-left {\n bottom: 0;\n left: 0;\n flex-direction: column-reverse;\n}\n\n.toastique-container--bottom-center {\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n flex-direction: column-reverse;\n}\n\n.toastique-container--bottom-right {\n bottom: 0;\n right: 0;\n flex-direction: column-reverse;\n}\n\n/* Animation adjustments for different positions */\n.toastique-container--top-left .toastique-toast,\n.toastique-container--bottom-left .toastique-toast {\n transform: translateX(-100%);\n}\n\n.toastique-container--top-left .toastique-toast--visible,\n.toastique-container--bottom-left .toastique-toast--visible {\n transform: translateX(0);\n}\n\n.toastique-container--top-left .toastique-toast--exiting,\n.toastique-container--bottom-left .toastique-toast--exiting {\n transform: translateX(-100%);\n}\n\n.toastique-container--top-center .toastique-toast,\n.toastique-container--bottom-center .toastique-toast {\n transform: translateY(-20px);\n}\n\n.toastique-container--top-center .toastique-toast--visible,\n.toastique-container--bottom-center .toastique-toast--visible {\n transform: translateY(0);\n}\n\n.toastique-container--top-center .toastique-toast--exiting,\n.toastique-container--bottom-center .toastique-toast--exiting {\n transform: translateY(-20px);\n opacity: 0;\n}\n\n/* Bottom center specific */\n.toastique-container--bottom-center .toastique-toast {\n transform: translateY(20px);\n}\n\n.toastique-container--bottom-center .toastique-toast--exiting {\n transform: translateY(20px);\n}\n\n/* Mobile responsiveness */\n@media (max-width: 480px) {\n .toastique-container {\n left: 0 !important;\n right: 0 !important;\n transform: none !important;\n padding: 12px;\n }\n\n .toastique-container--top-left,\n .toastique-container--top-right,\n .toastique-container--top-center {\n top: 0;\n }\n\n .toastique-container--bottom-left,\n .toastique-container--bottom-right,\n .toastique-container--bottom-center {\n bottom: 0;\n }\n\n .toastique-toast {\n min-width: auto;\n max-width: none;\n width: 100%;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,66 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+
4
+ type ToastType = 'success' | 'error' | 'warning' | 'info' | 'loading';
5
+ type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
6
+ interface ToastOptions {
7
+ duration?: number;
8
+ position?: ToastPosition;
9
+ dismissible?: boolean;
10
+ icon?: React.ReactNode;
11
+ className?: string;
12
+ onClose?: () => void;
13
+ }
14
+ interface Toast$1 {
15
+ id: string;
16
+ type: ToastType;
17
+ message: string;
18
+ options: Required<Omit<ToastOptions, 'icon' | 'className' | 'onClose'>> & Pick<ToastOptions, 'icon' | 'className' | 'onClose'>;
19
+ createdAt: number;
20
+ }
21
+ interface ToastPromiseOptions {
22
+ loading: string;
23
+ success: string | ((data: unknown) => string);
24
+ error: string | ((error: unknown) => string);
25
+ }
26
+ interface ToastContextValue {
27
+ toasts: Toast$1[];
28
+ addToast: (type: ToastType, message: string, options?: ToastOptions) => string;
29
+ dismissToast: (id: string) => void;
30
+ dismissAll: () => void;
31
+ updateToast: (id: string, updates: Partial<Pick<Toast$1, 'type' | 'message'>>) => void;
32
+ }
33
+ interface ToastProviderProps {
34
+ children: React.ReactNode;
35
+ defaultPosition?: ToastPosition;
36
+ defaultDuration?: number;
37
+ maxToasts?: number;
38
+ }
39
+
40
+ interface ToastProps {
41
+ toast: Toast$1;
42
+ onDismiss: (id: string) => void;
43
+ }
44
+ declare const Toast: ({ toast, onDismiss }: ToastProps) => react_jsx_runtime.JSX.Element;
45
+
46
+ interface ToastContainerProps {
47
+ toasts: Toast$1[];
48
+ onDismiss: (id: string) => void;
49
+ }
50
+ declare const ToastContainer: ({ toasts, onDismiss }: ToastContainerProps) => react_jsx_runtime.JSX.Element;
51
+
52
+ declare const ToastContext: react.Context<ToastContextValue | null>;
53
+ declare const ToastProvider: ({ children, defaultPosition, defaultDuration, maxToasts, }: ToastProviderProps) => react_jsx_runtime.JSX.Element;
54
+
55
+ declare const useToast: () => {
56
+ success: (message: string, options?: ToastOptions) => string;
57
+ error: (message: string, options?: ToastOptions) => string;
58
+ warning: (message: string, options?: ToastOptions) => string;
59
+ info: (message: string, options?: ToastOptions) => string;
60
+ loading: (message: string, options?: ToastOptions) => string;
61
+ promise: <T>(promiseOrFn: Promise<T> | (() => Promise<T>), messages: ToastPromiseOptions, options?: ToastOptions) => Promise<T>;
62
+ dismiss: (id: string) => void;
63
+ dismissAll: () => void;
64
+ };
65
+
66
+ export { Toast, ToastContainer, ToastContext, type ToastContextValue, type Toast$1 as ToastData, type ToastOptions, type ToastPosition, type ToastPromiseOptions, ToastProvider, type ToastProviderProps, type ToastType, useToast };
@@ -0,0 +1,66 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+
4
+ type ToastType = 'success' | 'error' | 'warning' | 'info' | 'loading';
5
+ type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
6
+ interface ToastOptions {
7
+ duration?: number;
8
+ position?: ToastPosition;
9
+ dismissible?: boolean;
10
+ icon?: React.ReactNode;
11
+ className?: string;
12
+ onClose?: () => void;
13
+ }
14
+ interface Toast$1 {
15
+ id: string;
16
+ type: ToastType;
17
+ message: string;
18
+ options: Required<Omit<ToastOptions, 'icon' | 'className' | 'onClose'>> & Pick<ToastOptions, 'icon' | 'className' | 'onClose'>;
19
+ createdAt: number;
20
+ }
21
+ interface ToastPromiseOptions {
22
+ loading: string;
23
+ success: string | ((data: unknown) => string);
24
+ error: string | ((error: unknown) => string);
25
+ }
26
+ interface ToastContextValue {
27
+ toasts: Toast$1[];
28
+ addToast: (type: ToastType, message: string, options?: ToastOptions) => string;
29
+ dismissToast: (id: string) => void;
30
+ dismissAll: () => void;
31
+ updateToast: (id: string, updates: Partial<Pick<Toast$1, 'type' | 'message'>>) => void;
32
+ }
33
+ interface ToastProviderProps {
34
+ children: React.ReactNode;
35
+ defaultPosition?: ToastPosition;
36
+ defaultDuration?: number;
37
+ maxToasts?: number;
38
+ }
39
+
40
+ interface ToastProps {
41
+ toast: Toast$1;
42
+ onDismiss: (id: string) => void;
43
+ }
44
+ declare const Toast: ({ toast, onDismiss }: ToastProps) => react_jsx_runtime.JSX.Element;
45
+
46
+ interface ToastContainerProps {
47
+ toasts: Toast$1[];
48
+ onDismiss: (id: string) => void;
49
+ }
50
+ declare const ToastContainer: ({ toasts, onDismiss }: ToastContainerProps) => react_jsx_runtime.JSX.Element;
51
+
52
+ declare const ToastContext: react.Context<ToastContextValue | null>;
53
+ declare const ToastProvider: ({ children, defaultPosition, defaultDuration, maxToasts, }: ToastProviderProps) => react_jsx_runtime.JSX.Element;
54
+
55
+ declare const useToast: () => {
56
+ success: (message: string, options?: ToastOptions) => string;
57
+ error: (message: string, options?: ToastOptions) => string;
58
+ warning: (message: string, options?: ToastOptions) => string;
59
+ info: (message: string, options?: ToastOptions) => string;
60
+ loading: (message: string, options?: ToastOptions) => string;
61
+ promise: <T>(promiseOrFn: Promise<T> | (() => Promise<T>), messages: ToastPromiseOptions, options?: ToastOptions) => Promise<T>;
62
+ dismiss: (id: string) => void;
63
+ dismissAll: () => void;
64
+ };
65
+
66
+ export { Toast, ToastContainer, ToastContext, type ToastContextValue, type Toast$1 as ToastData, type ToastOptions, type ToastPosition, type ToastPromiseOptions, ToastProvider, type ToastProviderProps, type ToastType, useToast };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import {createContext,useState,useEffect,useMemo,useReducer,useCallback,useContext}from'react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var D=0,w=()=>(D+=1,`toast-${Date.now()}-${D}`),I=(...t)=>t.filter(Boolean).join(" ");var O={success:"\u2713",error:"\u2715",warning:"\u26A0",info:"\u2139",loading:"\u25CC"},v=({toast:t,onDismiss:o})=>{let[a,n]=useState(false),[i,c]=useState(false);useEffect(()=>{requestAnimationFrame(()=>{n(true);});},[]);let u=()=>{c(true),setTimeout(()=>{o(t.id);},200);},l=f=>{f.key==="Escape"&&t.options.dismissible&&u();};return jsxs("div",{role:"alert","aria-live":t.type==="error"?"assertive":"polite",tabIndex:0,onKeyDown:l,className:I("toastique-toast",`toastique-toast--${t.type}`,a&&"toastique-toast--visible",i&&"toastique-toast--exiting",t.options.className),children:[jsx("span",{className:"toastique-toast__icon","aria-hidden":"true",children:t.options.icon||O[t.type]}),jsx("span",{className:"toastique-toast__message",children:t.message}),t.options.dismissible&&t.type!=="loading"&&jsx("button",{type:"button",className:"toastique-toast__close",onClick:u,"aria-label":"Dismiss notification",children:"\u2715"})]})};var N={"top-left":"toastique-container--top-left","top-center":"toastique-container--top-center","top-right":"toastique-container--top-right","bottom-left":"toastique-container--bottom-left","bottom-center":"toastique-container--bottom-center","bottom-right":"toastique-container--bottom-right"},k=({toasts:t,onDismiss:o})=>{let a=useMemo(()=>{let n={"top-left":[],"top-center":[],"top-right":[],"bottom-left":[],"bottom-center":[],"bottom-right":[]};return t.forEach(i=>{n[i.options.position].push(i);}),n},[t]);return jsx(Fragment,{children:Object.keys(a).map(n=>{let i=a[n];return i.length===0?null:jsx("div",{className:`toastique-container ${N[n]}`,"aria-label":`Notifications ${n}`,children:i.map(c=>jsx(v,{toast:c,onDismiss:o},c.id))},n)})})};var U=(t,o)=>{switch(o.type){case "ADD":return [...t,o.payload];case "DISMISS":return t.filter(a=>a.id!==o.payload);case "DISMISS_ALL":return [];case "UPDATE":return t.map(a=>a.id===o.payload.id?{...a,...o.payload.updates}:a);default:return t}},q=createContext(null),V=4e3,Y="top-right",$=5,z=({children:t,defaultPosition:o=Y,defaultDuration:a=V,maxToasts:n=$})=>{let[i,c]=useReducer(U,[]),u=useCallback((e,s,r)=>{let p=w(),m={id:p,type:e,message:s,options:{duration:r?.duration??(e==="loading"?1/0:a),position:r?.position??o,dismissible:r?.dismissible??true,icon:r?.icon,className:r?.className,onClose:r?.onClose},createdAt:Date.now()};return c({type:"ADD",payload:m}),m.options.duration!==1/0&&setTimeout(()=>{c({type:"DISMISS",payload:p}),r?.onClose?.();},m.options.duration),p},[a,o]),l=useCallback(e=>{let s=i.find(r=>r.id===e);c({type:"DISMISS",payload:e}),s?.options.onClose?.();},[i]),f=useCallback(()=>{i.forEach(e=>e.options.onClose?.()),c({type:"DISMISS_ALL"});},[i]),T=useCallback((e,s)=>{c({type:"UPDATE",payload:{id:e,updates:s}});},[]),g=useMemo(()=>i.slice(-n),[i,n]),x=useMemo(()=>({toasts:g,addToast:u,dismissToast:l,dismissAll:f,updateToast:T}),[g,u,l,f,T]);return jsxs(q.Provider,{value:x,children:[t,jsx(k,{toasts:g,onDismiss:l})]})};var j=()=>{let t=useContext(q);if(!t)throw new Error("useToast must be used within a ToastProvider");let{addToast:o,dismissToast:a,dismissAll:n,updateToast:i}=t,c=useCallback((e,s)=>o("success",e,s),[o]),u=useCallback((e,s)=>o("error",e,s),[o]),l=useCallback((e,s)=>o("warning",e,s),[o]),f=useCallback((e,s)=>o("info",e,s),[o]),T=useCallback((e,s)=>o("loading",e,s),[o]),g=useCallback((e,s,r)=>{let p=o("loading",s.loading,{...r,duration:1/0}),m=typeof e=="function"?e():e;return m.then(y=>{let h=typeof s.success=="function"?s.success(y):s.success;i(p,{type:"success",message:h}),setTimeout(()=>{a(p);},r?.duration??4e3);}).catch(y=>{let h=typeof s.error=="function"?s.error(y):s.error;i(p,{type:"error",message:h}),setTimeout(()=>{a(p);},r?.duration??4e3);}),m},[o,i,a]),x=useCallback(e=>a(e),[a]);return {success:c,error:u,warning:l,info:f,loading:T,promise:g,dismiss:x,dismissAll:n}};export{v as Toast,k as ToastContainer,q as ToastContext,z as ToastProvider,j as useToast};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/index.ts","../src/components/Toast.tsx","../src/components/ToastContainer.tsx","../src/context/ToastContext.tsx","../src/hooks/useToast.ts"],"names":["counter","generateId","classNames","classes","icons","Toast","toast","onDismiss","isVisible","setIsVisible","useState","isExiting","setIsExiting","useEffect","handleDismiss","handleKeyDown","e","jsxs","jsx","positionClasses","ToastContainer","toasts","groupedToasts","useMemo","groups","Fragment","position","positionToasts","toastReducer","state","action","ToastContext","createContext","DEFAULT_DURATION","DEFAULT_POSITION","DEFAULT_MAX_TOASTS","ToastProvider","children","defaultPosition","defaultDuration","maxToasts","dispatch","useReducer","addToast","useCallback","type","message","options","id","dismissToast","t","dismissAll","updateToast","updates","visibleToasts","value","useToast","context","useContext","success","error","warning","info","loading","promise","promiseOrFn","messages","data","successMessage","err","errorMessage","dismiss"],"mappings":"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","file":"index.js","sourcesContent":["let counter = 0;\n\nexport const generateId = (): string => {\n counter += 1;\n return `toast-${Date.now()}-${counter}`;\n};\n\nexport const classNames = (...classes: (string | undefined | false)[]): string => {\n return classes.filter(Boolean).join(' ');\n};\n","import { useEffect, useState } from 'react';\nimport type { Toast as ToastType } from '../types';\nimport { classNames } from '../utils';\nimport './Toast.css';\n\ninterface ToastProps {\n toast: ToastType;\n onDismiss: (id: string) => void;\n}\n\nconst icons: Record<ToastType['type'], string> = {\n success: '✓',\n error: '✕',\n warning: '⚠',\n info: 'ℹ',\n loading: '◌',\n};\n\nexport const Toast = ({ toast, onDismiss }: ToastProps) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n // Trigger enter animation\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n }, []);\n\n const handleDismiss = () => {\n setIsExiting(true);\n setTimeout(() => {\n onDismiss(toast.id);\n }, 200); // Match animation duration\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && toast.options.dismissible) {\n handleDismiss();\n }\n };\n\n return (\n <div\n role=\"alert\"\n aria-live={toast.type === 'error' ? 'assertive' : 'polite'}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={classNames(\n 'toastique-toast',\n `toastique-toast--${toast.type}`,\n isVisible && 'toastique-toast--visible',\n isExiting && 'toastique-toast--exiting',\n toast.options.className\n )}\n >\n <span className=\"toastique-toast__icon\" aria-hidden=\"true\">\n {toast.options.icon || icons[toast.type]}\n </span>\n <span className=\"toastique-toast__message\">{toast.message}</span>\n {toast.options.dismissible && toast.type !== 'loading' && (\n <button\n type=\"button\"\n className=\"toastique-toast__close\"\n onClick={handleDismiss}\n aria-label=\"Dismiss notification\"\n >\n ✕\n </button>\n )}\n </div>\n );\n};\n","import { useMemo } from 'react';\nimport type { Toast as ToastType, ToastPosition } from '../types';\nimport { Toast } from './Toast';\nimport './ToastContainer.css';\n\ninterface ToastContainerProps {\n toasts: ToastType[];\n onDismiss: (id: string) => void;\n}\n\nconst positionClasses: Record<ToastPosition, string> = {\n 'top-left': 'toastique-container--top-left',\n 'top-center': 'toastique-container--top-center',\n 'top-right': 'toastique-container--top-right',\n 'bottom-left': 'toastique-container--bottom-left',\n 'bottom-center': 'toastique-container--bottom-center',\n 'bottom-right': 'toastique-container--bottom-right',\n};\n\nexport const ToastContainer = ({ toasts, onDismiss }: ToastContainerProps) => {\n // Group toasts by position\n const groupedToasts = useMemo(() => {\n const groups: Record<ToastPosition, ToastType[]> = {\n 'top-left': [],\n 'top-center': [],\n 'top-right': [],\n 'bottom-left': [],\n 'bottom-center': [],\n 'bottom-right': [],\n };\n\n toasts.forEach((toast) => {\n groups[toast.options.position].push(toast);\n });\n\n return groups;\n }, [toasts]);\n\n return (\n <>\n {(Object.keys(groupedToasts) as ToastPosition[]).map((position) => {\n const positionToasts = groupedToasts[position];\n if (positionToasts.length === 0) return null;\n\n return (\n <div\n key={position}\n className={`toastique-container ${positionClasses[position]}`}\n aria-label={`Notifications ${position}`}\n >\n {positionToasts.map((toast) => (\n <Toast key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>\n );\n })}\n </>\n );\n};\n","import { createContext, useCallback, useReducer, useMemo } from 'react';\nimport type {\n Toast,\n ToastType,\n ToastOptions,\n ToastContextValue,\n ToastProviderProps,\n ToastPosition,\n} from '../types';\nimport { generateId } from '../utils';\nimport { ToastContainer } from '../components/ToastContainer';\n\ntype ToastAction =\n | { type: 'ADD'; payload: Toast }\n | { type: 'DISMISS'; payload: string }\n | { type: 'DISMISS_ALL' }\n | { type: 'UPDATE'; payload: { id: string; updates: Partial<Pick<Toast, 'type' | 'message'>> } };\n\nconst toastReducer = (state: Toast[], action: ToastAction): Toast[] => {\n switch (action.type) {\n case 'ADD':\n return [...state, action.payload];\n case 'DISMISS':\n return state.filter((toast) => toast.id !== action.payload);\n case 'DISMISS_ALL':\n return [];\n case 'UPDATE':\n return state.map((toast) =>\n toast.id === action.payload.id\n ? { ...toast, ...action.payload.updates }\n : toast\n );\n default:\n return state;\n }\n};\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\nconst DEFAULT_DURATION = 4000;\nconst DEFAULT_POSITION: ToastPosition = 'top-right';\nconst DEFAULT_MAX_TOASTS = 5;\n\nexport const ToastProvider = ({\n children,\n defaultPosition = DEFAULT_POSITION,\n defaultDuration = DEFAULT_DURATION,\n maxToasts = DEFAULT_MAX_TOASTS,\n}: ToastProviderProps) => {\n const [toasts, dispatch] = useReducer(toastReducer, []);\n\n const addToast = useCallback(\n (type: ToastType, message: string, options?: ToastOptions): string => {\n const id = generateId();\n const toast: Toast = {\n id,\n type,\n message,\n options: {\n duration: options?.duration ?? (type === 'loading' ? Infinity : defaultDuration),\n position: options?.position ?? defaultPosition,\n dismissible: options?.dismissible ?? true,\n icon: options?.icon,\n className: options?.className,\n onClose: options?.onClose,\n },\n createdAt: Date.now(),\n };\n\n dispatch({ type: 'ADD', payload: toast });\n\n // Auto dismiss (except for loading toasts)\n if (toast.options.duration !== Infinity) {\n setTimeout(() => {\n dispatch({ type: 'DISMISS', payload: id });\n options?.onClose?.();\n }, toast.options.duration);\n }\n\n return id;\n },\n [defaultDuration, defaultPosition]\n );\n\n const dismissToast = useCallback((id: string) => {\n const toast = toasts.find((t) => t.id === id);\n dispatch({ type: 'DISMISS', payload: id });\n toast?.options.onClose?.();\n }, [toasts]);\n\n const dismissAll = useCallback(() => {\n toasts.forEach((toast) => toast.options.onClose?.());\n dispatch({ type: 'DISMISS_ALL' });\n }, [toasts]);\n\n const updateToast = useCallback(\n (id: string, updates: Partial<Pick<Toast, 'type' | 'message'>>) => {\n dispatch({ type: 'UPDATE', payload: { id, updates } });\n },\n []\n );\n\n // Limit visible toasts\n const visibleToasts = useMemo(() => {\n return toasts.slice(-maxToasts);\n }, [toasts, maxToasts]);\n\n const value = useMemo(\n () => ({\n toasts: visibleToasts,\n addToast,\n dismissToast,\n dismissAll,\n updateToast,\n }),\n [visibleToasts, addToast, dismissToast, dismissAll, updateToast]\n );\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <ToastContainer toasts={visibleToasts} onDismiss={dismissToast} />\n </ToastContext.Provider>\n );\n};\n","import { useContext, useCallback } from 'react';\nimport { ToastContext } from '../context/ToastContext';\nimport type { ToastOptions, ToastPromiseOptions } from '../types';\n\nexport const useToast = () => {\n const context = useContext(ToastContext);\n\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n\n const { addToast, dismissToast, dismissAll, updateToast } = context;\n\n const success = useCallback(\n (message: string, options?: ToastOptions) => addToast('success', message, options),\n [addToast]\n );\n\n const error = useCallback(\n (message: string, options?: ToastOptions) => addToast('error', message, options),\n [addToast]\n );\n\n const warning = useCallback(\n (message: string, options?: ToastOptions) => addToast('warning', message, options),\n [addToast]\n );\n\n const info = useCallback(\n (message: string, options?: ToastOptions) => addToast('info', message, options),\n [addToast]\n );\n\n const loading = useCallback(\n (message: string, options?: ToastOptions) => addToast('loading', message, options),\n [addToast]\n );\n\n const promise = useCallback(\n <T>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n messages: ToastPromiseOptions,\n options?: ToastOptions\n ): Promise<T> => {\n const id = addToast('loading', messages.loading, { ...options, duration: Infinity });\n\n const promise = typeof promiseOrFn === 'function' ? promiseOrFn() : promiseOrFn;\n\n promise\n .then((data) => {\n const successMessage =\n typeof messages.success === 'function'\n ? messages.success(data)\n : messages.success;\n updateToast(id, { type: 'success', message: successMessage });\n\n // Auto dismiss after success\n setTimeout(() => {\n dismissToast(id);\n }, options?.duration ?? 4000);\n })\n .catch((err) => {\n const errorMessage =\n typeof messages.error === 'function'\n ? messages.error(err)\n : messages.error;\n updateToast(id, { type: 'error', message: errorMessage });\n\n // Auto dismiss after error\n setTimeout(() => {\n dismissToast(id);\n }, options?.duration ?? 4000);\n });\n\n return promise;\n },\n [addToast, updateToast, dismissToast]\n );\n\n const dismiss = useCallback(\n (id: string) => dismissToast(id),\n [dismissToast]\n );\n\n return {\n success,\n error,\n warning,\n info,\n loading,\n promise,\n dismiss,\n dismissAll,\n };\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "react-toastique",
3
+ "version": "1.0.0",
4
+ "description": "A lightweight, elegant toast notification library for React",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./styles.css": "./dist/index.css"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "sideEffects": [
21
+ "*.css"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch",
26
+ "type-check": "tsc --noEmit"
27
+ },
28
+ "keywords": [
29
+ "react",
30
+ "toast",
31
+ "notification",
32
+ "snackbar",
33
+ "alert",
34
+ "ui",
35
+ "component",
36
+ "lightweight",
37
+ "accessible"
38
+ ],
39
+ "author": "saykarim",
40
+ "license": "MIT",
41
+ "peerDependencies": {
42
+ "react": "^18.0.0 || ^19.0.0",
43
+ "react-dom": "^18.0.0 || ^19.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/react": "^18.2.48",
47
+ "@types/react-dom": "^18.2.18",
48
+ "react": "^18.2.0",
49
+ "react-dom": "^18.2.0",
50
+ "tsup": "^8.0.1",
51
+ "typescript": "^5.3.3"
52
+ }
53
+ }