vibe-toast 0.1.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/README.md ADDED
Binary file
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var $=Object.create;var T=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var G=(t,e)=>{for(var i in e)T(t,i,{get:e[i],enumerable:!0})},V=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of U(e))!q.call(t,n)&&n!==i&&T(t,n,{get:()=>e[n],enumerable:!(r=X(e,n))||r.enumerable});return t};var W=(t,e,i)=>(i=t!=null?$(_(t)):{},V(e||!t||!t.__esModule?T(i,"default",{value:t,enumerable:!0}):i,t)),H=t=>V(T({},"__esModule",{value:!0}),t);var J={};G(J,{Toaster:()=>D,toast:()=>v,useToast:()=>w});module.exports=H(J);var S=require("framer-motion");var k=require("react");var F=()=>Math.random().toString(36).substring(2,9)+Date.now().toString(36);var O={default:4e3,success:4e3,error:4e3,loading:1/0,warning:4e3,info:4e3},I=class{constructor(){this.toasts=[];this.listeners=new Set;this.settings={limit:5}}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}emit(){this.listeners.forEach(e=>e([...this.toasts]))}setLimit(e){this.settings.limit=e,this.toasts.length>e&&(this.toasts=this.toasts.slice(0,e),this.emit())}add(e){let i=F(),r=e.variant||"default",n=e.duration!==void 0?e.duration:O[r],s={id:i,...e,variant:r,duration:n};return this.toasts=[s,...this.toasts].slice(0,this.settings.limit),this.emit(),i}update(e,i){this.toasts=this.toasts.map(r=>{if(r.id===e){let n=i.variant||r.variant||"default",s=i.duration!==void 0?i.duration:O[n];return{...r,...i,variant:n,duration:s}}return r}),this.emit()}dismiss(e){e?this.toasts=this.toasts.filter(i=>i.id!==e):this.toasts=[],this.emit()}},d=new I,v=t=>d.add(t);v.dismiss=t=>d.dismiss(t);v.dismissAll=()=>d.dismiss();v.setLimit=t=>d.setLimit(t);v.promise=(t,{loading:e,success:i,error:r})=>{let n=d.add({variant:"loading",title:e,duration:1/0});return t.then(s=>{let p=typeof i=="function"?i(s):i;d.update(n,{variant:"success",title:p})}).catch(s=>{let p=typeof r=="function"?r(s):r;d.update(n,{variant:"error",title:p})}),t};function w(){let[t,e]=(0,k.useState)([]);return(0,k.useEffect)(()=>{let i=d.subscribe(r=>{e(r)});return()=>{i()}},[]),{toasts:t,dismiss:i=>d.dismiss(i)}}var l=W(require("react"),1),b=require("framer-motion"),L=require("react-icons/md");var C=require("react-icons/fa"),u=require("react-icons/tb"),f=require("react/jsx-runtime"),B=t=>{let e={size:20,strokeWidth:2.25};switch(t){case"success":return(0,f.jsx)(C.FaCheckCircle,{...e,className:"vibe-icon-success"});case"error":return(0,f.jsx)(u.TbCircleX,{...e,className:"vibe-icon-error"});case"warning":return(0,f.jsx)(u.TbBan,{...e,className:"vibe-icon-warning"});case"info":return(0,f.jsx)(u.TbAlertCircle,{...e,className:"vibe-icon-info"});case"loading":return(0,f.jsx)(C.FaCircleNotch,{...e,className:"vibe-icon-spin"});default:return null}};var o=require("react/jsx-runtime"),M=({toast:t,onDismiss:e})=>{var N,P,A,E,z,R;let[i,r]=(0,l.useState)(!1),[n,s]=(0,l.useState)(!1),p=t.duration;(0,l.useEffect)(()=>{let a=t.duration;if(!a||a===1/0)return;let c=setTimeout(()=>{e()},a);return()=>clearTimeout(c)},[t.id,t.duration,e]),(0,l.useEffect)(()=>{r(!1);let a=setTimeout(()=>r(!0),50),c=setTimeout(()=>s(!0),300);return()=>{clearTimeout(a),clearTimeout(c)}},[t.id]);let m=()=>{var y;let a=((y=t.style)==null?void 0:y.accent)||"var(--vibe-accent)";if(t.icon)return l.default.isValidElement(t.icon)?l.default.cloneElement(t.icon,{size:20,style:{color:a,flexShrink:0}}):t.icon;let c=B(t.variant||"default");return l.default.isValidElement(c)?l.default.cloneElement(c,{size:20,style:{color:a,flexShrink:0}}):c},x={...t.style,backgroundColor:((N=t.style)==null?void 0:N.background)||"var(--vibe-bg)",color:((P=t.style)==null?void 0:P.color)||"var(--vibe-text-main)",borderColor:(A=t.style)!=null&&A.background?"transparent":"var(--vibe-border)"},g={color:((E=t.style)==null?void 0:E.color)||"inherit"};return(0,o.jsxs)(b.motion.div,{layout:!0,initial:{opacity:0,y:15,scale:.95},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,scale:.9,transition:{duration:.2}},drag:"x",dragConstraints:{left:0,right:300},onDragEnd:(a,c)=>c.offset.x>80&&e(),className:`vibe-toast-card vibe-variant-${t.variant}`,style:x,children:[(0,o.jsxs)("div",{className:"vibe-toast-inner",children:[(0,o.jsx)("div",{className:"vibe-toast-icon-side",children:m()}),(0,o.jsxs)("div",{className:"vibe-toast-content-side",children:[(0,o.jsxs)("div",{className:"vibe-toast-top-row",children:[(0,o.jsx)("span",{className:"vibe-toast-title",style:g,children:t.title}),(0,o.jsx)("button",{className:"vibe-close-btn",onClick:e,style:g,children:(0,o.jsx)(L.MdClose,{size:18})})]}),(0,o.jsx)(b.AnimatePresence,{children:n&&t.description&&(0,o.jsx)(b.motion.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{height:{duration:.4,ease:[.4,0,.2,1]},opacity:{duration:.2,delay:.1}},style:{overflow:"hidden"},children:(0,o.jsx)("p",{className:"vibe-description-text",children:t.description})},"desc")}),(0,o.jsx)(b.AnimatePresence,{children:n&&t.actions&&t.actions.length>0&&(0,o.jsx)(b.motion.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{height:{duration:.4},opacity:{duration:.2,delay:.1}},children:(0,o.jsx)("div",{className:"vibe-action-stack",children:(z=t.actions)==null?void 0:z.map((a,c)=>(0,o.jsx)("button",{className:`vibe-action-btn vibe-btn-${a.variant||"secondary"}`,onClick:y=>{a.onClick(y),(!t.duration||t.duration!==1/0)&&e()},children:a.label},c))})},"actions")})]})]}),!t.hideProgressBar&&t.duration!==1/0&&(0,o.jsx)("div",{className:"vibe-progress-track",children:(0,o.jsx)("div",{className:"vibe-progress-fill",style:{backgroundColor:((R=t.style)==null?void 0:R.accent)||void 0,width:i?"0%":"100%",transition:`width ${t.duration}ms linear`}})})]})};var h=require("react/jsx-runtime"),D=({position:t="top-right",theme:e="system",duration:i,hideProgressBar:r})=>{let{toasts:n,dismiss:s}=w(),p=t.includes("top");return(0,h.jsx)("div",{className:`vibe-toaster-container ${t}`,"data-theme":e,style:{position:"fixed",display:"flex",flexDirection:p?"column":"column-reverse",alignItems:t.includes("center")?"center":t.includes("left")?"flex-start":"flex-end",pointerEvents:"none",zIndex:9999,padding:"16px",inset:0,gap:"12px"},children:(0,h.jsx)(S.AnimatePresence,{mode:"popLayout",children:n.map(m=>{var x,g;return(0,h.jsx)(S.motion.div,{layout:!0,initial:{opacity:0,x:20,scale:.9},animate:{opacity:1,x:0,scale:1},exit:{opacity:0,scale:.9,transition:{duration:.2}},style:{pointerEvents:"auto"},children:(0,h.jsx)(M,{toast:{...m,duration:(x=m.duration)!=null?x:i,hideProgressBar:(g=m.hideProgressBar)!=null?g:r},onDismiss:()=>s(m.id)})},m.id)})})})};0&&(module.exports={Toaster,toast,useToast});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"],"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') ? 'center' : position.includes('left') ? 'flex-start' : '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 <motion.div\r\n key={toast.id}\r\n layout\r\n initial={{ opacity: 0, x: 20, scale: 0.9 }}\r\n animate={{ opacity: 1, x: 0, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.9, transition: { duration: 0.2 } }}\r\n style={{ pointerEvents: 'auto' }}\r\n >\r\n {/* Merge global props with individual toast props here */}\r\n <ToastItem \r\n toast={{\r\n ...toast,\r\n duration: toast.duration ?? globalDuration,\r\n hideProgressBar: toast.hideProgressBar ?? globalHideProgress\r\n }} \r\n onDismiss={() => dismiss(toast.id)} \r\n />\r\n </motion.div>\r\n ))}\r\n </AnimatePresence>\r\n </div>\r\n );\r\n};","import { useState, useEffect } from 'react';\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 \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 return {\r\n toasts,\r\n dismiss: (id?: string) => toastStore.dismiss(id),\r\n };\r\n}","export const generateId = (): string => {\r\n return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);\r\n};","import { Toast, ToastOptions, PromiseOptions, ToastVariant } 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 // 1. Initialize the settings property here\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, // 2. Spread options FIRST so variant is respected\r\n variant, \r\n duration,\r\n };\r\n\r\n // 3. limit check now works because this.settings exists\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 \r\n // If we are updating the variant (e.g., loading -> success), \r\n // we should reset the duration to the new variant's 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 * API Logic\r\n */\r\n// Exported API now includes the fixed methods\r\nexport const toast = (options: ToastOptions) => toastStore.add(options);\r\n// Individual dismissal\r\ntoast.dismiss = (id: string) => toastStore.dismiss(id);\r\n\r\n// NEW: Clear all toasts with a clean method name\r\ntoast.dismissAll = () => toastStore.dismiss();toast.setLimit = (n: number) => toastStore.setLimit(n);\r\n\r\ntoast.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(data) : success;\r\n toastStore.update(id, {\r\n variant: 'success',\r\n title: successTitle,\r\n });\r\n })\r\n .catch((err) => {\r\n const errorTitle = typeof error === 'function' ? error(err) : error;\r\n toastStore.update(id, {\r\n variant: 'error',\r\n title: errorTitle,\r\n });\r\n });\r\n \r\n return promise;\r\n};","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: () => 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\r\n // Don't auto-dismiss if duration is 0 or Infinity\r\n if (!toastDuration || toastDuration === Infinity) return;\r\n\r\n const timer = setTimeout(() => {\r\n onDismiss();\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}\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) 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};"],"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","toast","n","promise","loading","success","error","data","successTitle","err","errorTitle","useToast","toasts","setToasts","unsubscribe","toastStore","newToasts","id","import_react","import_framer_motion","import_md","import_fa","import_tb","import_jsx_runtime","resolveIcon","variant","props","import_jsx_runtime","ToastItem","toast","onDismiss","_a","_b","_c","_d","_e","_f","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","_a","_b","ToastItem"]}
package/dist/index.css ADDED
@@ -0,0 +1,2 @@
1
+ :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)}
2
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/toast.css"],"sourcesContent":["/* 1. Theme Variables */\r\n:root,\r\n.vibe-toaster-container {\r\n --vibe-bg: #09090b;\r\n --vibe-border: #27272a;\r\n --vibe-text-main: #ffffff;\r\n --vibe-text-muted: #a1a1aa;\r\n --vibe-progress-bg: rgba(255, 255, 255, 0.05);\r\n --vibe-accent: #3b82f6;\r\n}\r\n\r\n.vibe-toaster-container[data-theme=\"light\"] {\r\n --vibe-bg: #ffffff;\r\n --vibe-border: #e4e4e7;\r\n --vibe-text-main: #18181b;\r\n --vibe-text-muted: #71717a;\r\n --vibe-progress-bg: rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n/* 2. Container */\r\n.vibe-toaster-container {\r\n font-family: inherit;\r\n gap: 10px !important;\r\n z-index: 9999;\r\n pointer-events: none;\r\n}\r\n\r\n/* 3. The Toast Card */\r\n.vibe-toast-card {\r\n font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;\r\n -webkit-font-smoothing: antialiased;\r\n pointer-events: auto;\r\n position: relative;\r\n width: 320px;\r\n background: var(--vibe-bg);\r\n border: 1px solid var(--vibe-border);\r\n color: var(--vibe-text-main);\r\n border-radius: 10px;\r\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.4);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n touch-action: none;\r\n user-select: none;\r\n cursor: grab;\r\n transition: none !important; /* Prevents CSS from breaking Framer Motion */\r\n}\r\n\r\n.vibe-toast-inner {\r\n display: flex;\r\n padding: 14px;\r\n gap: 12px;\r\n align-items: flex-start; /* Aligns icon with title top */\r\n}\r\n\r\n.vibe-toast-icon-side {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 20px;\r\n color: var(--vibe-accent); /* Added this line */\r\n font-size: 20px; /* Standard size for icon fonts */\r\n}\r\n\r\n/* Optional: Add a subtle glow to the icon to make it pop */\r\n.vibe-toast-icon-side svg {\r\n filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.1));\r\n}\r\n\r\n.vibe-toast-content-side {\r\n flex: 1;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.vibe-toast-top-row {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n min-height: 20px;\r\n}\r\n\r\n.vibe-toast-title {\r\n font-weight: 600;\r\n font-size: 14px;\r\n line-height: 1.4;\r\n margin-right: 8px;\r\n}\r\n\r\n.vibe-close-btn {\r\n background: none;\r\n border: none;\r\n color: var(--vibe-text-muted);\r\n cursor: pointer;\r\n opacity: 0.4;\r\n padding: 0;\r\n display: flex;\r\n transition: opacity 0.2s;\r\n}\r\n\r\n.vibe-close-btn:hover {\r\n opacity: 1;\r\n}\r\n\r\n.vibe-description-text {\r\n margin: 6px 0 0 0;\r\n font-size: 13px;\r\n color: var(--vibe-text-muted);\r\n line-height: 1.5;\r\n}\r\n\r\n/* 4. Progress Bar */\r\n.vibe-progress-track {\r\n height: 3px;\r\n width: 100%;\r\n background: var(--vibe-progress-bg);\r\n position: relative; /* Changed to relative so it sits at the bottom of the column */\r\n}\r\n\r\n.vibe-progress-fill {\r\n height: 100%;\r\n background: var(--vibe-accent);\r\n}\r\n\r\n/* 5. Variants */\r\n.vibe-variant-success {\r\n --vibe-accent: #10b981;\r\n}\r\n.vibe-variant-error {\r\n --vibe-accent: #ef4444;\r\n}\r\n.vibe-variant-warning {\r\n --vibe-accent: #f59e0b;\r\n}\r\n.vibe-variant-info {\r\n --vibe-accent: #3b82f6;\r\n}\r\n\r\n.vibe-icon-spin {\r\n animation: vibe-spin 0.8s linear infinite;\r\n}\r\n\r\n@keyframes vibe-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* Container for the buttons */\r\n.vibe-action-stack {\r\n display: flex;\r\n gap: 8px;\r\n padding: 4px 14px 14px 14px; /* Align with the inner padding */\r\n margin-top: 8px;\r\n}\r\n\r\n/* Base button style */\r\n.vibe-action-btn {\r\n flex: 1; /* Makes buttons equal width */\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n border: 1px solid var(--vibe-border);\r\n background: transparent;\r\n color: var(--vibe-text-main);\r\n}\r\n\r\n/* Primary style (uses the accent color) */\r\n.vibe-btn-primary {\r\n background: var(--vibe-accent);\r\n border-color: var(--vibe-accent);\r\n color: #ffffff;\r\n}\r\n\r\n.vibe-btn-primary:hover {\r\n filter: brightness(1.1);\r\n}\r\n\r\n/* Ghost style */\r\n.vibe-btn-ghost {\r\n border-color: transparent;\r\n color: var(--vibe-text-muted);\r\n}\r\n\r\n.vibe-btn-ghost:hover {\r\n background: var(--vibe-progress-bg);\r\n color: var(--vibe-text-main);\r\n}"],"mappings":"AACA,MACA,CAAC,uBACC,WAAW,QACX,eAAe,QACf,kBAAkB,QAClB,mBAAmB,QACnB,oBAAoB,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KACxC,eAAe,OACjB,CAEA,CATC,sBASsB,CAAC,kBACtB,WAAW,QACX,eAAe,QACf,kBAAkB,QAClB,mBAAmB,QACnB,oBAAoB,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IACpC,CAGA,CAlBC,uBAmBC,YAAa,QACb,IAAK,eACL,QAAS,KACT,eAAgB,IAClB,CAGA,CAAC,gBACC,YAAa,aAAa,CAAE,SAAS,CAAE,aAAa,CAAE,WACtD,uBAAwB,YACxB,eAAgB,KAChB,SAAU,SACV,MAAO,MACP,WAAY,IAAI,WAChB,OAAQ,IAAI,MAAM,IAAI,eACtB,MAAO,IAAI,kBApCb,cAqCiB,KACf,WAAY,EAAE,KAAK,KAAK,KAAK,MAC7B,QAAS,KACT,eAAgB,OAChB,SAAU,OACV,aAAc,KACd,YAAa,KACb,OAAQ,KACR,WAAY,cACd,CAEA,CAAC,iBACC,QAAS,KAjDX,QAkDW,KACT,IAAK,KACL,YAAa,UACf,CAEA,CAAC,qBACC,YAAa,EACb,QAAS,KACT,YAAa,OACb,gBAAiB,OACjB,WAAY,KACZ,MAAO,IAAI,eACX,UAAW,IACb,CAGA,CAXC,qBAWqB,IACpB,OAAQ,YAAY,EAAE,EAAE,IAAI,KAAK,CAAC,CAAE,CAAC,CAAE,CAAC,CAAE,IAC5C,CAEA,CAAC,wBACC,KAAM,EACN,UAAW,EACX,QAAS,KACT,eAAgB,MAClB,CAEA,CAAC,mBACC,QAAS,KACT,gBAAiB,cACjB,YAAa,WACb,WAAY,IACd,CAEA,CAAC,iBACC,YAAa,IACb,UAAW,KACX,YAAa,IACb,aAAc,GAChB,CAEA,CAAC,eACC,WAAY,KACZ,OAAQ,KACR,MAAO,IAAI,mBACX,OAAQ,QACR,QAAS,GAhGX,QAiGW,EACT,QAAS,KACT,WAAY,QAAQ,GACtB,CAEA,CAXC,cAWc,OACb,QAAS,CACX,CAEA,CAAC,sBA1GD,OA2GU,IAAI,EAAE,EACd,UAAW,KACX,MAAO,IAAI,mBACX,YAAa,GACf,CAGA,CAAC,oBACC,OAAQ,IACR,MAAO,KACP,WAAY,IAAI,oBAChB,SAAU,QACZ,CAEA,CAAC,mBACC,OAAQ,KACR,WAAY,IAAI,cAClB,CAGA,CAAC,qBACC,eAAe,OACjB,CACA,CAAC,mBACC,eAAe,OACjB,CACA,CAAC,qBACC,eAAe,OACjB,CACA,CAAC,kBACC,eAAe,OACjB,CAEA,CAAC,eACC,UAAW,UAAU,IAAK,OAAO,QACnC,CAEA,WAHa,UAIX,GACE,UAAW,OAAO,OACpB,CACF,CAGA,CAAC,kBACC,QAAS,KACT,IAAK,IAzJP,QA0JW,IAAI,KAAK,KAClB,WAAY,GACd,CAGA,CAAC,gBACC,KAAM,EAhKR,QAiKW,IAAI,KACb,UAAW,KACX,YAAa,IAnKf,cAoKiB,IACf,OAAQ,QACR,WAAY,IAAI,IAAK,KACrB,OAAQ,IAAI,MAAM,IAAI,eACtB,WAAY,YACZ,MAAO,IAAI,iBACb,CAGA,CAAC,iBACC,WAAY,IAAI,eAChB,aAAc,IAAI,eAClB,MAAO,IACT,CAEA,CANC,gBAMgB,OACf,OAAQ,WAAW,IACrB,CAGA,CAAC,eACC,aAAc,YACd,MAAO,IAAI,kBACb,CAEA,CALC,cAKc,OACb,WAAY,IAAI,oBAChB,MAAO,IAAI,iBACb","names":[]}
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+
3
+ type ToastVariant = 'default' | 'success' | 'error' | 'warning' | 'info' | 'loading';
4
+ type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
5
+ interface ToastAction {
6
+ /** The text to display on the action button */
7
+ label: string;
8
+ /** Callback function triggered when the button is clicked */
9
+ onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;
10
+ variant?: 'primary' | 'secondary' | 'ghost';
11
+ }
12
+ interface Toast {
13
+ /** Unique identifier for the toast */
14
+ id: string;
15
+ /** The visual style variant of the toast */
16
+ variant?: ToastVariant;
17
+ /** The main message heading */
18
+ title: React.ReactNode;
19
+ /** Sub-text details that appear after a short delay */
20
+ description?: React.ReactNode;
21
+ /** Duration in ms before auto-dismiss. Use Infinity to keep open. */
22
+ duration?: number;
23
+ /** Custom icon to override the variant default */
24
+ icon?: React.ReactNode;
25
+ /** Optional button for user interaction (e.g., Undo) */
26
+ actions?: ToastAction[];
27
+ action?: ToastAction;
28
+ /** Whether the user can manually close the toast */
29
+ dismissible?: boolean;
30
+ /** Callback fired when the toast is removed */
31
+ onDismiss?: (id: string) => void;
32
+ /** Custom CSS class for the toast card */
33
+ className?: string;
34
+ /** Set to true to hide the countdown progress bar */
35
+ hideProgressBar?: boolean;
36
+ /** Custom theme overrides for background, text, and accent colors */
37
+ style?: React.CSSProperties & {
38
+ background?: string;
39
+ color?: string;
40
+ accent?: string;
41
+ };
42
+ /** Additional data for custom internal logic */
43
+ metadata?: Record<string, any>;
44
+ }
45
+ type ToastOptions = Omit<Toast, 'id'>;
46
+ interface PromiseOptions<T = any> {
47
+ loading: string | React.ReactNode;
48
+ success: string | React.ReactNode | ((data: T) => React.ReactNode);
49
+ error: string | React.ReactNode | ((error: any) => React.ReactNode);
50
+ }
51
+ interface ToasterProps {
52
+ /** Where on the screen the toasts should appear */
53
+ position?: ToastPosition;
54
+ /** Force 'light' or 'dark' mode, or follow 'system' settings */
55
+ theme?: 'light' | 'dark' | 'system';
56
+ /** Whether multiple toasts should expand or stack (logical prop) */
57
+ expand?: boolean;
58
+ /** Use stronger background colors for variants */
59
+ richColors?: boolean;
60
+ /** Show a close button on all toasts by default */
61
+ closeButton?: boolean;
62
+ /** Custom CSS class for the toaster container */
63
+ className?: string;
64
+ /** Custom styles for the toaster container */
65
+ style?: React.CSSProperties;
66
+ /** Global duration in ms for all toasts. Individual toast duration overrides this. */
67
+ duration?: number;
68
+ /** Globally hide progress bars for all toasts */
69
+ hideProgressBar?: boolean;
70
+ }
71
+
72
+ declare const Toaster: React.FC<ToasterProps>;
73
+
74
+ declare function useToast(): {
75
+ toasts: Toast[];
76
+ dismiss: (id?: string) => void;
77
+ };
78
+
79
+ /**
80
+ * API Logic
81
+ */
82
+ declare const toast: {
83
+ (options: ToastOptions): string;
84
+ dismiss(id: string): void;
85
+ dismissAll(): void;
86
+ setLimit(n: number): void;
87
+ promise<T>(promise: Promise<T>, { loading, success, error }: PromiseOptions<T>): Promise<T>;
88
+ };
89
+
90
+ export { type PromiseOptions, type Toast, type ToastAction, type ToastOptions, type ToastPosition, type ToastVariant, Toaster, type ToasterProps, toast, useToast };
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+
3
+ type ToastVariant = 'default' | 'success' | 'error' | 'warning' | 'info' | 'loading';
4
+ type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
5
+ interface ToastAction {
6
+ /** The text to display on the action button */
7
+ label: string;
8
+ /** Callback function triggered when the button is clicked */
9
+ onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;
10
+ variant?: 'primary' | 'secondary' | 'ghost';
11
+ }
12
+ interface Toast {
13
+ /** Unique identifier for the toast */
14
+ id: string;
15
+ /** The visual style variant of the toast */
16
+ variant?: ToastVariant;
17
+ /** The main message heading */
18
+ title: React.ReactNode;
19
+ /** Sub-text details that appear after a short delay */
20
+ description?: React.ReactNode;
21
+ /** Duration in ms before auto-dismiss. Use Infinity to keep open. */
22
+ duration?: number;
23
+ /** Custom icon to override the variant default */
24
+ icon?: React.ReactNode;
25
+ /** Optional button for user interaction (e.g., Undo) */
26
+ actions?: ToastAction[];
27
+ action?: ToastAction;
28
+ /** Whether the user can manually close the toast */
29
+ dismissible?: boolean;
30
+ /** Callback fired when the toast is removed */
31
+ onDismiss?: (id: string) => void;
32
+ /** Custom CSS class for the toast card */
33
+ className?: string;
34
+ /** Set to true to hide the countdown progress bar */
35
+ hideProgressBar?: boolean;
36
+ /** Custom theme overrides for background, text, and accent colors */
37
+ style?: React.CSSProperties & {
38
+ background?: string;
39
+ color?: string;
40
+ accent?: string;
41
+ };
42
+ /** Additional data for custom internal logic */
43
+ metadata?: Record<string, any>;
44
+ }
45
+ type ToastOptions = Omit<Toast, 'id'>;
46
+ interface PromiseOptions<T = any> {
47
+ loading: string | React.ReactNode;
48
+ success: string | React.ReactNode | ((data: T) => React.ReactNode);
49
+ error: string | React.ReactNode | ((error: any) => React.ReactNode);
50
+ }
51
+ interface ToasterProps {
52
+ /** Where on the screen the toasts should appear */
53
+ position?: ToastPosition;
54
+ /** Force 'light' or 'dark' mode, or follow 'system' settings */
55
+ theme?: 'light' | 'dark' | 'system';
56
+ /** Whether multiple toasts should expand or stack (logical prop) */
57
+ expand?: boolean;
58
+ /** Use stronger background colors for variants */
59
+ richColors?: boolean;
60
+ /** Show a close button on all toasts by default */
61
+ closeButton?: boolean;
62
+ /** Custom CSS class for the toaster container */
63
+ className?: string;
64
+ /** Custom styles for the toaster container */
65
+ style?: React.CSSProperties;
66
+ /** Global duration in ms for all toasts. Individual toast duration overrides this. */
67
+ duration?: number;
68
+ /** Globally hide progress bars for all toasts */
69
+ hideProgressBar?: boolean;
70
+ }
71
+
72
+ declare const Toaster: React.FC<ToasterProps>;
73
+
74
+ declare function useToast(): {
75
+ toasts: Toast[];
76
+ dismiss: (id?: string) => void;
77
+ };
78
+
79
+ /**
80
+ * API Logic
81
+ */
82
+ declare const toast: {
83
+ (options: ToastOptions): string;
84
+ dismiss(id: string): void;
85
+ dismissAll(): void;
86
+ setLimit(n: number): void;
87
+ promise<T>(promise: Promise<T>, { loading, success, error }: PromiseOptions<T>): Promise<T>;
88
+ };
89
+
90
+ export { type PromiseOptions, type Toast, type ToastAction, type ToastOptions, type ToastPosition, type ToastVariant, Toaster, type ToasterProps, toast, useToast };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{AnimatePresence as q,motion as G}from"framer-motion";import{useState as B,useEffect as L}from"react";var A=()=>Math.random().toString(36).substring(2,9)+Date.now().toString(36);var E={default:4e3,success:4e3,error:4e3,loading:1/0,warning:4e3,info:4e3},y=class{constructor(){this.toasts=[];this.listeners=new Set;this.settings={limit:5}}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}emit(){this.listeners.forEach(e=>e([...this.toasts]))}setLimit(e){this.settings.limit=e,this.toasts.length>e&&(this.toasts=this.toasts.slice(0,e),this.emit())}add(e){let i=A(),r=e.variant||"default",a=e.duration!==void 0?e.duration:E[r],s={id:i,...e,variant:r,duration:a};return this.toasts=[s,...this.toasts].slice(0,this.settings.limit),this.emit(),i}update(e,i){this.toasts=this.toasts.map(r=>{if(r.id===e){let a=i.variant||r.variant||"default",s=i.duration!==void 0?i.duration:E[a];return{...r,...i,variant:a,duration:s}}return r}),this.emit()}dismiss(e){e?this.toasts=this.toasts.filter(i=>i.id!==e):this.toasts=[],this.emit()}},l=new y,p=t=>l.add(t);p.dismiss=t=>l.dismiss(t);p.dismissAll=()=>l.dismiss();p.setLimit=t=>l.setLimit(t);p.promise=(t,{loading:e,success:i,error:r})=>{let a=l.add({variant:"loading",title:e,duration:1/0});return t.then(s=>{let m=typeof i=="function"?i(s):i;l.update(a,{variant:"success",title:m})}).catch(s=>{let m=typeof r=="function"?r(s):r;l.update(a,{variant:"error",title:m})}),t};function T(){let[t,e]=B([]);return L(()=>{let i=l.subscribe(r=>{e(r)});return()=>{i()}},[]),{toasts:t,dismiss:i=>l.dismiss(i)}}import g,{useState as R,useEffect as V}from"react";import{AnimatePresence as F,motion as k}from"framer-motion";import{MdClose as _}from"react-icons/md";import{FaCheckCircle as M,FaCircleNotch as D}from"react-icons/fa";import{TbAlertCircle as $,TbBan as X,TbCircleX as U}from"react-icons/tb";import{jsx as v}from"react/jsx-runtime";var z=t=>{let e={size:20,strokeWidth:2.25};switch(t){case"success":return v(M,{...e,className:"vibe-icon-success"});case"error":return v(U,{...e,className:"vibe-icon-error"});case"warning":return v(X,{...e,className:"vibe-icon-warning"});case"info":return v($,{...e,className:"vibe-icon-info"});case"loading":return v(D,{...e,className:"vibe-icon-spin"});default:return null}};import{jsx as n,jsxs as h}from"react/jsx-runtime";var O=({toast:t,onDismiss:e})=>{var w,C,S,I,N,P;let[i,r]=R(!1),[a,s]=R(!1),m=t.duration;V(()=>{let o=t.duration;if(!o||o===1/0)return;let c=setTimeout(()=>{e()},o);return()=>clearTimeout(c)},[t.id,t.duration,e]),V(()=>{r(!1);let o=setTimeout(()=>r(!0),50),c=setTimeout(()=>s(!0),300);return()=>{clearTimeout(o),clearTimeout(c)}},[t.id]);let d=()=>{var u;let o=((u=t.style)==null?void 0:u.accent)||"var(--vibe-accent)";if(t.icon)return g.isValidElement(t.icon)?g.cloneElement(t.icon,{size:20,style:{color:o,flexShrink:0}}):t.icon;let c=z(t.variant||"default");return g.isValidElement(c)?g.cloneElement(c,{size:20,style:{color:o,flexShrink:0}}):c},f={...t.style,backgroundColor:((w=t.style)==null?void 0:w.background)||"var(--vibe-bg)",color:((C=t.style)==null?void 0:C.color)||"var(--vibe-text-main)",borderColor:(S=t.style)!=null&&S.background?"transparent":"var(--vibe-border)"},b={color:((I=t.style)==null?void 0:I.color)||"inherit"};return h(k.div,{layout:!0,initial:{opacity:0,y:15,scale:.95},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,scale:.9,transition:{duration:.2}},drag:"x",dragConstraints:{left:0,right:300},onDragEnd:(o,c)=>c.offset.x>80&&e(),className:`vibe-toast-card vibe-variant-${t.variant}`,style:f,children:[h("div",{className:"vibe-toast-inner",children:[n("div",{className:"vibe-toast-icon-side",children:d()}),h("div",{className:"vibe-toast-content-side",children:[h("div",{className:"vibe-toast-top-row",children:[n("span",{className:"vibe-toast-title",style:b,children:t.title}),n("button",{className:"vibe-close-btn",onClick:e,style:b,children:n(_,{size:18})})]}),n(F,{children:a&&t.description&&n(k.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{height:{duration:.4,ease:[.4,0,.2,1]},opacity:{duration:.2,delay:.1}},style:{overflow:"hidden"},children:n("p",{className:"vibe-description-text",children:t.description})},"desc")}),n(F,{children:a&&t.actions&&t.actions.length>0&&n(k.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{height:{duration:.4},opacity:{duration:.2,delay:.1}},children:n("div",{className:"vibe-action-stack",children:(N=t.actions)==null?void 0:N.map((o,c)=>n("button",{className:`vibe-action-btn vibe-btn-${o.variant||"secondary"}`,onClick:u=>{o.onClick(u),(!t.duration||t.duration!==1/0)&&e()},children:o.label},c))})},"actions")})]})]}),!t.hideProgressBar&&t.duration!==1/0&&n("div",{className:"vibe-progress-track",children:n("div",{className:"vibe-progress-fill",style:{backgroundColor:((P=t.style)==null?void 0:P.accent)||void 0,width:i?"0%":"100%",transition:`width ${t.duration}ms linear`}})})]})};import{jsx as x}from"react/jsx-runtime";var W=({position:t="top-right",theme:e="system",duration:i,hideProgressBar:r})=>{let{toasts:a,dismiss:s}=T(),m=t.includes("top");return x("div",{className:`vibe-toaster-container ${t}`,"data-theme":e,style:{position:"fixed",display:"flex",flexDirection:m?"column":"column-reverse",alignItems:t.includes("center")?"center":t.includes("left")?"flex-start":"flex-end",pointerEvents:"none",zIndex:9999,padding:"16px",inset:0,gap:"12px"},children:x(q,{mode:"popLayout",children:a.map(d=>{var f,b;return x(G.div,{layout:!0,initial:{opacity:0,x:20,scale:.9},animate:{opacity:1,x:0,scale:1},exit:{opacity:0,scale:.9,transition:{duration:.2}},style:{pointerEvents:"auto"},children:x(O,{toast:{...d,duration:(f=d.duration)!=null?f:i,hideProgressBar:(b=d.hideProgressBar)!=null?b:r},onDismiss:()=>s(d.id)})},d.id)})})})};export{W as Toaster,p as toast,T as useToast};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"],"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') ? 'center' : position.includes('left') ? 'flex-start' : '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 <motion.div\r\n key={toast.id}\r\n layout\r\n initial={{ opacity: 0, x: 20, scale: 0.9 }}\r\n animate={{ opacity: 1, x: 0, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.9, transition: { duration: 0.2 } }}\r\n style={{ pointerEvents: 'auto' }}\r\n >\r\n {/* Merge global props with individual toast props here */}\r\n <ToastItem \r\n toast={{\r\n ...toast,\r\n duration: toast.duration ?? globalDuration,\r\n hideProgressBar: toast.hideProgressBar ?? globalHideProgress\r\n }} \r\n onDismiss={() => dismiss(toast.id)} \r\n />\r\n </motion.div>\r\n ))}\r\n </AnimatePresence>\r\n </div>\r\n );\r\n};","import { useState, useEffect } from 'react';\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 \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 return {\r\n toasts,\r\n dismiss: (id?: string) => toastStore.dismiss(id),\r\n };\r\n}","export const generateId = (): string => {\r\n return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);\r\n};","import { Toast, ToastOptions, PromiseOptions, ToastVariant } 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 // 1. Initialize the settings property here\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, // 2. Spread options FIRST so variant is respected\r\n variant, \r\n duration,\r\n };\r\n\r\n // 3. limit check now works because this.settings exists\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 \r\n // If we are updating the variant (e.g., loading -> success), \r\n // we should reset the duration to the new variant's 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 * API Logic\r\n */\r\n// Exported API now includes the fixed methods\r\nexport const toast = (options: ToastOptions) => toastStore.add(options);\r\n// Individual dismissal\r\ntoast.dismiss = (id: string) => toastStore.dismiss(id);\r\n\r\n// NEW: Clear all toasts with a clean method name\r\ntoast.dismissAll = () => toastStore.dismiss();toast.setLimit = (n: number) => toastStore.setLimit(n);\r\n\r\ntoast.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(data) : success;\r\n toastStore.update(id, {\r\n variant: 'success',\r\n title: successTitle,\r\n });\r\n })\r\n .catch((err) => {\r\n const errorTitle = typeof error === 'function' ? error(err) : error;\r\n toastStore.update(id, {\r\n variant: 'error',\r\n title: errorTitle,\r\n });\r\n });\r\n \r\n return promise;\r\n};","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: () => 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\r\n // Don't auto-dismiss if duration is 0 or Infinity\r\n if (!toastDuration || toastDuration === Infinity) return;\r\n\r\n const timer = setTimeout(() => {\r\n onDismiss();\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}\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) 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};"],"mappings":"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","names":["AnimatePresence","motion","useState","useEffect","generateId","DEFAULT_TIMEOUTS","ToastStore","listener","newLimit","options","id","generateId","variant","duration","newToast","t","newVariant","newDuration","toastStore","toast","n","promise","loading","success","error","data","successTitle","err","errorTitle","useToast","toasts","setToasts","useState","useEffect","unsubscribe","toastStore","newToasts","id","React","useState","useEffect","AnimatePresence","motion","MdClose","FaCheckCircle","FaCircleNotch","TbAlertCircle","TbBan","TbCircleX","jsx","resolveIcon","variant","props","jsx","jsxs","ToastItem","toast","onDismiss","_a","_b","_c","_d","_e","_f","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","_a","_b","motion","ToastItem"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "vibe-toast",
3
+ "version": "0.1.0",
4
+ "description": "Animation-first, minimal toast library for React.",
5
+ "author": "Your Name",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/your-username/vibe-toast.git"
10
+ },
11
+ "homepage": "https://github.com/your-username/vibe-toast#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/your-username/vibe-toast/issues"
14
+ },
15
+ "keywords": [
16
+ "react",
17
+ "toast",
18
+ "notification",
19
+ "animation",
20
+ "framer-motion",
21
+ "sonner",
22
+ "ui",
23
+ "component-library"
24
+ ],
25
+ "type": "module",
26
+ "main": "./dist/index.cjs",
27
+ "module": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js",
33
+ "require": "./dist/index.cjs"
34
+ },
35
+ "./style": "./dist/index.css"
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "sideEffects": [
41
+ "**/*.css",
42
+ "**/*.scss"
43
+ ],
44
+ "scripts": {
45
+ "dev": "tsup --watch",
46
+ "build": "tsup",
47
+ "clean": "rm -rf dist",
48
+ "prepublishOnly": "npm run build"
49
+ },
50
+ "peerDependencies": {
51
+ "framer-motion": ">=10",
52
+ "react": ">=18",
53
+ "react-dom": ">=18"
54
+ },
55
+ "devDependencies": {
56
+ "@types/react": "^19.0.0",
57
+ "@types/react-dom": "^19.0.0",
58
+ "react": "^19.2.4",
59
+ "react-dom": "^19.2.4",
60
+ "tsup": "^8.5.1",
61
+ "typescript": "^5.9.3"
62
+ },
63
+ "dependencies": {
64
+ "react-icons": "^5.6.0"
65
+ }
66
+ }