vibe-toast 0.1.4 → 0.1.6

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/README.md CHANGED
@@ -82,15 +82,6 @@ toast.promise(save(), {
82
82
  })
83
83
  ```
84
84
 
85
- ## ⚙️ API
86
-
87
- ### Toaster Props
88
- | Prop | Type | Default | Options |
89
- |------|------|---------|---------|
90
- | `position` | `string` | `'top-right'` | `top-left`, `top-center`, `top-right`, `bottom-left`, `bottom-center`, `bottom-right` |
91
- | `theme` | `string` | `'light'` | `light`, `dark` |
92
- | `duration` | `number` | `4000` | milliseconds |
93
- | `maxToasts` | `number` | `5` | max toasts shown at once |
94
85
 
95
86
  ### Toast Methods
96
87
  - `toast.success(message, options?)`
@@ -104,20 +95,6 @@ toast.promise(save(), {
104
95
  - `toast.dismissAll()`
105
96
  - `toast.update(id, options)`
106
97
 
107
- ## 📦 Bundle Size
108
-
109
- | Library | Size (gzipped) |
110
- |---------|---------------|
111
- | `vibe-toast` | **1.4kb** |
112
- | `react-hot-toast` | 7.2kb |
113
- | `sonner` | 4.8kb |
114
- | `react-toastify` | 15.2kb |
115
-
116
- ## 📄 License
117
-
118
- MIT © [Your Name]
119
-
120
- ---
121
98
 
122
99
  <div align="center">
123
100
  <a href="https://github.com/suraj-savle/vibe-toast">GitHub</a> •
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/Toaster.tsx","../src/hooks/use-toast.ts","../src/utils/generateId.ts","../src/core/storeBridge.ts","../src/components/ToastItem.tsx","../src/utils/resolveIcon.tsx","#style-inject:#style-inject","../src/styles/toast.css"],"sourcesContent":["export { Toaster } from './components/Toaster'; // Update this\r\nexport { useToast } from './hooks/use-toast';\r\nexport { toast } from './core/storeBridge';\r\nexport * from './types/types';\r\nimport './styles/toast.css';","import React from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useToast } from \"../hooks/use-toast\";\r\nimport { ToasterProps } from \"../types/types\";\r\nimport { ToastItem } from \"./ToastItem\";\r\n\r\nexport const Toaster: React.FC<ToasterProps> = ({\r\n position = \"top-right\",\r\n theme = \"system\",\r\n duration: globalDuration, // Added\r\n hideProgressBar: globalHideProgress, // Added\r\n}) => {\r\n const { toasts, dismiss } = useToast();\r\n const isTop = position.includes(\"top\");\r\n\r\n return (\r\n <div\r\n className={`vibe-toaster-container ${position}`}\r\n data-theme={theme}\r\n style={{\r\n position: \"fixed\",\r\n display: \"flex\",\r\n flexDirection: isTop ? \"column\" : \"column-reverse\",\r\n alignItems: position.includes(\"center\")\r\n ? \"center\"\r\n : position.includes(\"left\")\r\n ? \"flex-start\"\r\n : \"flex-end\",\r\n pointerEvents: \"none\",\r\n zIndex: 9999,\r\n padding: \"16px\",\r\n inset: 0,\r\n gap: \"12px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id} // This MUST stay here for AnimatePresence\r\n toast={{\r\n ...toast,\r\n duration: toast.duration ?? globalDuration,\r\n hideProgressBar: toast.hideProgressBar ?? globalHideProgress,\r\n }}\r\n onDismiss={dismiss}\r\n />\r\n ))}\r\n </AnimatePresence>\r\n </div>\r\n );\r\n};\r\n","import { useState, useEffect, useCallback } from 'react'; // Added useCallback\r\nimport { toastStore } from '../core/storeBridge';\r\nimport { Toast } from '../types/types'; \r\n\r\nexport function useToast() {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = toastStore.subscribe((newToasts) => {\r\n setToasts(newToasts);\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, []);\r\n\r\n // Use useCallback so this function reference never changes\r\n const dismiss = useCallback((id?: string) => {\r\n toastStore.dismiss(id);\r\n }, []);\r\n\r\n return {\r\n toasts,\r\n dismiss,\r\n };\r\n}","export const generateId = (): string => {\r\n return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);\r\n};","// packages/vibe-toast/src/core/storeBridge.ts\r\nimport React from 'react';\r\nimport { \r\n Toast, \r\n ToastOptions, \r\n PromiseOptions, \r\n ToastVariant, \r\n ToastFunction \r\n} from \"../types/types\";\r\nimport { generateId } from \"../utils/generateId\";\r\n\r\nexport const DEFAULT_TIMEOUTS: Record<ToastVariant, number> = {\r\n default: 4000,\r\n success: 4000,\r\n error: 4000,\r\n loading: Infinity,\r\n warning: 4000,\r\n info: 4000,\r\n};\r\n\r\ninterface StoreSettings {\r\n limit: number;\r\n}\r\n\r\ntype Listener = (toasts: Toast[]) => void;\r\n\r\nclass ToastStore {\r\n private toasts: Toast[] = [];\r\n private listeners: Set<Listener> = new Set();\r\n private settings: StoreSettings = { limit: 5 };\r\n\r\n subscribe(listener: Listener) {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private emit() {\r\n this.listeners.forEach((listener) => listener([...this.toasts]));\r\n }\r\n\r\n setLimit(newLimit: number) {\r\n this.settings.limit = newLimit;\r\n if (this.toasts.length > newLimit) {\r\n this.toasts = this.toasts.slice(0, newLimit);\r\n this.emit();\r\n }\r\n }\r\n\r\n add(options: ToastOptions): string {\r\n const id = generateId();\r\n const variant = options.variant || \"default\";\r\n const duration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant, \r\n duration,\r\n };\r\n\r\n // Add new toast to the front and enforce limit\r\n this.toasts = [newToast, ...this.toasts].slice(0, this.settings.limit);\r\n\r\n this.emit();\r\n return id;\r\n }\r\n\r\n update(id: string, options: Partial<ToastOptions>) {\r\n this.toasts = this.toasts.map((t) => {\r\n if (t.id === id) {\r\n const newVariant = options.variant || t.variant || \"default\";\r\n const newDuration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[newVariant as ToastVariant];\r\n\r\n return { ...t, ...options, variant: newVariant, duration: newDuration };\r\n }\r\n return t;\r\n });\r\n this.emit();\r\n }\r\n\r\n dismiss(id?: string) {\r\n if (id) {\r\n this.toasts = this.toasts.filter((t) => t.id !== id);\r\n } else {\r\n this.toasts = [];\r\n }\r\n this.emit();\r\n }\r\n}\r\n\r\nexport const toastStore = new ToastStore();\r\n\r\n/**\r\n * Internal base function to handle the logic\r\n */\r\nconst baseToast = (options: ToastOptions | string): string => {\r\n if (typeof options === \"string\") {\r\n return toastStore.add({ title: options, variant: \"default\" });\r\n }\r\n return toastStore.add(options);\r\n};\r\n\r\n/**\r\n * Helper to create variant-specific methods (success, error, etc.)\r\n */\r\nconst createHandler = (variant: ToastVariant) => {\r\n return (title: React.ReactNode, options?: Omit<ToastOptions, \"title\" | \"variant\">) => {\r\n return toastStore.add({\r\n ...options,\r\n title,\r\n variant,\r\n });\r\n };\r\n};\r\n\r\n// Assign Shorthand Methods\r\nbaseToast.success = createHandler(\"success\");\r\nbaseToast.error = createHandler(\"error\");\r\nbaseToast.warning = createHandler(\"warning\");\r\nbaseToast.info = createHandler(\"info\");\r\nbaseToast.loading = createHandler(\"loading\");\r\n\r\n// Assign Utility Methods\r\nbaseToast.dismiss = (id?: string) => toastStore.dismiss(id);\r\nbaseToast.dismissAll = () => toastStore.dismiss();\r\nbaseToast.setLimit = (n: number) => toastStore.setLimit(n);\r\n\r\n/**\r\n * Promise Handler Logic\r\n */\r\nbaseToast.promise = <T>(\r\n promise: Promise<T>,\r\n { loading, success, error }: PromiseOptions<T>\r\n) => {\r\n const id = toastStore.add({\r\n variant: 'loading',\r\n title: loading,\r\n duration: Infinity, \r\n });\r\n \r\n promise\r\n .then((data) => {\r\n const successTitle = typeof success === 'function' ? (success as Function)(data) : success;\r\n toastStore.update(id, {\r\n variant: 'success',\r\n title: successTitle,\r\n duration: DEFAULT_TIMEOUTS.success\r\n });\r\n })\r\n .catch((err) => {\r\n const errorTitle = typeof error === 'function' ? (error as Function)(err) : error;\r\n toastStore.update(id, {\r\n variant: 'error',\r\n title: errorTitle,\r\n duration: DEFAULT_TIMEOUTS.error\r\n });\r\n });\r\n \r\n return promise;\r\n};\r\n\r\n/**\r\n * Final Export: Cast to ToastFunction for full TypeScript support\r\n */\r\nexport const toast = (baseToast as unknown) as ToastFunction;","import React, { useState, useEffect } from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { MdClose } from \"react-icons/md\";\r\nimport { resolveIcon } from \"../utils/resolveIcon\";\r\nimport { Toast, ToastAction } from \"../types/types\";\r\n\r\nexport const ToastItem = ({\r\n toast,\r\n onDismiss,\r\n}: {\r\n toast: Toast;\r\n onDismiss: (id?: string) => void;\r\n}) => {\r\n const [isStarted, setIsStarted] = useState(false);\r\n const [showDesc, setShowDesc] = useState(false);\r\n const duration = toast.duration;\r\n // Inside ToastItem.tsx\r\n useEffect(() => {\r\n const toastDuration = toast.duration;\r\n if (!toastDuration || toastDuration === Infinity) return;\r\n\r\n const timer = setTimeout(() => {\r\n onDismiss(toast.id); // This will now work correctly with the stable function\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, onDismiss]);\r\n\r\n useEffect(() => {\r\n // 1. Reset and start progress bar\r\n setIsStarted(false);\r\n const progressTimer = setTimeout(() => setIsStarted(true), 50);\r\n\r\n // 2. DELAYED EXPANSION: Show description 300ms after the toast appears\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n\r\n return () => {\r\n clearTimeout(progressTimer);\r\n clearTimeout(expansionTimer);\r\n };\r\n }, [toast.id]);\r\n\r\n // --- Icon Logic ---\r\n const renderIcon = () => {\r\n // Determine the color based on priority\r\n const iconColor = toast.style?.accent || `var(--vibe-accent)`;\r\n\r\n if (toast.icon) {\r\n if (React.isValidElement(toast.icon)) {\r\n return React.cloneElement(toast.icon as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return toast.icon;\r\n }\r\n\r\n const iconElement = resolveIcon(toast.variant || \"default\");\r\n if (React.isValidElement(iconElement)) {\r\n return React.cloneElement(iconElement as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return iconElement;\r\n };\r\n\r\n const containerStyle: React.CSSProperties = {\r\n ...toast.style,\r\n backgroundColor: toast.style?.background || \"var(--vibe-bg)\",\r\n color: toast.style?.color || \"var(--vibe-text-main)\",\r\n borderColor: !!toast.style?.background\r\n ? \"transparent\"\r\n : \"var(--vibe-border)\",\r\n };\r\n\r\n const textStyle = { color: toast.style?.color || \"inherit\" };\r\n\r\n return (\r\n <motion.div\r\n layout\r\n initial={{ opacity: 0, y: 15, scale: 0.95 }}\r\n animate={{ opacity: 1, y: 0, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.9, transition: { duration: 0.2 } }}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => info.offset.x > 80 && onDismiss()}\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n >\r\n <div className=\"vibe-toast-inner\">\r\n <div className=\"vibe-toast-icon-side\">{renderIcon()}</div>\r\n\r\n <div className=\"vibe-toast-content-side\">\r\n <div className=\"vibe-toast-top-row\">\r\n <span className=\"vibe-toast-title\" style={textStyle}>\r\n {toast.title}\r\n </span>\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n style={textStyle}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n <AnimatePresence>\r\n {showDesc && toast.description && (\r\n <motion.div\r\n key=\"desc\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4, ease: [0.4, 0, 0.2, 1] },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n style={{ overflow: \"hidden\" }}\r\n >\r\n <p className=\"vibe-description-text\">{toast.description}</p>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n <AnimatePresence>\r\n {showDesc && toast.actions && toast.actions.length > 0 && (\r\n <motion.div\r\n key=\"actions\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4 },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n >\r\n <div className=\"vibe-action-stack\">\r\n {toast.actions?.map((action: ToastAction, idx: number) => (\r\n <button\r\n key={idx}\r\n className={`vibe-action-btn vibe-btn-${action.variant || \"secondary\"}`}\r\n onClick={(e) => {\r\n action.onClick(e);\r\n if (!toast.duration || toast.duration !== Infinity)\r\n onDismiss();\r\n }}\r\n >\r\n {action.label}\r\n </button>\r\n ))}\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Only show if NOT hidden AND duration isn't infinite */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n backgroundColor: toast.style?.accent || undefined,\r\n width: isStarted ? \"0%\" : \"100%\",\r\n transition: `width ${toast.duration}ms linear`, // Injected duration\r\n }}\r\n />\r\n </div>\r\n )}\r\n </motion.div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { ToastVariant } from '../types/types';\r\nimport { FaCheckCircle, FaCircleNotch } from 'react-icons/fa';\r\nimport { MdCancel, MdError } from 'react-icons/md';\r\nimport { IoIosInformationCircle } from 'react-icons/io';\r\nimport { TbAlertCircle, TbAlertCircleFilled, TbAlertTriangleFilled, TbBan, TbCircleLetterXFilled, TbCircleX, TbCircleXFilled } from 'react-icons/tb';\r\n\r\nexport const resolveIcon = (variant: ToastVariant) => {\r\n const props = { size: 20, strokeWidth: 2.25 };\r\n\r\n switch (variant) {\r\n case 'success': return <FaCheckCircle {...props} className=\"vibe-icon-success\" />;\r\n case 'error': return <TbCircleX {...props} className=\"vibe-icon-error\" />;\r\n case 'warning': return <TbBan {...props} className=\"vibe-icon-warning\" />;\r\n case 'info': return <TbAlertCircle {...props} className=\"vibe-icon-info\" />;\r\n case 'loading': return <FaCircleNotch {...props} className=\"vibe-icon-spin\" />;\r\n default: return null;\r\n }\r\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(\":root,.vibe-toaster-container{--vibe-bg: #09090b;--vibe-border: #27272a;--vibe-text-main: #ffffff;--vibe-text-muted: #a1a1aa;--vibe-progress-bg: rgba(255, 255, 255, .05);--vibe-accent: #3b82f6}.vibe-toaster-container[data-theme=light]{--vibe-bg: #ffffff;--vibe-border: #e4e4e7;--vibe-text-main: #18181b;--vibe-text-muted: #71717a;--vibe-progress-bg: rgba(0, 0, 0, .05)}.vibe-toaster-container{font-family:inherit;gap:10px!important;z-index:9999;pointer-events:none}.vibe-toast-card{font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;pointer-events:auto;position:relative;width:320px;background:var(--vibe-bg);border:1px solid var(--vibe-border);color:var(--vibe-text-main);border-radius:10px;box-shadow:0 10px 15px -3px #0006;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;transition:none!important}.vibe-toast-inner{display:flex;padding:14px;gap:12px;align-items:flex-start}.vibe-toast-icon-side{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-height:20px;color:var(--vibe-accent);font-size:20px}.vibe-toast-icon-side svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}.vibe-toast-content-side{flex:1;min-width:0;display:flex;flex-direction:column}.vibe-toast-top-row{display:flex;justify-content:space-between;align-items:flex-start;min-height:20px}.vibe-toast-title{font-weight:600;font-size:14px;line-height:1.4;margin-right:8px}.vibe-close-btn{background:none;border:none;color:var(--vibe-text-muted);cursor:pointer;opacity:.4;padding:0;display:flex;transition:opacity .2s}.vibe-close-btn:hover{opacity:1}.vibe-description-text{margin:6px 0 0;font-size:13px;color:var(--vibe-text-muted);line-height:1.5}.vibe-progress-track{height:3px;width:100%;background:var(--vibe-progress-bg);position:relative}.vibe-progress-fill{height:100%;background:var(--vibe-accent)}.vibe-variant-success{--vibe-accent: #10b981}.vibe-variant-error{--vibe-accent: #ef4444}.vibe-variant-warning{--vibe-accent: #f59e0b}.vibe-variant-info{--vibe-accent: #3b82f6}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;padding:4px 14px 14px;margin-top:8px}.vibe-action-btn{flex:1;padding:6px 12px;font-size:12px;font-weight:600;border-radius:6px;cursor:pointer;transition:all .2s ease;border:1px solid var(--vibe-border);background:transparent;color:var(--vibe-text-main)}.vibe-btn-primary{background:var(--vibe-accent);border-color:var(--vibe-accent);color:#fff}.vibe-btn-primary:hover{filter:brightness(1.1)}.vibe-btn-ghost{border-color:transparent;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}\\n\")"],"mappings":"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","names":["index_exports","__export","Toaster","toast","useToast","__toCommonJS","import_framer_motion","import_react","generateId","DEFAULT_TIMEOUTS","ToastStore","listener","newLimit","options","id","generateId","variant","duration","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","toast","useToast","toasts","setToasts","unsubscribe","toastStore","newToasts","dismiss","id","import_react","import_framer_motion","import_md","import_fa","import_tb","import_jsx_runtime","resolveIcon","variant","props","import_jsx_runtime","ToastItem","toast","onDismiss","isStarted","setIsStarted","showDesc","setShowDesc","duration","toastDuration","timer","progressTimer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","_","info","action","idx","e","import_jsx_runtime","Toaster","position","theme","globalDuration","globalHideProgress","toasts","dismiss","useToast","isTop","toast","ToastItem","styleInject","css","insertAt","head","style","styleInject"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/Toaster.tsx","../src/hooks/use-toast.ts","../src/utils/generateId.ts","../src/core/storeBridge.ts","../src/components/ToastItem.tsx","../src/utils/resolveIcon.tsx","#style-inject:#style-inject","../src/styles/toast.css"],"sourcesContent":["export { Toaster } from './components/Toaster'; // Update this\r\nexport { useToast } from './hooks/use-toast';\r\nexport { toast } from './core/storeBridge';\r\nexport * from './types/types';\r\nimport './styles/toast.css';","import React from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useToast } from \"../hooks/use-toast\";\r\nimport { ToasterProps } from \"../types/types\";\r\nimport { ToastItem } from \"./ToastItem\";\r\n\r\nexport const Toaster: React.FC<ToasterProps> = ({\r\n position = \"top-right\",\r\n theme = \"system\",\r\n duration: globalDuration, // Added\r\n hideProgressBar: globalHideProgress, // Added\r\n}) => {\r\n const { toasts, dismiss } = useToast();\r\n const isTop = position.includes(\"top\");\r\n\r\n return (\r\n <div\r\n className={`vibe-toaster-container ${position}`}\r\n data-theme={theme}\r\n style={{\r\n position: \"fixed\",\r\n display: \"flex\",\r\n flexDirection: isTop ? \"column\" : \"column-reverse\",\r\n alignItems: position.includes(\"center\")\r\n ? \"center\"\r\n : position.includes(\"left\")\r\n ? \"flex-start\"\r\n : \"flex-end\",\r\n pointerEvents: \"none\",\r\n zIndex: 9999,\r\n padding: \"16px\",\r\n inset: 0,\r\n gap: \"12px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id} // This MUST stay here for AnimatePresence\r\n toast={{\r\n ...toast,\r\n duration: toast.duration ?? globalDuration,\r\n hideProgressBar: toast.hideProgressBar ?? globalHideProgress,\r\n }}\r\n onDismiss={dismiss}\r\n />\r\n ))}\r\n </AnimatePresence>\r\n </div>\r\n );\r\n};\r\n","import { useState, useEffect, useCallback } from 'react'; // Added useCallback\r\nimport { toastStore } from '../core/storeBridge';\r\nimport { Toast } from '../types/types'; \r\n\r\nexport function useToast() {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = toastStore.subscribe((newToasts) => {\r\n setToasts(newToasts);\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, []);\r\n\r\n // Use useCallback so this function reference never changes\r\n const dismiss = useCallback((id?: string) => {\r\n toastStore.dismiss(id);\r\n }, []);\r\n\r\n return {\r\n toasts,\r\n dismiss,\r\n };\r\n}","export const generateId = (): string => {\r\n return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);\r\n};","// packages/vibe-toast/src/core/storeBridge.ts\r\nimport React from 'react';\r\nimport { \r\n Toast, \r\n ToastOptions, \r\n PromiseOptions, \r\n ToastVariant, \r\n ToastFunction \r\n} from \"../types/types\";\r\nimport { generateId } from \"../utils/generateId\";\r\n\r\nexport const DEFAULT_TIMEOUTS: Record<ToastVariant, number> = {\r\n default: 4000,\r\n success: 4000,\r\n error: 4000,\r\n loading: Infinity,\r\n warning: 4000,\r\n info: 4000,\r\n};\r\n\r\ninterface StoreSettings {\r\n limit: number;\r\n}\r\n\r\ntype Listener = (toasts: Toast[]) => void;\r\n\r\nclass ToastStore {\r\n private toasts: Toast[] = [];\r\n private listeners: Set<Listener> = new Set();\r\n private settings: StoreSettings = { limit: 5 };\r\n\r\n subscribe(listener: Listener) {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private emit() {\r\n this.listeners.forEach((listener) => listener([...this.toasts]));\r\n }\r\n\r\n setLimit(newLimit: number) {\r\n this.settings.limit = newLimit;\r\n if (this.toasts.length > newLimit) {\r\n this.toasts = this.toasts.slice(0, newLimit);\r\n this.emit();\r\n }\r\n }\r\n\r\n add(options: ToastOptions): string {\r\n const id = generateId();\r\n const variant = options.variant || \"default\";\r\n const duration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant, \r\n duration,\r\n };\r\n\r\n // Add new toast to the front and enforce limit\r\n this.toasts = [newToast, ...this.toasts].slice(0, this.settings.limit);\r\n\r\n this.emit();\r\n return id;\r\n }\r\n\r\n update(id: string, options: Partial<ToastOptions>) {\r\n this.toasts = this.toasts.map((t) => {\r\n if (t.id === id) {\r\n const newVariant = options.variant || t.variant || \"default\";\r\n const newDuration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[newVariant as ToastVariant];\r\n\r\n return { ...t, ...options, variant: newVariant, duration: newDuration };\r\n }\r\n return t;\r\n });\r\n this.emit();\r\n }\r\n\r\n dismiss(id?: string) {\r\n if (id) {\r\n this.toasts = this.toasts.filter((t) => t.id !== id);\r\n } else {\r\n this.toasts = [];\r\n }\r\n this.emit();\r\n }\r\n}\r\n\r\nexport const toastStore = new ToastStore();\r\n\r\n/**\r\n * Internal base function to handle the logic\r\n */\r\nconst baseToast = (options: ToastOptions | string): string => {\r\n if (typeof options === \"string\") {\r\n return toastStore.add({ title: options, variant: \"default\" });\r\n }\r\n return toastStore.add(options);\r\n};\r\n\r\n/**\r\n * Helper to create variant-specific methods (success, error, etc.)\r\n */\r\nconst createHandler = (variant: ToastVariant) => {\r\n return (title: React.ReactNode, options?: Omit<ToastOptions, \"title\" | \"variant\">) => {\r\n return toastStore.add({\r\n ...options,\r\n title,\r\n variant,\r\n });\r\n };\r\n};\r\n\r\n// Assign Shorthand Methods\r\nbaseToast.success = createHandler(\"success\");\r\nbaseToast.error = createHandler(\"error\");\r\nbaseToast.warning = createHandler(\"warning\");\r\nbaseToast.info = createHandler(\"info\");\r\nbaseToast.loading = createHandler(\"loading\");\r\n\r\n// Assign Utility Methods\r\nbaseToast.dismiss = (id?: string) => toastStore.dismiss(id);\r\nbaseToast.dismissAll = () => toastStore.dismiss();\r\nbaseToast.setLimit = (n: number) => toastStore.setLimit(n);\r\n\r\n/**\r\n * Promise Handler Logic\r\n */\r\nbaseToast.promise = <T>(\r\n promise: Promise<T>,\r\n { loading, success, error }: PromiseOptions<T>\r\n) => {\r\n const id = toastStore.add({\r\n variant: 'loading',\r\n title: loading,\r\n duration: Infinity, \r\n });\r\n \r\n promise\r\n .then((data) => {\r\n const successTitle = typeof success === 'function' ? (success as Function)(data) : success;\r\n toastStore.update(id, {\r\n variant: 'success',\r\n title: successTitle,\r\n duration: DEFAULT_TIMEOUTS.success\r\n });\r\n })\r\n .catch((err) => {\r\n const errorTitle = typeof error === 'function' ? (error as Function)(err) : error;\r\n toastStore.update(id, {\r\n variant: 'error',\r\n title: errorTitle,\r\n duration: DEFAULT_TIMEOUTS.error\r\n });\r\n });\r\n \r\n return promise;\r\n};\r\n\r\n/**\r\n * Final Export: Cast to ToastFunction for full TypeScript support\r\n */\r\nexport const toast = (baseToast as unknown) as ToastFunction;","\"use client\";\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { MdClose } from \"react-icons/md\";\r\nimport { resolveIcon } from \"../utils/resolveIcon\";\r\nimport { Toast, ToastAction } from \"../types/types\";\r\n\r\nexport const ToastItem = ({\r\n toast,\r\n onDismiss,\r\n}: {\r\n toast: Toast;\r\n onDismiss: (id?: string) => void;\r\n}) => {\r\n const [isStarted, setIsStarted] = useState(false);\r\n const [showDesc, setShowDesc] = useState(false);\r\n const duration = toast.duration;\r\n // Inside ToastItem.tsx\r\n useEffect(() => {\r\n const toastDuration = toast.duration;\r\n if (!toastDuration || toastDuration === Infinity) return;\r\n\r\n const timer = setTimeout(() => {\r\n onDismiss(toast.id); // This will now work correctly with the stable function\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, onDismiss]);\r\n\r\n useEffect(() => {\r\n // 1. Reset and start progress bar\r\n setIsStarted(false);\r\n const progressTimer = setTimeout(() => setIsStarted(true), 50);\r\n\r\n // 2. DELAYED EXPANSION: Show description 300ms after the toast appears\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n\r\n return () => {\r\n clearTimeout(progressTimer);\r\n clearTimeout(expansionTimer);\r\n };\r\n }, [toast.id]);\r\n\r\n // --- Icon Logic ---\r\n const renderIcon = () => {\r\n // Determine the color based on priority\r\n const iconColor = toast.style?.accent || `var(--vibe-accent)`;\r\n\r\n if (toast.icon) {\r\n if (React.isValidElement(toast.icon)) {\r\n return React.cloneElement(toast.icon as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return toast.icon;\r\n }\r\n\r\n const iconElement = resolveIcon(toast.variant || \"default\");\r\n if (React.isValidElement(iconElement)) {\r\n return React.cloneElement(iconElement as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return iconElement;\r\n };\r\n\r\n const containerStyle: React.CSSProperties = {\r\n ...toast.style,\r\n backgroundColor: toast.style?.background || \"var(--vibe-bg)\",\r\n color: toast.style?.color || \"var(--vibe-text-main)\",\r\n borderColor: !!toast.style?.background\r\n ? \"transparent\"\r\n : \"var(--vibe-border)\",\r\n };\r\n\r\n const textStyle = { color: toast.style?.color || \"inherit\" };\r\n\r\n return (\r\n <motion.div\r\n layout\r\n initial={{ opacity: 0, y: 15, scale: 0.95 }}\r\n animate={{ opacity: 1, y: 0, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.9, transition: { duration: 0.2 } }}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => info.offset.x > 80 && onDismiss()}\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n >\r\n <div className=\"vibe-toast-inner\">\r\n <div className=\"vibe-toast-icon-side\">{renderIcon()}</div>\r\n\r\n <div className=\"vibe-toast-content-side\">\r\n <div className=\"vibe-toast-top-row\">\r\n <span className=\"vibe-toast-title\" style={textStyle}>\r\n {toast.title}\r\n </span>\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n style={textStyle}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n <AnimatePresence>\r\n {showDesc && toast.description && (\r\n <motion.div\r\n key=\"desc\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4, ease: [0.4, 0, 0.2, 1] },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n style={{ overflow: \"hidden\" }}\r\n >\r\n <p className=\"vibe-description-text\">{toast.description}</p>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n <AnimatePresence>\r\n {showDesc && toast.actions && toast.actions.length > 0 && (\r\n <motion.div\r\n key=\"actions\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4 },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n >\r\n <div className=\"vibe-action-stack\">\r\n {toast.actions?.map((action: ToastAction, idx: number) => (\r\n <button\r\n key={idx}\r\n className={`vibe-action-btn vibe-btn-${action.variant || \"secondary\"}`}\r\n onClick={(e) => {\r\n action.onClick(e);\r\n if (!toast.duration || toast.duration !== Infinity)\r\n onDismiss();\r\n }}\r\n >\r\n {action.label}\r\n </button>\r\n ))}\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Only show if NOT hidden AND duration isn't infinite */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n backgroundColor: toast.style?.accent || undefined,\r\n width: isStarted ? \"0%\" : \"100%\",\r\n transition: `width ${toast.duration}ms linear`, // Injected duration\r\n }}\r\n />\r\n </div>\r\n )}\r\n </motion.div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { ToastVariant } from '../types/types';\r\nimport { FaCheckCircle, FaCircleNotch } from 'react-icons/fa';\r\nimport { MdCancel, MdError } from 'react-icons/md';\r\nimport { IoIosInformationCircle } from 'react-icons/io';\r\nimport { TbAlertCircle, TbAlertCircleFilled, TbAlertTriangleFilled, TbBan, TbCircleLetterXFilled, TbCircleX, TbCircleXFilled } from 'react-icons/tb';\r\n\r\nexport const resolveIcon = (variant: ToastVariant) => {\r\n const props = { size: 20, strokeWidth: 2.25 };\r\n\r\n switch (variant) {\r\n case 'success': return <FaCheckCircle {...props} className=\"vibe-icon-success\" />;\r\n case 'error': return <TbCircleX {...props} className=\"vibe-icon-error\" />;\r\n case 'warning': return <TbBan {...props} className=\"vibe-icon-warning\" />;\r\n case 'info': return <TbAlertCircle {...props} className=\"vibe-icon-info\" />;\r\n case 'loading': return <FaCircleNotch {...props} className=\"vibe-icon-spin\" />;\r\n default: return null;\r\n }\r\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(\":root,.vibe-toaster-container{--vibe-bg: #09090b;--vibe-border: #27272a;--vibe-text-main: #ffffff;--vibe-text-muted: #a1a1aa;--vibe-progress-bg: rgba(255, 255, 255, .05);--vibe-accent: #3b82f6}.vibe-toaster-container[data-theme=light]{--vibe-bg: #ffffff;--vibe-border: #e4e4e7;--vibe-text-main: #18181b;--vibe-text-muted: #71717a;--vibe-progress-bg: rgba(0, 0, 0, .05)}.vibe-toaster-container{font-family:inherit;gap:10px!important;z-index:9999;pointer-events:none}.vibe-toast-card{font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;pointer-events:auto;position:relative;width:320px;background:var(--vibe-bg);border:1px solid var(--vibe-border);color:var(--vibe-text-main);border-radius:10px;box-shadow:0 10px 15px -3px #0006;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;transition:none!important}.vibe-toast-inner{display:flex;padding:14px;gap:12px;align-items:flex-start}.vibe-toast-icon-side{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-height:20px;color:var(--vibe-accent);font-size:20px}.vibe-toast-icon-side svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}.vibe-toast-content-side{flex:1;min-width:0;display:flex;flex-direction:column}.vibe-toast-top-row{display:flex;justify-content:space-between;align-items:flex-start;min-height:20px}.vibe-toast-title{font-weight:600;font-size:14px;line-height:1.4;margin-right:8px}.vibe-close-btn{background:none;border:none;color:var(--vibe-text-muted);cursor:pointer;opacity:.4;padding:0;display:flex;transition:opacity .2s}.vibe-close-btn:hover{opacity:1}.vibe-description-text{margin:6px 0 0;font-size:13px;color:var(--vibe-text-muted);line-height:1.5}.vibe-progress-track{height:3px;width:100%;background:var(--vibe-progress-bg);position:relative}.vibe-progress-fill{height:100%;background:var(--vibe-accent)}.vibe-variant-success{--vibe-accent: #10b981}.vibe-variant-error{--vibe-accent: #ef4444}.vibe-variant-warning{--vibe-accent: #f59e0b}.vibe-variant-info{--vibe-accent: #3b82f6}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;padding:4px 14px 14px;margin-top:8px}.vibe-action-btn{flex:1;padding:6px 12px;font-size:12px;font-weight:600;border-radius:6px;cursor:pointer;transition:all .2s ease;border:1px solid var(--vibe-border);background:transparent;color:var(--vibe-text-main)}.vibe-btn-primary{background:var(--vibe-accent);border-color:var(--vibe-accent);color:#fff}.vibe-btn-primary:hover{filter:brightness(1.1)}.vibe-btn-ghost{border-color:transparent;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}\\n\")"],"mappings":"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","names":["index_exports","__export","Toaster","toast","useToast","__toCommonJS","import_framer_motion","import_react","generateId","DEFAULT_TIMEOUTS","ToastStore","listener","newLimit","options","id","generateId","variant","duration","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","toast","useToast","toasts","setToasts","unsubscribe","toastStore","newToasts","dismiss","id","import_react","import_framer_motion","import_md","import_fa","import_tb","import_jsx_runtime","resolveIcon","variant","props","import_jsx_runtime","ToastItem","toast","onDismiss","isStarted","setIsStarted","showDesc","setShowDesc","duration","toastDuration","timer","progressTimer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","_","info","action","idx","e","import_jsx_runtime","Toaster","position","theme","globalDuration","globalHideProgress","toasts","dismiss","useToast","isTop","toast","ToastItem","styleInject","css","insertAt","head","style","styleInject"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Toaster.tsx","../src/hooks/use-toast.ts","../src/utils/generateId.ts","../src/core/storeBridge.ts","../src/components/ToastItem.tsx","../src/utils/resolveIcon.tsx","#style-inject:#style-inject","../src/styles/toast.css"],"sourcesContent":["import React from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useToast } from \"../hooks/use-toast\";\r\nimport { ToasterProps } from \"../types/types\";\r\nimport { ToastItem } from \"./ToastItem\";\r\n\r\nexport const Toaster: React.FC<ToasterProps> = ({\r\n position = \"top-right\",\r\n theme = \"system\",\r\n duration: globalDuration, // Added\r\n hideProgressBar: globalHideProgress, // Added\r\n}) => {\r\n const { toasts, dismiss } = useToast();\r\n const isTop = position.includes(\"top\");\r\n\r\n return (\r\n <div\r\n className={`vibe-toaster-container ${position}`}\r\n data-theme={theme}\r\n style={{\r\n position: \"fixed\",\r\n display: \"flex\",\r\n flexDirection: isTop ? \"column\" : \"column-reverse\",\r\n alignItems: position.includes(\"center\")\r\n ? \"center\"\r\n : position.includes(\"left\")\r\n ? \"flex-start\"\r\n : \"flex-end\",\r\n pointerEvents: \"none\",\r\n zIndex: 9999,\r\n padding: \"16px\",\r\n inset: 0,\r\n gap: \"12px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id} // This MUST stay here for AnimatePresence\r\n toast={{\r\n ...toast,\r\n duration: toast.duration ?? globalDuration,\r\n hideProgressBar: toast.hideProgressBar ?? globalHideProgress,\r\n }}\r\n onDismiss={dismiss}\r\n />\r\n ))}\r\n </AnimatePresence>\r\n </div>\r\n );\r\n};\r\n","import { useState, useEffect, useCallback } from 'react'; // Added useCallback\r\nimport { toastStore } from '../core/storeBridge';\r\nimport { Toast } from '../types/types'; \r\n\r\nexport function useToast() {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = toastStore.subscribe((newToasts) => {\r\n setToasts(newToasts);\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, []);\r\n\r\n // Use useCallback so this function reference never changes\r\n const dismiss = useCallback((id?: string) => {\r\n toastStore.dismiss(id);\r\n }, []);\r\n\r\n return {\r\n toasts,\r\n dismiss,\r\n };\r\n}","export const generateId = (): string => {\r\n return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);\r\n};","// packages/vibe-toast/src/core/storeBridge.ts\r\nimport React from 'react';\r\nimport { \r\n Toast, \r\n ToastOptions, \r\n PromiseOptions, \r\n ToastVariant, \r\n ToastFunction \r\n} from \"../types/types\";\r\nimport { generateId } from \"../utils/generateId\";\r\n\r\nexport const DEFAULT_TIMEOUTS: Record<ToastVariant, number> = {\r\n default: 4000,\r\n success: 4000,\r\n error: 4000,\r\n loading: Infinity,\r\n warning: 4000,\r\n info: 4000,\r\n};\r\n\r\ninterface StoreSettings {\r\n limit: number;\r\n}\r\n\r\ntype Listener = (toasts: Toast[]) => void;\r\n\r\nclass ToastStore {\r\n private toasts: Toast[] = [];\r\n private listeners: Set<Listener> = new Set();\r\n private settings: StoreSettings = { limit: 5 };\r\n\r\n subscribe(listener: Listener) {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private emit() {\r\n this.listeners.forEach((listener) => listener([...this.toasts]));\r\n }\r\n\r\n setLimit(newLimit: number) {\r\n this.settings.limit = newLimit;\r\n if (this.toasts.length > newLimit) {\r\n this.toasts = this.toasts.slice(0, newLimit);\r\n this.emit();\r\n }\r\n }\r\n\r\n add(options: ToastOptions): string {\r\n const id = generateId();\r\n const variant = options.variant || \"default\";\r\n const duration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant, \r\n duration,\r\n };\r\n\r\n // Add new toast to the front and enforce limit\r\n this.toasts = [newToast, ...this.toasts].slice(0, this.settings.limit);\r\n\r\n this.emit();\r\n return id;\r\n }\r\n\r\n update(id: string, options: Partial<ToastOptions>) {\r\n this.toasts = this.toasts.map((t) => {\r\n if (t.id === id) {\r\n const newVariant = options.variant || t.variant || \"default\";\r\n const newDuration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[newVariant as ToastVariant];\r\n\r\n return { ...t, ...options, variant: newVariant, duration: newDuration };\r\n }\r\n return t;\r\n });\r\n this.emit();\r\n }\r\n\r\n dismiss(id?: string) {\r\n if (id) {\r\n this.toasts = this.toasts.filter((t) => t.id !== id);\r\n } else {\r\n this.toasts = [];\r\n }\r\n this.emit();\r\n }\r\n}\r\n\r\nexport const toastStore = new ToastStore();\r\n\r\n/**\r\n * Internal base function to handle the logic\r\n */\r\nconst baseToast = (options: ToastOptions | string): string => {\r\n if (typeof options === \"string\") {\r\n return toastStore.add({ title: options, variant: \"default\" });\r\n }\r\n return toastStore.add(options);\r\n};\r\n\r\n/**\r\n * Helper to create variant-specific methods (success, error, etc.)\r\n */\r\nconst createHandler = (variant: ToastVariant) => {\r\n return (title: React.ReactNode, options?: Omit<ToastOptions, \"title\" | \"variant\">) => {\r\n return toastStore.add({\r\n ...options,\r\n title,\r\n variant,\r\n });\r\n };\r\n};\r\n\r\n// Assign Shorthand Methods\r\nbaseToast.success = createHandler(\"success\");\r\nbaseToast.error = createHandler(\"error\");\r\nbaseToast.warning = createHandler(\"warning\");\r\nbaseToast.info = createHandler(\"info\");\r\nbaseToast.loading = createHandler(\"loading\");\r\n\r\n// Assign Utility Methods\r\nbaseToast.dismiss = (id?: string) => toastStore.dismiss(id);\r\nbaseToast.dismissAll = () => toastStore.dismiss();\r\nbaseToast.setLimit = (n: number) => toastStore.setLimit(n);\r\n\r\n/**\r\n * Promise Handler Logic\r\n */\r\nbaseToast.promise = <T>(\r\n promise: Promise<T>,\r\n { loading, success, error }: PromiseOptions<T>\r\n) => {\r\n const id = toastStore.add({\r\n variant: 'loading',\r\n title: loading,\r\n duration: Infinity, \r\n });\r\n \r\n promise\r\n .then((data) => {\r\n const successTitle = typeof success === 'function' ? (success as Function)(data) : success;\r\n toastStore.update(id, {\r\n variant: 'success',\r\n title: successTitle,\r\n duration: DEFAULT_TIMEOUTS.success\r\n });\r\n })\r\n .catch((err) => {\r\n const errorTitle = typeof error === 'function' ? (error as Function)(err) : error;\r\n toastStore.update(id, {\r\n variant: 'error',\r\n title: errorTitle,\r\n duration: DEFAULT_TIMEOUTS.error\r\n });\r\n });\r\n \r\n return promise;\r\n};\r\n\r\n/**\r\n * Final Export: Cast to ToastFunction for full TypeScript support\r\n */\r\nexport const toast = (baseToast as unknown) as ToastFunction;","import React, { useState, useEffect } from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { MdClose } from \"react-icons/md\";\r\nimport { resolveIcon } from \"../utils/resolveIcon\";\r\nimport { Toast, ToastAction } from \"../types/types\";\r\n\r\nexport const ToastItem = ({\r\n toast,\r\n onDismiss,\r\n}: {\r\n toast: Toast;\r\n onDismiss: (id?: string) => void;\r\n}) => {\r\n const [isStarted, setIsStarted] = useState(false);\r\n const [showDesc, setShowDesc] = useState(false);\r\n const duration = toast.duration;\r\n // Inside ToastItem.tsx\r\n useEffect(() => {\r\n const toastDuration = toast.duration;\r\n if (!toastDuration || toastDuration === Infinity) return;\r\n\r\n const timer = setTimeout(() => {\r\n onDismiss(toast.id); // This will now work correctly with the stable function\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, onDismiss]);\r\n\r\n useEffect(() => {\r\n // 1. Reset and start progress bar\r\n setIsStarted(false);\r\n const progressTimer = setTimeout(() => setIsStarted(true), 50);\r\n\r\n // 2. DELAYED EXPANSION: Show description 300ms after the toast appears\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n\r\n return () => {\r\n clearTimeout(progressTimer);\r\n clearTimeout(expansionTimer);\r\n };\r\n }, [toast.id]);\r\n\r\n // --- Icon Logic ---\r\n const renderIcon = () => {\r\n // Determine the color based on priority\r\n const iconColor = toast.style?.accent || `var(--vibe-accent)`;\r\n\r\n if (toast.icon) {\r\n if (React.isValidElement(toast.icon)) {\r\n return React.cloneElement(toast.icon as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return toast.icon;\r\n }\r\n\r\n const iconElement = resolveIcon(toast.variant || \"default\");\r\n if (React.isValidElement(iconElement)) {\r\n return React.cloneElement(iconElement as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return iconElement;\r\n };\r\n\r\n const containerStyle: React.CSSProperties = {\r\n ...toast.style,\r\n backgroundColor: toast.style?.background || \"var(--vibe-bg)\",\r\n color: toast.style?.color || \"var(--vibe-text-main)\",\r\n borderColor: !!toast.style?.background\r\n ? \"transparent\"\r\n : \"var(--vibe-border)\",\r\n };\r\n\r\n const textStyle = { color: toast.style?.color || \"inherit\" };\r\n\r\n return (\r\n <motion.div\r\n layout\r\n initial={{ opacity: 0, y: 15, scale: 0.95 }}\r\n animate={{ opacity: 1, y: 0, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.9, transition: { duration: 0.2 } }}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => info.offset.x > 80 && onDismiss()}\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n >\r\n <div className=\"vibe-toast-inner\">\r\n <div className=\"vibe-toast-icon-side\">{renderIcon()}</div>\r\n\r\n <div className=\"vibe-toast-content-side\">\r\n <div className=\"vibe-toast-top-row\">\r\n <span className=\"vibe-toast-title\" style={textStyle}>\r\n {toast.title}\r\n </span>\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n style={textStyle}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n <AnimatePresence>\r\n {showDesc && toast.description && (\r\n <motion.div\r\n key=\"desc\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4, ease: [0.4, 0, 0.2, 1] },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n style={{ overflow: \"hidden\" }}\r\n >\r\n <p className=\"vibe-description-text\">{toast.description}</p>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n <AnimatePresence>\r\n {showDesc && toast.actions && toast.actions.length > 0 && (\r\n <motion.div\r\n key=\"actions\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4 },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n >\r\n <div className=\"vibe-action-stack\">\r\n {toast.actions?.map((action: ToastAction, idx: number) => (\r\n <button\r\n key={idx}\r\n className={`vibe-action-btn vibe-btn-${action.variant || \"secondary\"}`}\r\n onClick={(e) => {\r\n action.onClick(e);\r\n if (!toast.duration || toast.duration !== Infinity)\r\n onDismiss();\r\n }}\r\n >\r\n {action.label}\r\n </button>\r\n ))}\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Only show if NOT hidden AND duration isn't infinite */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n backgroundColor: toast.style?.accent || undefined,\r\n width: isStarted ? \"0%\" : \"100%\",\r\n transition: `width ${toast.duration}ms linear`, // Injected duration\r\n }}\r\n />\r\n </div>\r\n )}\r\n </motion.div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { ToastVariant } from '../types/types';\r\nimport { FaCheckCircle, FaCircleNotch } from 'react-icons/fa';\r\nimport { MdCancel, MdError } from 'react-icons/md';\r\nimport { IoIosInformationCircle } from 'react-icons/io';\r\nimport { TbAlertCircle, TbAlertCircleFilled, TbAlertTriangleFilled, TbBan, TbCircleLetterXFilled, TbCircleX, TbCircleXFilled } from 'react-icons/tb';\r\n\r\nexport const resolveIcon = (variant: ToastVariant) => {\r\n const props = { size: 20, strokeWidth: 2.25 };\r\n\r\n switch (variant) {\r\n case 'success': return <FaCheckCircle {...props} className=\"vibe-icon-success\" />;\r\n case 'error': return <TbCircleX {...props} className=\"vibe-icon-error\" />;\r\n case 'warning': return <TbBan {...props} className=\"vibe-icon-warning\" />;\r\n case 'info': return <TbAlertCircle {...props} className=\"vibe-icon-info\" />;\r\n case 'loading': return <FaCircleNotch {...props} className=\"vibe-icon-spin\" />;\r\n default: return null;\r\n }\r\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(\":root,.vibe-toaster-container{--vibe-bg: #09090b;--vibe-border: #27272a;--vibe-text-main: #ffffff;--vibe-text-muted: #a1a1aa;--vibe-progress-bg: rgba(255, 255, 255, .05);--vibe-accent: #3b82f6}.vibe-toaster-container[data-theme=light]{--vibe-bg: #ffffff;--vibe-border: #e4e4e7;--vibe-text-main: #18181b;--vibe-text-muted: #71717a;--vibe-progress-bg: rgba(0, 0, 0, .05)}.vibe-toaster-container{font-family:inherit;gap:10px!important;z-index:9999;pointer-events:none}.vibe-toast-card{font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;pointer-events:auto;position:relative;width:320px;background:var(--vibe-bg);border:1px solid var(--vibe-border);color:var(--vibe-text-main);border-radius:10px;box-shadow:0 10px 15px -3px #0006;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;transition:none!important}.vibe-toast-inner{display:flex;padding:14px;gap:12px;align-items:flex-start}.vibe-toast-icon-side{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-height:20px;color:var(--vibe-accent);font-size:20px}.vibe-toast-icon-side svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}.vibe-toast-content-side{flex:1;min-width:0;display:flex;flex-direction:column}.vibe-toast-top-row{display:flex;justify-content:space-between;align-items:flex-start;min-height:20px}.vibe-toast-title{font-weight:600;font-size:14px;line-height:1.4;margin-right:8px}.vibe-close-btn{background:none;border:none;color:var(--vibe-text-muted);cursor:pointer;opacity:.4;padding:0;display:flex;transition:opacity .2s}.vibe-close-btn:hover{opacity:1}.vibe-description-text{margin:6px 0 0;font-size:13px;color:var(--vibe-text-muted);line-height:1.5}.vibe-progress-track{height:3px;width:100%;background:var(--vibe-progress-bg);position:relative}.vibe-progress-fill{height:100%;background:var(--vibe-accent)}.vibe-variant-success{--vibe-accent: #10b981}.vibe-variant-error{--vibe-accent: #ef4444}.vibe-variant-warning{--vibe-accent: #f59e0b}.vibe-variant-info{--vibe-accent: #3b82f6}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;padding:4px 14px 14px;margin-top:8px}.vibe-action-btn{flex:1;padding:6px 12px;font-size:12px;font-weight:600;border-radius:6px;cursor:pointer;transition:all .2s ease;border:1px solid var(--vibe-border);background:transparent;color:var(--vibe-text-main)}.vibe-btn-primary{background:var(--vibe-accent);border-color:var(--vibe-accent);color:#fff}.vibe-btn-primary:hover{filter:brightness(1.1)}.vibe-btn-ghost{border-color:transparent;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}\\n\")"],"mappings":"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","names":["AnimatePresence","useState","useEffect","useCallback","generateId","DEFAULT_TIMEOUTS","ToastStore","listener","newLimit","options","id","generateId","variant","duration","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","toast","useToast","toasts","setToasts","useState","useEffect","unsubscribe","toastStore","newToasts","dismiss","useCallback","id","React","useState","useEffect","AnimatePresence","motion","MdClose","FaCheckCircle","FaCircleNotch","TbAlertCircle","TbBan","TbCircleX","jsx","resolveIcon","variant","props","jsx","jsxs","ToastItem","toast","onDismiss","isStarted","setIsStarted","useState","showDesc","setShowDesc","duration","useEffect","toastDuration","timer","progressTimer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","motion","_","info","MdClose","AnimatePresence","action","idx","e","jsx","Toaster","position","theme","globalDuration","globalHideProgress","toasts","dismiss","useToast","isTop","AnimatePresence","toast","ToastItem","styleInject","css","insertAt","head","style","styleInject"]}
1
+ {"version":3,"sources":["../src/components/Toaster.tsx","../src/hooks/use-toast.ts","../src/utils/generateId.ts","../src/core/storeBridge.ts","../src/components/ToastItem.tsx","../src/utils/resolveIcon.tsx","#style-inject:#style-inject","../src/styles/toast.css"],"sourcesContent":["import React from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useToast } from \"../hooks/use-toast\";\r\nimport { ToasterProps } from \"../types/types\";\r\nimport { ToastItem } from \"./ToastItem\";\r\n\r\nexport const Toaster: React.FC<ToasterProps> = ({\r\n position = \"top-right\",\r\n theme = \"system\",\r\n duration: globalDuration, // Added\r\n hideProgressBar: globalHideProgress, // Added\r\n}) => {\r\n const { toasts, dismiss } = useToast();\r\n const isTop = position.includes(\"top\");\r\n\r\n return (\r\n <div\r\n className={`vibe-toaster-container ${position}`}\r\n data-theme={theme}\r\n style={{\r\n position: \"fixed\",\r\n display: \"flex\",\r\n flexDirection: isTop ? \"column\" : \"column-reverse\",\r\n alignItems: position.includes(\"center\")\r\n ? \"center\"\r\n : position.includes(\"left\")\r\n ? \"flex-start\"\r\n : \"flex-end\",\r\n pointerEvents: \"none\",\r\n zIndex: 9999,\r\n padding: \"16px\",\r\n inset: 0,\r\n gap: \"12px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id} // This MUST stay here for AnimatePresence\r\n toast={{\r\n ...toast,\r\n duration: toast.duration ?? globalDuration,\r\n hideProgressBar: toast.hideProgressBar ?? globalHideProgress,\r\n }}\r\n onDismiss={dismiss}\r\n />\r\n ))}\r\n </AnimatePresence>\r\n </div>\r\n );\r\n};\r\n","import { useState, useEffect, useCallback } from 'react'; // Added useCallback\r\nimport { toastStore } from '../core/storeBridge';\r\nimport { Toast } from '../types/types'; \r\n\r\nexport function useToast() {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = toastStore.subscribe((newToasts) => {\r\n setToasts(newToasts);\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, []);\r\n\r\n // Use useCallback so this function reference never changes\r\n const dismiss = useCallback((id?: string) => {\r\n toastStore.dismiss(id);\r\n }, []);\r\n\r\n return {\r\n toasts,\r\n dismiss,\r\n };\r\n}","export const generateId = (): string => {\r\n return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);\r\n};","// packages/vibe-toast/src/core/storeBridge.ts\r\nimport React from 'react';\r\nimport { \r\n Toast, \r\n ToastOptions, \r\n PromiseOptions, \r\n ToastVariant, \r\n ToastFunction \r\n} from \"../types/types\";\r\nimport { generateId } from \"../utils/generateId\";\r\n\r\nexport const DEFAULT_TIMEOUTS: Record<ToastVariant, number> = {\r\n default: 4000,\r\n success: 4000,\r\n error: 4000,\r\n loading: Infinity,\r\n warning: 4000,\r\n info: 4000,\r\n};\r\n\r\ninterface StoreSettings {\r\n limit: number;\r\n}\r\n\r\ntype Listener = (toasts: Toast[]) => void;\r\n\r\nclass ToastStore {\r\n private toasts: Toast[] = [];\r\n private listeners: Set<Listener> = new Set();\r\n private settings: StoreSettings = { limit: 5 };\r\n\r\n subscribe(listener: Listener) {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private emit() {\r\n this.listeners.forEach((listener) => listener([...this.toasts]));\r\n }\r\n\r\n setLimit(newLimit: number) {\r\n this.settings.limit = newLimit;\r\n if (this.toasts.length > newLimit) {\r\n this.toasts = this.toasts.slice(0, newLimit);\r\n this.emit();\r\n }\r\n }\r\n\r\n add(options: ToastOptions): string {\r\n const id = generateId();\r\n const variant = options.variant || \"default\";\r\n const duration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant, \r\n duration,\r\n };\r\n\r\n // Add new toast to the front and enforce limit\r\n this.toasts = [newToast, ...this.toasts].slice(0, this.settings.limit);\r\n\r\n this.emit();\r\n return id;\r\n }\r\n\r\n update(id: string, options: Partial<ToastOptions>) {\r\n this.toasts = this.toasts.map((t) => {\r\n if (t.id === id) {\r\n const newVariant = options.variant || t.variant || \"default\";\r\n const newDuration = options.duration !== undefined \r\n ? options.duration \r\n : DEFAULT_TIMEOUTS[newVariant as ToastVariant];\r\n\r\n return { ...t, ...options, variant: newVariant, duration: newDuration };\r\n }\r\n return t;\r\n });\r\n this.emit();\r\n }\r\n\r\n dismiss(id?: string) {\r\n if (id) {\r\n this.toasts = this.toasts.filter((t) => t.id !== id);\r\n } else {\r\n this.toasts = [];\r\n }\r\n this.emit();\r\n }\r\n}\r\n\r\nexport const toastStore = new ToastStore();\r\n\r\n/**\r\n * Internal base function to handle the logic\r\n */\r\nconst baseToast = (options: ToastOptions | string): string => {\r\n if (typeof options === \"string\") {\r\n return toastStore.add({ title: options, variant: \"default\" });\r\n }\r\n return toastStore.add(options);\r\n};\r\n\r\n/**\r\n * Helper to create variant-specific methods (success, error, etc.)\r\n */\r\nconst createHandler = (variant: ToastVariant) => {\r\n return (title: React.ReactNode, options?: Omit<ToastOptions, \"title\" | \"variant\">) => {\r\n return toastStore.add({\r\n ...options,\r\n title,\r\n variant,\r\n });\r\n };\r\n};\r\n\r\n// Assign Shorthand Methods\r\nbaseToast.success = createHandler(\"success\");\r\nbaseToast.error = createHandler(\"error\");\r\nbaseToast.warning = createHandler(\"warning\");\r\nbaseToast.info = createHandler(\"info\");\r\nbaseToast.loading = createHandler(\"loading\");\r\n\r\n// Assign Utility Methods\r\nbaseToast.dismiss = (id?: string) => toastStore.dismiss(id);\r\nbaseToast.dismissAll = () => toastStore.dismiss();\r\nbaseToast.setLimit = (n: number) => toastStore.setLimit(n);\r\n\r\n/**\r\n * Promise Handler Logic\r\n */\r\nbaseToast.promise = <T>(\r\n promise: Promise<T>,\r\n { loading, success, error }: PromiseOptions<T>\r\n) => {\r\n const id = toastStore.add({\r\n variant: 'loading',\r\n title: loading,\r\n duration: Infinity, \r\n });\r\n \r\n promise\r\n .then((data) => {\r\n const successTitle = typeof success === 'function' ? (success as Function)(data) : success;\r\n toastStore.update(id, {\r\n variant: 'success',\r\n title: successTitle,\r\n duration: DEFAULT_TIMEOUTS.success\r\n });\r\n })\r\n .catch((err) => {\r\n const errorTitle = typeof error === 'function' ? (error as Function)(err) : error;\r\n toastStore.update(id, {\r\n variant: 'error',\r\n title: errorTitle,\r\n duration: DEFAULT_TIMEOUTS.error\r\n });\r\n });\r\n \r\n return promise;\r\n};\r\n\r\n/**\r\n * Final Export: Cast to ToastFunction for full TypeScript support\r\n */\r\nexport const toast = (baseToast as unknown) as ToastFunction;","\"use client\";\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { MdClose } from \"react-icons/md\";\r\nimport { resolveIcon } from \"../utils/resolveIcon\";\r\nimport { Toast, ToastAction } from \"../types/types\";\r\n\r\nexport const ToastItem = ({\r\n toast,\r\n onDismiss,\r\n}: {\r\n toast: Toast;\r\n onDismiss: (id?: string) => void;\r\n}) => {\r\n const [isStarted, setIsStarted] = useState(false);\r\n const [showDesc, setShowDesc] = useState(false);\r\n const duration = toast.duration;\r\n // Inside ToastItem.tsx\r\n useEffect(() => {\r\n const toastDuration = toast.duration;\r\n if (!toastDuration || toastDuration === Infinity) return;\r\n\r\n const timer = setTimeout(() => {\r\n onDismiss(toast.id); // This will now work correctly with the stable function\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, onDismiss]);\r\n\r\n useEffect(() => {\r\n // 1. Reset and start progress bar\r\n setIsStarted(false);\r\n const progressTimer = setTimeout(() => setIsStarted(true), 50);\r\n\r\n // 2. DELAYED EXPANSION: Show description 300ms after the toast appears\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n\r\n return () => {\r\n clearTimeout(progressTimer);\r\n clearTimeout(expansionTimer);\r\n };\r\n }, [toast.id]);\r\n\r\n // --- Icon Logic ---\r\n const renderIcon = () => {\r\n // Determine the color based on priority\r\n const iconColor = toast.style?.accent || `var(--vibe-accent)`;\r\n\r\n if (toast.icon) {\r\n if (React.isValidElement(toast.icon)) {\r\n return React.cloneElement(toast.icon as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return toast.icon;\r\n }\r\n\r\n const iconElement = resolveIcon(toast.variant || \"default\");\r\n if (React.isValidElement(iconElement)) {\r\n return React.cloneElement(iconElement as React.ReactElement<any>, {\r\n size: 20,\r\n style: { color: iconColor, flexShrink: 0 },\r\n });\r\n }\r\n return iconElement;\r\n };\r\n\r\n const containerStyle: React.CSSProperties = {\r\n ...toast.style,\r\n backgroundColor: toast.style?.background || \"var(--vibe-bg)\",\r\n color: toast.style?.color || \"var(--vibe-text-main)\",\r\n borderColor: !!toast.style?.background\r\n ? \"transparent\"\r\n : \"var(--vibe-border)\",\r\n };\r\n\r\n const textStyle = { color: toast.style?.color || \"inherit\" };\r\n\r\n return (\r\n <motion.div\r\n layout\r\n initial={{ opacity: 0, y: 15, scale: 0.95 }}\r\n animate={{ opacity: 1, y: 0, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.9, transition: { duration: 0.2 } }}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => info.offset.x > 80 && onDismiss()}\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n >\r\n <div className=\"vibe-toast-inner\">\r\n <div className=\"vibe-toast-icon-side\">{renderIcon()}</div>\r\n\r\n <div className=\"vibe-toast-content-side\">\r\n <div className=\"vibe-toast-top-row\">\r\n <span className=\"vibe-toast-title\" style={textStyle}>\r\n {toast.title}\r\n </span>\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n style={textStyle}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n <AnimatePresence>\r\n {showDesc && toast.description && (\r\n <motion.div\r\n key=\"desc\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4, ease: [0.4, 0, 0.2, 1] },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n style={{ overflow: \"hidden\" }}\r\n >\r\n <p className=\"vibe-description-text\">{toast.description}</p>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n <AnimatePresence>\r\n {showDesc && toast.actions && toast.actions.length > 0 && (\r\n <motion.div\r\n key=\"actions\"\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{\r\n height: { duration: 0.4 },\r\n opacity: { duration: 0.2, delay: 0.1 },\r\n }}\r\n >\r\n <div className=\"vibe-action-stack\">\r\n {toast.actions?.map((action: ToastAction, idx: number) => (\r\n <button\r\n key={idx}\r\n className={`vibe-action-btn vibe-btn-${action.variant || \"secondary\"}`}\r\n onClick={(e) => {\r\n action.onClick(e);\r\n if (!toast.duration || toast.duration !== Infinity)\r\n onDismiss();\r\n }}\r\n >\r\n {action.label}\r\n </button>\r\n ))}\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Only show if NOT hidden AND duration isn't infinite */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n backgroundColor: toast.style?.accent || undefined,\r\n width: isStarted ? \"0%\" : \"100%\",\r\n transition: `width ${toast.duration}ms linear`, // Injected duration\r\n }}\r\n />\r\n </div>\r\n )}\r\n </motion.div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { ToastVariant } from '../types/types';\r\nimport { FaCheckCircle, FaCircleNotch } from 'react-icons/fa';\r\nimport { MdCancel, MdError } from 'react-icons/md';\r\nimport { IoIosInformationCircle } from 'react-icons/io';\r\nimport { TbAlertCircle, TbAlertCircleFilled, TbAlertTriangleFilled, TbBan, TbCircleLetterXFilled, TbCircleX, TbCircleXFilled } from 'react-icons/tb';\r\n\r\nexport const resolveIcon = (variant: ToastVariant) => {\r\n const props = { size: 20, strokeWidth: 2.25 };\r\n\r\n switch (variant) {\r\n case 'success': return <FaCheckCircle {...props} className=\"vibe-icon-success\" />;\r\n case 'error': return <TbCircleX {...props} className=\"vibe-icon-error\" />;\r\n case 'warning': return <TbBan {...props} className=\"vibe-icon-warning\" />;\r\n case 'info': return <TbAlertCircle {...props} className=\"vibe-icon-info\" />;\r\n case 'loading': return <FaCircleNotch {...props} className=\"vibe-icon-spin\" />;\r\n default: return null;\r\n }\r\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(\":root,.vibe-toaster-container{--vibe-bg: #09090b;--vibe-border: #27272a;--vibe-text-main: #ffffff;--vibe-text-muted: #a1a1aa;--vibe-progress-bg: rgba(255, 255, 255, .05);--vibe-accent: #3b82f6}.vibe-toaster-container[data-theme=light]{--vibe-bg: #ffffff;--vibe-border: #e4e4e7;--vibe-text-main: #18181b;--vibe-text-muted: #71717a;--vibe-progress-bg: rgba(0, 0, 0, .05)}.vibe-toaster-container{font-family:inherit;gap:10px!important;z-index:9999;pointer-events:none}.vibe-toast-card{font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;pointer-events:auto;position:relative;width:320px;background:var(--vibe-bg);border:1px solid var(--vibe-border);color:var(--vibe-text-main);border-radius:10px;box-shadow:0 10px 15px -3px #0006;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;transition:none!important}.vibe-toast-inner{display:flex;padding:14px;gap:12px;align-items:flex-start}.vibe-toast-icon-side{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-height:20px;color:var(--vibe-accent);font-size:20px}.vibe-toast-icon-side svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.1))}.vibe-toast-content-side{flex:1;min-width:0;display:flex;flex-direction:column}.vibe-toast-top-row{display:flex;justify-content:space-between;align-items:flex-start;min-height:20px}.vibe-toast-title{font-weight:600;font-size:14px;line-height:1.4;margin-right:8px}.vibe-close-btn{background:none;border:none;color:var(--vibe-text-muted);cursor:pointer;opacity:.4;padding:0;display:flex;transition:opacity .2s}.vibe-close-btn:hover{opacity:1}.vibe-description-text{margin:6px 0 0;font-size:13px;color:var(--vibe-text-muted);line-height:1.5}.vibe-progress-track{height:3px;width:100%;background:var(--vibe-progress-bg);position:relative}.vibe-progress-fill{height:100%;background:var(--vibe-accent)}.vibe-variant-success{--vibe-accent: #10b981}.vibe-variant-error{--vibe-accent: #ef4444}.vibe-variant-warning{--vibe-accent: #f59e0b}.vibe-variant-info{--vibe-accent: #3b82f6}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;padding:4px 14px 14px;margin-top:8px}.vibe-action-btn{flex:1;padding:6px 12px;font-size:12px;font-weight:600;border-radius:6px;cursor:pointer;transition:all .2s ease;border:1px solid var(--vibe-border);background:transparent;color:var(--vibe-text-main)}.vibe-btn-primary{background:var(--vibe-accent);border-color:var(--vibe-accent);color:#fff}.vibe-btn-primary:hover{filter:brightness(1.1)}.vibe-btn-ghost{border-color:transparent;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}\\n\")"],"mappings":"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","names":["AnimatePresence","useState","useEffect","useCallback","generateId","DEFAULT_TIMEOUTS","ToastStore","listener","newLimit","options","id","generateId","variant","duration","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","toast","useToast","toasts","setToasts","useState","useEffect","unsubscribe","toastStore","newToasts","dismiss","useCallback","id","React","useState","useEffect","AnimatePresence","motion","MdClose","FaCheckCircle","FaCircleNotch","TbAlertCircle","TbBan","TbCircleX","jsx","resolveIcon","variant","props","jsx","jsxs","ToastItem","toast","onDismiss","isStarted","setIsStarted","useState","showDesc","setShowDesc","duration","useEffect","toastDuration","timer","progressTimer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","motion","_","info","MdClose","AnimatePresence","action","idx","e","jsx","Toaster","position","theme","globalDuration","globalHideProgress","toasts","dismiss","useToast","isTop","AnimatePresence","toast","ToastItem","styleInject","css","insertAt","head","style","styleInject"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-toast",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Animation-first, minimal toast library for React.",
5
5
  "author": "Suraj Savle",
6
6
  "license": "MIT",