vibe-toast 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var B=Object.create;var x=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var j=(e,t)=>{for(var i in t)x(e,i,{get:t[i],enumerable:!0})},C=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of L(t))!X.call(e,a)&&a!==i&&x(e,a,{get:()=>t[a],enumerable:!(r=D(t,a))||r.enumerable});return e};var M=(e,t,i)=>(i=e!=null?B(K(e)):{},C(t||!e||!e.__esModule?x(i,"default",{value:e,enumerable:!0}):i,e)),U=e=>C(x({},"__esModule",{value:!0}),e);var Y={};j(Y,{Toaster:()=>O,toast:()=>E,useToast:()=>y});module.exports=U(Y);var V=require("framer-motion");var v=require("react");var I=()=>Math.random().toString(36).substring(2,9)+Date.now().toString(36);var h={default:4e3,success:4e3,error:4e3,loading:1/0,warning:4e3,info:4e3},N=class{toasts=[];listeners=new Set;settings={limit:5};subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}emit(){this.listeners.forEach(t=>t([...this.toasts]))}setLimit(t){this.settings.limit=t,this.toasts.length>t&&(this.toasts=this.toasts.slice(0,t),this.emit())}add(t){let i=t.variant||"default",r=t.duration!==void 0?t.duration:h[i],a=t.groupKey||`${i}-${String(t.title)}-${String(t.description||"")}`,c=this.toasts.findIndex(o=>o.groupKey===a);if(t.dedupe!==!1&&c!==-1){let o=this.toasts[c],k={...o,count:(o.count||1)+1,duration:r,updatedAt:Date.now()};return this.toasts=this.toasts.map(($,F)=>F===c?k:$),this.emit(),o.id}let l=I(),s={id:l,...t,variant:i,duration:r,count:1,groupKey:a};return this.toasts=[s,...this.toasts].slice(0,this.settings.limit),this.emit(),l}update(t,i){this.toasts=this.toasts.map(r=>{if(r.id===t){let a=i.variant||r.variant||"default",c=i.duration!==void 0?i.duration:h[a];return{...r,...i,variant:a,duration:c}}return r}),this.emit()}dismiss(t){t?this.toasts=this.toasts.filter(i=>i.id!==t):this.toasts=[],this.emit()}},d=new N,p=e=>typeof e=="string"?d.add({title:e,variant:"default"}):d.add(e),g=e=>(t,i)=>d.add({...i,title:t,variant:e});p.success=g("success");p.error=g("error");p.warning=g("warning");p.info=g("info");p.loading=g("loading");p.dismiss=e=>d.dismiss(e);p.dismissAll=()=>d.dismiss();p.setLimit=e=>d.setLimit(e);p.promise=(e,{loading:t,success:i,error:r})=>{let a=d.add({variant:"loading",title:t,duration:1/0});return e.then(c=>{let l=typeof i=="function"?i(c):i;d.update(a,{variant:"success",title:l,duration:h.success})}).catch(c=>{let l=typeof r=="function"?r(c):r;d.update(a,{variant:"error",title:l,duration:h.error})}),e};var E=p;function y(){let[e,t]=(0,v.useState)([]);(0,v.useEffect)(()=>{let r=d.subscribe(a=>{t(a)});return()=>{r()}},[]);let i=(0,v.useCallback)(r=>{d.dismiss(r)},[]);return{toasts:e,dismiss:i}}var m=M(require("react"),1),b=require("framer-motion"),A=require("react-icons/md");var T=require("react-icons/fa"),f=require("react-icons/tb"),u=require("react/jsx-runtime"),P=e=>{let t={size:20,strokeWidth:2.25};switch(e){case"success":return(0,u.jsx)(T.FaCheckCircle,{...t,className:"vibe-icon-success"});case"error":return(0,u.jsx)(f.TbCircleX,{...t,className:"vibe-icon-error"});case"warning":return(0,u.jsx)(f.TbBan,{...t,className:"vibe-icon-warning"});case"info":return(0,u.jsx)(f.TbAlertCircle,{...t,className:"vibe-icon-info"});case"loading":return(0,u.jsx)(T.FaCircleNotch,{...t,className:"vibe-icon-spin"});default:return null}};var z={initial:{opacity:0,y:-20,scale:.95},animate:{opacity:1,y:0,scale:1,transition:{type:"spring",stiffness:400,damping:32,mass:.8,opacity:{duration:.15,ease:"easeOut"}}},exit:{opacity:0,y:-8,scale:.96,transition:{type:"spring",stiffness:500,damping:35,mass:.6,opacity:{duration:.12,ease:"easeIn"}}}};var n=require("react/jsx-runtime"),R=({toast:e,onDismiss:t})=>{let[i,r]=(0,m.useState)(!1);(0,m.useEffect)(()=>{let s=e.duration;if(!s||s===1/0)return;let o=setTimeout(()=>{t(e.id)},s);return()=>clearTimeout(o)},[e.id,e.duration,e.updatedAt,t]),(0,m.useEffect)(()=>{let s=setTimeout(()=>r(!0),300);return()=>clearTimeout(s)},[e.id,e.updatedAt]);let a=()=>{let s=e.style?.accent||"var(--vibe-accent)";if(e.icon)return m.default.isValidElement(e.icon)?m.default.cloneElement(e.icon,{size:20,style:{color:s,flexShrink:0}}):e.icon;let o=P(e.variant||"default");return m.default.isValidElement(o)?m.default.cloneElement(o,{size:20,style:{color:s,flexShrink:0}}):o},c={...e.style,backgroundColor:e.style?.background||"var(--vibe-bg)",color:e.style?.color||"var(--vibe-text-main)",borderColor:e.style?.background?"transparent":"var(--vibe-border)"},l={color:e.style?.color||"inherit"};return(0,n.jsxs)(b.motion.div,{layout:!0,variants:z,initial:"initial",animate:"animate",exit:"exit",className:`vibe-toast-card vibe-variant-${e.variant}`,style:c,drag:"x",dragConstraints:{left:0,right:300},onDragEnd:(s,o)=>{(o.offset.x>80||o.velocity.x>500)&&t(e.id)},children:[(0,n.jsxs)("div",{className:"vibe-toast-inner",children:[(0,n.jsx)("div",{className:"vibe-toast-icon-side",children:a()}),(0,n.jsxs)("div",{className:"vibe-toast-content-side",children:[(0,n.jsxs)("div",{className:"vibe-toast-top-row",children:[(0,n.jsx)("span",{className:"vibe-toast-title",style:l,children:e.title}),(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.count&&e.count>1&&(0,n.jsxs)("span",{className:"vibe-toast-count",children:["X",e.count]}),(0,n.jsx)("button",{className:"vibe-close-btn",onClick:()=>t(e.id),children:(0,n.jsx)(A.MdClose,{size:18})})]})]}),(0,n.jsx)(b.AnimatePresence,{children:i&&e.description&&(0,n.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,n.jsx)("p",{className:"vibe-description-text",children:e.description})},"desc")}),(0,n.jsx)(b.AnimatePresence,{children:i&&e.actions&&e.actions.length>0&&(0,n.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,n.jsx)("div",{className:"vibe-action-stack",children:e.actions.map((s,o)=>(0,n.jsx)("button",{className:`vibe-action-btn vibe-btn-${s.variant||"secondary"}`,onClick:k=>{s.onClick(k),(!e.duration||e.duration!==1/0)&&t()},children:s.label},o))})},"actions")})]})]}),!e.hideProgressBar&&e.duration!==1/0&&(0,n.jsx)("div",{className:"vibe-progress-track",children:(0,n.jsx)("div",{className:"vibe-progress-fill",style:{animation:`vibe-progress-shrink ${e.duration}ms linear forwards`}},`${e.id}-${e.updatedAt||0}`)})]})};var w=require("react/jsx-runtime"),O=({position:e="top-center",theme:t="light",duration:i,hideProgressBar:r=!0})=>{let{toasts:a,dismiss:c}=y(),l=e.includes("top");return(0,w.jsx)("div",{className:`vibe-toaster-container ${e}`,"data-theme":t,style:{position:"fixed",display:"flex",flexDirection:l?"column":"column-reverse",alignItems:e.includes("center")?"center":e.includes("left")?"flex-start":"flex-end",pointerEvents:"none",zIndex:9999,padding:"16px",inset:0,gap:"10px"},children:(0,w.jsx)(V.AnimatePresence,{mode:"popLayout",children:a.map(s=>(0,w.jsx)(R,{toast:{...s,duration:s.duration??i,hideProgressBar:s.hideProgressBar??r},onDismiss:c},s.id))})})};function S(e,{insertAt:t}={}){if(!e||typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t==="top"&&i.firstChild?i.insertBefore(r,i.firstChild):i.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}S(`: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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);border:1px solid color-mix(in srgb,var(--vibe-border) 70%,white 8%);color:var(--vibe-text-main);border-radius:12px;box-shadow:0 1px 2px #00000005,0 2px 12px #0000000a,0 4px 20px #00000008;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:12px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}
1
+ "use strict";var B=Object.create;var x=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var j=(e,t)=>{for(var i in t)x(e,i,{get:t[i],enumerable:!0})},C=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of L(t))!X.call(e,a)&&a!==i&&x(e,a,{get:()=>t[a],enumerable:!(r=D(t,a))||r.enumerable});return e};var M=(e,t,i)=>(i=e!=null?B(K(e)):{},C(t||!e||!e.__esModule?x(i,"default",{value:e,enumerable:!0}):i,e)),U=e=>C(x({},"__esModule",{value:!0}),e);var Y={};j(Y,{Toaster:()=>O,toast:()=>E,useToast:()=>y});module.exports=U(Y);var V=require("framer-motion");var v=require("react");var I=()=>Math.random().toString(36).substring(2,9)+Date.now().toString(36);var h={default:4e3,success:4e3,error:4e3,loading:1/0,warning:4e3,info:4e3},N=class{toasts=[];listeners=new Set;settings={limit:5};subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}emit(){this.listeners.forEach(t=>t([...this.toasts]))}setLimit(t){this.settings.limit=t,this.toasts.length>t&&(this.toasts=this.toasts.slice(0,t),this.emit())}add(t){let i=t.variant||"default",r=t.duration!==void 0?t.duration:h[i],a=t.groupKey||`${i}-${String(t.title)}-${String(t.description||"")}`,c=this.toasts.findIndex(o=>o.groupKey===a);if(t.dedupe!==!1&&c!==-1){let o=this.toasts[c],k={...o,count:(o.count||1)+1,duration:r,updatedAt:Date.now()};return this.toasts=this.toasts.map(($,F)=>F===c?k:$),this.emit(),o.id}let l=I(),s={id:l,...t,variant:i,duration:r,count:1,groupKey:a};return this.toasts=[s,...this.toasts].slice(0,this.settings.limit),this.emit(),l}update(t,i){this.toasts=this.toasts.map(r=>{if(r.id===t){let a=i.variant||r.variant||"default",c=i.duration!==void 0?i.duration:h[a];return{...r,...i,variant:a,duration:c}}return r}),this.emit()}dismiss(t){t?this.toasts=this.toasts.filter(i=>i.id!==t):this.toasts=[],this.emit()}},d=new N,p=e=>typeof e=="string"?d.add({title:e,variant:"default"}):d.add(e),g=e=>(t,i)=>d.add({...i,title:t,variant:e});p.success=g("success");p.error=g("error");p.warning=g("warning");p.info=g("info");p.loading=g("loading");p.dismiss=e=>d.dismiss(e);p.dismissAll=()=>d.dismiss();p.setLimit=e=>d.setLimit(e);p.promise=(e,{loading:t,success:i,error:r})=>{let a=d.add({variant:"loading",title:t,duration:1/0});return e.then(c=>{let l=typeof i=="function"?i(c):i;d.update(a,{variant:"success",title:l,duration:h.success})}).catch(c=>{let l=typeof r=="function"?r(c):r;d.update(a,{variant:"error",title:l,duration:h.error})}),e};var E=p;function y(){let[e,t]=(0,v.useState)([]);(0,v.useEffect)(()=>{let r=d.subscribe(a=>{t(a)});return()=>{r()}},[]);let i=(0,v.useCallback)(r=>{d.dismiss(r)},[]);return{toasts:e,dismiss:i}}var m=M(require("react"),1),b=require("framer-motion"),A=require("react-icons/md");var T=require("react-icons/fa"),f=require("react-icons/tb"),u=require("react/jsx-runtime"),P=e=>{let t={size:20,strokeWidth:2.25};switch(e){case"success":return(0,u.jsx)(T.FaCheckCircle,{...t,className:"vibe-icon-success"});case"error":return(0,u.jsx)(f.TbCircleX,{...t,className:"vibe-icon-error"});case"warning":return(0,u.jsx)(f.TbBan,{...t,className:"vibe-icon-warning"});case"info":return(0,u.jsx)(f.TbAlertCircle,{...t,className:"vibe-icon-info"});case"loading":return(0,u.jsx)(T.FaCircleNotch,{...t,className:"vibe-icon-spin"});default:return null}};var z={initial:{opacity:0,y:-20,scale:.95},animate:{opacity:1,y:0,scale:1,transition:{type:"spring",stiffness:400,damping:32,mass:.8,opacity:{duration:.15,ease:"easeOut"}}},exit:{opacity:0,y:-8,scale:.96,transition:{type:"spring",stiffness:500,damping:35,mass:.6,opacity:{duration:.12,ease:"easeIn"}}}};var n=require("react/jsx-runtime"),R=({toast:e,onDismiss:t})=>{let[i,r]=(0,m.useState)(!1);(0,m.useEffect)(()=>{let s=e.duration;if(!s||s===1/0)return;let o=setTimeout(()=>{t(e.id)},s);return()=>clearTimeout(o)},[e.id,e.duration,e.updatedAt,t]),(0,m.useEffect)(()=>{let s=setTimeout(()=>r(!0),300);return()=>clearTimeout(s)},[e.id,e.updatedAt]);let a=()=>{let s=e.style?.accent||"var(--vibe-accent)";if(e.icon)return m.default.isValidElement(e.icon)?m.default.cloneElement(e.icon,{size:20,style:{color:s,flexShrink:0}}):e.icon;let o=P(e.variant||"default");return m.default.isValidElement(o)?m.default.cloneElement(o,{size:20,style:{color:s,flexShrink:0}}):o},c={...e.style,backgroundColor:e.style?.background||"var(--vibe-bg)",color:e.style?.color||"var(--vibe-text-main)",borderColor:e.style?.background?"transparent":"var(--vibe-border)"},l={color:e.style?.color||"inherit"};return(0,n.jsxs)(b.motion.div,{layout:!0,variants:z,initial:"initial",animate:"animate",exit:"exit",className:`vibe-toast-card vibe-variant-${e.variant}`,style:c,drag:"x",dragConstraints:{left:0,right:300},onDragEnd:(s,o)=>{(o.offset.x>80||o.velocity.x>500)&&t(e.id)},children:[(0,n.jsxs)("div",{className:"vibe-toast-inner",children:[(0,n.jsx)("div",{className:"vibe-toast-icon-side",children:a()}),(0,n.jsxs)("div",{className:"vibe-toast-content-side",children:[(0,n.jsxs)("div",{className:"vibe-toast-top-row",children:[(0,n.jsx)("span",{className:"vibe-toast-title",style:l,children:e.title}),(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.count&&e.count>1&&(0,n.jsxs)("span",{className:"vibe-toast-count",children:["X",e.count]}),(0,n.jsx)("button",{className:"vibe-close-btn",onClick:()=>t(e.id),children:(0,n.jsx)(A.MdClose,{size:18})})]})]}),(0,n.jsx)(b.AnimatePresence,{children:i&&e.description&&(0,n.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,n.jsx)("p",{className:"vibe-description-text",children:e.description})},"desc")}),(0,n.jsx)(b.AnimatePresence,{children:i&&e.actions&&e.actions.length>0&&(0,n.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,n.jsx)("div",{className:"vibe-action-stack",children:e.actions.map((s,o)=>(0,n.jsx)("button",{className:`vibe-action-btn vibe-btn-${s.variant||"secondary"}`,onClick:k=>{s.onClick(k),(!e.duration||e.duration!==1/0)&&t()},children:s.label},o))})},"actions")})]})]}),!e.hideProgressBar&&e.duration!==1/0&&(0,n.jsx)("div",{className:"vibe-progress-track",children:(0,n.jsx)("div",{className:"vibe-progress-fill",style:{animation:`vibe-progress-shrink ${e.duration}ms linear forwards`}},`${e.id}-${e.updatedAt||0}`)})]})};var w=require("react/jsx-runtime"),O=({position:e="top-center",theme:t="light",duration:i,hideProgressBar:r=!0})=>{let{toasts:a,dismiss:c}=y(),l=e.includes("top");return(0,w.jsx)("div",{className:`vibe-toaster-container ${e}`,"data-theme":t,style:{position:"fixed",display:"flex",flexDirection:l?"column":"column-reverse",alignItems:e.includes("center")?"center":e.includes("left")?"flex-start":"flex-end",pointerEvents:"none",zIndex:9999,padding:"16px",inset:0,gap:"10px"},children:(0,w.jsx)(V.AnimatePresence,{mode:"popLayout",children:a.map(s=>(0,w.jsx)(R,{toast:{...s,duration:s.duration??i,hideProgressBar:s.hideProgressBar??r},onDismiss:c},s.id))})})};function S(e,{insertAt:t}={}){if(!e||typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t==="top"&&i.firstChild?i.insertBefore(r,i.firstChild):i.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}S(`: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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);color:var(--vibe-text-main);border-radius:8px;box-shadow:0 1px 2px #00000003,0 2px 6px #00000005,0 4px 10px #00000005;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:8px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}
2
2
  `);0&&(module.exports={Toaster,toast,useToast});
3
3
  //# sourceMappingURL=index.cjs.map
@@ -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","../src/core/animations.ts","#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 } 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-center\",\r\n theme = \"light\",\r\n duration: globalDuration,\r\n hideProgressBar: globalHideProgress = true,\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: \"10px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id}\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 variant = options.variant || \"default\";\r\n const duration =\r\n options.duration !== undefined\r\n ? options.duration\r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const dedupeKey =\r\n options.groupKey ||\r\n `${variant}-${String(options.title)}-${String(options.description || \"\")}`;\r\n\r\n const existingIndex = this.toasts.findIndex(\r\n (toast) => toast.groupKey === dedupeKey,\r\n );\r\n\r\n // DEDUPE / GROUP\r\n if (options.dedupe !== false && existingIndex !== -1) {\r\n const existingToast = this.toasts[existingIndex];\r\n\r\n const updatedToast: Toast = {\r\n ...existingToast,\r\n count: (existingToast.count || 1) + 1,\r\n duration,\r\n updatedAt: Date.now(),\r\n };\r\n\r\n this.toasts = this.toasts.map((toast, index) =>\r\n index === existingIndex ? updatedToast : toast\r\n );\r\n\r\n this.emit();\r\n return existingToast.id;\r\n}\r\n\r\n const id = generateId();\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant,\r\n duration,\r\n count: 1,\r\n groupKey: dedupeKey,\r\n };\r\n\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 =\r\n 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 (\r\n title: React.ReactNode,\r\n options?: Omit<ToastOptions, \"title\" | \"variant\">,\r\n ) => {\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 =\r\n 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 =\r\n 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;\r\n","\"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\nimport { toastVariants } from \"@/core/animations\";\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 [showDesc, setShowDesc] = useState(false);\r\n\r\n // ⏱ Auto dismiss\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);\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, toast.updatedAt, onDismiss]);\r\n\r\n // 📦 Description delay\r\n useEffect(() => {\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n return () => clearTimeout(expansionTimer);\r\n }, [toast.id, toast.updatedAt]);\r\n\r\n // 🎯 Icon\r\n const renderIcon = () => {\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 variants={toastVariants}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => {\r\n if (info.offset.x > 80 || info.velocity.x > 500) {\r\n onDismiss(toast.id);\r\n }\r\n }}\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\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\r\n {toast.count && toast.count > 1 && (\r\n <span className=\"vibe-toast-count\">X{toast.count}</span>\r\n )}\r\n\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n\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\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 {/* ✅ Premium Progress Bar */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n key={`${toast.id}-${toast.updatedAt || 0}`}\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n animation: `vibe-progress-shrink ${toast.duration}ms linear forwards`,\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 { TbAlertCircle, TbBan, TbCircleX } 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};","import { Variants } from \"framer-motion\";\r\n\r\nexport const toastVariants: Variants = {\r\n initial: {\r\n opacity: 0,\r\n y: -20,\r\n scale: 0.95,\r\n },\r\n\r\n animate: {\r\n opacity: 1,\r\n y: 0,\r\n scale: 1,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 400,\r\n damping: 32,\r\n mass: 0.8,\r\n opacity: {\r\n duration: 0.15,\r\n ease: \"easeOut\",\r\n },\r\n },\r\n },\r\n\r\n exit: {\r\n opacity: 0,\r\n y: -8,\r\n scale: 0.96,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 500,\r\n damping: 35,\r\n mass: 0.6,\r\n opacity: {\r\n duration: 0.12,\r\n ease: \"easeIn\",\r\n },\r\n },\r\n },\r\n} as const;","\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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);border:1px solid color-mix(in srgb,var(--vibe-border) 70%,white 8%);color:var(--vibe-text-main);border-radius:12px;box-shadow:0 1px 2px #00000005,0 2px 12px #0000000a,0 4px 20px #00000008;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:\\\"\\\";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:12px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}\\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","variant","duration","dedupeKey","existingIndex","toast","existingToast","updatedToast","index","id","generateId","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","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","toastVariants","import_jsx_runtime","ToastItem","toast","onDismiss","showDesc","setShowDesc","toastDuration","timer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","toastVariants","_","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","../src/core/animations.ts","#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 } 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-center\",\r\n theme = \"light\",\r\n duration: globalDuration,\r\n hideProgressBar: globalHideProgress = true,\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: \"10px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id}\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 variant = options.variant || \"default\";\r\n const duration =\r\n options.duration !== undefined\r\n ? options.duration\r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const dedupeKey =\r\n options.groupKey ||\r\n `${variant}-${String(options.title)}-${String(options.description || \"\")}`;\r\n\r\n const existingIndex = this.toasts.findIndex(\r\n (toast) => toast.groupKey === dedupeKey,\r\n );\r\n\r\n // DEDUPE / GROUP\r\n if (options.dedupe !== false && existingIndex !== -1) {\r\n const existingToast = this.toasts[existingIndex];\r\n\r\n const updatedToast: Toast = {\r\n ...existingToast,\r\n count: (existingToast.count || 1) + 1,\r\n duration,\r\n updatedAt: Date.now(),\r\n };\r\n\r\n this.toasts = this.toasts.map((toast, index) =>\r\n index === existingIndex ? updatedToast : toast\r\n );\r\n\r\n this.emit();\r\n return existingToast.id;\r\n}\r\n\r\n const id = generateId();\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant,\r\n duration,\r\n count: 1,\r\n groupKey: dedupeKey,\r\n };\r\n\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 =\r\n 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 (\r\n title: React.ReactNode,\r\n options?: Omit<ToastOptions, \"title\" | \"variant\">,\r\n ) => {\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 =\r\n 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 =\r\n 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;\r\n","\"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\nimport { toastVariants } from \"@/core/animations\";\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 [showDesc, setShowDesc] = useState(false);\r\n\r\n // ⏱ Auto dismiss\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);\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, toast.updatedAt, onDismiss]);\r\n\r\n // 📦 Description delay\r\n useEffect(() => {\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n return () => clearTimeout(expansionTimer);\r\n }, [toast.id, toast.updatedAt]);\r\n\r\n // 🎯 Icon\r\n const renderIcon = () => {\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 variants={toastVariants}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => {\r\n if (info.offset.x > 80 || info.velocity.x > 500) {\r\n onDismiss(toast.id);\r\n }\r\n }}\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\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\r\n {toast.count && toast.count > 1 && (\r\n <span className=\"vibe-toast-count\">X{toast.count}</span>\r\n )}\r\n\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n\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\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 {/* ✅ Premium Progress Bar */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n key={`${toast.id}-${toast.updatedAt || 0}`}\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n animation: `vibe-progress-shrink ${toast.duration}ms linear forwards`,\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 { TbAlertCircle, TbBan, TbCircleX } 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};","import { Variants } from \"framer-motion\";\r\n\r\nexport const toastVariants: Variants = {\r\n initial: {\r\n opacity: 0,\r\n y: -20,\r\n scale: 0.95,\r\n },\r\n\r\n animate: {\r\n opacity: 1,\r\n y: 0,\r\n scale: 1,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 400,\r\n damping: 32,\r\n mass: 0.8,\r\n opacity: {\r\n duration: 0.15,\r\n ease: \"easeOut\",\r\n },\r\n },\r\n },\r\n\r\n exit: {\r\n opacity: 0,\r\n y: -8,\r\n scale: 0.96,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 500,\r\n damping: 35,\r\n mass: 0.6,\r\n opacity: {\r\n duration: 0.12,\r\n ease: \"easeIn\",\r\n },\r\n },\r\n },\r\n} as const;","\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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);color:var(--vibe-text-main);border-radius:8px;box-shadow:0 1px 2px #00000003,0 2px 6px #00000005,0 4px 10px #00000005;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:\\\"\\\";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:8px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}\\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","variant","duration","dedupeKey","existingIndex","toast","existingToast","updatedToast","index","id","generateId","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","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","toastVariants","import_jsx_runtime","ToastItem","toast","onDismiss","showDesc","setShowDesc","toastDuration","timer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","toastVariants","_","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 CHANGED
@@ -1,3 +1,3 @@
1
- import{AnimatePresence as j}from"framer-motion";import{useState as R,useEffect as V,useCallback as O}from"react";var k=()=>Math.random().toString(36).substring(2,9)+Date.now().toString(36);var u={default:4e3,success:4e3,error:4e3,loading:1/0,warning:4e3,info:4e3},x=class{toasts=[];listeners=new Set;settings={limit:5};subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}emit(){this.listeners.forEach(t=>t([...this.toasts]))}setLimit(t){this.settings.limit=t,this.toasts.length>t&&(this.toasts=this.toasts.slice(0,t),this.emit())}add(t){let i=t.variant||"default",r=t.duration!==void 0?t.duration:u[i],s=t.groupKey||`${i}-${String(t.title)}-${String(t.description||"")}`,o=this.toasts.findIndex(a=>a.groupKey===s);if(t.dedupe!==!1&&o!==-1){let a=this.toasts[o],g={...a,count:(a.count||1)+1,duration:r,updatedAt:Date.now()};return this.toasts=this.toasts.map((P,z)=>z===o?g:P),this.emit(),a.id}let l=k(),n={id:l,...t,variant:i,duration:r,count:1,groupKey:s};return this.toasts=[n,...this.toasts].slice(0,this.settings.limit),this.emit(),l}update(t,i){this.toasts=this.toasts.map(r=>{if(r.id===t){let s=i.variant||r.variant||"default",o=i.duration!==void 0?i.duration:u[s];return{...r,...i,variant:s,duration:o}}return r}),this.emit()}dismiss(t){t?this.toasts=this.toasts.filter(i=>i.id!==t):this.toasts=[],this.emit()}},d=new x,p=e=>typeof e=="string"?d.add({title:e,variant:"default"}):d.add(e),b=e=>(t,i)=>d.add({...i,title:t,variant:e});p.success=b("success");p.error=b("error");p.warning=b("warning");p.info=b("info");p.loading=b("loading");p.dismiss=e=>d.dismiss(e);p.dismissAll=()=>d.dismiss();p.setLimit=e=>d.setLimit(e);p.promise=(e,{loading:t,success:i,error:r})=>{let s=d.add({variant:"loading",title:t,duration:1/0});return e.then(o=>{let l=typeof i=="function"?i(o):i;d.update(s,{variant:"success",title:l,duration:u.success})}).catch(o=>{let l=typeof r=="function"?r(o):r;d.update(s,{variant:"error",title:l,duration:u.error})}),e};var A=p;function h(){let[e,t]=R([]);V(()=>{let r=d.subscribe(s=>{t(s)});return()=>{r()}},[]);let i=O(r=>{d.dismiss(r)},[]);return{toasts:e,dismiss:i}}import f,{useState as K,useEffect as C}from"react";import{AnimatePresence as I,motion as y}from"framer-motion";import{MdClose as X}from"react-icons/md";import{FaCheckCircle as $,FaCircleNotch as F}from"react-icons/fa";import{TbAlertCircle as B,TbBan as D,TbCircleX as L}from"react-icons/tb";import{jsx as v}from"react/jsx-runtime";var N=e=>{let t={size:20,strokeWidth:2.25};switch(e){case"success":return v($,{...t,className:"vibe-icon-success"});case"error":return v(L,{...t,className:"vibe-icon-error"});case"warning":return v(D,{...t,className:"vibe-icon-warning"});case"info":return v(B,{...t,className:"vibe-icon-info"});case"loading":return v(F,{...t,className:"vibe-icon-spin"});default:return null}};var S={initial:{opacity:0,y:-20,scale:.95},animate:{opacity:1,y:0,scale:1,transition:{type:"spring",stiffness:400,damping:32,mass:.8,opacity:{duration:.15,ease:"easeOut"}}},exit:{opacity:0,y:-8,scale:.96,transition:{type:"spring",stiffness:500,damping:35,mass:.6,opacity:{duration:.12,ease:"easeIn"}}}};import{jsx as c,jsxs as m}from"react/jsx-runtime";var E=({toast:e,onDismiss:t})=>{let[i,r]=K(!1);C(()=>{let n=e.duration;if(!n||n===1/0)return;let a=setTimeout(()=>{t(e.id)},n);return()=>clearTimeout(a)},[e.id,e.duration,e.updatedAt,t]),C(()=>{let n=setTimeout(()=>r(!0),300);return()=>clearTimeout(n)},[e.id,e.updatedAt]);let s=()=>{let n=e.style?.accent||"var(--vibe-accent)";if(e.icon)return f.isValidElement(e.icon)?f.cloneElement(e.icon,{size:20,style:{color:n,flexShrink:0}}):e.icon;let a=N(e.variant||"default");return f.isValidElement(a)?f.cloneElement(a,{size:20,style:{color:n,flexShrink:0}}):a},o={...e.style,backgroundColor:e.style?.background||"var(--vibe-bg)",color:e.style?.color||"var(--vibe-text-main)",borderColor:e.style?.background?"transparent":"var(--vibe-border)"},l={color:e.style?.color||"inherit"};return m(y.div,{layout:!0,variants:S,initial:"initial",animate:"animate",exit:"exit",className:`vibe-toast-card vibe-variant-${e.variant}`,style:o,drag:"x",dragConstraints:{left:0,right:300},onDragEnd:(n,a)=>{(a.offset.x>80||a.velocity.x>500)&&t(e.id)},children:[m("div",{className:"vibe-toast-inner",children:[c("div",{className:"vibe-toast-icon-side",children:s()}),m("div",{className:"vibe-toast-content-side",children:[m("div",{className:"vibe-toast-top-row",children:[c("span",{className:"vibe-toast-title",style:l,children:e.title}),m("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.count&&e.count>1&&m("span",{className:"vibe-toast-count",children:["X",e.count]}),c("button",{className:"vibe-close-btn",onClick:()=>t(e.id),children:c(X,{size:18})})]})]}),c(I,{children:i&&e.description&&c(y.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:c("p",{className:"vibe-description-text",children:e.description})},"desc")}),c(I,{children:i&&e.actions&&e.actions.length>0&&c(y.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:c("div",{className:"vibe-action-stack",children:e.actions.map((n,a)=>c("button",{className:`vibe-action-btn vibe-btn-${n.variant||"secondary"}`,onClick:g=>{n.onClick(g),(!e.duration||e.duration!==1/0)&&t()},children:n.label},a))})},"actions")})]})]}),!e.hideProgressBar&&e.duration!==1/0&&c("div",{className:"vibe-progress-track",children:c("div",{className:"vibe-progress-fill",style:{animation:`vibe-progress-shrink ${e.duration}ms linear forwards`}},`${e.id}-${e.updatedAt||0}`)})]})};import{jsx as T}from"react/jsx-runtime";var M=({position:e="top-center",theme:t="light",duration:i,hideProgressBar:r=!0})=>{let{toasts:s,dismiss:o}=h(),l=e.includes("top");return T("div",{className:`vibe-toaster-container ${e}`,"data-theme":t,style:{position:"fixed",display:"flex",flexDirection:l?"column":"column-reverse",alignItems:e.includes("center")?"center":e.includes("left")?"flex-start":"flex-end",pointerEvents:"none",zIndex:9999,padding:"16px",inset:0,gap:"10px"},children:T(j,{mode:"popLayout",children:s.map(n=>T(E,{toast:{...n,duration:n.duration??i,hideProgressBar:n.hideProgressBar??r},onDismiss:o},n.id))})})};function w(e,{insertAt:t}={}){if(!e||typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t==="top"&&i.firstChild?i.insertBefore(r,i.firstChild):i.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}w(`: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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);border:1px solid color-mix(in srgb,var(--vibe-border) 70%,white 8%);color:var(--vibe-text-main);border-radius:12px;box-shadow:0 1px 2px #00000005,0 2px 12px #0000000a,0 4px 20px #00000008;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:12px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}
1
+ import{AnimatePresence as j}from"framer-motion";import{useState as R,useEffect as V,useCallback as O}from"react";var k=()=>Math.random().toString(36).substring(2,9)+Date.now().toString(36);var u={default:4e3,success:4e3,error:4e3,loading:1/0,warning:4e3,info:4e3},x=class{toasts=[];listeners=new Set;settings={limit:5};subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}emit(){this.listeners.forEach(t=>t([...this.toasts]))}setLimit(t){this.settings.limit=t,this.toasts.length>t&&(this.toasts=this.toasts.slice(0,t),this.emit())}add(t){let i=t.variant||"default",r=t.duration!==void 0?t.duration:u[i],s=t.groupKey||`${i}-${String(t.title)}-${String(t.description||"")}`,o=this.toasts.findIndex(a=>a.groupKey===s);if(t.dedupe!==!1&&o!==-1){let a=this.toasts[o],g={...a,count:(a.count||1)+1,duration:r,updatedAt:Date.now()};return this.toasts=this.toasts.map((P,z)=>z===o?g:P),this.emit(),a.id}let l=k(),n={id:l,...t,variant:i,duration:r,count:1,groupKey:s};return this.toasts=[n,...this.toasts].slice(0,this.settings.limit),this.emit(),l}update(t,i){this.toasts=this.toasts.map(r=>{if(r.id===t){let s=i.variant||r.variant||"default",o=i.duration!==void 0?i.duration:u[s];return{...r,...i,variant:s,duration:o}}return r}),this.emit()}dismiss(t){t?this.toasts=this.toasts.filter(i=>i.id!==t):this.toasts=[],this.emit()}},d=new x,p=e=>typeof e=="string"?d.add({title:e,variant:"default"}):d.add(e),b=e=>(t,i)=>d.add({...i,title:t,variant:e});p.success=b("success");p.error=b("error");p.warning=b("warning");p.info=b("info");p.loading=b("loading");p.dismiss=e=>d.dismiss(e);p.dismissAll=()=>d.dismiss();p.setLimit=e=>d.setLimit(e);p.promise=(e,{loading:t,success:i,error:r})=>{let s=d.add({variant:"loading",title:t,duration:1/0});return e.then(o=>{let l=typeof i=="function"?i(o):i;d.update(s,{variant:"success",title:l,duration:u.success})}).catch(o=>{let l=typeof r=="function"?r(o):r;d.update(s,{variant:"error",title:l,duration:u.error})}),e};var A=p;function h(){let[e,t]=R([]);V(()=>{let r=d.subscribe(s=>{t(s)});return()=>{r()}},[]);let i=O(r=>{d.dismiss(r)},[]);return{toasts:e,dismiss:i}}import f,{useState as K,useEffect as C}from"react";import{AnimatePresence as I,motion as y}from"framer-motion";import{MdClose as X}from"react-icons/md";import{FaCheckCircle as $,FaCircleNotch as F}from"react-icons/fa";import{TbAlertCircle as B,TbBan as D,TbCircleX as L}from"react-icons/tb";import{jsx as v}from"react/jsx-runtime";var N=e=>{let t={size:20,strokeWidth:2.25};switch(e){case"success":return v($,{...t,className:"vibe-icon-success"});case"error":return v(L,{...t,className:"vibe-icon-error"});case"warning":return v(D,{...t,className:"vibe-icon-warning"});case"info":return v(B,{...t,className:"vibe-icon-info"});case"loading":return v(F,{...t,className:"vibe-icon-spin"});default:return null}};var S={initial:{opacity:0,y:-20,scale:.95},animate:{opacity:1,y:0,scale:1,transition:{type:"spring",stiffness:400,damping:32,mass:.8,opacity:{duration:.15,ease:"easeOut"}}},exit:{opacity:0,y:-8,scale:.96,transition:{type:"spring",stiffness:500,damping:35,mass:.6,opacity:{duration:.12,ease:"easeIn"}}}};import{jsx as c,jsxs as m}from"react/jsx-runtime";var E=({toast:e,onDismiss:t})=>{let[i,r]=K(!1);C(()=>{let n=e.duration;if(!n||n===1/0)return;let a=setTimeout(()=>{t(e.id)},n);return()=>clearTimeout(a)},[e.id,e.duration,e.updatedAt,t]),C(()=>{let n=setTimeout(()=>r(!0),300);return()=>clearTimeout(n)},[e.id,e.updatedAt]);let s=()=>{let n=e.style?.accent||"var(--vibe-accent)";if(e.icon)return f.isValidElement(e.icon)?f.cloneElement(e.icon,{size:20,style:{color:n,flexShrink:0}}):e.icon;let a=N(e.variant||"default");return f.isValidElement(a)?f.cloneElement(a,{size:20,style:{color:n,flexShrink:0}}):a},o={...e.style,backgroundColor:e.style?.background||"var(--vibe-bg)",color:e.style?.color||"var(--vibe-text-main)",borderColor:e.style?.background?"transparent":"var(--vibe-border)"},l={color:e.style?.color||"inherit"};return m(y.div,{layout:!0,variants:S,initial:"initial",animate:"animate",exit:"exit",className:`vibe-toast-card vibe-variant-${e.variant}`,style:o,drag:"x",dragConstraints:{left:0,right:300},onDragEnd:(n,a)=>{(a.offset.x>80||a.velocity.x>500)&&t(e.id)},children:[m("div",{className:"vibe-toast-inner",children:[c("div",{className:"vibe-toast-icon-side",children:s()}),m("div",{className:"vibe-toast-content-side",children:[m("div",{className:"vibe-toast-top-row",children:[c("span",{className:"vibe-toast-title",style:l,children:e.title}),m("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.count&&e.count>1&&m("span",{className:"vibe-toast-count",children:["X",e.count]}),c("button",{className:"vibe-close-btn",onClick:()=>t(e.id),children:c(X,{size:18})})]})]}),c(I,{children:i&&e.description&&c(y.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:c("p",{className:"vibe-description-text",children:e.description})},"desc")}),c(I,{children:i&&e.actions&&e.actions.length>0&&c(y.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:c("div",{className:"vibe-action-stack",children:e.actions.map((n,a)=>c("button",{className:`vibe-action-btn vibe-btn-${n.variant||"secondary"}`,onClick:g=>{n.onClick(g),(!e.duration||e.duration!==1/0)&&t()},children:n.label},a))})},"actions")})]})]}),!e.hideProgressBar&&e.duration!==1/0&&c("div",{className:"vibe-progress-track",children:c("div",{className:"vibe-progress-fill",style:{animation:`vibe-progress-shrink ${e.duration}ms linear forwards`}},`${e.id}-${e.updatedAt||0}`)})]})};import{jsx as T}from"react/jsx-runtime";var M=({position:e="top-center",theme:t="light",duration:i,hideProgressBar:r=!0})=>{let{toasts:s,dismiss:o}=h(),l=e.includes("top");return T("div",{className:`vibe-toaster-container ${e}`,"data-theme":t,style:{position:"fixed",display:"flex",flexDirection:l?"column":"column-reverse",alignItems:e.includes("center")?"center":e.includes("left")?"flex-start":"flex-end",pointerEvents:"none",zIndex:9999,padding:"16px",inset:0,gap:"10px"},children:T(j,{mode:"popLayout",children:s.map(n=>T(E,{toast:{...n,duration:n.duration??i,hideProgressBar:n.hideProgressBar??r},onDismiss:o},n.id))})})};function w(e,{insertAt:t}={}){if(!e||typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t==="top"&&i.firstChild?i.insertBefore(r,i.firstChild):i.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}w(`: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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);color:var(--vibe-text-main);border-radius:8px;box-shadow:0 1px 2px #00000003,0 2px 6px #00000005,0 4px 10px #00000005;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:8px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}
2
2
  `);export{M as Toaster,A as toast,h as useToast};
3
3
  //# sourceMappingURL=index.js.map
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","../src/core/animations.ts","#style-inject:#style-inject","../src/styles/toast.css"],"sourcesContent":["import React from \"react\";\r\nimport { AnimatePresence } 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-center\",\r\n theme = \"light\",\r\n duration: globalDuration,\r\n hideProgressBar: globalHideProgress = true,\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: \"10px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id}\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 variant = options.variant || \"default\";\r\n const duration =\r\n options.duration !== undefined\r\n ? options.duration\r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const dedupeKey =\r\n options.groupKey ||\r\n `${variant}-${String(options.title)}-${String(options.description || \"\")}`;\r\n\r\n const existingIndex = this.toasts.findIndex(\r\n (toast) => toast.groupKey === dedupeKey,\r\n );\r\n\r\n // DEDUPE / GROUP\r\n if (options.dedupe !== false && existingIndex !== -1) {\r\n const existingToast = this.toasts[existingIndex];\r\n\r\n const updatedToast: Toast = {\r\n ...existingToast,\r\n count: (existingToast.count || 1) + 1,\r\n duration,\r\n updatedAt: Date.now(),\r\n };\r\n\r\n this.toasts = this.toasts.map((toast, index) =>\r\n index === existingIndex ? updatedToast : toast\r\n );\r\n\r\n this.emit();\r\n return existingToast.id;\r\n}\r\n\r\n const id = generateId();\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant,\r\n duration,\r\n count: 1,\r\n groupKey: dedupeKey,\r\n };\r\n\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 =\r\n 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 (\r\n title: React.ReactNode,\r\n options?: Omit<ToastOptions, \"title\" | \"variant\">,\r\n ) => {\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 =\r\n 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 =\r\n 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;\r\n","\"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\nimport { toastVariants } from \"@/core/animations\";\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 [showDesc, setShowDesc] = useState(false);\r\n\r\n // ⏱ Auto dismiss\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);\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, toast.updatedAt, onDismiss]);\r\n\r\n // 📦 Description delay\r\n useEffect(() => {\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n return () => clearTimeout(expansionTimer);\r\n }, [toast.id, toast.updatedAt]);\r\n\r\n // 🎯 Icon\r\n const renderIcon = () => {\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 variants={toastVariants}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => {\r\n if (info.offset.x > 80 || info.velocity.x > 500) {\r\n onDismiss(toast.id);\r\n }\r\n }}\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\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\r\n {toast.count && toast.count > 1 && (\r\n <span className=\"vibe-toast-count\">X{toast.count}</span>\r\n )}\r\n\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n\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\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 {/* ✅ Premium Progress Bar */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n key={`${toast.id}-${toast.updatedAt || 0}`}\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n animation: `vibe-progress-shrink ${toast.duration}ms linear forwards`,\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 { TbAlertCircle, TbBan, TbCircleX } 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};","import { Variants } from \"framer-motion\";\r\n\r\nexport const toastVariants: Variants = {\r\n initial: {\r\n opacity: 0,\r\n y: -20,\r\n scale: 0.95,\r\n },\r\n\r\n animate: {\r\n opacity: 1,\r\n y: 0,\r\n scale: 1,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 400,\r\n damping: 32,\r\n mass: 0.8,\r\n opacity: {\r\n duration: 0.15,\r\n ease: \"easeOut\",\r\n },\r\n },\r\n },\r\n\r\n exit: {\r\n opacity: 0,\r\n y: -8,\r\n scale: 0.96,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 500,\r\n damping: 35,\r\n mass: 0.6,\r\n opacity: {\r\n duration: 0.12,\r\n ease: \"easeIn\",\r\n },\r\n },\r\n },\r\n} as const;","\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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);border:1px solid color-mix(in srgb,var(--vibe-border) 70%,white 8%);color:var(--vibe-text-main);border-radius:12px;box-shadow:0 1px 2px #00000005,0 2px 12px #0000000a,0 4px 20px #00000008;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:\\\"\\\";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:12px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}\\n\")"],"mappings":"AACA,OAAS,mBAAAA,MAAuB,gBCDhC,OAAS,YAAAC,EAAU,aAAAC,EAAW,eAAAC,MAAmB,QCA1C,IAAMC,EAAa,IACjB,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,CAAC,EAAI,KAAK,IAAI,EAAE,SAAS,EAAE,ECUrE,IAAMC,EAAiD,CAC5D,QAAS,IACT,QAAS,IACT,MAAO,IACP,QAAS,IACT,QAAS,IACT,KAAM,GACR,EAQMC,EAAN,KAAiB,CACP,OAAkB,CAAC,EACnB,UAA2B,IAAI,IAC/B,SAA0B,CAAE,MAAO,CAAE,EAE7C,UAAUC,EAAoB,CAC5B,YAAK,UAAU,IAAIA,CAAQ,EACpB,IAAM,KAAK,UAAU,OAAOA,CAAQ,CAC7C,CAEQ,MAAO,CACb,KAAK,UAAU,QAASA,GAAaA,EAAS,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CACjE,CAEA,SAASC,EAAkB,CACzB,KAAK,SAAS,MAAQA,EAClB,KAAK,OAAO,OAASA,IACvB,KAAK,OAAS,KAAK,OAAO,MAAM,EAAGA,CAAQ,EAC3C,KAAK,KAAK,EAEd,CAEA,IAAIC,EAA+B,CACjC,IAAMC,EAAUD,EAAQ,SAAW,UAC7BE,EACJF,EAAQ,WAAa,OACjBA,EAAQ,SACRJ,EAAiBK,CAAO,EAExBE,EACJH,EAAQ,UACR,GAAGC,CAAO,IAAI,OAAOD,EAAQ,KAAK,CAAC,IAAI,OAAOA,EAAQ,aAAe,EAAE,CAAC,GAEpEI,EAAgB,KAAK,OAAO,UAC/BC,GAAUA,EAAM,WAAaF,CAChC,EAGA,GAAIH,EAAQ,SAAW,IAASI,IAAkB,GAAI,CACxD,IAAME,EAAgB,KAAK,OAAOF,CAAa,EAEzCG,EAAsB,CAC1B,GAAGD,EACH,OAAQA,EAAc,OAAS,GAAK,EACpC,SAAAJ,EACA,UAAW,KAAK,IAAI,CACtB,EAEA,YAAK,OAAS,KAAK,OAAO,IAAI,CAACG,EAAOG,IACpCA,IAAUJ,EAAgBG,EAAeF,CAC3C,EAEA,KAAK,KAAK,EACHC,EAAc,EACvB,CAEI,IAAMG,EAAKC,EAAW,EAEhBC,EAAkB,CACtB,GAAAF,EACA,GAAGT,EACH,QAAAC,EACA,SAAAC,EACA,MAAO,EACP,SAAUC,CACZ,EAEA,YAAK,OAAS,CAACQ,EAAU,GAAG,KAAK,MAAM,EAAE,MAAM,EAAG,KAAK,SAAS,KAAK,EAErE,KAAK,KAAK,EACHF,CACT,CAEA,OAAOA,EAAYT,EAAgC,CACjD,KAAK,OAAS,KAAK,OAAO,IAAKY,GAAM,CACnC,GAAIA,EAAE,KAAOH,EAAI,CACf,IAAMI,EAAab,EAAQ,SAAWY,EAAE,SAAW,UAC7CE,EACJd,EAAQ,WAAa,OACjBA,EAAQ,SACRJ,EAAiBiB,CAA0B,EAEjD,MAAO,CAAE,GAAGD,EAAG,GAAGZ,EAAS,QAASa,EAAY,SAAUC,CAAY,CACxE,CACA,OAAOF,CACT,CAAC,EACD,KAAK,KAAK,CACZ,CAEA,QAAQH,EAAa,CACfA,EACF,KAAK,OAAS,KAAK,OAAO,OAAQG,GAAMA,EAAE,KAAOH,CAAE,EAEnD,KAAK,OAAS,CAAC,EAEjB,KAAK,KAAK,CACZ,CACF,EAEaM,EAAa,IAAIlB,EAKxBmB,EAAahB,GACb,OAAOA,GAAY,SACde,EAAW,IAAI,CAAE,MAAOf,EAAS,QAAS,SAAU,CAAC,EAEvDe,EAAW,IAAIf,CAAO,EAMzBiB,EAAiBhB,GACd,CACLiB,EACAlB,IAEOe,EAAW,IAAI,CACpB,GAAGf,EACH,MAAAkB,EACA,QAAAjB,CACF,CAAC,EAKLe,EAAU,QAAUC,EAAc,SAAS,EAC3CD,EAAU,MAAQC,EAAc,OAAO,EACvCD,EAAU,QAAUC,EAAc,SAAS,EAC3CD,EAAU,KAAOC,EAAc,MAAM,EACrCD,EAAU,QAAUC,EAAc,SAAS,EAG3CD,EAAU,QAAWP,GAAgBM,EAAW,QAAQN,CAAE,EAC1DO,EAAU,WAAa,IAAMD,EAAW,QAAQ,EAChDC,EAAU,SAAYG,GAAcJ,EAAW,SAASI,CAAC,EAKzDH,EAAU,QAAU,CAClBI,EACA,CAAE,QAAAC,EAAS,QAAAC,EAAS,MAAAC,CAAM,IACvB,CACH,IAAMd,EAAKM,EAAW,IAAI,CACxB,QAAS,UACT,MAAOM,EACP,SAAU,GACZ,CAAC,EAED,OAAAD,EACG,KAAMI,GAAS,CACd,IAAMC,EACJ,OAAOH,GAAY,WAAcA,EAAqBE,CAAI,EAAIF,EAChEP,EAAW,OAAON,EAAI,CACpB,QAAS,UACT,MAAOgB,EACP,SAAU7B,EAAiB,OAC7B,CAAC,CACH,CAAC,EACA,MAAO8B,GAAQ,CACd,IAAMC,EACJ,OAAOJ,GAAU,WAAcA,EAAmBG,CAAG,EAAIH,EAC3DR,EAAW,OAAON,EAAI,CACpB,QAAS,QACT,MAAOkB,EACP,SAAU/B,EAAiB,KAC7B,CAAC,CACH,CAAC,EAEIwB,CACT,EAKO,IAAMf,EAAQW,EFxMd,SAASY,GAAW,CACzB,GAAM,CAACC,EAAQC,CAAS,EAAIC,EAAkB,CAAC,CAAC,EAEhDC,EAAU,IAAM,CACd,IAAMC,EAAcC,EAAW,UAAWC,GAAc,CACtDL,EAAUK,CAAS,CACrB,CAAC,EAED,MAAO,IAAM,CACXF,EAAY,CACd,CACF,EAAG,CAAC,CAAC,EAGL,IAAMG,EAAUC,EAAaC,GAAgB,CAC3CJ,EAAW,QAAQI,CAAE,CACvB,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,OAAAT,EACA,QAAAO,CACF,CACF,CGzBA,OAAOG,GAAS,YAAAC,EAAU,aAAAC,MAAiB,QAC3C,OAAS,mBAAAC,EAAiB,UAAAC,MAAc,gBACxC,OAAS,WAAAC,MAAe,iBCDxB,OAAS,iBAAAC,EAAe,iBAAAC,MAAqB,iBAC7C,OAAS,iBAAAC,EAAe,SAAAC,EAAO,aAAAC,MAAiB,iBAMrB,cAAAC,MAAA,oBAJpB,IAAMC,EAAeC,GAA0B,CACpD,IAAMC,EAAQ,CAAE,KAAM,GAAI,YAAa,IAAK,EAE5C,OAAQD,EAAS,CACf,IAAK,UAAW,OAAOF,EAACL,EAAA,CAAgB,GAAGQ,EAAO,UAAU,oBAAoB,EAChF,IAAK,QAAW,OAAOH,EAACD,EAAA,CAAgB,GAAGI,EAAO,UAAU,kBAAkB,EAC9E,IAAK,UAAW,OAAOH,EAACF,EAAA,CAAU,GAAGK,EAAO,UAAU,oBAAoB,EAC1E,IAAK,OAAW,OAAOH,EAACH,EAAA,CAAiB,GAAGM,EAAO,UAAU,iBAAiB,EAC9E,IAAK,UAAW,OAAOH,EAACJ,EAAA,CAAe,GAAGO,EAAO,UAAU,iBAAiB,EAC5E,QAAgB,OAAO,IACzB,CACF,ECdO,IAAMC,EAA0B,CACrC,QAAS,CACP,QAAS,EACT,EAAG,IACH,MAAO,GACT,EAEA,QAAS,CACP,QAAS,EACT,EAAG,EACH,MAAO,EACP,WAAY,CACV,KAAM,SACN,UAAW,IACX,QAAS,GACT,KAAM,GACN,QAAS,CACP,SAAU,IACV,KAAM,SACR,CACF,CACF,EAEA,KAAM,CACJ,QAAS,EACT,EAAG,GACH,MAAO,IACP,WAAY,CACV,KAAM,SACN,UAAW,IACX,QAAS,GACT,KAAM,GACN,QAAS,CACP,SAAU,IACV,KAAM,QACR,CACF,CACF,CACF,EFgDQ,cAAAC,EAUQ,QAAAC,MAVR,oBAhFD,IAAMC,EAAY,CAAC,CACxB,MAAAC,EACA,UAAAC,CACF,IAGM,CACJ,GAAM,CAACC,EAAUC,CAAW,EAAIC,EAAS,EAAK,EAG9CC,EAAU,IAAM,CACd,IAAMC,EAAgBN,EAAM,SAC5B,GAAI,CAACM,GAAiBA,IAAkB,IAAU,OAElD,IAAMC,EAAQ,WAAW,IAAM,CAC7BN,EAAUD,EAAM,EAAE,CACpB,EAAGM,CAAa,EAEhB,MAAO,IAAM,aAAaC,CAAK,CACjC,EAAG,CAACP,EAAM,GAAIA,EAAM,SAAUA,EAAM,UAAWC,CAAS,CAAC,EAGzDI,EAAU,IAAM,CACd,IAAMG,EAAiB,WAAW,IAAML,EAAY,EAAI,EAAG,GAAG,EAC9D,MAAO,IAAM,aAAaK,CAAc,CAC1C,EAAG,CAACR,EAAM,GAAIA,EAAM,SAAS,CAAC,EAG9B,IAAMS,EAAa,IAAM,CACvB,IAAMC,EAAYV,EAAM,OAAO,QAAU,qBAEzC,GAAIA,EAAM,KACR,OAAIW,EAAM,eAAeX,EAAM,IAAI,EAC1BW,EAAM,aAAaX,EAAM,KAAiC,CAC/D,KAAM,GACN,MAAO,CAAE,MAAOU,EAAW,WAAY,CAAE,CAC3C,CAAC,EAEIV,EAAM,KAGf,IAAMY,EAAcC,EAAYb,EAAM,SAAW,SAAS,EAC1D,OAAIW,EAAM,eAAeC,CAAW,EAC3BD,EAAM,aAAaC,EAAwC,CAChE,KAAM,GACN,MAAO,CAAE,MAAOF,EAAW,WAAY,CAAE,CAC3C,CAAC,EAEIE,CACT,EAEME,EAAsC,CAC1C,GAAGd,EAAM,MACT,gBAAiBA,EAAM,OAAO,YAAc,iBAC5C,MAAOA,EAAM,OAAO,OAAS,wBAC7B,YAAeA,EAAM,OAAO,WACxB,cACA,oBACN,EAEMe,EAAY,CAAE,MAAOf,EAAM,OAAO,OAAS,SAAU,EAE3D,OACEF,EAACkB,EAAO,IAAP,CACC,OAAM,GACN,SAAUC,EACV,QAAQ,UACR,QAAQ,UACR,KAAK,OACL,UAAW,gCAAgCjB,EAAM,OAAO,GACxD,MAAOc,EACP,KAAK,IACL,gBAAiB,CAAE,KAAM,EAAG,MAAO,GAAI,EACvC,UAAW,CAACI,EAAGC,IAAS,EAClBA,EAAK,OAAO,EAAI,IAAMA,EAAK,SAAS,EAAI,MAC1ClB,EAAUD,EAAM,EAAE,CAEtB,EAEA,UAAAF,EAAC,OAAI,UAAU,mBACb,UAAAD,EAAC,OAAI,UAAU,uBAAwB,SAAAY,EAAW,EAAE,EAEpDX,EAAC,OAAI,UAAU,0BACb,UAAAA,EAAC,OAAI,UAAU,qBACb,UAAAD,EAAC,QAAK,UAAU,mBAAmB,MAAOkB,EACvC,SAAAf,EAAM,MACT,EAEAF,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,KAAM,EAC7D,UAAAE,EAAM,OAASA,EAAM,MAAQ,GAC5BF,EAAC,QAAK,UAAU,mBAAmB,cAAEE,EAAM,OAAM,EAGnDH,EAAC,UACC,UAAU,iBACV,QAAS,IAAMI,EAAUD,EAAM,EAAE,EAEjC,SAAAH,EAACuB,EAAA,CAAQ,KAAM,GAAI,EACrB,GACF,GACF,EAEAvB,EAACwB,EAAA,CACE,SAAAnB,GAAYF,EAAM,aACjBH,EAACmB,EAAO,IAAP,CAEC,QAAS,CAAE,OAAQ,EAAG,QAAS,CAAE,EACjC,QAAS,CAAE,OAAQ,OAAQ,QAAS,CAAE,EACtC,KAAM,CAAE,OAAQ,EAAG,QAAS,CAAE,EAC9B,WAAY,CACV,OAAQ,CAAE,SAAU,GAAK,KAAM,CAAC,GAAK,EAAG,GAAK,CAAC,CAAE,EAChD,QAAS,CAAE,SAAU,GAAK,MAAO,EAAI,CACvC,EACA,MAAO,CAAE,SAAU,QAAS,EAE5B,SAAAnB,EAAC,KAAE,UAAU,wBAAyB,SAAAG,EAAM,YAAY,GAVpD,MAWN,EAEJ,EAEAH,EAACwB,EAAA,CACE,SAAAnB,GAAYF,EAAM,SAAWA,EAAM,QAAQ,OAAS,GACnDH,EAACmB,EAAO,IAAP,CAEC,QAAS,CAAE,OAAQ,EAAG,QAAS,CAAE,EACjC,QAAS,CAAE,OAAQ,OAAQ,QAAS,CAAE,EACtC,KAAM,CAAE,OAAQ,EAAG,QAAS,CAAE,EAC9B,WAAY,CACV,OAAQ,CAAE,SAAU,EAAI,EACxB,QAAS,CAAE,SAAU,GAAK,MAAO,EAAI,CACvC,EAEA,SAAAnB,EAAC,OAAI,UAAU,oBACZ,SAAAG,EAAM,QAAQ,IAAI,CAACsB,EAAqBC,IACvC1B,EAAC,UAEC,UAAW,4BAA4ByB,EAAO,SAAW,WAAW,GACpE,QAAUE,GAAM,CACdF,EAAO,QAAQE,CAAC,GACZ,CAACxB,EAAM,UAAYA,EAAM,WAAa,MACxCC,EAAU,CACd,EAEC,SAAAqB,EAAO,OARHC,CASP,CACD,EACH,GAvBI,SAwBN,EAEJ,GACF,GACF,EAGC,CAACvB,EAAM,iBAAmBA,EAAM,WAAa,KAC5CH,EAAC,OAAI,UAAU,sBACb,SAAAA,EAAC,OAEC,UAAU,qBACV,MAAO,CACL,UAAW,wBAAwBG,EAAM,QAAQ,oBACnD,GAJK,GAAGA,EAAM,EAAE,IAAIA,EAAM,WAAa,CAAC,EAK1C,EACF,GAEJ,CAEJ,EJ1IU,cAAAyB,MAAA,oBA/BH,IAAMC,EAAkC,CAAC,CAC9C,SAAAC,EAAW,aACX,MAAAC,EAAQ,QACR,SAAUC,EACV,gBAAiBC,EAAqB,EACxC,IAAM,CACJ,GAAM,CAAE,OAAAC,EAAQ,QAAAC,CAAQ,EAAIC,EAAS,EAC/BC,EAAQP,EAAS,SAAS,KAAK,EAErC,OACEF,EAAC,OACC,UAAW,0BAA0BE,CAAQ,GAC7C,aAAYC,EACZ,MAAO,CACL,SAAU,QACV,QAAS,OACT,cAAeM,EAAQ,SAAW,iBAClC,WAAYP,EAAS,SAAS,QAAQ,EAClC,SACAA,EAAS,SAAS,MAAM,EACtB,aACA,WACN,cAAe,OACf,OAAQ,KACR,QAAS,OACT,MAAO,EACP,IAAK,MACP,EAEA,SAAAF,EAACU,EAAA,CAAgB,KAAK,YACnB,SAAAJ,EAAO,IAAKK,GACXX,EAACY,EAAA,CAEC,MAAO,CACL,GAAGD,EACH,SAAUA,EAAM,UAAYP,EAC5B,gBAAiBO,EAAM,iBAAmBN,CAC5C,EACA,UAAWE,GANNI,EAAM,EAOb,CACD,EACH,EACF,CAEJ,EOjDyB,SAARE,EAA6BC,EAAK,CAAE,SAAAC,CAAS,EAAI,CAAC,EAAG,CAC1D,GAAI,CAACD,GAAO,OAAO,SAAa,IAAa,OAE7C,IAAME,EAAO,SAAS,MAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC/DC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,WAETF,IAAa,OACXC,EAAK,WACPA,EAAK,aAAaC,EAAOD,EAAK,UAAU,EAK1CA,EAAK,YAAYC,CAAK,EAGpBA,EAAM,WACRA,EAAM,WAAW,QAAUH,EAE3BG,EAAM,YAAY,SAAS,eAAeH,CAAG,CAAC,CAElD,CCvB8BI,EAAY;AAAA,CAAwmJ","names":["AnimatePresence","useState","useEffect","useCallback","generateId","DEFAULT_TIMEOUTS","ToastStore","listener","newLimit","options","variant","duration","dedupeKey","existingIndex","toast","existingToast","updatedToast","index","id","generateId","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","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","toastVariants","jsx","jsxs","ToastItem","toast","onDismiss","showDesc","setShowDesc","useState","useEffect","toastDuration","timer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","motion","toastVariants","_","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","../src/core/animations.ts","#style-inject:#style-inject","../src/styles/toast.css"],"sourcesContent":["import React from \"react\";\r\nimport { AnimatePresence } 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-center\",\r\n theme = \"light\",\r\n duration: globalDuration,\r\n hideProgressBar: globalHideProgress = true,\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: \"10px\",\r\n }}\r\n >\r\n <AnimatePresence mode=\"popLayout\">\r\n {toasts.map((toast) => (\r\n <ToastItem\r\n key={toast.id}\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 variant = options.variant || \"default\";\r\n const duration =\r\n options.duration !== undefined\r\n ? options.duration\r\n : DEFAULT_TIMEOUTS[variant];\r\n\r\n const dedupeKey =\r\n options.groupKey ||\r\n `${variant}-${String(options.title)}-${String(options.description || \"\")}`;\r\n\r\n const existingIndex = this.toasts.findIndex(\r\n (toast) => toast.groupKey === dedupeKey,\r\n );\r\n\r\n // DEDUPE / GROUP\r\n if (options.dedupe !== false && existingIndex !== -1) {\r\n const existingToast = this.toasts[existingIndex];\r\n\r\n const updatedToast: Toast = {\r\n ...existingToast,\r\n count: (existingToast.count || 1) + 1,\r\n duration,\r\n updatedAt: Date.now(),\r\n };\r\n\r\n this.toasts = this.toasts.map((toast, index) =>\r\n index === existingIndex ? updatedToast : toast\r\n );\r\n\r\n this.emit();\r\n return existingToast.id;\r\n}\r\n\r\n const id = generateId();\r\n\r\n const newToast: Toast = {\r\n id,\r\n ...options,\r\n variant,\r\n duration,\r\n count: 1,\r\n groupKey: dedupeKey,\r\n };\r\n\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 =\r\n 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 (\r\n title: React.ReactNode,\r\n options?: Omit<ToastOptions, \"title\" | \"variant\">,\r\n ) => {\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 =\r\n 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 =\r\n 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;\r\n","\"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\nimport { toastVariants } from \"@/core/animations\";\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 [showDesc, setShowDesc] = useState(false);\r\n\r\n // ⏱ Auto dismiss\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);\r\n }, toastDuration);\r\n\r\n return () => clearTimeout(timer);\r\n }, [toast.id, toast.duration, toast.updatedAt, onDismiss]);\r\n\r\n // 📦 Description delay\r\n useEffect(() => {\r\n const expansionTimer = setTimeout(() => setShowDesc(true), 300);\r\n return () => clearTimeout(expansionTimer);\r\n }, [toast.id, toast.updatedAt]);\r\n\r\n // 🎯 Icon\r\n const renderIcon = () => {\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 variants={toastVariants}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n className={`vibe-toast-card vibe-variant-${toast.variant}`}\r\n style={containerStyle}\r\n drag=\"x\"\r\n dragConstraints={{ left: 0, right: 300 }}\r\n onDragEnd={(_, info) => {\r\n if (info.offset.x > 80 || info.velocity.x > 500) {\r\n onDismiss(toast.id);\r\n }\r\n }}\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\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\r\n {toast.count && toast.count > 1 && (\r\n <span className=\"vibe-toast-count\">X{toast.count}</span>\r\n )}\r\n\r\n <button\r\n className=\"vibe-close-btn\"\r\n onClick={() => onDismiss(toast.id)}\r\n >\r\n <MdClose size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n\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\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 {/* ✅ Premium Progress Bar */}\r\n {!toast.hideProgressBar && toast.duration !== Infinity && (\r\n <div className=\"vibe-progress-track\">\r\n <div\r\n key={`${toast.id}-${toast.updatedAt || 0}`}\r\n className=\"vibe-progress-fill\"\r\n style={{\r\n animation: `vibe-progress-shrink ${toast.duration}ms linear forwards`,\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 { TbAlertCircle, TbBan, TbCircleX } 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};","import { Variants } from \"framer-motion\";\r\n\r\nexport const toastVariants: Variants = {\r\n initial: {\r\n opacity: 0,\r\n y: -20,\r\n scale: 0.95,\r\n },\r\n\r\n animate: {\r\n opacity: 1,\r\n y: 0,\r\n scale: 1,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 400,\r\n damping: 32,\r\n mass: 0.8,\r\n opacity: {\r\n duration: 0.15,\r\n ease: \"easeOut\",\r\n },\r\n },\r\n },\r\n\r\n exit: {\r\n opacity: 0,\r\n y: -8,\r\n scale: 0.96,\r\n transition: {\r\n type: \"spring\",\r\n stiffness: 500,\r\n damping: 35,\r\n mass: 0.6,\r\n opacity: {\r\n duration: 0.12,\r\n ease: \"easeIn\",\r\n },\r\n },\r\n },\r\n} as const;","\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:100%;max-width:300px;min-width:180px;background:color-mix(in srgb,var(--vibe-bg) 92%,transparent);backdrop-filter:blur(14px);color:var(--vibe-text-main);border-radius:8px;box-shadow:0 1px 2px #00000003,0 2px 6px #00000005,0 4px 10px #00000005;display:flex;flex-direction:column;overflow:hidden;touch-action:none;user-select:none;cursor:grab;will-change:transform,opacity}.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 2px 8px rgba(0,0,0,.08))}.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{width:100%;height:3px;background:var(--vibe-progress-bg);overflow:hidden;border-radius:999px}.vibe-progress-fill{width:100%;height:100%;background:linear-gradient(90deg,color-mix(in srgb,var(--vibe-accent) 75%,white 12%),var(--vibe-accent) 45%,color-mix(in srgb,var(--vibe-accent) 85%,black 8%));transform-origin:left;border-radius:inherit;box-shadow:0 0 8px color-mix(in srgb,var(--vibe-accent) 28%,transparent)}.vibe-progress-fill:after{content:\\\"\\\";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:vibe-progress-shine 1.6s linear infinite}@keyframes vibe-progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.vibe-variant-success{--vibe-accent: #34d399}.vibe-variant-error{--vibe-accent: #fb7185}.vibe-variant-warning{--vibe-accent: #facc15}.vibe-variant-info{--vibe-accent: #818cf8}.vibe-icon-spin{animation:vibe-spin .8s linear infinite}@keyframes vibe-spin{to{transform:rotate(360deg)}}.vibe-action-stack{display:flex;gap:8px;margin-top:10px}.vibe-action-btn{flex:1;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;letter-spacing:-.01em;border-radius:8px;cursor:pointer;border:1px solid var(--vibe-border);background:color-mix(in srgb,var(--vibe-bg) 92%,white 4%);color:var(--vibe-text-main);display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:transform .22s cubic-bezier(.22,1,.36,1),background .22s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease;box-shadow:0 1px 2px #0000000a,0 4px 10px #0000000d;will-change:transform}.vibe-action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000000d,0 8px 18px #00000014}.vibe-btn-primary{background:linear-gradient(180deg,color-mix(in srgb,var(--vibe-accent) 88%,white 8%),var(--vibe-accent));border-color:color-mix(in srgb,var(--vibe-accent) 80%,black 8%);color:#fff;box-shadow:0 1px 2px #0000000f,0 6px 14px color-mix(in srgb,var(--vibe-accent) 18%,transparent)}.vibe-btn-primary:hover{transform:translateY(-1px);filter:brightness(1.04)}.vibe-btn-ghost{background:transparent;border-color:#000;color:var(--vibe-text-muted)}.vibe-btn-ghost:hover{background:var(--vibe-progress-bg);color:var(--vibe-text-main)}@media(max-width:640px){.vibe-toast-card{width:calc(100vw - 16px);max-width:260px;border-radius:8px}.vibe-toast-inner{padding:12px;gap:10px}.vibe-toast-title{font-size:13px}.vibe-description-text{font-size:12px}}.vibe-toast-count{min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:600;line-height:1;background:color-mix(in srgb,var(--vibe-accent) 12%,transparent);color:var(--vibe-text-main);border:1px solid color-mix(in srgb,var(--vibe-accent) 22%,transparent);display:inline-flex;align-items:center;justify-content:center;margin-right:6px}\\n\")"],"mappings":"AACA,OAAS,mBAAAA,MAAuB,gBCDhC,OAAS,YAAAC,EAAU,aAAAC,EAAW,eAAAC,MAAmB,QCA1C,IAAMC,EAAa,IACjB,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,CAAC,EAAI,KAAK,IAAI,EAAE,SAAS,EAAE,ECUrE,IAAMC,EAAiD,CAC5D,QAAS,IACT,QAAS,IACT,MAAO,IACP,QAAS,IACT,QAAS,IACT,KAAM,GACR,EAQMC,EAAN,KAAiB,CACP,OAAkB,CAAC,EACnB,UAA2B,IAAI,IAC/B,SAA0B,CAAE,MAAO,CAAE,EAE7C,UAAUC,EAAoB,CAC5B,YAAK,UAAU,IAAIA,CAAQ,EACpB,IAAM,KAAK,UAAU,OAAOA,CAAQ,CAC7C,CAEQ,MAAO,CACb,KAAK,UAAU,QAASA,GAAaA,EAAS,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CACjE,CAEA,SAASC,EAAkB,CACzB,KAAK,SAAS,MAAQA,EAClB,KAAK,OAAO,OAASA,IACvB,KAAK,OAAS,KAAK,OAAO,MAAM,EAAGA,CAAQ,EAC3C,KAAK,KAAK,EAEd,CAEA,IAAIC,EAA+B,CACjC,IAAMC,EAAUD,EAAQ,SAAW,UAC7BE,EACJF,EAAQ,WAAa,OACjBA,EAAQ,SACRJ,EAAiBK,CAAO,EAExBE,EACJH,EAAQ,UACR,GAAGC,CAAO,IAAI,OAAOD,EAAQ,KAAK,CAAC,IAAI,OAAOA,EAAQ,aAAe,EAAE,CAAC,GAEpEI,EAAgB,KAAK,OAAO,UAC/BC,GAAUA,EAAM,WAAaF,CAChC,EAGA,GAAIH,EAAQ,SAAW,IAASI,IAAkB,GAAI,CACxD,IAAME,EAAgB,KAAK,OAAOF,CAAa,EAEzCG,EAAsB,CAC1B,GAAGD,EACH,OAAQA,EAAc,OAAS,GAAK,EACpC,SAAAJ,EACA,UAAW,KAAK,IAAI,CACtB,EAEA,YAAK,OAAS,KAAK,OAAO,IAAI,CAACG,EAAOG,IACpCA,IAAUJ,EAAgBG,EAAeF,CAC3C,EAEA,KAAK,KAAK,EACHC,EAAc,EACvB,CAEI,IAAMG,EAAKC,EAAW,EAEhBC,EAAkB,CACtB,GAAAF,EACA,GAAGT,EACH,QAAAC,EACA,SAAAC,EACA,MAAO,EACP,SAAUC,CACZ,EAEA,YAAK,OAAS,CAACQ,EAAU,GAAG,KAAK,MAAM,EAAE,MAAM,EAAG,KAAK,SAAS,KAAK,EAErE,KAAK,KAAK,EACHF,CACT,CAEA,OAAOA,EAAYT,EAAgC,CACjD,KAAK,OAAS,KAAK,OAAO,IAAKY,GAAM,CACnC,GAAIA,EAAE,KAAOH,EAAI,CACf,IAAMI,EAAab,EAAQ,SAAWY,EAAE,SAAW,UAC7CE,EACJd,EAAQ,WAAa,OACjBA,EAAQ,SACRJ,EAAiBiB,CAA0B,EAEjD,MAAO,CAAE,GAAGD,EAAG,GAAGZ,EAAS,QAASa,EAAY,SAAUC,CAAY,CACxE,CACA,OAAOF,CACT,CAAC,EACD,KAAK,KAAK,CACZ,CAEA,QAAQH,EAAa,CACfA,EACF,KAAK,OAAS,KAAK,OAAO,OAAQG,GAAMA,EAAE,KAAOH,CAAE,EAEnD,KAAK,OAAS,CAAC,EAEjB,KAAK,KAAK,CACZ,CACF,EAEaM,EAAa,IAAIlB,EAKxBmB,EAAahB,GACb,OAAOA,GAAY,SACde,EAAW,IAAI,CAAE,MAAOf,EAAS,QAAS,SAAU,CAAC,EAEvDe,EAAW,IAAIf,CAAO,EAMzBiB,EAAiBhB,GACd,CACLiB,EACAlB,IAEOe,EAAW,IAAI,CACpB,GAAGf,EACH,MAAAkB,EACA,QAAAjB,CACF,CAAC,EAKLe,EAAU,QAAUC,EAAc,SAAS,EAC3CD,EAAU,MAAQC,EAAc,OAAO,EACvCD,EAAU,QAAUC,EAAc,SAAS,EAC3CD,EAAU,KAAOC,EAAc,MAAM,EACrCD,EAAU,QAAUC,EAAc,SAAS,EAG3CD,EAAU,QAAWP,GAAgBM,EAAW,QAAQN,CAAE,EAC1DO,EAAU,WAAa,IAAMD,EAAW,QAAQ,EAChDC,EAAU,SAAYG,GAAcJ,EAAW,SAASI,CAAC,EAKzDH,EAAU,QAAU,CAClBI,EACA,CAAE,QAAAC,EAAS,QAAAC,EAAS,MAAAC,CAAM,IACvB,CACH,IAAMd,EAAKM,EAAW,IAAI,CACxB,QAAS,UACT,MAAOM,EACP,SAAU,GACZ,CAAC,EAED,OAAAD,EACG,KAAMI,GAAS,CACd,IAAMC,EACJ,OAAOH,GAAY,WAAcA,EAAqBE,CAAI,EAAIF,EAChEP,EAAW,OAAON,EAAI,CACpB,QAAS,UACT,MAAOgB,EACP,SAAU7B,EAAiB,OAC7B,CAAC,CACH,CAAC,EACA,MAAO8B,GAAQ,CACd,IAAMC,EACJ,OAAOJ,GAAU,WAAcA,EAAmBG,CAAG,EAAIH,EAC3DR,EAAW,OAAON,EAAI,CACpB,QAAS,QACT,MAAOkB,EACP,SAAU/B,EAAiB,KAC7B,CAAC,CACH,CAAC,EAEIwB,CACT,EAKO,IAAMf,EAAQW,EFxMd,SAASY,GAAW,CACzB,GAAM,CAACC,EAAQC,CAAS,EAAIC,EAAkB,CAAC,CAAC,EAEhDC,EAAU,IAAM,CACd,IAAMC,EAAcC,EAAW,UAAWC,GAAc,CACtDL,EAAUK,CAAS,CACrB,CAAC,EAED,MAAO,IAAM,CACXF,EAAY,CACd,CACF,EAAG,CAAC,CAAC,EAGL,IAAMG,EAAUC,EAAaC,GAAgB,CAC3CJ,EAAW,QAAQI,CAAE,CACvB,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,OAAAT,EACA,QAAAO,CACF,CACF,CGzBA,OAAOG,GAAS,YAAAC,EAAU,aAAAC,MAAiB,QAC3C,OAAS,mBAAAC,EAAiB,UAAAC,MAAc,gBACxC,OAAS,WAAAC,MAAe,iBCDxB,OAAS,iBAAAC,EAAe,iBAAAC,MAAqB,iBAC7C,OAAS,iBAAAC,EAAe,SAAAC,EAAO,aAAAC,MAAiB,iBAMrB,cAAAC,MAAA,oBAJpB,IAAMC,EAAeC,GAA0B,CACpD,IAAMC,EAAQ,CAAE,KAAM,GAAI,YAAa,IAAK,EAE5C,OAAQD,EAAS,CACf,IAAK,UAAW,OAAOF,EAACL,EAAA,CAAgB,GAAGQ,EAAO,UAAU,oBAAoB,EAChF,IAAK,QAAW,OAAOH,EAACD,EAAA,CAAgB,GAAGI,EAAO,UAAU,kBAAkB,EAC9E,IAAK,UAAW,OAAOH,EAACF,EAAA,CAAU,GAAGK,EAAO,UAAU,oBAAoB,EAC1E,IAAK,OAAW,OAAOH,EAACH,EAAA,CAAiB,GAAGM,EAAO,UAAU,iBAAiB,EAC9E,IAAK,UAAW,OAAOH,EAACJ,EAAA,CAAe,GAAGO,EAAO,UAAU,iBAAiB,EAC5E,QAAgB,OAAO,IACzB,CACF,ECdO,IAAMC,EAA0B,CACrC,QAAS,CACP,QAAS,EACT,EAAG,IACH,MAAO,GACT,EAEA,QAAS,CACP,QAAS,EACT,EAAG,EACH,MAAO,EACP,WAAY,CACV,KAAM,SACN,UAAW,IACX,QAAS,GACT,KAAM,GACN,QAAS,CACP,SAAU,IACV,KAAM,SACR,CACF,CACF,EAEA,KAAM,CACJ,QAAS,EACT,EAAG,GACH,MAAO,IACP,WAAY,CACV,KAAM,SACN,UAAW,IACX,QAAS,GACT,KAAM,GACN,QAAS,CACP,SAAU,IACV,KAAM,QACR,CACF,CACF,CACF,EFgDQ,cAAAC,EAUQ,QAAAC,MAVR,oBAhFD,IAAMC,EAAY,CAAC,CACxB,MAAAC,EACA,UAAAC,CACF,IAGM,CACJ,GAAM,CAACC,EAAUC,CAAW,EAAIC,EAAS,EAAK,EAG9CC,EAAU,IAAM,CACd,IAAMC,EAAgBN,EAAM,SAC5B,GAAI,CAACM,GAAiBA,IAAkB,IAAU,OAElD,IAAMC,EAAQ,WAAW,IAAM,CAC7BN,EAAUD,EAAM,EAAE,CACpB,EAAGM,CAAa,EAEhB,MAAO,IAAM,aAAaC,CAAK,CACjC,EAAG,CAACP,EAAM,GAAIA,EAAM,SAAUA,EAAM,UAAWC,CAAS,CAAC,EAGzDI,EAAU,IAAM,CACd,IAAMG,EAAiB,WAAW,IAAML,EAAY,EAAI,EAAG,GAAG,EAC9D,MAAO,IAAM,aAAaK,CAAc,CAC1C,EAAG,CAACR,EAAM,GAAIA,EAAM,SAAS,CAAC,EAG9B,IAAMS,EAAa,IAAM,CACvB,IAAMC,EAAYV,EAAM,OAAO,QAAU,qBAEzC,GAAIA,EAAM,KACR,OAAIW,EAAM,eAAeX,EAAM,IAAI,EAC1BW,EAAM,aAAaX,EAAM,KAAiC,CAC/D,KAAM,GACN,MAAO,CAAE,MAAOU,EAAW,WAAY,CAAE,CAC3C,CAAC,EAEIV,EAAM,KAGf,IAAMY,EAAcC,EAAYb,EAAM,SAAW,SAAS,EAC1D,OAAIW,EAAM,eAAeC,CAAW,EAC3BD,EAAM,aAAaC,EAAwC,CAChE,KAAM,GACN,MAAO,CAAE,MAAOF,EAAW,WAAY,CAAE,CAC3C,CAAC,EAEIE,CACT,EAEME,EAAsC,CAC1C,GAAGd,EAAM,MACT,gBAAiBA,EAAM,OAAO,YAAc,iBAC5C,MAAOA,EAAM,OAAO,OAAS,wBAC7B,YAAeA,EAAM,OAAO,WACxB,cACA,oBACN,EAEMe,EAAY,CAAE,MAAOf,EAAM,OAAO,OAAS,SAAU,EAE3D,OACEF,EAACkB,EAAO,IAAP,CACC,OAAM,GACN,SAAUC,EACV,QAAQ,UACR,QAAQ,UACR,KAAK,OACL,UAAW,gCAAgCjB,EAAM,OAAO,GACxD,MAAOc,EACP,KAAK,IACL,gBAAiB,CAAE,KAAM,EAAG,MAAO,GAAI,EACvC,UAAW,CAACI,EAAGC,IAAS,EAClBA,EAAK,OAAO,EAAI,IAAMA,EAAK,SAAS,EAAI,MAC1ClB,EAAUD,EAAM,EAAE,CAEtB,EAEA,UAAAF,EAAC,OAAI,UAAU,mBACb,UAAAD,EAAC,OAAI,UAAU,uBAAwB,SAAAY,EAAW,EAAE,EAEpDX,EAAC,OAAI,UAAU,0BACb,UAAAA,EAAC,OAAI,UAAU,qBACb,UAAAD,EAAC,QAAK,UAAU,mBAAmB,MAAOkB,EACvC,SAAAf,EAAM,MACT,EAEAF,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,KAAM,EAC7D,UAAAE,EAAM,OAASA,EAAM,MAAQ,GAC5BF,EAAC,QAAK,UAAU,mBAAmB,cAAEE,EAAM,OAAM,EAGnDH,EAAC,UACC,UAAU,iBACV,QAAS,IAAMI,EAAUD,EAAM,EAAE,EAEjC,SAAAH,EAACuB,EAAA,CAAQ,KAAM,GAAI,EACrB,GACF,GACF,EAEAvB,EAACwB,EAAA,CACE,SAAAnB,GAAYF,EAAM,aACjBH,EAACmB,EAAO,IAAP,CAEC,QAAS,CAAE,OAAQ,EAAG,QAAS,CAAE,EACjC,QAAS,CAAE,OAAQ,OAAQ,QAAS,CAAE,EACtC,KAAM,CAAE,OAAQ,EAAG,QAAS,CAAE,EAC9B,WAAY,CACV,OAAQ,CAAE,SAAU,GAAK,KAAM,CAAC,GAAK,EAAG,GAAK,CAAC,CAAE,EAChD,QAAS,CAAE,SAAU,GAAK,MAAO,EAAI,CACvC,EACA,MAAO,CAAE,SAAU,QAAS,EAE5B,SAAAnB,EAAC,KAAE,UAAU,wBAAyB,SAAAG,EAAM,YAAY,GAVpD,MAWN,EAEJ,EAEAH,EAACwB,EAAA,CACE,SAAAnB,GAAYF,EAAM,SAAWA,EAAM,QAAQ,OAAS,GACnDH,EAACmB,EAAO,IAAP,CAEC,QAAS,CAAE,OAAQ,EAAG,QAAS,CAAE,EACjC,QAAS,CAAE,OAAQ,OAAQ,QAAS,CAAE,EACtC,KAAM,CAAE,OAAQ,EAAG,QAAS,CAAE,EAC9B,WAAY,CACV,OAAQ,CAAE,SAAU,EAAI,EACxB,QAAS,CAAE,SAAU,GAAK,MAAO,EAAI,CACvC,EAEA,SAAAnB,EAAC,OAAI,UAAU,oBACZ,SAAAG,EAAM,QAAQ,IAAI,CAACsB,EAAqBC,IACvC1B,EAAC,UAEC,UAAW,4BAA4ByB,EAAO,SAAW,WAAW,GACpE,QAAUE,GAAM,CACdF,EAAO,QAAQE,CAAC,GACZ,CAACxB,EAAM,UAAYA,EAAM,WAAa,MACxCC,EAAU,CACd,EAEC,SAAAqB,EAAO,OARHC,CASP,CACD,EACH,GAvBI,SAwBN,EAEJ,GACF,GACF,EAGC,CAACvB,EAAM,iBAAmBA,EAAM,WAAa,KAC5CH,EAAC,OAAI,UAAU,sBACb,SAAAA,EAAC,OAEC,UAAU,qBACV,MAAO,CACL,UAAW,wBAAwBG,EAAM,QAAQ,oBACnD,GAJK,GAAGA,EAAM,EAAE,IAAIA,EAAM,WAAa,CAAC,EAK1C,EACF,GAEJ,CAEJ,EJ1IU,cAAAyB,MAAA,oBA/BH,IAAMC,EAAkC,CAAC,CAC9C,SAAAC,EAAW,aACX,MAAAC,EAAQ,QACR,SAAUC,EACV,gBAAiBC,EAAqB,EACxC,IAAM,CACJ,GAAM,CAAE,OAAAC,EAAQ,QAAAC,CAAQ,EAAIC,EAAS,EAC/BC,EAAQP,EAAS,SAAS,KAAK,EAErC,OACEF,EAAC,OACC,UAAW,0BAA0BE,CAAQ,GAC7C,aAAYC,EACZ,MAAO,CACL,SAAU,QACV,QAAS,OACT,cAAeM,EAAQ,SAAW,iBAClC,WAAYP,EAAS,SAAS,QAAQ,EAClC,SACAA,EAAS,SAAS,MAAM,EACtB,aACA,WACN,cAAe,OACf,OAAQ,KACR,QAAS,OACT,MAAO,EACP,IAAK,MACP,EAEA,SAAAF,EAACU,EAAA,CAAgB,KAAK,YACnB,SAAAJ,EAAO,IAAKK,GACXX,EAACY,EAAA,CAEC,MAAO,CACL,GAAGD,EACH,SAAUA,EAAM,UAAYP,EAC5B,gBAAiBO,EAAM,iBAAmBN,CAC5C,EACA,UAAWE,GANNI,EAAM,EAOb,CACD,EACH,EACF,CAEJ,EOjDyB,SAARE,EAA6BC,EAAK,CAAE,SAAAC,CAAS,EAAI,CAAC,EAAG,CAC1D,GAAI,CAACD,GAAO,OAAO,SAAa,IAAa,OAE7C,IAAME,EAAO,SAAS,MAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC/DC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,WAETF,IAAa,OACXC,EAAK,WACPA,EAAK,aAAaC,EAAOD,EAAK,UAAU,EAK1CA,EAAK,YAAYC,CAAK,EAGpBA,EAAM,WACRA,EAAM,WAAW,QAAUH,EAE3BG,EAAM,YAAY,SAAS,eAAeH,CAAG,CAAC,CAElD,CCvB8BI,EAAY;AAAA,CAAiiJ","names":["AnimatePresence","useState","useEffect","useCallback","generateId","DEFAULT_TIMEOUTS","ToastStore","listener","newLimit","options","variant","duration","dedupeKey","existingIndex","toast","existingToast","updatedToast","index","id","generateId","newToast","t","newVariant","newDuration","toastStore","baseToast","createHandler","title","n","promise","loading","success","error","data","successTitle","err","errorTitle","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","toastVariants","jsx","jsxs","ToastItem","toast","onDismiss","showDesc","setShowDesc","useState","useEffect","toastDuration","timer","expansionTimer","renderIcon","iconColor","React","iconElement","resolveIcon","containerStyle","textStyle","motion","toastVariants","_","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.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Animation-first, minimal toast library for React.",
5
5
  "author": "Suraj Savle",
6
6
  "license": "MIT",