react-compact-toast
Version:
A tiny, compact, and fully customizable toast notification library.
1 lines • 20.8 kB
Source Map (JSON)
{"version":3,"sources":["../src/constants/index.ts","../src/core/event-manager.ts","../src/core/toast.ts","../src/hooks/use-toast-container.ts","../src/hooks/use-toast.ts","#style-inject:#style-inject","../src/styles.css","../src/components/toast.tsx","../src/components/toast-container.tsx"],"names":["TOAST_DEFAULT_POSITION","eventManager","event","callback","filteredCallbacks","cb","args","callbacks","timers","timer","emitAddToast","toastProps","id","toast","options","useToastContainer","toastList","setToastList","useState","addToast","useCallback","props","prev","newMap","deleteToast","updateToast","text","useEffect","positionGroup","position","useToast","toastId","autoClose","closeOnClick","isExiting","setIsExiting","styleInject","css","insertAt","head","style","Toast","icon","highlightText","highlightColor","className","handleAnimationEnd","handleClick","isTopPosition","renderIcon","jsx","classes","jsxs","toast_default","ToastContainer","getToastPositionGroupToRender","useMemo","Fragment","toasts","toast_container_default","memo"],"mappings":"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","file":"index.mjs","sourcesContent":["export const TOAST_DEFAULT_POSITION = 'bottomCenter';\nexport const TOAST_MAX_COUNT = 6;\n","import { TOAST_MAX_COUNT } from '../constants';\nimport {\n EventManager,\n ToastEvent,\n EventCallbacks,\n TimeoutId,\n ToastProps,\n} from '../types';\n\nexport const eventManager: EventManager = {\n list: new Map(),\n emitQueue: new Map(),\n activeToastCount: 0,\n\n on<E extends ToastEvent>(event: E, callback: EventCallbacks[E]) {\n if (!this.list.has(event)) {\n this.list.set(event, []);\n }\n this.list\n .get(event)!\n .push(callback as EventCallbacks[keyof EventCallbacks]);\n return this;\n },\n\n off<E extends ToastEvent>(event: E, callback?: EventCallbacks[E]) {\n if (callback && this.list.has(event)) {\n const callbacks = this.list.get(event)!;\n const filteredCallbacks = callbacks.filter((cb) => cb !== callback);\n this.list.set(event, filteredCallbacks);\n } else if (!callback) {\n this.list.delete(event);\n }\n return this;\n },\n\n emit<E extends ToastEvent>(event: E, ...args: Parameters<EventCallbacks[E]>) {\n if (!this.list.has(event)) return;\n\n const callbacks = this.list.get(event)!;\n const timers: TimeoutId[] = [];\n\n if (event === ToastEvent.Add && this.activeToastCount >= TOAST_MAX_COUNT) {\n return;\n }\n\n callbacks.forEach((callback) => {\n const timer = setTimeout(() => {\n switch (event) {\n case ToastEvent.Add:\n (callback as EventCallbacks[ToastEvent.Add])(\n ...(args as [ToastProps])\n );\n this.activeToastCount += 1;\n break;\n case ToastEvent.Delete:\n (callback as EventCallbacks[ToastEvent.Delete])(\n ...(args as [string])\n );\n this.activeToastCount -= 1;\n break;\n case ToastEvent.Update:\n (callback as EventCallbacks[ToastEvent.Update])(\n ...(args as [string, string])\n );\n break;\n }\n }, 0);\n timers.push(timer);\n });\n\n if (timers.length > 0) {\n this.emitQueue.set(event, [\n ...(this.emitQueue.get(event) || []),\n ...timers,\n ]);\n }\n },\n\n cancelEmit(event: ToastEvent) {\n if (this.emitQueue.has(event)) {\n const timers = this.emitQueue.get(event)!;\n timers.forEach(clearTimeout);\n this.emitQueue.delete(event);\n }\n return this;\n },\n};\n","import { eventManager } from './event-manager';\nimport { ToastEvent, ToastProps } from '../types';\n\ntype ToastOptions = Omit<ToastProps, 'toastId'>;\n\nconst emitAddToast = (toastProps: ToastOptions) => {\n const id = crypto.randomUUID();\n\n eventManager.emit(ToastEvent.Add, {\n ...toastProps,\n toastId: id,\n });\n return id;\n};\n\n/**\n * Creates and displays a toast notification.\n *\n * @param {ToastOptions | string} options - Toast configuration options or a simple text message\n * - If a string is provided, it will be converted to `{ text: options }`\n * - If an object is provided, it should contain toast configuration properties:\n * @param {string} options.text - The text content to display in the toast\n * @param {React.JSX.Element | string | 'default'} [options.icon] - Icon to display in the toast:\n * - JSX Element: Custom React component\n * - string: Text/emoji icon\n * - 'default': Default icon\n * - undefined: No icon\n * @param {string} [options.highlightText] - Text to highlight with a different color\n * @param {string} [options.highlightColor] - Custom color for the highlighted text (CSS color value)\n * @param {false | number} [options.autoClose=3000] - Auto-close behavior:\n * - `false`: Toast will not close automatically\n * - `number`: Time in milliseconds before the toast closes automatically\n * @param {boolean} [options.closeOnClick=true] - Whether the toast should close when clicked\n * @param {ToastPosition} [options.position='bottomCenter'] - Position where the toast appears:\n * - 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight'\n * @param {string} [options.className] - Custom CSS classes to apply to the toast\n * @returns {string} The unique ID of the created toast\n *\n * @example\n * // Simple text toast\n * toast('Hello, world!');\n *\n * @example\n * // Toast with custom options\n * toast({\n * text: 'Custom notification',\n * icon: '🚀',\n * highlightText: 'Custom',\n * highlightColor: '#ff6b6b',\n * autoClose: 5000,\n * closeOnClick: true,\n * position: 'topRight',\n * className: 'bg-blue-500 text-white rounded-lg',\n * });\n */\nexport const toast = (options: ToastOptions | string): string => {\n const toastOptions: ToastOptions =\n typeof options === 'string' ? { text: options } : options;\n\n return emitAddToast(toastOptions);\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { TOAST_DEFAULT_POSITION } from '../constants';\nimport { eventManager, ToastEvent, ToastPosition, ToastProps } from '../core';\n\nexport const useToastContainer = () => {\n const [toastList, setToastList] = useState(new Map<string, ToastProps>());\n\n const addToast = useCallback((props: ToastProps) => {\n setToastList((prev) => {\n const newMap = new Map(prev);\n newMap.set(props.toastId, props);\n return newMap;\n });\n }, []);\n\n const deleteToast = useCallback((id: string) => {\n setToastList((prev) => {\n if (!prev.has(id)) return prev;\n\n const newMap = new Map(prev);\n newMap.delete(id);\n return newMap;\n });\n }, []);\n\n const updateToast = useCallback((id: string, text: string) => {\n setToastList((prev) => {\n if (!prev.has(id)) return prev;\n\n const newMap = new Map(prev);\n const toast = prev.get(id)!;\n newMap.set(id, { ...toast, text });\n return newMap;\n });\n }, []);\n\n useEffect(() => {\n eventManager.on(ToastEvent.Add, addToast);\n eventManager.on(ToastEvent.Delete, deleteToast);\n eventManager.on(ToastEvent.Update, updateToast);\n\n return () => {\n eventManager.off(ToastEvent.Add, addToast);\n eventManager.off(ToastEvent.Delete, deleteToast);\n eventManager.off(ToastEvent.Update, updateToast);\n\n eventManager.cancelEmit(ToastEvent.Add);\n eventManager.cancelEmit(ToastEvent.Delete);\n eventManager.cancelEmit(ToastEvent.Update);\n };\n }, [addToast, deleteToast, updateToast]);\n\n const getToastPositionGroupToRender = useCallback(() => {\n const positionGroup = new Map<ToastPosition, ToastProps[]>();\n\n toastList.forEach((toast) => {\n const position = toast.position || TOAST_DEFAULT_POSITION;\n\n if (!positionGroup.has(position)) {\n positionGroup.set(position, []);\n }\n positionGroup.get(position)!.push(toast);\n });\n\n return positionGroup;\n }, [toastList]);\n\n return { getToastPositionGroupToRender };\n};\n","import { useState, useEffect } from 'react';\n\nimport { eventManager, ToastEvent } from '../core';\n\nexport const useToast = (\n toastId: string,\n autoClose?: number | false,\n closeOnClick = true\n) => {\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n if (autoClose) {\n const timer = setTimeout(() => setIsExiting(true), autoClose);\n return () => clearTimeout(timer);\n }\n }, [autoClose]);\n\n const handleAnimationEnd = () => {\n if (isExiting) {\n eventManager.emit(ToastEvent.Delete, toastId);\n }\n };\n\n const handleClick = () => {\n if (closeOnClick) setIsExiting(true);\n };\n\n return { isExiting, handleAnimationEnd, handleClick };\n};\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@keyframes toastEnterFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes toastExitToBottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}@keyframes toastEnterFromTop{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes toastExitToTop{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}.toast{position:relative;min-width:320px;min-height:50px;display:flex;justify-content:center;align-items:center;text-align:center;z-index:9999;box-shadow:0 0 6px #00000026;cursor:pointer;pointer-events:auto;touch-action:auto}.toast-default-style{background-color:#fff;color:#121212;border-radius:24px}.toast-content{display:flex;justify-content:center;align-items:center;gap:4px}.toast-text{overflow:hidden;text-overflow:ellipsis;white-space:pre-line;max-width:270px}.toast-highlight-text{color:#a9e34b}.toast-enter-top{animation:toastEnterFromTop .5s ease-out forwards}.toast-exit-top{animation:toastExitToTop .5s ease-in forwards}.toast-enter-bottom{animation:toastEnterFromBottom .5s ease-out forwards}.toast-exit-bottom{animation:toastExitToBottom .5s ease-in forwards}.toast-container{display:flex;flex-direction:column;gap:10px;width:100vw;position:fixed;z-index:1000}.toast-position-bottomCenter{align-items:center;bottom:30px;left:0}.toast-position-bottomLeft{align-items:flex-start;bottom:30px;left:20px}.toast-position-bottomRight{align-items:flex-end;bottom:30px;right:20px}.toast-position-topCenter{align-items:center;left:0;top:30px}.toast-position-topLeft{align-items:flex-start;left:20px;top:30px}.toast-position-topRight{align-items:flex-end;right:20px;top:30px}\\n\")","import { TOAST_DEFAULT_POSITION } from '../constants';\nimport { ToastProps } from '../core';\nimport { useToast } from '../hooks';\n\nimport '../styles.css';\n\nconst Toast = ({\n toastId,\n text,\n icon,\n highlightText,\n highlightColor,\n autoClose = 3000,\n closeOnClick = true,\n position = TOAST_DEFAULT_POSITION,\n className,\n}: ToastProps) => {\n const { isExiting, handleAnimationEnd, handleClick } = useToast(\n toastId,\n autoClose,\n closeOnClick\n );\n\n const isTopPosition = position.startsWith('top');\n\n const renderIcon = () => {\n switch (icon) {\n case 'default':\n return icon;\n case undefined:\n return null;\n default:\n return icon;\n }\n };\n\n const getToastClasses = () => {\n let classes = 'toast';\n\n if (!className) {\n classes += ' toast-default-style toast-default-size';\n }\n\n if (isTopPosition) {\n classes += ' toast-top-position';\n }\n\n if (isExiting) {\n classes += isTopPosition ? ' toast-exit-top' : ' toast-exit-bottom';\n } else {\n classes += isTopPosition ? ' toast-enter-top' : ' toast-enter-bottom';\n }\n\n if (className) {\n classes += ` ${className}`;\n }\n\n return classes;\n };\n\n return (\n <div\n className={getToastClasses()}\n onClick={handleClick}\n onAnimationEnd={handleAnimationEnd}\n >\n <div className=\"toast-content\">\n {renderIcon()}\n <p className=\"toast-text\">\n <span\n className=\"toast-highlight-text\"\n style={highlightColor ? { color: highlightColor } : undefined}\n >\n {highlightText}\n </span>\n {text}\n </p>\n </div>\n </div>\n );\n};\n\nexport default Toast;\n","import { memo, useMemo, Fragment } from 'react';\n\nimport Toast from './toast';\nimport { useToastContainer } from '../hooks/use-toast-container';\nimport '../styles.css';\n\nconst ToastContainer = () => {\n const { getToastPositionGroupToRender } = useToastContainer();\n const positionGroup = useMemo(\n () => getToastPositionGroupToRender(),\n [getToastPositionGroupToRender]\n );\n\n return (\n <Fragment>\n {Array.from(positionGroup).map(([position, toasts]) => (\n <div\n key={position}\n className={`toast-container toast-position-${position}`}\n >\n {toasts.map((toastProps) => (\n <Toast key={toastProps.toastId} {...toastProps} />\n ))}\n </div>\n ))}\n </Fragment>\n );\n};\n\nexport default memo(ToastContainer);\n"]}