diff --git a/web/bun.lock b/web/bun.lock index b5cf77f..d2b1c23 100644 --- a/web/bun.lock +++ b/web/bun.lock @@ -21,7 +21,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.41.3", - "react-hot-toast": "^2.4.0", + "react-hot-toast": "^2.5.2", "react-markdown": "^8.0.1", "remark-gfm": "^3.0.1", "tinycolor2": "^1.6.0", @@ -46,6 +46,9 @@ }, }, }, + "patchedDependencies": { + "react-hot-toast@2.5.2": "patches/react-hot-toast@2.5.2.patch", + }, "packages": { "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], diff --git a/web/package.json b/web/package.json index 6465ed1..6b5798d 100644 --- a/web/package.json +++ b/web/package.json @@ -21,7 +21,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.41.3", - "react-hot-toast": "^2.4.0", + "react-hot-toast": "^2.5.2", "react-markdown": "^8.0.1", "remark-gfm": "^3.0.1", "tinycolor2": "^1.6.0", @@ -50,9 +50,7 @@ "prop-types": "^15.8.1", "rimraf": "^3.0.2" }, - "pnpm": { - "patchedDependencies": { - "react-hot-toast@2.4.0": "patches/react-hot-toast@2.4.0.patch" - } + "patchedDependencies": { + "react-hot-toast@2.5.2": "patches/react-hot-toast@2.5.2.patch" } } diff --git a/web/patches/react-hot-toast@2.4.0.patch b/web/patches/react-hot-toast@2.4.0.patch deleted file mode 100644 index 2c7310a..0000000 --- a/web/patches/react-hot-toast@2.4.0.patch +++ /dev/null @@ -1,228 +0,0 @@ -diff --git a/dist/index.d.ts b/dist/index.d.ts -index 4b208397b30693e124aa0d8802be41104bb4ae23..8c9d448c9e10173616d58ac3ab443ea726bb2806 100644 ---- a/dist/index.d.ts -+++ b/dist/index.d.ts -@@ -3,7 +3,7 @@ import { CSSProperties } from 'react'; - import * as goober from 'goober'; - - declare type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom'; --declare type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'; -+declare type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | 'center-right' | 'center-left'; - declare type Renderable = JSX.Element | string | null; - interface IconTheme { - primary: string; -diff --git a/dist/index.js b/dist/index.js -index 3cf68f6f3f944047d29538341561ed58d6484823..34dd98b4d79a6dace516caa4435d214d1c920804 100644 ---- a/dist/index.js -+++ b/dist/index.js -@@ -1,4 +1,4 @@ --"use strict";var Y=Object.create;var E=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var ee=(e,t)=>{for(var o in t)E(e,o,{get:t[o],enumerable:!0})},j=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of G(t))!Z.call(e,r)&&r!==o&&E(e,r,{get:()=>t[r],enumerable:!(s=q(t,r))||s.enumerable});return e};var W=(e,t,o)=>(o=e!=null?Y(K(e)):{},j(t||!e||!e.__esModule?E(o,"default",{value:e,enumerable:!0}):o,e)),te=e=>j(E({},"__esModule",{value:!0}),e);var Ve={};ee(Ve,{CheckmarkIcon:()=>F,ErrorIcon:()=>w,LoaderIcon:()=>M,ToastBar:()=>$,ToastIcon:()=>U,Toaster:()=>J,default:()=>_e,resolveValue:()=>u,toast:()=>n,useToaster:()=>V,useToasterStore:()=>_});module.exports=te(Ve);var oe=e=>typeof e=="function",u=(e,t)=>oe(e)?e(t):e;var Q=(()=>{let e=0;return()=>(++e).toString()})(),R=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();var k=require("react"),re=20;var v=new Map,se=1e3,X=e=>{if(v.has(e))return;let t=setTimeout(()=>{v.delete(e),l({type:4,toastId:e})},se);v.set(e,t)},ae=e=>{let t=v.get(e);t&&clearTimeout(t)},H=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,re)};case 1:return t.toast.id&&ae(t.toast.id),{...e,toasts:e.toasts.map(a=>a.id===t.toast.id?{...a,...t.toast}:a)};case 2:let{toast:o}=t;return e.toasts.find(a=>a.id===o.id)?H(e,{type:1,toast:o}):H(e,{type:0,toast:o});case 3:let{toastId:s}=t;return s?X(s):e.toasts.forEach(a=>{X(a.id)}),{...e,toasts:e.toasts.map(a=>a.id===s||s===void 0?{...a,visible:!1}:a)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(a=>a.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let r=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(a=>({...a,pauseDuration:a.pauseDuration+r}))}}},I=[],D={toasts:[],pausedAt:void 0},l=e=>{D=H(D,e),I.forEach(t=>{t(D)})},ie={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},_=(e={})=>{let[t,o]=(0,k.useState)(D);(0,k.useEffect)(()=>(I.push(o),()=>{let r=I.indexOf(o);r>-1&&I.splice(r,1)}),[t]);let s=t.toasts.map(r=>{var a,c;return{...e,...e[r.type],...r,duration:r.duration||((a=e[r.type])==null?void 0:a.duration)||(e==null?void 0:e.duration)||ie[r.type],style:{...e.style,...(c=e[r.type])==null?void 0:c.style,...r.style}}});return{...t,toasts:s}};var ce=(e,t="blank",o)=>({createdAt:Date.now(),visible:!0,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...o,id:(o==null?void 0:o.id)||Q()}),S=e=>(t,o)=>{let s=ce(t,e,o);return l({type:2,toast:s}),s.id},n=(e,t)=>S("blank")(e,t);n.error=S("error");n.success=S("success");n.loading=S("loading");n.custom=S("custom");n.dismiss=e=>{l({type:3,toastId:e})};n.remove=e=>l({type:4,toastId:e});n.promise=(e,t,o)=>{let s=n.loading(t.loading,{...o,...o==null?void 0:o.loading});return e.then(r=>(n.success(u(t.success,r),{id:s,...o,...o==null?void 0:o.success}),r)).catch(r=>{n.error(u(t.error,r),{id:s,...o,...o==null?void 0:o.error})}),e};var A=require("react");var pe=(e,t)=>{l({type:1,toast:{id:e,height:t}})},de=()=>{l({type:5,time:Date.now()})},V=e=>{let{toasts:t,pausedAt:o}=_(e);(0,A.useEffect)(()=>{if(o)return;let a=Date.now(),c=t.map(i=>{if(i.duration===1/0)return;let d=(i.duration||0)+i.pauseDuration-(a-i.createdAt);if(d<0){i.visible&&n.dismiss(i.id);return}return setTimeout(()=>n.dismiss(i.id),d)});return()=>{c.forEach(i=>i&&clearTimeout(i))}},[t,o]);let s=(0,A.useCallback)(()=>{o&&l({type:6,time:Date.now()})},[o]),r=(0,A.useCallback)((a,c)=>{let{reverseOrder:i=!1,gutter:d=8,defaultPosition:p}=c||{},g=t.filter(m=>(m.position||p)===(a.position||p)&&m.height),z=g.findIndex(m=>m.id===a.id),O=g.filter((m,B)=>Bm.visible).slice(...i?[O+1]:[0,O]).reduce((m,B)=>m+(B.height||0)+d,0)},[t]);return{toasts:t,handlers:{updateHeight:pe,startPause:de,endPause:s,calculateOffset:r}}};var T=W(require("react")),b=require("goober");var y=W(require("react")),x=require("goober");var h=require("goober"),me=h.keyframes` -+"use strict";var Y=Object.create;var E=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var ee=(e,t)=>{for(var o in t)E(e,o,{get:t[o],enumerable:!0})},j=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of G(t))!Z.call(e,r)&&r!==o&&E(e,r,{get:()=>t[r],enumerable:!(s=q(t,r))||s.enumerable});return e};var W=(e,t,o)=>(o=e!=null?Y(K(e)):{},j(t||!e||!e.__esModule?E(o,"default",{value:e,enumerable:!0}):o,e)),te=e=>j(E({},"__esModule",{value:!0}),e);var Ve={};ee(Ve,{CheckmarkIcon:()=>F,ErrorIcon:()=>w,LoaderIcon:()=>M,ToastBar:()=>$,ToastIcon:()=>U,Toaster:()=>J,default:()=>_e,resolveValue:()=>m,toast:()=>i,useToaster:()=>V,useToasterStore:()=>_});module.exports=te(Ve);var oe=e=>typeof e=="function",m=(e,t)=>oe(e)?e(t):e;var Q=(()=>{let e=0;return()=>(++e).toString()})(),R=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();var k=require("react"),re=20;var v=new Map,se=1e3,X=e=>{if(v.has(e))return;let t=setTimeout(()=>{v.delete(e),l({type:4,toastId:e})},se);v.set(e,t)},ae=e=>{let t=v.get(e);t&&clearTimeout(t)},H=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,re)};case 1:return t.toast.id&&ae(t.toast.id),{...e,toasts:e.toasts.map(a=>a.id===t.toast.id?{...a,...t.toast}:a)};case 2:let{toast:o}=t;return e.toasts.find(a=>a.id===o.id)?H(e,{type:1,toast:o}):H(e,{type:0,toast:o});case 3:let{toastId:s}=t;return s?X(s):e.toasts.forEach(a=>{X(a.id)}),{...e,toasts:e.toasts.map(a=>a.id===s||s===void 0?{...a,visible:!1}:a)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(a=>a.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let r=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(a=>({...a,pauseDuration:a.pauseDuration+r}))}}},I=[],D={toasts:[],pausedAt:void 0},l=e=>{D=H(D,e),I.forEach(t=>{t(D)})},ne={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},_=(e={})=>{let[t,o]=(0,k.useState)(D);(0,k.useEffect)(()=>(I.push(o),()=>{let r=I.indexOf(o);r>-1&&I.splice(r,1)}),[t]);let s=t.toasts.map(r=>{var a,c;return{...e,...e[r.type],...r,duration:r.duration||((a=e[r.type])==null?void 0:a.duration)||(e==null?void 0:e.duration)||ne[r.type],style:{...e.style,...(c=e[r.type])==null?void 0:c.style,...r.style}}});return{...t,toasts:s}};var ce=(e,t="blank",o)=>({createdAt:Date.now(),visible:!0,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...o,id:(o==null?void 0:o.id)||Q()}),S=e=>(t,o)=>{let s=ce(t,e,o);return l({type:2,toast:s}),s.id},i=(e,t)=>S("blank")(e,t);i.error=S("error");i.success=S("success");i.loading=S("loading");i.custom=S("custom");i.dismiss=e=>{l({type:3,toastId:e})};i.remove=e=>l({type:4,toastId:e});i.promise=(e,t,o)=>{let s=i.loading(t.loading,{...o,...o==null?void 0:o.loading});return e.then(r=>(i.success(m(t.success,r),{id:s,...o,...o==null?void 0:o.success}),r)).catch(r=>{i.error(m(t.error,r),{id:s,...o,...o==null?void 0:o.error})}),e};var A=require("react");var pe=(e,t)=>{l({type:1,toast:{id:e,height:t}})},de=()=>{l({type:5,time:Date.now()})},V=e=>{let{toasts:t,pausedAt:o}=_(e);(0,A.useEffect)(()=>{if(o)return;let a=Date.now(),c=t.map(n=>{if(n.duration===1/0)return;let d=(n.duration||0)+n.pauseDuration-(a-n.createdAt);if(d<0){n.visible&&i.dismiss(n.id);return}return setTimeout(()=>i.dismiss(n.id),d)});return()=>{c.forEach(n=>n&&clearTimeout(n))}},[t,o]);let s=(0,A.useCallback)(()=>{o&&l({type:6,time:Date.now()})},[o]),r=(0,A.useCallback)((a,c)=>{let{reverseOrder:n=!1,gutter:d=8,defaultPosition:p}=c||{},g=t.filter(u=>(u.position||p)===(a.position||p)&&u.height),z=g.findIndex(u=>u.id===a.id),O=g.filter((u,B)=>Bu.visible).slice(...n?[O+1]:[0,O]).reduce((u,B)=>u+(B.height||0)+d,0)},[t]);return{toasts:t,handlers:{updateHeight:pe,startPause:de,endPause:s,calculateOffset:r}}};var f=W(require("react")),b=require("goober");var y=W(require("react")),x=require("goober");var h=require("goober"),ue=h.keyframes` - from { - transform: scale(0) rotate(45deg); - opacity: 0; -@@ -6,7 +6,7 @@ from { - to { - transform: scale(1) rotate(45deg); - opacity: 1; --}`,ue=h.keyframes` -+}`,me=h.keyframes` - from { - transform: scale(0); - opacity: 0; -@@ -31,14 +31,14 @@ to { - position: relative; - transform: rotate(45deg); - -- animation: ${me} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) -+ animation: ${ue} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) - forwards; - animation-delay: 100ms; - - &:after, - &:before { - content: ''; -- animation: ${ue} 0.15s ease-out forwards; -+ animation: ${me} 0.15s ease-out forwards; - animation-delay: 150ms; - position: absolute; - border-radius: 3px; -@@ -55,7 +55,7 @@ to { - animation-delay: 180ms; - transform: rotate(90deg); - } --`;var C=require("goober"),Te=C.keyframes` -+`;var C=require("goober"),fe=C.keyframes` - from { - transform: rotate(0deg); - } -@@ -70,8 +70,8 @@ to { - border-radius: 100%; - border-color: ${e=>e.secondary||"#e0e0e0"}; - border-right-color: ${e=>e.primary||"#616161"}; -- animation: ${Te} 1s linear infinite; --`;var P=require("goober"),fe=P.keyframes` -+ animation: ${fe} 1s linear infinite; -+`;var P=require("goober"),Te=P.keyframes` - from { - transform: scale(0) rotate(45deg); - opacity: 0; -@@ -102,7 +102,7 @@ to { - position: relative; - transform: rotate(45deg); - -- animation: ${fe} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) -+ animation: ${Te} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) - forwards; - animation-delay: 100ms; - &:after { -@@ -169,10 +169,10 @@ to { - color: inherit; - flex: 1 1 auto; - white-space: pre-line; --`,ve=(e,t)=>{let s=e.includes("top")?1:-1,[r,a]=R()?[Pe,Oe]:[Se(s),Ae(s)];return{animation:t?`${(0,b.keyframes)(r)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${(0,b.keyframes)(a)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},$=T.memo(({toast:e,position:t,style:o,children:s})=>{let r=e.height?ve(e.position||t||"top-center",e.visible):{opacity:0},a=T.createElement(U,{toast:e}),c=T.createElement(Re,{...e.ariaProps},u(e.message,e));return T.createElement(Ee,{className:e.className,style:{...r,...o,...e.style}},typeof s=="function"?s({icon:a,message:c}):T.createElement(T.Fragment,null,a,c))});var N=require("goober"),f=W(require("react"));(0,N.setup)(f.createElement);var Ie=({id:e,className:t,style:o,onHeightUpdate:s,children:r})=>{let a=f.useCallback(c=>{if(c){let i=()=>{let d=c.getBoundingClientRect().height;s(e,d)};i(),new MutationObserver(i).observe(c,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return f.createElement("div",{ref:a,className:t,style:o},r)},De=(e,t)=>{let o=e.includes("top"),s=o?{top:0}:{bottom:0},r=e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:R()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(o?1:-1)}px)`,...s,...r}},ke=N.css` -+`,ve=(e,t)=>{let s=e.includes("top")?1:-1,[r,a]=R()?[Pe,Oe]:[Se(s),Ae(s)];return{animation:t?`${(0,b.keyframes)(r)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${(0,b.keyframes)(a)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},$=f.memo(({toast:e,position:t,style:o,children:s})=>{let r=e.height?ve(e.position||t||"top-center",e.visible):{opacity:0},a=f.createElement(U,{toast:e}),c=f.createElement(Re,{...e.ariaProps},m(e.message,e));return f.createElement(Ee,{className:e.className,style:{...r,...o,...e.style}},typeof s=="function"?s({icon:a,message:c}):f.createElement(f.Fragment,null,a,c))});var N=require("goober"),T=W(require("react"));(0,N.setup)(T.createElement);var Ie=({id:e,className:t,style:o,onHeightUpdate:s,children:r})=>{let a=T.useCallback(c=>{if(c){let n=()=>{let d=c.getBoundingClientRect().height;s(e,d)};n(),new MutationObserver(n).observe(c,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement("div",{ref:a,className:t,style:o},r)},De=(e,t)=>{let o=e.includes("top")||e.includes("center-"),s=o?{top:e.includes("center-")?"50%":0}:{bottom:0},r=e.includes("center-right")?{justifyContent:"flex-end"}:e.includes("center-left")?{justifyContent:"flex-start"}:e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:R()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(o?1:-1)}px)`,...s,...r}},ke=N.css` - z-index: 9999; - > * { - pointer-events: auto; - } --`,L=16,J=({reverseOrder:e,position:t="top-center",toastOptions:o,gutter:s,children:r,containerStyle:a,containerClassName:c})=>{let{toasts:i,handlers:d}=V(o);return f.createElement("div",{style:{position:"fixed",zIndex:9999,top:L,left:L,right:L,bottom:L,pointerEvents:"none",...a},className:c,onMouseEnter:d.startPause,onMouseLeave:d.endPause},i.map(p=>{let g=p.position||t,z=d.calculateOffset(p,{reverseOrder:e,gutter:s,defaultPosition:t}),O=De(g,z);return f.createElement(Ie,{id:p.id,key:p.id,onHeightUpdate:d.updateHeight,className:p.visible?ke:"",style:O},p.type==="custom"?u(p.message,p):r?r(p):f.createElement($,{toast:p,position:g}))}))};var _e=n;0&&(module.exports={CheckmarkIcon,ErrorIcon,LoaderIcon,ToastBar,ToastIcon,Toaster,resolveValue,toast,useToaster,useToasterStore}); -+`,L=16,J=({reverseOrder:e,position:t="top-center",toastOptions:o,gutter:s,children:r,containerStyle:a,containerClassName:c})=>{let{toasts:n,handlers:d}=V(o);return T.createElement("div",{style:{position:"fixed",zIndex:9999,top:L,left:L,right:L,bottom:L,pointerEvents:"none",...a},className:c,onMouseEnter:d.startPause,onMouseLeave:d.endPause},n.map(p=>{let g=p.position||t,z=d.calculateOffset(p,{reverseOrder:e,gutter:s,defaultPosition:t}),O=De(g,z);return T.createElement(Ie,{id:p.id,key:p.id,onHeightUpdate:d.updateHeight,className:p.visible?ke:"",style:O},p.type==="custom"?m(p.message,p):r?r(p):T.createElement($,{toast:p,position:g}))}))};var _e=i;0&&(module.exports={CheckmarkIcon,ErrorIcon,LoaderIcon,ToastBar,ToastIcon,Toaster,resolveValue,toast,useToaster,useToasterStore}); - //# sourceMappingURL=index.js.map -\ No newline at end of file -diff --git a/dist/index.js.map b/dist/index.js.map -index d7510655f2644f5a0b9d8c104d0a6d23ee4a7717..53d2c71f53732a2041b232d1a73593d16e025723 100644 ---- a/dist/index.js.map -+++ b/dist/index.js.map -@@ -1 +1 @@ --{"version":3,"sources":["../src/index.ts","../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx"],"sourcesContent":["import { toast } from './core/toast';\n\nexport * from './headless';\n\nexport { ToastBar } from './components/toast-bar';\nexport { ToastIcon } from './components/toast-icon';\nexport { Toaster } from './components/toaster';\nexport { CheckmarkIcon } from './components/checkmark';\nexport { ErrorIcon } from './components/error';\nexport { LoaderIcon } from './components/loader';\n\nexport { toast };\nexport default toast;\n","import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type Renderable = JSX.Element | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => JSX.Element;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nconst toastTimeouts = new Map>();\n\nexport const TOAST_EXPIRE_DISMISS_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, TOAST_EXPIRE_DISMISS_DELAY);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nconst clearFromRemoveQueue = (toastId: string) => {\n const timeout = toastTimeouts.get(toastId);\n if (timeout) {\n clearTimeout(timeout);\n }\n};\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n // ! Side effects !\n if (action.toast.id) {\n clearFromRemoveQueue(action.toast.id);\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return state.toasts.find((t) => t.id === toast.id)\n ? reducer(state, { type: ActionType.UPDATE_TOAST, toast })\n : reducer(state, { type: ActionType.ADD_TOAST, toast });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n // ! Side effects ! - This could be execrated into a dismissToast() action, but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId);\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id);\n });\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n useEffect(() => {\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, [state]);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise,\n msgs: {\n loading: Renderable;\n success: ValueOrFunction;\n error: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n promise\n .then((p) => {\n toast.success(resolveValue(msgs.success, p), {\n id,\n ...opts,\n ...opts?.success,\n });\n return p;\n })\n .catch((e) => {\n toast.error(resolveValue(msgs.error, e), {\n id,\n ...opts,\n ...opts?.error,\n });\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\nimport { ToastIcon } from './toast-icon';\nimport { prefersReducedMotion } from '../core/utils';\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`;\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`;\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\n\nconst ToastBarBase = styled('div')`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`;\n\nconst Message = styled('div')`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`;\n\ninterface ToastBarProps {\n toast: Toast;\n position?: ToastPosition;\n style?: React.CSSProperties;\n children?: (components: {\n icon: Renderable;\n message: Renderable;\n }) => Renderable;\n}\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes('top');\n const factor = top ? 1 : -1;\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)];\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n };\n};\n\nexport const ToastBar: React.FC = React.memo(\n ({ toast, position, style, children }) => {\n const animationStyle: React.CSSProperties = toast.height\n ? getAnimationStyle(\n toast.position || position || 'top-center',\n toast.visible\n )\n : { opacity: 0 };\n\n const icon = ;\n const message = (\n \n {resolveValue(toast.message, toast)}\n \n );\n\n return (\n \n {typeof children === 'function' ? (\n children({\n icon,\n message,\n })\n ) : (\n <>\n {icon}\n {message}\n \n )}\n \n );\n }\n);\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast } from '../core/types';\nimport { ErrorIcon, ErrorTheme } from './error';\nimport { LoaderIcon, LoaderTheme } from './loader';\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\n\nconst StatusWrapper = styled('div')`\n position: absolute;\n`;\n\nconst IndicatorWrapper = styled('div')`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`;\n\nconst enter = keyframes`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nexport const AnimatedIconWrapper = styled('div')`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`;\n\nexport type IconThemes = Partial<{\n success: CheckmarkTheme;\n error: ErrorTheme;\n loading: LoaderTheme;\n}>;\n\nexport const ToastIcon: React.FC<{\n toast: Toast;\n}> = ({ toast }) => {\n const { icon, type, iconTheme } = toast;\n if (icon !== undefined) {\n if (typeof icon === 'string') {\n return {icon};\n } else {\n return icon;\n }\n }\n\n if (type === 'blank') {\n return null;\n }\n\n return (\n \n \n {type !== 'loading' && (\n \n {type === 'error' ? (\n \n ) : (\n \n )}\n \n )}\n \n );\n};\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`;\n\nconst firstLineAnimation = keyframes`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nconst secondLineAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`;\n\nexport interface ErrorTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const ErrorIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#ff4b4b'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${(p) => p.secondary || '#fff'};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;\n","import { styled, keyframes } from 'goober';\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport interface LoaderTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const LoaderIcon = styled('div')`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${(p) => p.secondary || '#e0e0e0'};\n border-right-color: ${(p) => p.primary || '#616161'};\n animation: ${rotate} 1s linear infinite;\n`;\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`;\n\nconst checkmarkAnimation = keyframes`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`;\n\nexport interface CheckmarkTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const CheckmarkIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#61d345'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${(p) => p.secondary || '#fff'};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;\n","import { css, setup } from 'goober';\nimport * as React from 'react';\nimport {\n resolveValue,\n ToasterProps,\n ToastPosition,\n ToastWrapperProps,\n} from '../core/types';\nimport { useToaster } from '../core/use-toaster';\nimport { prefersReducedMotion } from '../core/utils';\nimport { ToastBar } from './toast-bar';\n\nsetup(React.createElement);\n\nconst ToastWrapper = ({\n id,\n className,\n style,\n onHeightUpdate,\n children,\n}: ToastWrapperProps) => {\n const ref = React.useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const updateHeight = () => {\n const height = el.getBoundingClientRect().height;\n onHeightUpdate(id, height);\n };\n updateHeight();\n new MutationObserver(updateHeight).observe(el, {\n subtree: true,\n childList: true,\n characterData: true,\n });\n }\n },\n [id, onHeightUpdate]\n );\n\n return (\n
\n {children}\n
\n );\n};\n\nconst getPositionStyle = (\n position: ToastPosition,\n offset: number\n): React.CSSProperties => {\n const top = position.includes('top');\n const verticalStyle: React.CSSProperties = top ? { top: 0 } : { bottom: 0 };\n const horizontalStyle: React.CSSProperties = position.includes('center')\n ? {\n justifyContent: 'center',\n }\n : position.includes('right')\n ? {\n justifyContent: 'flex-end',\n }\n : {};\n return {\n left: 0,\n right: 0,\n display: 'flex',\n position: 'absolute',\n transition: prefersReducedMotion()\n ? undefined\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\n ...verticalStyle,\n ...horizontalStyle,\n };\n};\n\nconst activeClass = css`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`;\n\nconst DEFAULT_OFFSET = 16;\n\nexport const Toaster: React.FC = ({\n reverseOrder,\n position = 'top-center',\n toastOptions,\n gutter,\n children,\n containerStyle,\n containerClassName,\n}) => {\n const { toasts, handlers } = useToaster(toastOptions);\n\n return (\n \n {toasts.map((t) => {\n const toastPosition = t.position || position;\n const offset = handlers.calculateOffset(t, {\n reverseOrder,\n gutter,\n defaultPosition: position,\n });\n const positionStyle = getPositionStyle(toastPosition, offset);\n\n return (\n \n {t.type === 'custom' ? (\n resolveValue(t.message, t)\n ) : children ? (\n children(t)\n ) : (\n \n )}\n \n );\n })}\n \n );\n};\n"],"mappings":"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","names":[]} -\ No newline at end of file -+{"version":3,"sources":["../src/index.ts","../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx"],"sourcesContent":["import { toast } from './core/toast';\r\n\r\nexport * from './headless';\r\n\r\nexport { ToastBar } from './components/toast-bar';\r\nexport { ToastIcon } from './components/toast-icon';\r\nexport { Toaster } from './components/toaster';\r\nexport { CheckmarkIcon } from './components/checkmark';\r\nexport { ErrorIcon } from './components/error';\r\nexport { LoaderIcon } from './components/loader';\r\n\r\nexport { toast };\r\nexport default toast;\r\n","import { CSSProperties } from 'react';\r\n\r\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\r\nexport type ToastPosition =\r\n | 'top-left'\r\n | 'top-center'\r\n | 'top-right'\r\n | 'bottom-left'\r\n | 'bottom-center'\r\n | 'bottom-right'\r\n | 'center-right'\r\n | 'center-left';\r\n\r\nexport type Renderable = JSX.Element | string | null;\r\n\r\nexport interface IconTheme {\r\n primary: string;\r\n secondary: string;\r\n}\r\n\r\nexport type ValueFunction = (arg: TArg) => TValue;\r\nexport type ValueOrFunction =\r\n | TValue\r\n | ValueFunction;\r\n\r\nconst isFunction = (\r\n valOrFunction: ValueOrFunction\r\n): valOrFunction is ValueFunction =>\r\n typeof valOrFunction === 'function';\r\n\r\nexport const resolveValue = (\r\n valOrFunction: ValueOrFunction,\r\n arg: TArg\r\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\r\n\r\nexport interface Toast {\r\n type: ToastType;\r\n id: string;\r\n message: ValueOrFunction;\r\n icon?: Renderable;\r\n duration?: number;\r\n pauseDuration: number;\r\n position?: ToastPosition;\r\n\r\n ariaProps: {\r\n role: 'status' | 'alert';\r\n 'aria-live': 'assertive' | 'off' | 'polite';\r\n };\r\n\r\n style?: CSSProperties;\r\n className?: string;\r\n iconTheme?: IconTheme;\r\n\r\n createdAt: number;\r\n visible: boolean;\r\n height?: number;\r\n}\r\n\r\nexport type ToastOptions = Partial<\r\n Pick<\r\n Toast,\r\n | 'id'\r\n | 'icon'\r\n | 'duration'\r\n | 'ariaProps'\r\n | 'className'\r\n | 'style'\r\n | 'position'\r\n | 'iconTheme'\r\n >\r\n>;\r\n\r\nexport type DefaultToastOptions = ToastOptions & {\r\n [key in ToastType]?: ToastOptions;\r\n};\r\n\r\nexport interface ToasterProps {\r\n position?: ToastPosition;\r\n toastOptions?: DefaultToastOptions;\r\n reverseOrder?: boolean;\r\n gutter?: number;\r\n containerStyle?: React.CSSProperties;\r\n containerClassName?: string;\r\n children?: (toast: Toast) => JSX.Element;\r\n}\r\n\r\nexport interface ToastWrapperProps {\r\n id: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n onHeightUpdate: (id: string, height: number) => void;\r\n children?: React.ReactNode;\r\n}\r\n","export const genId = (() => {\r\n let count = 0;\r\n return () => {\r\n return (++count).toString();\r\n };\r\n})();\r\n\r\nexport const prefersReducedMotion = (() => {\r\n // Cache result\r\n let shouldReduceMotion: boolean | undefined = undefined;\r\n\r\n return () => {\r\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\r\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\r\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\r\n }\r\n return shouldReduceMotion;\r\n };\r\n})();\r\n","import { useEffect, useState } from 'react';\r\nimport { DefaultToastOptions, Toast, ToastType } from './types';\r\n\r\nconst TOAST_LIMIT = 20;\r\n\r\nexport enum ActionType {\r\n ADD_TOAST,\r\n UPDATE_TOAST,\r\n UPSERT_TOAST,\r\n DISMISS_TOAST,\r\n REMOVE_TOAST,\r\n START_PAUSE,\r\n END_PAUSE,\r\n}\r\n\r\ntype Action =\r\n | {\r\n type: ActionType.ADD_TOAST;\r\n toast: Toast;\r\n }\r\n | {\r\n type: ActionType.UPSERT_TOAST;\r\n toast: Toast;\r\n }\r\n | {\r\n type: ActionType.UPDATE_TOAST;\r\n toast: Partial;\r\n }\r\n | {\r\n type: ActionType.DISMISS_TOAST;\r\n toastId?: string;\r\n }\r\n | {\r\n type: ActionType.REMOVE_TOAST;\r\n toastId?: string;\r\n }\r\n | {\r\n type: ActionType.START_PAUSE;\r\n time: number;\r\n }\r\n | {\r\n type: ActionType.END_PAUSE;\r\n time: number;\r\n };\r\n\r\ninterface State {\r\n toasts: Toast[];\r\n pausedAt: number | undefined;\r\n}\r\n\r\nconst toastTimeouts = new Map>();\r\n\r\nexport const TOAST_EXPIRE_DISMISS_DELAY = 1000;\r\n\r\nconst addToRemoveQueue = (toastId: string) => {\r\n if (toastTimeouts.has(toastId)) {\r\n return;\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n toastTimeouts.delete(toastId);\r\n dispatch({\r\n type: ActionType.REMOVE_TOAST,\r\n toastId: toastId,\r\n });\r\n }, TOAST_EXPIRE_DISMISS_DELAY);\r\n\r\n toastTimeouts.set(toastId, timeout);\r\n};\r\n\r\nconst clearFromRemoveQueue = (toastId: string) => {\r\n const timeout = toastTimeouts.get(toastId);\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n};\r\n\r\nexport const reducer = (state: State, action: Action): State => {\r\n switch (action.type) {\r\n case ActionType.ADD_TOAST:\r\n return {\r\n ...state,\r\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\r\n };\r\n\r\n case ActionType.UPDATE_TOAST:\r\n // ! Side effects !\r\n if (action.toast.id) {\r\n clearFromRemoveQueue(action.toast.id);\r\n }\r\n\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === action.toast.id ? { ...t, ...action.toast } : t\r\n ),\r\n };\r\n\r\n case ActionType.UPSERT_TOAST:\r\n const { toast } = action;\r\n return state.toasts.find((t) => t.id === toast.id)\r\n ? reducer(state, { type: ActionType.UPDATE_TOAST, toast })\r\n : reducer(state, { type: ActionType.ADD_TOAST, toast });\r\n\r\n case ActionType.DISMISS_TOAST:\r\n const { toastId } = action;\r\n\r\n // ! Side effects ! - This could be execrated into a dismissToast() action, but I'll keep it here for simplicity\r\n if (toastId) {\r\n addToRemoveQueue(toastId);\r\n } else {\r\n state.toasts.forEach((toast) => {\r\n addToRemoveQueue(toast.id);\r\n });\r\n }\r\n\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === toastId || toastId === undefined\r\n ? {\r\n ...t,\r\n visible: false,\r\n }\r\n : t\r\n ),\r\n };\r\n case ActionType.REMOVE_TOAST:\r\n if (action.toastId === undefined) {\r\n return {\r\n ...state,\r\n toasts: [],\r\n };\r\n }\r\n return {\r\n ...state,\r\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\r\n };\r\n\r\n case ActionType.START_PAUSE:\r\n return {\r\n ...state,\r\n pausedAt: action.time,\r\n };\r\n\r\n case ActionType.END_PAUSE:\r\n const diff = action.time - (state.pausedAt || 0);\r\n\r\n return {\r\n ...state,\r\n pausedAt: undefined,\r\n toasts: state.toasts.map((t) => ({\r\n ...t,\r\n pauseDuration: t.pauseDuration + diff,\r\n })),\r\n };\r\n }\r\n};\r\n\r\nconst listeners: Array<(state: State) => void> = [];\r\n\r\nlet memoryState: State = { toasts: [], pausedAt: undefined };\r\n\r\nexport const dispatch = (action: Action) => {\r\n memoryState = reducer(memoryState, action);\r\n listeners.forEach((listener) => {\r\n listener(memoryState);\r\n });\r\n};\r\n\r\nexport const defaultTimeouts: {\r\n [key in ToastType]: number;\r\n} = {\r\n blank: 4000,\r\n error: 4000,\r\n success: 2000,\r\n loading: Infinity,\r\n custom: 4000,\r\n};\r\n\r\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\r\n const [state, setState] = useState(memoryState);\r\n useEffect(() => {\r\n listeners.push(setState);\r\n return () => {\r\n const index = listeners.indexOf(setState);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n }, [state]);\r\n\r\n const mergedToasts = state.toasts.map((t) => ({\r\n ...toastOptions,\r\n ...toastOptions[t.type],\r\n ...t,\r\n duration:\r\n t.duration ||\r\n toastOptions[t.type]?.duration ||\r\n toastOptions?.duration ||\r\n defaultTimeouts[t.type],\r\n style: {\r\n ...toastOptions.style,\r\n ...toastOptions[t.type]?.style,\r\n ...t.style,\r\n },\r\n }));\r\n\r\n return {\r\n ...state,\r\n toasts: mergedToasts,\r\n };\r\n};\r\n","import {\r\n Renderable,\r\n Toast,\r\n ToastOptions,\r\n ToastType,\r\n DefaultToastOptions,\r\n ValueOrFunction,\r\n resolveValue,\r\n} from './types';\r\nimport { genId } from './utils';\r\nimport { dispatch, ActionType } from './store';\r\n\r\ntype Message = ValueOrFunction;\r\n\r\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\r\n\r\nconst createToast = (\r\n message: Message,\r\n type: ToastType = 'blank',\r\n opts?: ToastOptions\r\n): Toast => ({\r\n createdAt: Date.now(),\r\n visible: true,\r\n type,\r\n ariaProps: {\r\n role: 'status',\r\n 'aria-live': 'polite',\r\n },\r\n message,\r\n pauseDuration: 0,\r\n ...opts,\r\n id: opts?.id || genId(),\r\n});\r\n\r\nconst createHandler =\r\n (type?: ToastType): ToastHandler =>\r\n (message, options) => {\r\n const toast = createToast(message, type, options);\r\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\r\n return toast.id;\r\n };\r\n\r\nconst toast = (message: Message, opts?: ToastOptions) =>\r\n createHandler('blank')(message, opts);\r\n\r\ntoast.error = createHandler('error');\r\ntoast.success = createHandler('success');\r\ntoast.loading = createHandler('loading');\r\ntoast.custom = createHandler('custom');\r\n\r\ntoast.dismiss = (toastId?: string) => {\r\n dispatch({\r\n type: ActionType.DISMISS_TOAST,\r\n toastId,\r\n });\r\n};\r\n\r\ntoast.remove = (toastId?: string) =>\r\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\r\n\r\ntoast.promise = (\r\n promise: Promise,\r\n msgs: {\r\n loading: Renderable;\r\n success: ValueOrFunction;\r\n error: ValueOrFunction;\r\n },\r\n opts?: DefaultToastOptions\r\n) => {\r\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\r\n\r\n promise\r\n .then((p) => {\r\n toast.success(resolveValue(msgs.success, p), {\r\n id,\r\n ...opts,\r\n ...opts?.success,\r\n });\r\n return p;\r\n })\r\n .catch((e) => {\r\n toast.error(resolveValue(msgs.error, e), {\r\n id,\r\n ...opts,\r\n ...opts?.error,\r\n });\r\n });\r\n\r\n return promise;\r\n};\r\n\r\nexport { toast };\r\n","import { useEffect, useCallback } from 'react';\r\nimport { dispatch, ActionType, useStore } from './store';\r\nimport { toast } from './toast';\r\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\r\n\r\nconst updateHeight = (toastId: string, height: number) => {\r\n dispatch({\r\n type: ActionType.UPDATE_TOAST,\r\n toast: { id: toastId, height },\r\n });\r\n};\r\nconst startPause = () => {\r\n dispatch({\r\n type: ActionType.START_PAUSE,\r\n time: Date.now(),\r\n });\r\n};\r\n\r\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\r\n const { toasts, pausedAt } = useStore(toastOptions);\r\n\r\n useEffect(() => {\r\n if (pausedAt) {\r\n return;\r\n }\r\n\r\n const now = Date.now();\r\n const timeouts = toasts.map((t) => {\r\n if (t.duration === Infinity) {\r\n return;\r\n }\r\n\r\n const durationLeft =\r\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\r\n\r\n if (durationLeft < 0) {\r\n if (t.visible) {\r\n toast.dismiss(t.id);\r\n }\r\n return;\r\n }\r\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\r\n });\r\n\r\n return () => {\r\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\r\n };\r\n }, [toasts, pausedAt]);\r\n\r\n const endPause = useCallback(() => {\r\n if (pausedAt) {\r\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\r\n }\r\n }, [pausedAt]);\r\n\r\n const calculateOffset = useCallback(\r\n (\r\n toast: Toast,\r\n opts?: {\r\n reverseOrder?: boolean;\r\n gutter?: number;\r\n defaultPosition?: ToastPosition;\r\n }\r\n ) => {\r\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\r\n\r\n const relevantToasts = toasts.filter(\r\n (t) =>\r\n (t.position || defaultPosition) ===\r\n (toast.position || defaultPosition) && t.height\r\n );\r\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\r\n const toastsBefore = relevantToasts.filter(\r\n (toast, i) => i < toastIndex && toast.visible\r\n ).length;\r\n\r\n const offset = relevantToasts\r\n .filter((t) => t.visible)\r\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\r\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\r\n\r\n return offset;\r\n },\r\n [toasts]\r\n );\r\n\r\n return {\r\n toasts,\r\n handlers: {\r\n updateHeight,\r\n startPause,\r\n endPause,\r\n calculateOffset,\r\n },\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport { styled, keyframes } from 'goober';\r\n\r\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\r\nimport { ToastIcon } from './toast-icon';\r\nimport { prefersReducedMotion } from '../core/utils';\r\n\r\nconst enterAnimation = (factor: number) => `\r\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\r\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\r\n`;\r\n\r\nconst exitAnimation = (factor: number) => `\r\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\r\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\r\n`;\r\n\r\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\r\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\r\n\r\nconst ToastBarBase = styled('div')`\r\n display: flex;\r\n align-items: center;\r\n background: #fff;\r\n color: #363636;\r\n line-height: 1.3;\r\n will-change: transform;\r\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\r\n max-width: 350px;\r\n pointer-events: auto;\r\n padding: 8px 10px;\r\n border-radius: 8px;\r\n`;\r\n\r\nconst Message = styled('div')`\r\n display: flex;\r\n justify-content: center;\r\n margin: 4px 10px;\r\n color: inherit;\r\n flex: 1 1 auto;\r\n white-space: pre-line;\r\n`;\r\n\r\ninterface ToastBarProps {\r\n toast: Toast;\r\n position?: ToastPosition;\r\n style?: React.CSSProperties;\r\n children?: (components: {\r\n icon: Renderable;\r\n message: Renderable;\r\n }) => Renderable;\r\n}\r\n\r\nconst getAnimationStyle = (\r\n position: ToastPosition,\r\n visible: boolean\r\n): React.CSSProperties => {\r\n const top = position.includes('top');\r\n const factor = top ? 1 : -1;\r\n\r\n const [enter, exit] = prefersReducedMotion()\r\n ? [fadeInAnimation, fadeOutAnimation]\r\n : [enterAnimation(factor), exitAnimation(factor)];\r\n\r\n return {\r\n animation: visible\r\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\r\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\r\n };\r\n};\r\n\r\nexport const ToastBar: React.FC = React.memo(\r\n ({ toast, position, style, children }) => {\r\n const animationStyle: React.CSSProperties = toast.height\r\n ? getAnimationStyle(\r\n toast.position || position || 'top-center',\r\n toast.visible\r\n )\r\n : { opacity: 0 };\r\n\r\n const icon = ;\r\n const message = (\r\n \r\n {resolveValue(toast.message, toast)}\r\n \r\n );\r\n\r\n return (\r\n \r\n {typeof children === 'function' ? (\r\n children({\r\n icon,\r\n message,\r\n })\r\n ) : (\r\n <>\r\n {icon}\r\n {message}\r\n \r\n )}\r\n \r\n );\r\n }\r\n);\r\n","import * as React from 'react';\r\nimport { styled, keyframes } from 'goober';\r\n\r\nimport { Toast } from '../core/types';\r\nimport { ErrorIcon, ErrorTheme } from './error';\r\nimport { LoaderIcon, LoaderTheme } from './loader';\r\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\r\n\r\nconst StatusWrapper = styled('div')`\r\n position: absolute;\r\n`;\r\n\r\nconst IndicatorWrapper = styled('div')`\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-width: 20px;\r\n min-height: 20px;\r\n`;\r\n\r\nconst enter = keyframes`\r\nfrom {\r\n transform: scale(0.6);\r\n opacity: 0.4;\r\n}\r\nto {\r\n transform: scale(1);\r\n opacity: 1;\r\n}`;\r\n\r\nexport const AnimatedIconWrapper = styled('div')`\r\n position: relative;\r\n transform: scale(0.6);\r\n opacity: 0.4;\r\n min-width: 20px;\r\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\r\n forwards;\r\n`;\r\n\r\nexport type IconThemes = Partial<{\r\n success: CheckmarkTheme;\r\n error: ErrorTheme;\r\n loading: LoaderTheme;\r\n}>;\r\n\r\nexport const ToastIcon: React.FC<{\r\n toast: Toast;\r\n}> = ({ toast }) => {\r\n const { icon, type, iconTheme } = toast;\r\n if (icon !== undefined) {\r\n if (typeof icon === 'string') {\r\n return {icon};\r\n } else {\r\n return icon;\r\n }\r\n }\r\n\r\n if (type === 'blank') {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {type !== 'loading' && (\r\n \r\n {type === 'error' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { styled, keyframes } from 'goober';\r\n\r\nconst circleAnimation = keyframes`\r\nfrom {\r\n transform: scale(0) rotate(45deg);\r\n\topacity: 0;\r\n}\r\nto {\r\n transform: scale(1) rotate(45deg);\r\n opacity: 1;\r\n}`;\r\n\r\nconst firstLineAnimation = keyframes`\r\nfrom {\r\n transform: scale(0);\r\n opacity: 0;\r\n}\r\nto {\r\n transform: scale(1);\r\n opacity: 1;\r\n}`;\r\n\r\nconst secondLineAnimation = keyframes`\r\nfrom {\r\n transform: scale(0) rotate(90deg);\r\n\topacity: 0;\r\n}\r\nto {\r\n transform: scale(1) rotate(90deg);\r\n\topacity: 1;\r\n}`;\r\n\r\nexport interface ErrorTheme {\r\n primary?: string;\r\n secondary?: string;\r\n}\r\n\r\nexport const ErrorIcon = styled('div')`\r\n width: 20px;\r\n opacity: 0;\r\n height: 20px;\r\n border-radius: 10px;\r\n background: ${(p) => p.primary || '#ff4b4b'};\r\n position: relative;\r\n transform: rotate(45deg);\r\n\r\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\r\n forwards;\r\n animation-delay: 100ms;\r\n\r\n &:after,\r\n &:before {\r\n content: '';\r\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\r\n animation-delay: 150ms;\r\n position: absolute;\r\n border-radius: 3px;\r\n opacity: 0;\r\n background: ${(p) => p.secondary || '#fff'};\r\n bottom: 9px;\r\n left: 4px;\r\n height: 2px;\r\n width: 12px;\r\n }\r\n\r\n &:before {\r\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\r\n animation-delay: 180ms;\r\n transform: rotate(90deg);\r\n }\r\n`;\r\n","import { styled, keyframes } from 'goober';\r\n\r\nconst rotate = keyframes`\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n`;\r\n\r\nexport interface LoaderTheme {\r\n primary?: string;\r\n secondary?: string;\r\n}\r\n\r\nexport const LoaderIcon = styled('div')`\r\n width: 12px;\r\n height: 12px;\r\n box-sizing: border-box;\r\n border: 2px solid;\r\n border-radius: 100%;\r\n border-color: ${(p) => p.secondary || '#e0e0e0'};\r\n border-right-color: ${(p) => p.primary || '#616161'};\r\n animation: ${rotate} 1s linear infinite;\r\n`;\r\n","import { styled, keyframes } from 'goober';\r\n\r\nconst circleAnimation = keyframes`\r\nfrom {\r\n transform: scale(0) rotate(45deg);\r\n\topacity: 0;\r\n}\r\nto {\r\n transform: scale(1) rotate(45deg);\r\n\topacity: 1;\r\n}`;\r\n\r\nconst checkmarkAnimation = keyframes`\r\n0% {\r\n\theight: 0;\r\n\twidth: 0;\r\n\topacity: 0;\r\n}\r\n40% {\r\n height: 0;\r\n\twidth: 6px;\r\n\topacity: 1;\r\n}\r\n100% {\r\n opacity: 1;\r\n height: 10px;\r\n}`;\r\n\r\nexport interface CheckmarkTheme {\r\n primary?: string;\r\n secondary?: string;\r\n}\r\n\r\nexport const CheckmarkIcon = styled('div')`\r\n width: 20px;\r\n opacity: 0;\r\n height: 20px;\r\n border-radius: 10px;\r\n background: ${(p) => p.primary || '#61d345'};\r\n position: relative;\r\n transform: rotate(45deg);\r\n\r\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\r\n forwards;\r\n animation-delay: 100ms;\r\n &:after {\r\n content: '';\r\n box-sizing: border-box;\r\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\r\n opacity: 0;\r\n animation-delay: 200ms;\r\n position: absolute;\r\n border-right: 2px solid;\r\n border-bottom: 2px solid;\r\n border-color: ${(p) => p.secondary || '#fff'};\r\n bottom: 6px;\r\n left: 6px;\r\n height: 10px;\r\n width: 6px;\r\n }\r\n`;\r\n","import { css, setup } from 'goober';\r\nimport * as React from 'react';\r\nimport {\r\n resolveValue,\r\n ToasterProps,\r\n ToastPosition,\r\n ToastWrapperProps,\r\n} from '../core/types';\r\nimport { useToaster } from '../core/use-toaster';\r\nimport { prefersReducedMotion } from '../core/utils';\r\nimport { ToastBar } from './toast-bar';\r\n\r\nsetup(React.createElement);\r\n\r\nconst ToastWrapper = ({\r\n id,\r\n className,\r\n style,\r\n onHeightUpdate,\r\n children,\r\n}: ToastWrapperProps) => {\r\n const ref = React.useCallback(\r\n (el: HTMLElement | null) => {\r\n if (el) {\r\n const updateHeight = () => {\r\n const height = el.getBoundingClientRect().height;\r\n onHeightUpdate(id, height);\r\n };\r\n updateHeight();\r\n new MutationObserver(updateHeight).observe(el, {\r\n subtree: true,\r\n childList: true,\r\n characterData: true,\r\n });\r\n }\r\n },\r\n [id, onHeightUpdate]\r\n );\r\n\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};\r\n\r\nconst getPositionStyle = (\r\n position: ToastPosition,\r\n offset: number\r\n): React.CSSProperties => {\r\n const top = position.includes('top') || position.includes('center-');\r\n const verticalStyle: React.CSSProperties = top\r\n ? {\r\n top: position.includes('center-') ? '50%' : 0,\r\n }\r\n : { bottom: 0 };\r\n const horizontalStyle: React.CSSProperties = position.includes('center-right')\r\n ? { justifyContent: 'flex-end' }\r\n : position.includes('center-left')\r\n ? { justifyContent: 'flex-start' }\r\n : position.includes('center')\r\n ? {\r\n justifyContent: 'center',\r\n }\r\n : position.includes('right')\r\n ? {\r\n justifyContent: 'flex-end',\r\n }\r\n : {};\r\n return {\r\n left: 0,\r\n right: 0,\r\n display: 'flex',\r\n position: 'absolute',\r\n transition: prefersReducedMotion()\r\n ? undefined\r\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\r\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\r\n ...verticalStyle,\r\n ...horizontalStyle,\r\n };\r\n};\r\n\r\nconst activeClass = css`\r\n z-index: 9999;\r\n > * {\r\n pointer-events: auto;\r\n }\r\n`;\r\n\r\nconst DEFAULT_OFFSET = 16;\r\n\r\nexport const Toaster: React.FC = ({\r\n reverseOrder,\r\n position = 'top-center',\r\n toastOptions,\r\n gutter,\r\n children,\r\n containerStyle,\r\n containerClassName,\r\n}) => {\r\n const { toasts, handlers } = useToaster(toastOptions);\r\n\r\n return (\r\n \r\n {toasts.map((t) => {\r\n const toastPosition = t.position || position;\r\n const offset = handlers.calculateOffset(t, {\r\n reverseOrder,\r\n gutter,\r\n defaultPosition: position,\r\n });\r\n const positionStyle = getPositionStyle(toastPosition, offset);\r\n\r\n return (\r\n \r\n {t.type === 'custom' ? (\r\n resolveValue(t.message, t)\r\n ) : children ? (\r\n children(t)\r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n"],"mappings":"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","names":[]} -\ No newline at end of file -diff --git a/dist/index.mjs b/dist/index.mjs -index 9d9e5a07f2526134ccffc5d501ad60baa913e6ba..c36187d9f1d5a05b493f5032e868d0a56c4869b8 100644 ---- a/dist/index.mjs -+++ b/dist/index.mjs -@@ -1,4 +1,4 @@ --var W=e=>typeof e=="function",T=(e,t)=>W(e)?e(t):e;var U=(()=>{let e=0;return()=>(++e).toString()})(),b=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();import{useEffect as H,useState as j}from"react";var Q=20;var S=new Map,X=1e3,$=e=>{if(S.has(e))return;let t=setTimeout(()=>{S.delete(e),u({type:4,toastId:e})},X);S.set(e,t)},J=e=>{let t=S.get(e);t&&clearTimeout(t)},v=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,Q)};case 1:return t.toast.id&&J(t.toast.id),{...e,toasts:e.toasts.map(r=>r.id===t.toast.id?{...r,...t.toast}:r)};case 2:let{toast:o}=t;return e.toasts.find(r=>r.id===o.id)?v(e,{type:1,toast:o}):v(e,{type:0,toast:o});case 3:let{toastId:s}=t;return s?$(s):e.toasts.forEach(r=>{$(r.id)}),{...e,toasts:e.toasts.map(r=>r.id===s||s===void 0?{...r,visible:!1}:r)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(r=>r.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(r=>({...r,pauseDuration:r.pauseDuration+a}))}}},A=[],P={toasts:[],pausedAt:void 0},u=e=>{P=v(P,e),A.forEach(t=>{t(P)})},Y={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},I=(e={})=>{let[t,o]=j(P);H(()=>(A.push(o),()=>{let a=A.indexOf(o);a>-1&&A.splice(a,1)}),[t]);let s=t.toasts.map(a=>{var r,c;return{...e,...e[a.type],...a,duration:a.duration||((r=e[a.type])==null?void 0:r.duration)||(e==null?void 0:e.duration)||Y[a.type],style:{...e.style,...(c=e[a.type])==null?void 0:c.style,...a.style}}});return{...t,toasts:s}};var G=(e,t="blank",o)=>({createdAt:Date.now(),visible:!0,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...o,id:(o==null?void 0:o.id)||U()}),h=e=>(t,o)=>{let s=G(t,e,o);return u({type:2,toast:s}),s.id},n=(e,t)=>h("blank")(e,t);n.error=h("error");n.success=h("success");n.loading=h("loading");n.custom=h("custom");n.dismiss=e=>{u({type:3,toastId:e})};n.remove=e=>u({type:4,toastId:e});n.promise=(e,t,o)=>{let s=n.loading(t.loading,{...o,...o==null?void 0:o.loading});return e.then(a=>(n.success(T(t.success,a),{id:s,...o,...o==null?void 0:o.success}),a)).catch(a=>{n.error(T(t.error,a),{id:s,...o,...o==null?void 0:o.error})}),e};import{useEffect as K,useCallback as L}from"react";var Z=(e,t)=>{u({type:1,toast:{id:e,height:t}})},ee=()=>{u({type:5,time:Date.now()})},D=e=>{let{toasts:t,pausedAt:o}=I(e);K(()=>{if(o)return;let r=Date.now(),c=t.map(i=>{if(i.duration===1/0)return;let d=(i.duration||0)+i.pauseDuration-(r-i.createdAt);if(d<0){i.visible&&n.dismiss(i.id);return}return setTimeout(()=>n.dismiss(i.id),d)});return()=>{c.forEach(i=>i&&clearTimeout(i))}},[t,o]);let s=L(()=>{o&&u({type:6,time:Date.now()})},[o]),a=L((r,c)=>{let{reverseOrder:i=!1,gutter:d=8,defaultPosition:p}=c||{},g=t.filter(m=>(m.position||p)===(r.position||p)&&m.height),E=g.findIndex(m=>m.id===r.id),x=g.filter((m,R)=>Rm.visible).slice(...i?[x+1]:[0,x]).reduce((m,R)=>m+(R.height||0)+d,0)},[t]);return{toasts:t,handlers:{updateHeight:Z,startPause:ee,endPause:s,calculateOffset:a}}};import*as l from"react";import{styled as B,keyframes as z}from"goober";import*as y from"react";import{styled as C,keyframes as me}from"goober";import{styled as te,keyframes as k}from"goober";var oe=k` -+var W=e=>typeof e=="function",f=(e,t)=>W(e)?e(t):e;var U=(()=>{let e=0;return()=>(++e).toString()})(),b=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();import{useEffect as H,useState as j}from"react";var Q=20;var S=new Map,X=1e3,$=e=>{if(S.has(e))return;let t=setTimeout(()=>{S.delete(e),m({type:4,toastId:e})},X);S.set(e,t)},J=e=>{let t=S.get(e);t&&clearTimeout(t)},v=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,Q)};case 1:return t.toast.id&&J(t.toast.id),{...e,toasts:e.toasts.map(r=>r.id===t.toast.id?{...r,...t.toast}:r)};case 2:let{toast:o}=t;return e.toasts.find(r=>r.id===o.id)?v(e,{type:1,toast:o}):v(e,{type:0,toast:o});case 3:let{toastId:s}=t;return s?$(s):e.toasts.forEach(r=>{$(r.id)}),{...e,toasts:e.toasts.map(r=>r.id===s||s===void 0?{...r,visible:!1}:r)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(r=>r.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(r=>({...r,pauseDuration:r.pauseDuration+a}))}}},A=[],P={toasts:[],pausedAt:void 0},m=e=>{P=v(P,e),A.forEach(t=>{t(P)})},Y={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},I=(e={})=>{let[t,o]=j(P);H(()=>(A.push(o),()=>{let a=A.indexOf(o);a>-1&&A.splice(a,1)}),[t]);let s=t.toasts.map(a=>{var r,c;return{...e,...e[a.type],...a,duration:a.duration||((r=e[a.type])==null?void 0:r.duration)||(e==null?void 0:e.duration)||Y[a.type],style:{...e.style,...(c=e[a.type])==null?void 0:c.style,...a.style}}});return{...t,toasts:s}};var G=(e,t="blank",o)=>({createdAt:Date.now(),visible:!0,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...o,id:(o==null?void 0:o.id)||U()}),h=e=>(t,o)=>{let s=G(t,e,o);return m({type:2,toast:s}),s.id},i=(e,t)=>h("blank")(e,t);i.error=h("error");i.success=h("success");i.loading=h("loading");i.custom=h("custom");i.dismiss=e=>{m({type:3,toastId:e})};i.remove=e=>m({type:4,toastId:e});i.promise=(e,t,o)=>{let s=i.loading(t.loading,{...o,...o==null?void 0:o.loading});return e.then(a=>(i.success(f(t.success,a),{id:s,...o,...o==null?void 0:o.success}),a)).catch(a=>{i.error(f(t.error,a),{id:s,...o,...o==null?void 0:o.error})}),e};import{useEffect as K,useCallback as L}from"react";var Z=(e,t)=>{m({type:1,toast:{id:e,height:t}})},ee=()=>{m({type:5,time:Date.now()})},D=e=>{let{toasts:t,pausedAt:o}=I(e);K(()=>{if(o)return;let r=Date.now(),c=t.map(n=>{if(n.duration===1/0)return;let d=(n.duration||0)+n.pauseDuration-(r-n.createdAt);if(d<0){n.visible&&i.dismiss(n.id);return}return setTimeout(()=>i.dismiss(n.id),d)});return()=>{c.forEach(n=>n&&clearTimeout(n))}},[t,o]);let s=L(()=>{o&&m({type:6,time:Date.now()})},[o]),a=L((r,c)=>{let{reverseOrder:n=!1,gutter:d=8,defaultPosition:p}=c||{},g=t.filter(u=>(u.position||p)===(r.position||p)&&u.height),E=g.findIndex(u=>u.id===r.id),x=g.filter((u,R)=>Ru.visible).slice(...n?[x+1]:[0,x]).reduce((u,R)=>u+(R.height||0)+d,0)},[t]);return{toasts:t,handlers:{updateHeight:Z,startPause:ee,endPause:s,calculateOffset:a}}};import*as l from"react";import{styled as B,keyframes as z}from"goober";import*as y from"react";import{styled as C,keyframes as ue}from"goober";import{styled as te,keyframes as k}from"goober";var oe=k` - from { - transform: scale(0) rotate(45deg); - opacity: 0; -@@ -55,7 +55,7 @@ to { - animation-delay: 180ms; - transform: rotate(90deg); - } --`;import{styled as ae,keyframes as ie}from"goober";var ne=ie` -+`;import{styled as ae,keyframes as ne}from"goober";var ie=ne` - from { - transform: rotate(0deg); - } -@@ -70,7 +70,7 @@ to { - border-radius: 100%; - border-color: ${e=>e.secondary||"#e0e0e0"}; - border-right-color: ${e=>e.primary||"#616161"}; -- animation: ${ne} 1s linear infinite; -+ animation: ${ie} 1s linear infinite; - `;import{styled as ce,keyframes as N}from"goober";var pe=N` - from { - transform: scale(0) rotate(45deg); -@@ -120,7 +120,7 @@ to { - height: 10px; - width: 6px; - } --`;var ue=C("div")` -+`;var me=C("div")` - position: absolute; - `,le=C("div")` - position: relative; -@@ -129,7 +129,7 @@ to { - align-items: center; - min-width: 20px; - min-height: 20px; --`,Te=me` -+`,fe=ue` - from { - transform: scale(0.6); - opacity: 0.4; -@@ -137,14 +137,14 @@ from { - to { - transform: scale(1); - opacity: 1; --}`,fe=C("div")` -+}`,Te=C("div")` - position: relative; - transform: scale(0.6); - opacity: 0.4; - min-width: 20px; -- animation: ${Te} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275) -+ animation: ${fe} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275) - forwards; --`,M=({toast:e})=>{let{icon:t,type:o,iconTheme:s}=e;return t!==void 0?typeof t=="string"?y.createElement(fe,null,t):t:o==="blank"?null:y.createElement(le,null,y.createElement(V,{...s}),o!=="loading"&&y.createElement(ue,null,o==="error"?y.createElement(_,{...s}):y.createElement(w,{...s})))};var ye=e=>` -+`,M=({toast:e})=>{let{icon:t,type:o,iconTheme:s}=e;return t!==void 0?typeof t=="string"?y.createElement(Te,null,t):t:o==="blank"?null:y.createElement(le,null,y.createElement(V,{...s}),o!=="loading"&&y.createElement(me,null,o==="error"?y.createElement(_,{...s}):y.createElement(w,{...s})))};var ye=e=>` - 0% {transform: translate3d(0,${e*-200}%,0) scale(.6); opacity:.5;} - 100% {transform: translate3d(0,0,0) scale(1); opacity:1;} - `,ge=e=>` -@@ -169,10 +169,10 @@ to { - color: inherit; - flex: 1 1 auto; - white-space: pre-line; --`,Ae=(e,t)=>{let s=e.includes("top")?1:-1,[a,r]=b()?[he,xe]:[ye(s),ge(s)];return{animation:t?`${z(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${z(r)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},F=l.memo(({toast:e,position:t,style:o,children:s})=>{let a=e.height?Ae(e.position||t||"top-center",e.visible):{opacity:0},r=l.createElement(M,{toast:e}),c=l.createElement(Se,{...e.ariaProps},T(e.message,e));return l.createElement(be,{className:e.className,style:{...a,...o,...e.style}},typeof s=="function"?s({icon:r,message:c}):l.createElement(l.Fragment,null,r,c))});import{css as Pe,setup as Oe}from"goober";import*as f from"react";Oe(f.createElement);var Ee=({id:e,className:t,style:o,onHeightUpdate:s,children:a})=>{let r=f.useCallback(c=>{if(c){let i=()=>{let d=c.getBoundingClientRect().height;s(e,d)};i(),new MutationObserver(i).observe(c,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return f.createElement("div",{ref:r,className:t,style:o},a)},Re=(e,t)=>{let o=e.includes("top"),s=o?{top:0}:{bottom:0},a=e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:b()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(o?1:-1)}px)`,...s,...a}},ve=Pe` -+`,Ae=(e,t)=>{let s=e.includes("top")?1:-1,[a,r]=b()?[he,xe]:[ye(s),ge(s)];return{animation:t?`${z(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${z(r)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},F=l.memo(({toast:e,position:t,style:o,children:s})=>{let a=e.height?Ae(e.position||t||"top-center",e.visible):{opacity:0},r=l.createElement(M,{toast:e}),c=l.createElement(Se,{...e.ariaProps},f(e.message,e));return l.createElement(be,{className:e.className,style:{...a,...o,...e.style}},typeof s=="function"?s({icon:r,message:c}):l.createElement(l.Fragment,null,r,c))});import{css as Pe,setup as Oe}from"goober";import*as T from"react";Oe(T.createElement);var Ee=({id:e,className:t,style:o,onHeightUpdate:s,children:a})=>{let r=T.useCallback(c=>{if(c){let n=()=>{let d=c.getBoundingClientRect().height;s(e,d)};n(),new MutationObserver(n).observe(c,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement("div",{ref:r,className:t,style:o},a)},Re=(e,t)=>{let o=e.includes("top")||e.includes("center-"),s=o?{top:e.includes("center-")?"50%":0}:{bottom:0},a=e.includes("center-right")?{justifyContent:"flex-end"}:e.includes("center-left")?{justifyContent:"flex-start"}:e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:b()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(o?1:-1)}px)`,...s,...a}},ve=Pe` - z-index: 9999; - > * { - pointer-events: auto; - } --`,O=16,Ie=({reverseOrder:e,position:t="top-center",toastOptions:o,gutter:s,children:a,containerStyle:r,containerClassName:c})=>{let{toasts:i,handlers:d}=D(o);return f.createElement("div",{style:{position:"fixed",zIndex:9999,top:O,left:O,right:O,bottom:O,pointerEvents:"none",...r},className:c,onMouseEnter:d.startPause,onMouseLeave:d.endPause},i.map(p=>{let g=p.position||t,E=d.calculateOffset(p,{reverseOrder:e,gutter:s,defaultPosition:t}),x=Re(g,E);return f.createElement(Ee,{id:p.id,key:p.id,onHeightUpdate:d.updateHeight,className:p.visible?ve:"",style:x},p.type==="custom"?T(p.message,p):a?a(p):f.createElement(F,{toast:p,position:g}))}))};var _t=n;export{w as CheckmarkIcon,_ as ErrorIcon,V as LoaderIcon,F as ToastBar,M as ToastIcon,Ie as Toaster,_t as default,T as resolveValue,n as toast,D as useToaster,I as useToasterStore}; -+`,O=16,Ie=({reverseOrder:e,position:t="top-center",toastOptions:o,gutter:s,children:a,containerStyle:r,containerClassName:c})=>{let{toasts:n,handlers:d}=D(o);return T.createElement("div",{style:{position:"fixed",zIndex:9999,top:O,left:O,right:O,bottom:O,pointerEvents:"none",...r},className:c,onMouseEnter:d.startPause,onMouseLeave:d.endPause},n.map(p=>{let g=p.position||t,E=d.calculateOffset(p,{reverseOrder:e,gutter:s,defaultPosition:t}),x=Re(g,E);return T.createElement(Ee,{id:p.id,key:p.id,onHeightUpdate:d.updateHeight,className:p.visible?ve:"",style:x},p.type==="custom"?f(p.message,p):a?a(p):T.createElement(F,{toast:p,position:g}))}))};var _t=i;export{w as CheckmarkIcon,_ as ErrorIcon,V as LoaderIcon,F as ToastBar,M as ToastIcon,Ie as Toaster,_t as default,f as resolveValue,i as toast,D as useToaster,I as useToasterStore}; - //# sourceMappingURL=index.mjs.map -\ No newline at end of file -diff --git a/dist/index.mjs.map b/dist/index.mjs.map -index 43971e037c7a5c4986c7cad876afff9d85dd0da0..c71b1f52b35a2a880d78f53e2c8376ae2dd7227f 100644 ---- a/dist/index.mjs.map -+++ b/dist/index.mjs.map -@@ -1 +1 @@ --{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx","../src/index.ts"],"sourcesContent":["import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type Renderable = JSX.Element | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => JSX.Element;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nconst toastTimeouts = new Map>();\n\nexport const TOAST_EXPIRE_DISMISS_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, TOAST_EXPIRE_DISMISS_DELAY);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nconst clearFromRemoveQueue = (toastId: string) => {\n const timeout = toastTimeouts.get(toastId);\n if (timeout) {\n clearTimeout(timeout);\n }\n};\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n // ! Side effects !\n if (action.toast.id) {\n clearFromRemoveQueue(action.toast.id);\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return state.toasts.find((t) => t.id === toast.id)\n ? reducer(state, { type: ActionType.UPDATE_TOAST, toast })\n : reducer(state, { type: ActionType.ADD_TOAST, toast });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n // ! Side effects ! - This could be execrated into a dismissToast() action, but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId);\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id);\n });\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n useEffect(() => {\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, [state]);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise,\n msgs: {\n loading: Renderable;\n success: ValueOrFunction;\n error: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n promise\n .then((p) => {\n toast.success(resolveValue(msgs.success, p), {\n id,\n ...opts,\n ...opts?.success,\n });\n return p;\n })\n .catch((e) => {\n toast.error(resolveValue(msgs.error, e), {\n id,\n ...opts,\n ...opts?.error,\n });\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\nimport { ToastIcon } from './toast-icon';\nimport { prefersReducedMotion } from '../core/utils';\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`;\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`;\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\n\nconst ToastBarBase = styled('div')`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`;\n\nconst Message = styled('div')`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`;\n\ninterface ToastBarProps {\n toast: Toast;\n position?: ToastPosition;\n style?: React.CSSProperties;\n children?: (components: {\n icon: Renderable;\n message: Renderable;\n }) => Renderable;\n}\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes('top');\n const factor = top ? 1 : -1;\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)];\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n };\n};\n\nexport const ToastBar: React.FC = React.memo(\n ({ toast, position, style, children }) => {\n const animationStyle: React.CSSProperties = toast.height\n ? getAnimationStyle(\n toast.position || position || 'top-center',\n toast.visible\n )\n : { opacity: 0 };\n\n const icon = ;\n const message = (\n \n {resolveValue(toast.message, toast)}\n \n );\n\n return (\n \n {typeof children === 'function' ? (\n children({\n icon,\n message,\n })\n ) : (\n <>\n {icon}\n {message}\n \n )}\n \n );\n }\n);\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast } from '../core/types';\nimport { ErrorIcon, ErrorTheme } from './error';\nimport { LoaderIcon, LoaderTheme } from './loader';\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\n\nconst StatusWrapper = styled('div')`\n position: absolute;\n`;\n\nconst IndicatorWrapper = styled('div')`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`;\n\nconst enter = keyframes`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nexport const AnimatedIconWrapper = styled('div')`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`;\n\nexport type IconThemes = Partial<{\n success: CheckmarkTheme;\n error: ErrorTheme;\n loading: LoaderTheme;\n}>;\n\nexport const ToastIcon: React.FC<{\n toast: Toast;\n}> = ({ toast }) => {\n const { icon, type, iconTheme } = toast;\n if (icon !== undefined) {\n if (typeof icon === 'string') {\n return {icon};\n } else {\n return icon;\n }\n }\n\n if (type === 'blank') {\n return null;\n }\n\n return (\n \n \n {type !== 'loading' && (\n \n {type === 'error' ? (\n \n ) : (\n \n )}\n \n )}\n \n );\n};\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`;\n\nconst firstLineAnimation = keyframes`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nconst secondLineAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`;\n\nexport interface ErrorTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const ErrorIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#ff4b4b'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${(p) => p.secondary || '#fff'};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;\n","import { styled, keyframes } from 'goober';\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport interface LoaderTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const LoaderIcon = styled('div')`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${(p) => p.secondary || '#e0e0e0'};\n border-right-color: ${(p) => p.primary || '#616161'};\n animation: ${rotate} 1s linear infinite;\n`;\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`;\n\nconst checkmarkAnimation = keyframes`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`;\n\nexport interface CheckmarkTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const CheckmarkIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#61d345'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${(p) => p.secondary || '#fff'};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;\n","import { css, setup } from 'goober';\nimport * as React from 'react';\nimport {\n resolveValue,\n ToasterProps,\n ToastPosition,\n ToastWrapperProps,\n} from '../core/types';\nimport { useToaster } from '../core/use-toaster';\nimport { prefersReducedMotion } from '../core/utils';\nimport { ToastBar } from './toast-bar';\n\nsetup(React.createElement);\n\nconst ToastWrapper = ({\n id,\n className,\n style,\n onHeightUpdate,\n children,\n}: ToastWrapperProps) => {\n const ref = React.useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const updateHeight = () => {\n const height = el.getBoundingClientRect().height;\n onHeightUpdate(id, height);\n };\n updateHeight();\n new MutationObserver(updateHeight).observe(el, {\n subtree: true,\n childList: true,\n characterData: true,\n });\n }\n },\n [id, onHeightUpdate]\n );\n\n return (\n
\n {children}\n
\n );\n};\n\nconst getPositionStyle = (\n position: ToastPosition,\n offset: number\n): React.CSSProperties => {\n const top = position.includes('top');\n const verticalStyle: React.CSSProperties = top ? { top: 0 } : { bottom: 0 };\n const horizontalStyle: React.CSSProperties = position.includes('center')\n ? {\n justifyContent: 'center',\n }\n : position.includes('right')\n ? {\n justifyContent: 'flex-end',\n }\n : {};\n return {\n left: 0,\n right: 0,\n display: 'flex',\n position: 'absolute',\n transition: prefersReducedMotion()\n ? undefined\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\n ...verticalStyle,\n ...horizontalStyle,\n };\n};\n\nconst activeClass = css`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`;\n\nconst DEFAULT_OFFSET = 16;\n\nexport const Toaster: React.FC = ({\n reverseOrder,\n position = 'top-center',\n toastOptions,\n gutter,\n children,\n containerStyle,\n containerClassName,\n}) => {\n const { toasts, handlers } = useToaster(toastOptions);\n\n return (\n \n {toasts.map((t) => {\n const toastPosition = t.position || position;\n const offset = handlers.calculateOffset(t, {\n reverseOrder,\n gutter,\n defaultPosition: position,\n });\n const positionStyle = getPositionStyle(toastPosition, offset);\n\n return (\n \n {t.type === 'custom' ? (\n resolveValue(t.message, t)\n ) : children ? (\n children(t)\n ) : (\n \n )}\n \n );\n })}\n \n );\n};\n","import { toast } from './core/toast';\n\nexport * from './headless';\n\nexport { ToastBar } from './components/toast-bar';\nexport { ToastIcon } from './components/toast-icon';\nexport { Toaster } from './components/toaster';\nexport { CheckmarkIcon } from './components/checkmark';\nexport { ErrorIcon } from './components/error';\nexport { LoaderIcon } from './components/loader';\n\nexport { toast };\nexport default toast;\n"],"mappings":"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","names":[]} -\ No newline at end of file -+{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx","../src/index.ts"],"sourcesContent":["import { CSSProperties } from 'react';\r\n\r\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\r\nexport type ToastPosition =\r\n | 'top-left'\r\n | 'top-center'\r\n | 'top-right'\r\n | 'bottom-left'\r\n | 'bottom-center'\r\n | 'bottom-right'\r\n | 'center-right'\r\n | 'center-left';\r\n\r\nexport type Renderable = JSX.Element | string | null;\r\n\r\nexport interface IconTheme {\r\n primary: string;\r\n secondary: string;\r\n}\r\n\r\nexport type ValueFunction = (arg: TArg) => TValue;\r\nexport type ValueOrFunction =\r\n | TValue\r\n | ValueFunction;\r\n\r\nconst isFunction = (\r\n valOrFunction: ValueOrFunction\r\n): valOrFunction is ValueFunction =>\r\n typeof valOrFunction === 'function';\r\n\r\nexport const resolveValue = (\r\n valOrFunction: ValueOrFunction,\r\n arg: TArg\r\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\r\n\r\nexport interface Toast {\r\n type: ToastType;\r\n id: string;\r\n message: ValueOrFunction;\r\n icon?: Renderable;\r\n duration?: number;\r\n pauseDuration: number;\r\n position?: ToastPosition;\r\n\r\n ariaProps: {\r\n role: 'status' | 'alert';\r\n 'aria-live': 'assertive' | 'off' | 'polite';\r\n };\r\n\r\n style?: CSSProperties;\r\n className?: string;\r\n iconTheme?: IconTheme;\r\n\r\n createdAt: number;\r\n visible: boolean;\r\n height?: number;\r\n}\r\n\r\nexport type ToastOptions = Partial<\r\n Pick<\r\n Toast,\r\n | 'id'\r\n | 'icon'\r\n | 'duration'\r\n | 'ariaProps'\r\n | 'className'\r\n | 'style'\r\n | 'position'\r\n | 'iconTheme'\r\n >\r\n>;\r\n\r\nexport type DefaultToastOptions = ToastOptions & {\r\n [key in ToastType]?: ToastOptions;\r\n};\r\n\r\nexport interface ToasterProps {\r\n position?: ToastPosition;\r\n toastOptions?: DefaultToastOptions;\r\n reverseOrder?: boolean;\r\n gutter?: number;\r\n containerStyle?: React.CSSProperties;\r\n containerClassName?: string;\r\n children?: (toast: Toast) => JSX.Element;\r\n}\r\n\r\nexport interface ToastWrapperProps {\r\n id: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n onHeightUpdate: (id: string, height: number) => void;\r\n children?: React.ReactNode;\r\n}\r\n","export const genId = (() => {\r\n let count = 0;\r\n return () => {\r\n return (++count).toString();\r\n };\r\n})();\r\n\r\nexport const prefersReducedMotion = (() => {\r\n // Cache result\r\n let shouldReduceMotion: boolean | undefined = undefined;\r\n\r\n return () => {\r\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\r\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\r\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\r\n }\r\n return shouldReduceMotion;\r\n };\r\n})();\r\n","import { useEffect, useState } from 'react';\r\nimport { DefaultToastOptions, Toast, ToastType } from './types';\r\n\r\nconst TOAST_LIMIT = 20;\r\n\r\nexport enum ActionType {\r\n ADD_TOAST,\r\n UPDATE_TOAST,\r\n UPSERT_TOAST,\r\n DISMISS_TOAST,\r\n REMOVE_TOAST,\r\n START_PAUSE,\r\n END_PAUSE,\r\n}\r\n\r\ntype Action =\r\n | {\r\n type: ActionType.ADD_TOAST;\r\n toast: Toast;\r\n }\r\n | {\r\n type: ActionType.UPSERT_TOAST;\r\n toast: Toast;\r\n }\r\n | {\r\n type: ActionType.UPDATE_TOAST;\r\n toast: Partial;\r\n }\r\n | {\r\n type: ActionType.DISMISS_TOAST;\r\n toastId?: string;\r\n }\r\n | {\r\n type: ActionType.REMOVE_TOAST;\r\n toastId?: string;\r\n }\r\n | {\r\n type: ActionType.START_PAUSE;\r\n time: number;\r\n }\r\n | {\r\n type: ActionType.END_PAUSE;\r\n time: number;\r\n };\r\n\r\ninterface State {\r\n toasts: Toast[];\r\n pausedAt: number | undefined;\r\n}\r\n\r\nconst toastTimeouts = new Map>();\r\n\r\nexport const TOAST_EXPIRE_DISMISS_DELAY = 1000;\r\n\r\nconst addToRemoveQueue = (toastId: string) => {\r\n if (toastTimeouts.has(toastId)) {\r\n return;\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n toastTimeouts.delete(toastId);\r\n dispatch({\r\n type: ActionType.REMOVE_TOAST,\r\n toastId: toastId,\r\n });\r\n }, TOAST_EXPIRE_DISMISS_DELAY);\r\n\r\n toastTimeouts.set(toastId, timeout);\r\n};\r\n\r\nconst clearFromRemoveQueue = (toastId: string) => {\r\n const timeout = toastTimeouts.get(toastId);\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n};\r\n\r\nexport const reducer = (state: State, action: Action): State => {\r\n switch (action.type) {\r\n case ActionType.ADD_TOAST:\r\n return {\r\n ...state,\r\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\r\n };\r\n\r\n case ActionType.UPDATE_TOAST:\r\n // ! Side effects !\r\n if (action.toast.id) {\r\n clearFromRemoveQueue(action.toast.id);\r\n }\r\n\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === action.toast.id ? { ...t, ...action.toast } : t\r\n ),\r\n };\r\n\r\n case ActionType.UPSERT_TOAST:\r\n const { toast } = action;\r\n return state.toasts.find((t) => t.id === toast.id)\r\n ? reducer(state, { type: ActionType.UPDATE_TOAST, toast })\r\n : reducer(state, { type: ActionType.ADD_TOAST, toast });\r\n\r\n case ActionType.DISMISS_TOAST:\r\n const { toastId } = action;\r\n\r\n // ! Side effects ! - This could be execrated into a dismissToast() action, but I'll keep it here for simplicity\r\n if (toastId) {\r\n addToRemoveQueue(toastId);\r\n } else {\r\n state.toasts.forEach((toast) => {\r\n addToRemoveQueue(toast.id);\r\n });\r\n }\r\n\r\n return {\r\n ...state,\r\n toasts: state.toasts.map((t) =>\r\n t.id === toastId || toastId === undefined\r\n ? {\r\n ...t,\r\n visible: false,\r\n }\r\n : t\r\n ),\r\n };\r\n case ActionType.REMOVE_TOAST:\r\n if (action.toastId === undefined) {\r\n return {\r\n ...state,\r\n toasts: [],\r\n };\r\n }\r\n return {\r\n ...state,\r\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\r\n };\r\n\r\n case ActionType.START_PAUSE:\r\n return {\r\n ...state,\r\n pausedAt: action.time,\r\n };\r\n\r\n case ActionType.END_PAUSE:\r\n const diff = action.time - (state.pausedAt || 0);\r\n\r\n return {\r\n ...state,\r\n pausedAt: undefined,\r\n toasts: state.toasts.map((t) => ({\r\n ...t,\r\n pauseDuration: t.pauseDuration + diff,\r\n })),\r\n };\r\n }\r\n};\r\n\r\nconst listeners: Array<(state: State) => void> = [];\r\n\r\nlet memoryState: State = { toasts: [], pausedAt: undefined };\r\n\r\nexport const dispatch = (action: Action) => {\r\n memoryState = reducer(memoryState, action);\r\n listeners.forEach((listener) => {\r\n listener(memoryState);\r\n });\r\n};\r\n\r\nexport const defaultTimeouts: {\r\n [key in ToastType]: number;\r\n} = {\r\n blank: 4000,\r\n error: 4000,\r\n success: 2000,\r\n loading: Infinity,\r\n custom: 4000,\r\n};\r\n\r\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\r\n const [state, setState] = useState(memoryState);\r\n useEffect(() => {\r\n listeners.push(setState);\r\n return () => {\r\n const index = listeners.indexOf(setState);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n }, [state]);\r\n\r\n const mergedToasts = state.toasts.map((t) => ({\r\n ...toastOptions,\r\n ...toastOptions[t.type],\r\n ...t,\r\n duration:\r\n t.duration ||\r\n toastOptions[t.type]?.duration ||\r\n toastOptions?.duration ||\r\n defaultTimeouts[t.type],\r\n style: {\r\n ...toastOptions.style,\r\n ...toastOptions[t.type]?.style,\r\n ...t.style,\r\n },\r\n }));\r\n\r\n return {\r\n ...state,\r\n toasts: mergedToasts,\r\n };\r\n};\r\n","import {\r\n Renderable,\r\n Toast,\r\n ToastOptions,\r\n ToastType,\r\n DefaultToastOptions,\r\n ValueOrFunction,\r\n resolveValue,\r\n} from './types';\r\nimport { genId } from './utils';\r\nimport { dispatch, ActionType } from './store';\r\n\r\ntype Message = ValueOrFunction;\r\n\r\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\r\n\r\nconst createToast = (\r\n message: Message,\r\n type: ToastType = 'blank',\r\n opts?: ToastOptions\r\n): Toast => ({\r\n createdAt: Date.now(),\r\n visible: true,\r\n type,\r\n ariaProps: {\r\n role: 'status',\r\n 'aria-live': 'polite',\r\n },\r\n message,\r\n pauseDuration: 0,\r\n ...opts,\r\n id: opts?.id || genId(),\r\n});\r\n\r\nconst createHandler =\r\n (type?: ToastType): ToastHandler =>\r\n (message, options) => {\r\n const toast = createToast(message, type, options);\r\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\r\n return toast.id;\r\n };\r\n\r\nconst toast = (message: Message, opts?: ToastOptions) =>\r\n createHandler('blank')(message, opts);\r\n\r\ntoast.error = createHandler('error');\r\ntoast.success = createHandler('success');\r\ntoast.loading = createHandler('loading');\r\ntoast.custom = createHandler('custom');\r\n\r\ntoast.dismiss = (toastId?: string) => {\r\n dispatch({\r\n type: ActionType.DISMISS_TOAST,\r\n toastId,\r\n });\r\n};\r\n\r\ntoast.remove = (toastId?: string) =>\r\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\r\n\r\ntoast.promise = (\r\n promise: Promise,\r\n msgs: {\r\n loading: Renderable;\r\n success: ValueOrFunction;\r\n error: ValueOrFunction;\r\n },\r\n opts?: DefaultToastOptions\r\n) => {\r\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\r\n\r\n promise\r\n .then((p) => {\r\n toast.success(resolveValue(msgs.success, p), {\r\n id,\r\n ...opts,\r\n ...opts?.success,\r\n });\r\n return p;\r\n })\r\n .catch((e) => {\r\n toast.error(resolveValue(msgs.error, e), {\r\n id,\r\n ...opts,\r\n ...opts?.error,\r\n });\r\n });\r\n\r\n return promise;\r\n};\r\n\r\nexport { toast };\r\n","import { useEffect, useCallback } from 'react';\r\nimport { dispatch, ActionType, useStore } from './store';\r\nimport { toast } from './toast';\r\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\r\n\r\nconst updateHeight = (toastId: string, height: number) => {\r\n dispatch({\r\n type: ActionType.UPDATE_TOAST,\r\n toast: { id: toastId, height },\r\n });\r\n};\r\nconst startPause = () => {\r\n dispatch({\r\n type: ActionType.START_PAUSE,\r\n time: Date.now(),\r\n });\r\n};\r\n\r\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\r\n const { toasts, pausedAt } = useStore(toastOptions);\r\n\r\n useEffect(() => {\r\n if (pausedAt) {\r\n return;\r\n }\r\n\r\n const now = Date.now();\r\n const timeouts = toasts.map((t) => {\r\n if (t.duration === Infinity) {\r\n return;\r\n }\r\n\r\n const durationLeft =\r\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\r\n\r\n if (durationLeft < 0) {\r\n if (t.visible) {\r\n toast.dismiss(t.id);\r\n }\r\n return;\r\n }\r\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\r\n });\r\n\r\n return () => {\r\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\r\n };\r\n }, [toasts, pausedAt]);\r\n\r\n const endPause = useCallback(() => {\r\n if (pausedAt) {\r\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\r\n }\r\n }, [pausedAt]);\r\n\r\n const calculateOffset = useCallback(\r\n (\r\n toast: Toast,\r\n opts?: {\r\n reverseOrder?: boolean;\r\n gutter?: number;\r\n defaultPosition?: ToastPosition;\r\n }\r\n ) => {\r\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\r\n\r\n const relevantToasts = toasts.filter(\r\n (t) =>\r\n (t.position || defaultPosition) ===\r\n (toast.position || defaultPosition) && t.height\r\n );\r\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\r\n const toastsBefore = relevantToasts.filter(\r\n (toast, i) => i < toastIndex && toast.visible\r\n ).length;\r\n\r\n const offset = relevantToasts\r\n .filter((t) => t.visible)\r\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\r\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\r\n\r\n return offset;\r\n },\r\n [toasts]\r\n );\r\n\r\n return {\r\n toasts,\r\n handlers: {\r\n updateHeight,\r\n startPause,\r\n endPause,\r\n calculateOffset,\r\n },\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport { styled, keyframes } from 'goober';\r\n\r\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\r\nimport { ToastIcon } from './toast-icon';\r\nimport { prefersReducedMotion } from '../core/utils';\r\n\r\nconst enterAnimation = (factor: number) => `\r\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\r\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\r\n`;\r\n\r\nconst exitAnimation = (factor: number) => `\r\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\r\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\r\n`;\r\n\r\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\r\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\r\n\r\nconst ToastBarBase = styled('div')`\r\n display: flex;\r\n align-items: center;\r\n background: #fff;\r\n color: #363636;\r\n line-height: 1.3;\r\n will-change: transform;\r\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\r\n max-width: 350px;\r\n pointer-events: auto;\r\n padding: 8px 10px;\r\n border-radius: 8px;\r\n`;\r\n\r\nconst Message = styled('div')`\r\n display: flex;\r\n justify-content: center;\r\n margin: 4px 10px;\r\n color: inherit;\r\n flex: 1 1 auto;\r\n white-space: pre-line;\r\n`;\r\n\r\ninterface ToastBarProps {\r\n toast: Toast;\r\n position?: ToastPosition;\r\n style?: React.CSSProperties;\r\n children?: (components: {\r\n icon: Renderable;\r\n message: Renderable;\r\n }) => Renderable;\r\n}\r\n\r\nconst getAnimationStyle = (\r\n position: ToastPosition,\r\n visible: boolean\r\n): React.CSSProperties => {\r\n const top = position.includes('top');\r\n const factor = top ? 1 : -1;\r\n\r\n const [enter, exit] = prefersReducedMotion()\r\n ? [fadeInAnimation, fadeOutAnimation]\r\n : [enterAnimation(factor), exitAnimation(factor)];\r\n\r\n return {\r\n animation: visible\r\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\r\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\r\n };\r\n};\r\n\r\nexport const ToastBar: React.FC = React.memo(\r\n ({ toast, position, style, children }) => {\r\n const animationStyle: React.CSSProperties = toast.height\r\n ? getAnimationStyle(\r\n toast.position || position || 'top-center',\r\n toast.visible\r\n )\r\n : { opacity: 0 };\r\n\r\n const icon = ;\r\n const message = (\r\n \r\n {resolveValue(toast.message, toast)}\r\n \r\n );\r\n\r\n return (\r\n \r\n {typeof children === 'function' ? (\r\n children({\r\n icon,\r\n message,\r\n })\r\n ) : (\r\n <>\r\n {icon}\r\n {message}\r\n \r\n )}\r\n \r\n );\r\n }\r\n);\r\n","import * as React from 'react';\r\nimport { styled, keyframes } from 'goober';\r\n\r\nimport { Toast } from '../core/types';\r\nimport { ErrorIcon, ErrorTheme } from './error';\r\nimport { LoaderIcon, LoaderTheme } from './loader';\r\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\r\n\r\nconst StatusWrapper = styled('div')`\r\n position: absolute;\r\n`;\r\n\r\nconst IndicatorWrapper = styled('div')`\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-width: 20px;\r\n min-height: 20px;\r\n`;\r\n\r\nconst enter = keyframes`\r\nfrom {\r\n transform: scale(0.6);\r\n opacity: 0.4;\r\n}\r\nto {\r\n transform: scale(1);\r\n opacity: 1;\r\n}`;\r\n\r\nexport const AnimatedIconWrapper = styled('div')`\r\n position: relative;\r\n transform: scale(0.6);\r\n opacity: 0.4;\r\n min-width: 20px;\r\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\r\n forwards;\r\n`;\r\n\r\nexport type IconThemes = Partial<{\r\n success: CheckmarkTheme;\r\n error: ErrorTheme;\r\n loading: LoaderTheme;\r\n}>;\r\n\r\nexport const ToastIcon: React.FC<{\r\n toast: Toast;\r\n}> = ({ toast }) => {\r\n const { icon, type, iconTheme } = toast;\r\n if (icon !== undefined) {\r\n if (typeof icon === 'string') {\r\n return {icon};\r\n } else {\r\n return icon;\r\n }\r\n }\r\n\r\n if (type === 'blank') {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {type !== 'loading' && (\r\n \r\n {type === 'error' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { styled, keyframes } from 'goober';\r\n\r\nconst circleAnimation = keyframes`\r\nfrom {\r\n transform: scale(0) rotate(45deg);\r\n\topacity: 0;\r\n}\r\nto {\r\n transform: scale(1) rotate(45deg);\r\n opacity: 1;\r\n}`;\r\n\r\nconst firstLineAnimation = keyframes`\r\nfrom {\r\n transform: scale(0);\r\n opacity: 0;\r\n}\r\nto {\r\n transform: scale(1);\r\n opacity: 1;\r\n}`;\r\n\r\nconst secondLineAnimation = keyframes`\r\nfrom {\r\n transform: scale(0) rotate(90deg);\r\n\topacity: 0;\r\n}\r\nto {\r\n transform: scale(1) rotate(90deg);\r\n\topacity: 1;\r\n}`;\r\n\r\nexport interface ErrorTheme {\r\n primary?: string;\r\n secondary?: string;\r\n}\r\n\r\nexport const ErrorIcon = styled('div')`\r\n width: 20px;\r\n opacity: 0;\r\n height: 20px;\r\n border-radius: 10px;\r\n background: ${(p) => p.primary || '#ff4b4b'};\r\n position: relative;\r\n transform: rotate(45deg);\r\n\r\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\r\n forwards;\r\n animation-delay: 100ms;\r\n\r\n &:after,\r\n &:before {\r\n content: '';\r\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\r\n animation-delay: 150ms;\r\n position: absolute;\r\n border-radius: 3px;\r\n opacity: 0;\r\n background: ${(p) => p.secondary || '#fff'};\r\n bottom: 9px;\r\n left: 4px;\r\n height: 2px;\r\n width: 12px;\r\n }\r\n\r\n &:before {\r\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\r\n animation-delay: 180ms;\r\n transform: rotate(90deg);\r\n }\r\n`;\r\n","import { styled, keyframes } from 'goober';\r\n\r\nconst rotate = keyframes`\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n`;\r\n\r\nexport interface LoaderTheme {\r\n primary?: string;\r\n secondary?: string;\r\n}\r\n\r\nexport const LoaderIcon = styled('div')`\r\n width: 12px;\r\n height: 12px;\r\n box-sizing: border-box;\r\n border: 2px solid;\r\n border-radius: 100%;\r\n border-color: ${(p) => p.secondary || '#e0e0e0'};\r\n border-right-color: ${(p) => p.primary || '#616161'};\r\n animation: ${rotate} 1s linear infinite;\r\n`;\r\n","import { styled, keyframes } from 'goober';\r\n\r\nconst circleAnimation = keyframes`\r\nfrom {\r\n transform: scale(0) rotate(45deg);\r\n\topacity: 0;\r\n}\r\nto {\r\n transform: scale(1) rotate(45deg);\r\n\topacity: 1;\r\n}`;\r\n\r\nconst checkmarkAnimation = keyframes`\r\n0% {\r\n\theight: 0;\r\n\twidth: 0;\r\n\topacity: 0;\r\n}\r\n40% {\r\n height: 0;\r\n\twidth: 6px;\r\n\topacity: 1;\r\n}\r\n100% {\r\n opacity: 1;\r\n height: 10px;\r\n}`;\r\n\r\nexport interface CheckmarkTheme {\r\n primary?: string;\r\n secondary?: string;\r\n}\r\n\r\nexport const CheckmarkIcon = styled('div')`\r\n width: 20px;\r\n opacity: 0;\r\n height: 20px;\r\n border-radius: 10px;\r\n background: ${(p) => p.primary || '#61d345'};\r\n position: relative;\r\n transform: rotate(45deg);\r\n\r\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\r\n forwards;\r\n animation-delay: 100ms;\r\n &:after {\r\n content: '';\r\n box-sizing: border-box;\r\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\r\n opacity: 0;\r\n animation-delay: 200ms;\r\n position: absolute;\r\n border-right: 2px solid;\r\n border-bottom: 2px solid;\r\n border-color: ${(p) => p.secondary || '#fff'};\r\n bottom: 6px;\r\n left: 6px;\r\n height: 10px;\r\n width: 6px;\r\n }\r\n`;\r\n","import { css, setup } from 'goober';\r\nimport * as React from 'react';\r\nimport {\r\n resolveValue,\r\n ToasterProps,\r\n ToastPosition,\r\n ToastWrapperProps,\r\n} from '../core/types';\r\nimport { useToaster } from '../core/use-toaster';\r\nimport { prefersReducedMotion } from '../core/utils';\r\nimport { ToastBar } from './toast-bar';\r\n\r\nsetup(React.createElement);\r\n\r\nconst ToastWrapper = ({\r\n id,\r\n className,\r\n style,\r\n onHeightUpdate,\r\n children,\r\n}: ToastWrapperProps) => {\r\n const ref = React.useCallback(\r\n (el: HTMLElement | null) => {\r\n if (el) {\r\n const updateHeight = () => {\r\n const height = el.getBoundingClientRect().height;\r\n onHeightUpdate(id, height);\r\n };\r\n updateHeight();\r\n new MutationObserver(updateHeight).observe(el, {\r\n subtree: true,\r\n childList: true,\r\n characterData: true,\r\n });\r\n }\r\n },\r\n [id, onHeightUpdate]\r\n );\r\n\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};\r\n\r\nconst getPositionStyle = (\r\n position: ToastPosition,\r\n offset: number\r\n): React.CSSProperties => {\r\n const top = position.includes('top') || position.includes('center-');\r\n const verticalStyle: React.CSSProperties = top\r\n ? {\r\n top: position.includes('center-') ? '50%' : 0,\r\n }\r\n : { bottom: 0 };\r\n const horizontalStyle: React.CSSProperties = position.includes('center-right')\r\n ? { justifyContent: 'flex-end' }\r\n : position.includes('center-left')\r\n ? { justifyContent: 'flex-start' }\r\n : position.includes('center')\r\n ? {\r\n justifyContent: 'center',\r\n }\r\n : position.includes('right')\r\n ? {\r\n justifyContent: 'flex-end',\r\n }\r\n : {};\r\n return {\r\n left: 0,\r\n right: 0,\r\n display: 'flex',\r\n position: 'absolute',\r\n transition: prefersReducedMotion()\r\n ? undefined\r\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\r\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\r\n ...verticalStyle,\r\n ...horizontalStyle,\r\n };\r\n};\r\n\r\nconst activeClass = css`\r\n z-index: 9999;\r\n > * {\r\n pointer-events: auto;\r\n }\r\n`;\r\n\r\nconst DEFAULT_OFFSET = 16;\r\n\r\nexport const Toaster: React.FC = ({\r\n reverseOrder,\r\n position = 'top-center',\r\n toastOptions,\r\n gutter,\r\n children,\r\n containerStyle,\r\n containerClassName,\r\n}) => {\r\n const { toasts, handlers } = useToaster(toastOptions);\r\n\r\n return (\r\n \r\n {toasts.map((t) => {\r\n const toastPosition = t.position || position;\r\n const offset = handlers.calculateOffset(t, {\r\n reverseOrder,\r\n gutter,\r\n defaultPosition: position,\r\n });\r\n const positionStyle = getPositionStyle(toastPosition, offset);\r\n\r\n return (\r\n \r\n {t.type === 'custom' ? (\r\n resolveValue(t.message, t)\r\n ) : children ? (\r\n children(t)\r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n","import { toast } from './core/toast';\r\n\r\nexport * from './headless';\r\n\r\nexport { ToastBar } from './components/toast-bar';\r\nexport { ToastIcon } from './components/toast-icon';\r\nexport { Toaster } from './components/toaster';\r\nexport { CheckmarkIcon } from './components/checkmark';\r\nexport { ErrorIcon } from './components/error';\r\nexport { LoaderIcon } from './components/loader';\r\n\r\nexport { toast };\r\nexport default toast;\r\n"],"mappings":"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","names":[]} -\ No newline at end of file -diff --git a/src/components/toaster.tsx b/src/components/toaster.tsx -index 16182faddcaa2b6d2c40d448068db6421f39b64c..9d03025e1b04dc511091a10918f2fe53aad57fc1 100644 ---- a/src/components/toaster.tsx -+++ b/src/components/toaster.tsx -@@ -48,9 +48,17 @@ const getPositionStyle = ( - position: ToastPosition, - offset: number - ): React.CSSProperties => { -- const top = position.includes('top'); -- const verticalStyle: React.CSSProperties = top ? { top: 0 } : { bottom: 0 }; -- const horizontalStyle: React.CSSProperties = position.includes('center') -+ const top = position.includes('top') || position.includes('center-'); -+ const verticalStyle: React.CSSProperties = top -+ ? { -+ top: position.includes('center-') ? '50%' : 0, -+ } -+ : { bottom: 0 }; -+ const horizontalStyle: React.CSSProperties = position.includes('center-right') -+ ? { justifyContent: 'flex-end' } -+ : position.includes('center-left') -+ ? { justifyContent: 'flex-start' } -+ : position.includes('center') - ? { - justifyContent: 'center', - } -diff --git a/src/core/types.ts b/src/core/types.ts -index cd6f67af4cea51b73ce9225c2f6fd9ff0c3e0d2e..4789baa61b9a40ac9726777a8d1a1f93bc09d2b2 100644 ---- a/src/core/types.ts -+++ b/src/core/types.ts -@@ -7,7 +7,9 @@ export type ToastPosition = - | 'top-right' - | 'bottom-left' - | 'bottom-center' -- | 'bottom-right'; -+ | 'bottom-right' -+ | 'center-right' -+ | 'center-left'; - - export type Renderable = JSX.Element | string | null; - \ No newline at end of file diff --git a/web/patches/react-hot-toast@2.5.2.patch b/web/patches/react-hot-toast@2.5.2.patch new file mode 100644 index 0000000..80ff1a9 --- /dev/null +++ b/web/patches/react-hot-toast@2.5.2.patch @@ -0,0 +1,280 @@ +diff --git a/dist/index.d.ts b/dist/index.d.ts +index c797608a39b3b437c54f7966760b4e355fea7f81..7fa003924520972e1196b4c3f50420953146d646 100644 +--- a/dist/index.d.ts ++++ b/dist/index.d.ts +@@ -3,7 +3,7 @@ import { CSSProperties } from 'react'; + import * as goober from 'goober'; + + type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom'; +-type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'; ++type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | 'center-right' | 'center-left'; + type Renderable = React.ReactElement | string | null; + interface IconTheme { + primary: string; +diff --git a/dist/index.js b/dist/index.js +index a89124854a2a137e10d8369f641450b9f4f2b7d4..36722063f0ac32cc8328b18596751b54c2589b12 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1,5 +1,5 @@ + "use client"; +-"use strict";var q=Object.create;var O=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(e,t)=>{for(var o in t)O(e,o,{get:t[o],enumerable:!0})},H=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of J(t))!X.call(e,a)&&a!==o&&O(e,a,{get:()=>t[a],enumerable:!(s=G(t,a))||s.enumerable});return e};var W=(e,t,o)=>(o=e!=null?q(K(e)):{},H(t||!e||!e.__esModule?O(o,"default",{value:e,enumerable:!0}):o,e)),ee=e=>H(O({},"__esModule",{value:!0}),e);var Ve={};Z(Ve,{CheckmarkIcon:()=>F,ErrorIcon:()=>w,LoaderIcon:()=>C,ToastBar:()=>$,ToastIcon:()=>U,Toaster:()=>Y,default:()=>ke,resolveValue:()=>u,toast:()=>n,useToaster:()=>_,useToasterStore:()=>V});module.exports=ee(Ve);var te=e=>typeof e=="function",u=(e,t)=>te(e)?e(t):e;var j=(()=>{let e=0;return()=>(++e).toString()})(),I=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();var x=require("react"),oe=20;var Q=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,oe)};case 1:return{...e,toasts:e.toasts.map(r=>r.id===t.toast.id?{...r,...t.toast}:r)};case 2:let{toast:o}=t;return Q(e,{type:e.toasts.find(r=>r.id===o.id)?1:0,toast:o});case 3:let{toastId:s}=t;return{...e,toasts:e.toasts.map(r=>r.id===s||s===void 0?{...r,dismissed:!0,visible:!1}:r)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(r=>r.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(r=>({...r,pauseDuration:r.pauseDuration+a}))}}},k=[],y={toasts:[],pausedAt:void 0},l=e=>{y=Q(y,e),k.forEach(t=>{t(y)})},re={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},V=(e={})=>{let[t,o]=(0,x.useState)(y),s=(0,x.useRef)(y);(0,x.useEffect)(()=>(s.current!==y&&o(y),k.push(o),()=>{let r=k.indexOf(o);r>-1&&k.splice(r,1)}),[]);let a=t.toasts.map(r=>{var c,i,p;return{...e,...e[r.type],...r,removeDelay:r.removeDelay||((c=e[r.type])==null?void 0:c.removeDelay)||(e==null?void 0:e.removeDelay),duration:r.duration||((i=e[r.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||re[r.type],style:{...e.style,...(p=e[r.type])==null?void 0:p.style,...r.style}}});return{...t,toasts:a}};var ae=(e,t="blank",o)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...o,id:(o==null?void 0:o.id)||j()}),R=e=>(t,o)=>{let s=ae(t,e,o);return l({type:2,toast:s}),s.id},n=(e,t)=>R("blank")(e,t);n.error=R("error");n.success=R("success");n.loading=R("loading");n.custom=R("custom");n.dismiss=e=>{l({type:3,toastId:e})};n.remove=e=>l({type:4,toastId:e});n.promise=(e,t,o)=>{let s=n.loading(t.loading,{...o,...o==null?void 0:o.loading});return typeof e=="function"&&(e=e()),e.then(a=>{let r=t.success?u(t.success,a):void 0;return r?n.success(r,{id:s,...o,...o==null?void 0:o.success}):n.dismiss(s),a}).catch(a=>{let r=t.error?u(t.error,a):void 0;r?n.error(r,{id:s,...o,...o==null?void 0:o.error}):n.dismiss(s)}),e};var b=require("react");var ie=(e,t)=>{l({type:1,toast:{id:e,height:t}})},ne=()=>{l({type:5,time:Date.now()})},v=new Map,ce=1e3,pe=(e,t=ce)=>{if(v.has(e))return;let o=setTimeout(()=>{v.delete(e),l({type:4,toastId:e})},t);v.set(e,o)},_=e=>{let{toasts:t,pausedAt:o}=V(e);(0,b.useEffect)(()=>{if(o)return;let r=Date.now(),c=t.map(i=>{if(i.duration===1/0)return;let p=(i.duration||0)+i.pauseDuration-(r-i.createdAt);if(p<0){i.visible&&n.dismiss(i.id);return}return setTimeout(()=>n.dismiss(i.id),p)});return()=>{c.forEach(i=>i&&clearTimeout(i))}},[t,o]);let s=(0,b.useCallback)(()=>{o&&l({type:6,time:Date.now()})},[o]),a=(0,b.useCallback)((r,c)=>{let{reverseOrder:i=!1,gutter:p=8,defaultPosition:d}=c||{},h=t.filter(m=>(m.position||d)===(r.position||d)&&m.height),z=h.findIndex(m=>m.id===r.id),D=h.filter((m,B)=>Bm.visible).slice(...i?[D+1]:[0,D]).reduce((m,B)=>m+(B.height||0)+p,0)},[t]);return(0,b.useEffect)(()=>{t.forEach(r=>{if(r.dismissed)pe(r.id,r.removeDelay);else{let c=v.get(r.id);c&&(clearTimeout(c),v.delete(r.id))}})},[t]),{toasts:t,handlers:{updateHeight:ie,startPause:ne,endPause:s,calculateOffset:a}}};var f=W(require("react")),P=require("goober");var g=W(require("react")),A=require("goober");var S=require("goober"),de=S.keyframes` ++"use strict";var q=Object.create;var O=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(e,t)=>{for(var o in t)O(e,o,{get:t[o],enumerable:!0})},H=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of J(t))!X.call(e,a)&&a!==o&&O(e,a,{get:()=>t[a],enumerable:!(s=G(t,a))||s.enumerable});return e};var W=(e,t,o)=>(o=e!=null?q(K(e)):{},H(t||!e||!e.__esModule?O(o,"default",{value:e,enumerable:!0}):o,e)),ee=e=>H(O({},"__esModule",{value:!0}),e);var Ve={};Z(Ve,{CheckmarkIcon:()=>F,ErrorIcon:()=>w,LoaderIcon:()=>M,ToastBar:()=>$,ToastIcon:()=>U,Toaster:()=>Y,default:()=>ke,resolveValue:()=>m,toast:()=>n,useToaster:()=>_,useToasterStore:()=>V});module.exports=ee(Ve);var te=e=>typeof e=="function",m=(e,t)=>te(e)?e(t):e;var j=(()=>{let e=0;return()=>(++e).toString()})(),I=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();var x=require("react"),oe=20;var Q=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,oe)};case 1:return{...e,toasts:e.toasts.map(r=>r.id===t.toast.id?{...r,...t.toast}:r)};case 2:let{toast:o}=t;return Q(e,{type:e.toasts.find(r=>r.id===o.id)?1:0,toast:o});case 3:let{toastId:s}=t;return{...e,toasts:e.toasts.map(r=>r.id===s||s===void 0?{...r,dismissed:!0,visible:!1}:r)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(r=>r.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(r=>({...r,pauseDuration:r.pauseDuration+a}))}}},k=[],y={toasts:[],pausedAt:void 0},u=e=>{y=Q(y,e),k.forEach(t=>{t(y)})},re={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},V=(e={})=>{let[t,o]=(0,x.useState)(y),s=(0,x.useRef)(y);(0,x.useEffect)(()=>(s.current!==y&&o(y),k.push(o),()=>{let r=k.indexOf(o);r>-1&&k.splice(r,1)}),[]);let a=t.toasts.map(r=>{var c,i,p;return{...e,...e[r.type],...r,removeDelay:r.removeDelay||((c=e[r.type])==null?void 0:c.removeDelay)||(e==null?void 0:e.removeDelay),duration:r.duration||((i=e[r.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||re[r.type],style:{...e.style,...(p=e[r.type])==null?void 0:p.style,...r.style}}});return{...t,toasts:a}};var ae=(e,t="blank",o)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...o,id:(o==null?void 0:o.id)||j()}),R=e=>(t,o)=>{let s=ae(t,e,o);return u({type:2,toast:s}),s.id},n=(e,t)=>R("blank")(e,t);n.error=R("error");n.success=R("success");n.loading=R("loading");n.custom=R("custom");n.dismiss=e=>{u({type:3,toastId:e})};n.remove=e=>u({type:4,toastId:e});n.promise=(e,t,o)=>{let s=n.loading(t.loading,{...o,...o==null?void 0:o.loading});return typeof e=="function"&&(e=e()),e.then(a=>{let r=t.success?m(t.success,a):void 0;return r?n.success(r,{id:s,...o,...o==null?void 0:o.success}):n.dismiss(s),a}).catch(a=>{let r=t.error?m(t.error,a):void 0;r?n.error(r,{id:s,...o,...o==null?void 0:o.error}):n.dismiss(s)}),e};var b=require("react");var ie=(e,t)=>{u({type:1,toast:{id:e,height:t}})},ne=()=>{u({type:5,time:Date.now()})},v=new Map,ce=1e3,pe=(e,t=ce)=>{if(v.has(e))return;let o=setTimeout(()=>{v.delete(e),u({type:4,toastId:e})},t);v.set(e,o)},_=e=>{let{toasts:t,pausedAt:o}=V(e);(0,b.useEffect)(()=>{if(o)return;let r=Date.now(),c=t.map(i=>{if(i.duration===1/0)return;let p=(i.duration||0)+i.pauseDuration-(r-i.createdAt);if(p<0){i.visible&&n.dismiss(i.id);return}return setTimeout(()=>n.dismiss(i.id),p)});return()=>{c.forEach(i=>i&&clearTimeout(i))}},[t,o]);let s=(0,b.useCallback)(()=>{o&&u({type:6,time:Date.now()})},[o]),a=(0,b.useCallback)((r,c)=>{let{reverseOrder:i=!1,gutter:p=8,defaultPosition:d}=c||{},h=t.filter(l=>(l.position||d)===(r.position||d)&&l.height),z=h.findIndex(l=>l.id===r.id),D=h.filter((l,B)=>Bl.visible).slice(...i?[D+1]:[0,D]).reduce((l,B)=>l+(B.height||0)+p,0)},[t]);return(0,b.useEffect)(()=>{t.forEach(r=>{if(r.dismissed)pe(r.id,r.removeDelay);else{let c=v.get(r.id);c&&(clearTimeout(c),v.delete(r.id))}})},[t]),{toasts:t,handlers:{updateHeight:ie,startPause:ne,endPause:s,calculateOffset:a}}};var f=W(require("react")),P=require("goober");var g=W(require("react")),A=require("goober");var S=require("goober"),de=S.keyframes` + from { + transform: scale(0) rotate(45deg); + opacity: 0; +@@ -7,7 +7,7 @@ from { + to { + transform: scale(1) rotate(45deg); + opacity: 1; +-}`,me=S.keyframes` ++}`,le=S.keyframes` + from { + transform: scale(0); + opacity: 0; +@@ -15,7 +15,7 @@ from { + to { + transform: scale(1); + opacity: 1; +-}`,ue=S.keyframes` ++}`,me=S.keyframes` + from { + transform: scale(0) rotate(90deg); + opacity: 0; +@@ -39,7 +39,7 @@ to { + &:after, + &:before { + content: ''; +- animation: ${me} 0.15s ease-out forwards; ++ animation: ${le} 0.15s ease-out forwards; + animation-delay: 150ms; + position: absolute; + border-radius: 3px; +@@ -52,18 +52,18 @@ to { + } + + &:before { +- animation: ${ue} 0.15s ease-out forwards; ++ animation: ${me} 0.15s ease-out forwards; + animation-delay: 180ms; + transform: rotate(90deg); + } +-`;var M=require("goober"),le=M.keyframes` ++`;var C=require("goober"),ue=C.keyframes` + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +-`,C=(0,M.styled)("div")` ++`,M=(0,C.styled)("div")` + width: 12px; + height: 12px; + box-sizing: border-box; +@@ -71,7 +71,7 @@ to { + border-radius: 100%; + border-color: ${e=>e.secondary||"#e0e0e0"}; + border-right-color: ${e=>e.primary||"#616161"}; +- animation: ${le} 1s linear infinite; ++ animation: ${ue} 1s linear infinite; + `;var E=require("goober"),fe=E.keyframes` + from { + transform: scale(0) rotate(45deg); +@@ -145,7 +145,7 @@ to { + min-width: 20px; + animation: ${he} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; +-`,U=({toast:e})=>{let{icon:t,type:o,iconTheme:s}=e;return t!==void 0?typeof t=="string"?g.createElement(xe,null,t):t:o==="blank"?null:g.createElement(ge,null,g.createElement(C,{...s}),o!=="loading"&&g.createElement(ye,null,o==="error"?g.createElement(w,{...s}):g.createElement(F,{...s})))};var be=e=>` ++`,U=({toast:e})=>{let{icon:t,type:o,iconTheme:s}=e;return t!==void 0?typeof t=="string"?g.createElement(xe,null,t):t:o==="blank"?null:g.createElement(ge,null,g.createElement(M,{...s}),o!=="loading"&&g.createElement(ye,null,o==="error"?g.createElement(w,{...s}):g.createElement(F,{...s})))};var be=e=>` + 0% {transform: translate3d(0,${e*-200}%,0) scale(.6); opacity:.5;} + 100% {transform: translate3d(0,0,0) scale(1); opacity:1;} + `,Se=e=>` +@@ -170,10 +170,10 @@ to { + color: inherit; + flex: 1 1 auto; + white-space: pre-line; +-`,Ee=(e,t)=>{let s=e.includes("top")?1:-1,[a,r]=I()?[Ae,Pe]:[be(s),Se(s)];return{animation:t?`${(0,P.keyframes)(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${(0,P.keyframes)(r)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},$=f.memo(({toast:e,position:t,style:o,children:s})=>{let a=e.height?Ee(e.position||t||"top-center",e.visible):{opacity:0},r=f.createElement(U,{toast:e}),c=f.createElement(ve,{...e.ariaProps},u(e.message,e));return f.createElement(Re,{className:e.className,style:{...a,...o,...e.style}},typeof s=="function"?s({icon:r,message:c}):f.createElement(f.Fragment,null,r,c))});var N=require("goober"),T=W(require("react"));(0,N.setup)(T.createElement);var De=({id:e,className:t,style:o,onHeightUpdate:s,children:a})=>{let r=T.useCallback(c=>{if(c){let i=()=>{let p=c.getBoundingClientRect().height;s(e,p)};i(),new MutationObserver(i).observe(c,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement("div",{ref:r,className:t,style:o},a)},Oe=(e,t)=>{let o=e.includes("top"),s=o?{top:0}:{bottom:0},a=e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:I()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(o?1:-1)}px)`,...s,...a}},Ie=N.css` ++`,Ee=(e,t)=>{let s=e.includes("top")?1:-1,[a,r]=I()?[Ae,Pe]:[be(s),Se(s)];return{animation:t?`${(0,P.keyframes)(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${(0,P.keyframes)(r)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},$=f.memo(({toast:e,position:t,style:o,children:s})=>{let a=e.height?Ee(e.position||t||"top-center",e.visible):{opacity:0},r=f.createElement(U,{toast:e}),c=f.createElement(ve,{...e.ariaProps},m(e.message,e));return f.createElement(Re,{className:e.className,style:{...a,...o,...e.style}},typeof s=="function"?s({icon:r,message:c}):f.createElement(f.Fragment,null,r,c))});var N=require("goober"),T=W(require("react"));(0,N.setup)(T.createElement);var De=({id:e,className:t,style:o,onHeightUpdate:s,children:a})=>{let r=T.useCallback(c=>{if(c){let i=()=>{let p=c.getBoundingClientRect().height;s(e,p)};i(),new MutationObserver(i).observe(c,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement("div",{ref:r,className:t,style:o},a)},Oe=(e,t)=>{let o=e.includes("top")||e.includes("center-"),s=o?{top:e.includes("center-")?"50%":0}:{bottom:0},a=e.includes("center-right")?{justifyContent:"flex-end"}:e.includes("center-left")?{justifyContent:"flex-start"}:e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:I()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(o?1:-1)}px)`,...s,...a}},Ie=N.css` + z-index: 9999; + > * { + pointer-events: auto; + } +-`,L=16,Y=({reverseOrder:e,position:t="top-center",toastOptions:o,gutter:s,children:a,containerStyle:r,containerClassName:c})=>{let{toasts:i,handlers:p}=_(o);return T.createElement("div",{id:"_rht_toaster",style:{position:"fixed",zIndex:9999,top:L,left:L,right:L,bottom:L,pointerEvents:"none",...r},className:c,onMouseEnter:p.startPause,onMouseLeave:p.endPause},i.map(d=>{let h=d.position||t,z=p.calculateOffset(d,{reverseOrder:e,gutter:s,defaultPosition:t}),D=Oe(h,z);return T.createElement(De,{id:d.id,key:d.id,onHeightUpdate:p.updateHeight,className:d.visible?Ie:"",style:D},d.type==="custom"?u(d.message,d):a?a(d):T.createElement($,{toast:d,position:h}))}))};var ke=n;0&&(module.exports={CheckmarkIcon,ErrorIcon,LoaderIcon,ToastBar,ToastIcon,Toaster,resolveValue,toast,useToaster,useToasterStore}); ++`,L=16,Y=({reverseOrder:e,position:t="top-center",toastOptions:o,gutter:s,children:a,containerStyle:r,containerClassName:c})=>{let{toasts:i,handlers:p}=_(o);return T.createElement("div",{id:"_rht_toaster",style:{position:"fixed",zIndex:9999,top:L,left:L,right:L,bottom:L,pointerEvents:"none",...r},className:c,onMouseEnter:p.startPause,onMouseLeave:p.endPause},i.map(d=>{let h=d.position||t,z=p.calculateOffset(d,{reverseOrder:e,gutter:s,defaultPosition:t}),D=Oe(h,z);return T.createElement(De,{id:d.id,key:d.id,onHeightUpdate:p.updateHeight,className:d.visible?Ie:"",style:D},d.type==="custom"?m(d.message,d):a?a(d):T.createElement($,{toast:d,position:h}))}))};var ke=n;0&&(module.exports={CheckmarkIcon,ErrorIcon,LoaderIcon,ToastBar,ToastIcon,Toaster,resolveValue,toast,useToaster,useToasterStore}); + //# sourceMappingURL=index.js.map +\ No newline at end of file +diff --git a/dist/index.js.map b/dist/index.js.map +index 2989273cd20dc4472472fe8b7d57b42243b9d062..66495e740fdfae2c7c96691808b50e8dbea25ecf 100644 +--- a/dist/index.js.map ++++ b/dist/index.js.map +@@ -1 +1 @@ +-{"version":3,"sources":["../src/index.ts","../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx"],"sourcesContent":["import { toast } from './core/toast';\n\nexport * from './headless';\n\nexport { ToastBar } from './components/toast-bar';\nexport { ToastIcon } from './components/toast-icon';\nexport { Toaster } from './components/toaster';\nexport { CheckmarkIcon } from './components/checkmark';\nexport { ErrorIcon } from './components/error';\nexport { LoaderIcon } from './components/loader';\n\nexport { toast };\nexport default toast;\n","import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\nimport { ToastIcon } from './toast-icon';\nimport { prefersReducedMotion } from '../core/utils';\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`;\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`;\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\n\nconst ToastBarBase = styled('div')`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`;\n\nconst Message = styled('div')`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`;\n\ninterface ToastBarProps {\n toast: Toast;\n position?: ToastPosition;\n style?: React.CSSProperties;\n children?: (components: {\n icon: Renderable;\n message: Renderable;\n }) => Renderable;\n}\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes('top');\n const factor = top ? 1 : -1;\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)];\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n };\n};\n\nexport const ToastBar: React.FC = React.memo(\n ({ toast, position, style, children }) => {\n const animationStyle: React.CSSProperties = toast.height\n ? getAnimationStyle(\n toast.position || position || 'top-center',\n toast.visible\n )\n : { opacity: 0 };\n\n const icon = ;\n const message = (\n \n {resolveValue(toast.message, toast)}\n \n );\n\n return (\n \n {typeof children === 'function' ? (\n children({\n icon,\n message,\n })\n ) : (\n <>\n {icon}\n {message}\n \n )}\n \n );\n }\n);\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast } from '../core/types';\nimport { ErrorIcon, ErrorTheme } from './error';\nimport { LoaderIcon, LoaderTheme } from './loader';\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\n\nconst StatusWrapper = styled('div')`\n position: absolute;\n`;\n\nconst IndicatorWrapper = styled('div')`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`;\n\nconst enter = keyframes`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nexport const AnimatedIconWrapper = styled('div')`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`;\n\nexport type IconThemes = Partial<{\n success: CheckmarkTheme;\n error: ErrorTheme;\n loading: LoaderTheme;\n}>;\n\nexport const ToastIcon: React.FC<{\n toast: Toast;\n}> = ({ toast }) => {\n const { icon, type, iconTheme } = toast;\n if (icon !== undefined) {\n if (typeof icon === 'string') {\n return {icon};\n } else {\n return icon;\n }\n }\n\n if (type === 'blank') {\n return null;\n }\n\n return (\n \n \n {type !== 'loading' && (\n \n {type === 'error' ? (\n \n ) : (\n \n )}\n \n )}\n \n );\n};\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`;\n\nconst firstLineAnimation = keyframes`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nconst secondLineAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`;\n\nexport interface ErrorTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const ErrorIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#ff4b4b'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${(p) => p.secondary || '#fff'};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;\n","import { styled, keyframes } from 'goober';\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport interface LoaderTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const LoaderIcon = styled('div')`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${(p) => p.secondary || '#e0e0e0'};\n border-right-color: ${(p) => p.primary || '#616161'};\n animation: ${rotate} 1s linear infinite;\n`;\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`;\n\nconst checkmarkAnimation = keyframes`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`;\n\nexport interface CheckmarkTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const CheckmarkIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#61d345'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${(p) => p.secondary || '#fff'};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;\n","import { css, setup } from 'goober';\nimport * as React from 'react';\nimport {\n resolveValue,\n ToasterProps,\n ToastPosition,\n ToastWrapperProps,\n} from '../core/types';\nimport { useToaster } from '../core/use-toaster';\nimport { prefersReducedMotion } from '../core/utils';\nimport { ToastBar } from './toast-bar';\n\nsetup(React.createElement);\n\nconst ToastWrapper = ({\n id,\n className,\n style,\n onHeightUpdate,\n children,\n}: ToastWrapperProps) => {\n const ref = React.useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const updateHeight = () => {\n const height = el.getBoundingClientRect().height;\n onHeightUpdate(id, height);\n };\n updateHeight();\n new MutationObserver(updateHeight).observe(el, {\n subtree: true,\n childList: true,\n characterData: true,\n });\n }\n },\n [id, onHeightUpdate]\n );\n\n return (\n
\n {children}\n
\n );\n};\n\nconst getPositionStyle = (\n position: ToastPosition,\n offset: number\n): React.CSSProperties => {\n const top = position.includes('top');\n const verticalStyle: React.CSSProperties = top ? { top: 0 } : { bottom: 0 };\n const horizontalStyle: React.CSSProperties = position.includes('center')\n ? {\n justifyContent: 'center',\n }\n : position.includes('right')\n ? {\n justifyContent: 'flex-end',\n }\n : {};\n return {\n left: 0,\n right: 0,\n display: 'flex',\n position: 'absolute',\n transition: prefersReducedMotion()\n ? undefined\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\n ...verticalStyle,\n ...horizontalStyle,\n };\n};\n\nconst activeClass = css`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`;\n\nconst DEFAULT_OFFSET = 16;\n\nexport const Toaster: React.FC = ({\n reverseOrder,\n position = 'top-center',\n toastOptions,\n gutter,\n children,\n containerStyle,\n containerClassName,\n}) => {\n const { toasts, handlers } = useToaster(toastOptions);\n\n return (\n \n {toasts.map((t) => {\n const toastPosition = t.position || position;\n const offset = handlers.calculateOffset(t, {\n reverseOrder,\n gutter,\n defaultPosition: position,\n });\n const positionStyle = getPositionStyle(toastPosition, offset);\n\n return (\n \n {t.type === 'custom' ? (\n resolveValue(t.message, t)\n ) : children ? (\n children(t)\n ) : (\n \n )}\n \n );\n })}\n \n );\n};\n"],"mappings":"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","names":["src_exports","__export","CheckmarkIcon","ErrorIcon","LoaderIcon","ToastBar","ToastIcon","Toaster","src_default","resolveValue","toast","useToaster","useStore","__toCommonJS","isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","import_react","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","initial","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","import_react","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","now","timeouts","t","durationLeft","toast","endPause","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","React","import_goober","React","import_goober","import_goober","circleAnimation","firstLineAnimation","secondLineAnimation","ErrorIcon","p","import_goober","rotate","LoaderIcon","p","import_goober","circleAnimation","checkmarkAnimation","CheckmarkIcon","p","StatusWrapper","IndicatorWrapper","enter","AnimatedIconWrapper","ToastIcon","toast","icon","type","iconTheme","LoaderIcon","ErrorIcon","CheckmarkIcon","enterAnimation","factor","exitAnimation","fadeInAnimation","fadeOutAnimation","ToastBarBase","Message","getAnimationStyle","position","visible","enter","exit","prefersReducedMotion","ToastBar","toast","style","children","animationStyle","icon","ToastIcon","message","resolveValue","import_goober","React","ToastWrapper","id","className","style","onHeightUpdate","children","ref","el","updateHeight","height","getPositionStyle","position","offset","top","verticalStyle","horizontalStyle","prefersReducedMotion","activeClass","DEFAULT_OFFSET","Toaster","reverseOrder","toastOptions","gutter","containerStyle","containerClassName","toasts","handlers","useToaster","t","toastPosition","positionStyle","resolveValue","ToastBar","src_default","toast"]} +\ No newline at end of file ++{"version":3,"sources":["../src/index.ts","../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx"],"sourcesContent":["import { toast } from './core/toast';\n\nexport * from './headless';\n\nexport { ToastBar } from './components/toast-bar';\nexport { ToastIcon } from './components/toast-icon';\nexport { Toaster } from './components/toaster';\nexport { CheckmarkIcon } from './components/checkmark';\nexport { ErrorIcon } from './components/error';\nexport { LoaderIcon } from './components/loader';\n\nexport { toast };\nexport default toast;\n","import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'center-right'\n | 'center-left';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\nimport { ToastIcon } from './toast-icon';\nimport { prefersReducedMotion } from '../core/utils';\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`;\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`;\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\n\nconst ToastBarBase = styled('div')`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`;\n\nconst Message = styled('div')`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`;\n\ninterface ToastBarProps {\n toast: Toast;\n position?: ToastPosition;\n style?: React.CSSProperties;\n children?: (components: {\n icon: Renderable;\n message: Renderable;\n }) => Renderable;\n}\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes('top');\n const factor = top ? 1 : -1;\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)];\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n };\n};\n\nexport const ToastBar: React.FC = React.memo(\n ({ toast, position, style, children }) => {\n const animationStyle: React.CSSProperties = toast.height\n ? getAnimationStyle(\n toast.position || position || 'top-center',\n toast.visible\n )\n : { opacity: 0 };\n\n const icon = ;\n const message = (\n \n {resolveValue(toast.message, toast)}\n \n );\n\n return (\n \n {typeof children === 'function' ? (\n children({\n icon,\n message,\n })\n ) : (\n <>\n {icon}\n {message}\n \n )}\n \n );\n }\n);\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast } from '../core/types';\nimport { ErrorIcon, ErrorTheme } from './error';\nimport { LoaderIcon, LoaderTheme } from './loader';\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\n\nconst StatusWrapper = styled('div')`\n position: absolute;\n`;\n\nconst IndicatorWrapper = styled('div')`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`;\n\nconst enter = keyframes`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nexport const AnimatedIconWrapper = styled('div')`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`;\n\nexport type IconThemes = Partial<{\n success: CheckmarkTheme;\n error: ErrorTheme;\n loading: LoaderTheme;\n}>;\n\nexport const ToastIcon: React.FC<{\n toast: Toast;\n}> = ({ toast }) => {\n const { icon, type, iconTheme } = toast;\n if (icon !== undefined) {\n if (typeof icon === 'string') {\n return {icon};\n } else {\n return icon;\n }\n }\n\n if (type === 'blank') {\n return null;\n }\n\n return (\n \n \n {type !== 'loading' && (\n \n {type === 'error' ? (\n \n ) : (\n \n )}\n \n )}\n \n );\n};\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`;\n\nconst firstLineAnimation = keyframes`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nconst secondLineAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`;\n\nexport interface ErrorTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const ErrorIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#ff4b4b'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${(p) => p.secondary || '#fff'};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;\n","import { styled, keyframes } from 'goober';\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport interface LoaderTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const LoaderIcon = styled('div')`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${(p) => p.secondary || '#e0e0e0'};\n border-right-color: ${(p) => p.primary || '#616161'};\n animation: ${rotate} 1s linear infinite;\n`;\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`;\n\nconst checkmarkAnimation = keyframes`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`;\n\nexport interface CheckmarkTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const CheckmarkIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#61d345'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${(p) => p.secondary || '#fff'};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;\n","import { css, setup } from 'goober';\nimport * as React from 'react';\nimport {\n resolveValue,\n ToasterProps,\n ToastPosition,\n ToastWrapperProps,\n} from '../core/types';\nimport { useToaster } from '../core/use-toaster';\nimport { prefersReducedMotion } from '../core/utils';\nimport { ToastBar } from './toast-bar';\n\nsetup(React.createElement);\n\nconst ToastWrapper = ({\n id,\n className,\n style,\n onHeightUpdate,\n children,\n}: ToastWrapperProps) => {\n const ref = React.useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const updateHeight = () => {\n const height = el.getBoundingClientRect().height;\n onHeightUpdate(id, height);\n };\n updateHeight();\n new MutationObserver(updateHeight).observe(el, {\n subtree: true,\n childList: true,\n characterData: true,\n });\n }\n },\n [id, onHeightUpdate]\n );\n\n return (\n
\n {children}\n
\n );\n};\n\nconst getPositionStyle = (\n position: ToastPosition,\n offset: number\n): React.CSSProperties => {\n const top = position.includes('top') || position.includes('center-');\n\n const verticalStyle: React.CSSProperties = top\n ? {\n top: position.includes('center-') ? '50%' : 0,\n }\n : { bottom: 0 };\n\n const horizontalStyle: React.CSSProperties = position.includes('center-right')\n ? { justifyContent: 'flex-end' }\n : position.includes('center-left')\n ? { justifyContent: 'flex-start' }\n : position.includes('center')\n ? { justifyContent: 'center' }\n : position.includes('right')\n ? { justifyContent: 'flex-end' }\n : {};\n\n return {\n left: 0,\n right: 0,\n display: 'flex',\n position: 'absolute',\n transition: prefersReducedMotion()\n ? undefined\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\n ...verticalStyle,\n ...horizontalStyle,\n };\n};\n\nconst activeClass = css`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`;\n\nconst DEFAULT_OFFSET = 16;\n\nexport const Toaster: React.FC = ({\n reverseOrder,\n position = 'top-center',\n toastOptions,\n gutter,\n children,\n containerStyle,\n containerClassName,\n}) => {\n const { toasts, handlers } = useToaster(toastOptions);\n\n return (\n \n {toasts.map((t) => {\n const toastPosition = t.position || position;\n const offset = handlers.calculateOffset(t, {\n reverseOrder,\n gutter,\n defaultPosition: position,\n });\n const positionStyle = getPositionStyle(toastPosition, offset);\n\n return (\n \n {t.type === 'custom' ? (\n resolveValue(t.message, t)\n ) : children ? (\n children(t)\n ) : (\n \n )}\n \n );\n })}\n \n );\n};\n"],"mappings":"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","names":["src_exports","__export","CheckmarkIcon","ErrorIcon","LoaderIcon","ToastBar","ToastIcon","Toaster","src_default","resolveValue","toast","useToaster","useStore","__toCommonJS","isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","import_react","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","initial","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","import_react","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","now","timeouts","t","durationLeft","toast","endPause","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","React","import_goober","React","import_goober","import_goober","circleAnimation","firstLineAnimation","secondLineAnimation","ErrorIcon","p","import_goober","rotate","LoaderIcon","p","import_goober","circleAnimation","checkmarkAnimation","CheckmarkIcon","p","StatusWrapper","IndicatorWrapper","enter","AnimatedIconWrapper","ToastIcon","toast","icon","type","iconTheme","LoaderIcon","ErrorIcon","CheckmarkIcon","enterAnimation","factor","exitAnimation","fadeInAnimation","fadeOutAnimation","ToastBarBase","Message","getAnimationStyle","position","visible","enter","exit","prefersReducedMotion","ToastBar","toast","style","children","animationStyle","icon","ToastIcon","message","resolveValue","import_goober","React","ToastWrapper","id","className","style","onHeightUpdate","children","ref","el","updateHeight","height","getPositionStyle","position","offset","top","verticalStyle","horizontalStyle","prefersReducedMotion","activeClass","DEFAULT_OFFSET","Toaster","reverseOrder","toastOptions","gutter","containerStyle","containerClassName","toasts","handlers","useToaster","t","toastPosition","positionStyle","resolveValue","ToastBar","src_default","toast"]} +\ No newline at end of file +diff --git a/dist/index.mjs b/dist/index.mjs +index 060ee23fbf2dae93e59de98cb2953625b9855e66..2267b62058167f2abaef74e9c75a5c1372d728c7 100644 +--- a/dist/index.mjs ++++ b/dist/index.mjs +@@ -1,5 +1,5 @@ + "use client"; +-var W=e=>typeof e=="function",f=(e,t)=>W(e)?e(t):e;var F=(()=>{let e=0;return()=>(++e).toString()})(),A=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();import{useEffect as H,useState as j,useRef as Q}from"react";var Y=20;var U=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,Y)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return U(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:s}=t;return{...e,toasts:e.toasts.map(o=>o.id===s||s===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+a}))}}},P=[],y={toasts:[],pausedAt:void 0},u=e=>{y=U(y,e),P.forEach(t=>{t(y)})},q={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},D=(e={})=>{let[t,r]=j(y),s=Q(y);H(()=>(s.current!==y&&r(y),P.push(r),()=>{let o=P.indexOf(r);o>-1&&P.splice(o,1)}),[]);let a=t.toasts.map(o=>{var n,i,p;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((n=e[o.type])==null?void 0:n.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((i=e[o.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||q[o.type],style:{...e.style,...(p=e[o.type])==null?void 0:p.style,...o.style}}});return{...t,toasts:a}};var J=(e,t="blank",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||F()}),x=e=>(t,r)=>{let s=J(t,e,r);return u({type:2,toast:s}),s.id},c=(e,t)=>x("blank")(e,t);c.error=x("error");c.success=x("success");c.loading=x("loading");c.custom=x("custom");c.dismiss=e=>{u({type:3,toastId:e})};c.remove=e=>u({type:4,toastId:e});c.promise=(e,t,r)=>{let s=c.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e=="function"&&(e=e()),e.then(a=>{let o=t.success?f(t.success,a):void 0;return o?c.success(o,{id:s,...r,...r==null?void 0:r.success}):c.dismiss(s),a}).catch(a=>{let o=t.error?f(t.error,a):void 0;o?c.error(o,{id:s,...r,...r==null?void 0:r.error}):c.dismiss(s)}),e};import{useEffect as $,useCallback as L}from"react";var K=(e,t)=>{u({type:1,toast:{id:e,height:t}})},X=()=>{u({type:5,time:Date.now()})},b=new Map,Z=1e3,ee=(e,t=Z)=>{if(b.has(e))return;let r=setTimeout(()=>{b.delete(e),u({type:4,toastId:e})},t);b.set(e,r)},O=e=>{let{toasts:t,pausedAt:r}=D(e);$(()=>{if(r)return;let o=Date.now(),n=t.map(i=>{if(i.duration===1/0)return;let p=(i.duration||0)+i.pauseDuration-(o-i.createdAt);if(p<0){i.visible&&c.dismiss(i.id);return}return setTimeout(()=>c.dismiss(i.id),p)});return()=>{n.forEach(i=>i&&clearTimeout(i))}},[t,r]);let s=L(()=>{r&&u({type:6,time:Date.now()})},[r]),a=L((o,n)=>{let{reverseOrder:i=!1,gutter:p=8,defaultPosition:d}=n||{},h=t.filter(m=>(m.position||d)===(o.position||d)&&m.height),v=h.findIndex(m=>m.id===o.id),S=h.filter((m,E)=>Em.visible).slice(...i?[S+1]:[0,S]).reduce((m,E)=>m+(E.height||0)+p,0)},[t]);return $(()=>{t.forEach(o=>{if(o.dismissed)ee(o.id,o.removeDelay);else{let n=b.get(o.id);n&&(clearTimeout(n),b.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:K,startPause:X,endPause:s,calculateOffset:a}}};import*as l from"react";import{styled as B,keyframes as z}from"goober";import*as g from"react";import{styled as w,keyframes as me}from"goober";import{styled as te,keyframes as I}from"goober";var oe=I` ++var W=e=>typeof e=="function",f=(e,t)=>W(e)?e(t):e;var F=(()=>{let e=0;return()=>(++e).toString()})(),A=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();import{useEffect as H,useState as j,useRef as Q}from"react";var Y=20;var U=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,Y)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return U(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:s}=t;return{...e,toasts:e.toasts.map(o=>o.id===s||s===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+a}))}}},P=[],y={toasts:[],pausedAt:void 0},m=e=>{y=U(y,e),P.forEach(t=>{t(y)})},q={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},D=(e={})=>{let[t,r]=j(y),s=Q(y);H(()=>(s.current!==y&&r(y),P.push(r),()=>{let o=P.indexOf(r);o>-1&&P.splice(o,1)}),[]);let a=t.toasts.map(o=>{var n,i,p;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((n=e[o.type])==null?void 0:n.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((i=e[o.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||q[o.type],style:{...e.style,...(p=e[o.type])==null?void 0:p.style,...o.style}}});return{...t,toasts:a}};var J=(e,t="blank",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||F()}),x=e=>(t,r)=>{let s=J(t,e,r);return m({type:2,toast:s}),s.id},c=(e,t)=>x("blank")(e,t);c.error=x("error");c.success=x("success");c.loading=x("loading");c.custom=x("custom");c.dismiss=e=>{m({type:3,toastId:e})};c.remove=e=>m({type:4,toastId:e});c.promise=(e,t,r)=>{let s=c.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e=="function"&&(e=e()),e.then(a=>{let o=t.success?f(t.success,a):void 0;return o?c.success(o,{id:s,...r,...r==null?void 0:r.success}):c.dismiss(s),a}).catch(a=>{let o=t.error?f(t.error,a):void 0;o?c.error(o,{id:s,...r,...r==null?void 0:r.error}):c.dismiss(s)}),e};import{useEffect as $,useCallback as L}from"react";var K=(e,t)=>{m({type:1,toast:{id:e,height:t}})},X=()=>{m({type:5,time:Date.now()})},b=new Map,Z=1e3,ee=(e,t=Z)=>{if(b.has(e))return;let r=setTimeout(()=>{b.delete(e),m({type:4,toastId:e})},t);b.set(e,r)},O=e=>{let{toasts:t,pausedAt:r}=D(e);$(()=>{if(r)return;let o=Date.now(),n=t.map(i=>{if(i.duration===1/0)return;let p=(i.duration||0)+i.pauseDuration-(o-i.createdAt);if(p<0){i.visible&&c.dismiss(i.id);return}return setTimeout(()=>c.dismiss(i.id),p)});return()=>{n.forEach(i=>i&&clearTimeout(i))}},[t,r]);let s=L(()=>{r&&m({type:6,time:Date.now()})},[r]),a=L((o,n)=>{let{reverseOrder:i=!1,gutter:p=8,defaultPosition:d}=n||{},h=t.filter(l=>(l.position||d)===(o.position||d)&&l.height),v=h.findIndex(l=>l.id===o.id),S=h.filter((l,E)=>El.visible).slice(...i?[S+1]:[0,S]).reduce((l,E)=>l+(E.height||0)+p,0)},[t]);return $(()=>{t.forEach(o=>{if(o.dismissed)ee(o.id,o.removeDelay);else{let n=b.get(o.id);n&&(clearTimeout(n),b.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:K,startPause:X,endPause:s,calculateOffset:a}}};import*as u from"react";import{styled as B,keyframes as z}from"goober";import*as g from"react";import{styled as w,keyframes as le}from"goober";import{styled as te,keyframes as I}from"goober";var oe=I` + from { + transform: scale(0) rotate(45deg); + opacity: 0; +@@ -121,16 +121,16 @@ to { + height: 10px; + width: 6px; + } +-`;var ue=w("div")` ++`;var me=w("div")` + position: absolute; +-`,le=w("div")` ++`,ue=w("div")` + position: relative; + display: flex; + justify-content: center; + align-items: center; + min-width: 20px; + min-height: 20px; +-`,fe=me` ++`,fe=le` + from { + transform: scale(0.6); + opacity: 0.4; +@@ -145,7 +145,7 @@ to { + min-width: 20px; + animation: ${fe} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; +-`,M=({toast:e})=>{let{icon:t,type:r,iconTheme:s}=e;return t!==void 0?typeof t=="string"?g.createElement(Te,null,t):t:r==="blank"?null:g.createElement(le,null,g.createElement(V,{...s}),r!=="loading"&&g.createElement(ue,null,r==="error"?g.createElement(k,{...s}):g.createElement(_,{...s})))};var ye=e=>` ++`,C=({toast:e})=>{let{icon:t,type:r,iconTheme:s}=e;return t!==void 0?typeof t=="string"?g.createElement(Te,null,t):t:r==="blank"?null:g.createElement(ue,null,g.createElement(V,{...s}),r!=="loading"&&g.createElement(me,null,r==="error"?g.createElement(k,{...s}):g.createElement(_,{...s})))};var ye=e=>` + 0% {transform: translate3d(0,${e*-200}%,0) scale(.6); opacity:.5;} + 100% {transform: translate3d(0,0,0) scale(1); opacity:1;} + `,ge=e=>` +@@ -170,10 +170,10 @@ to { + color: inherit; + flex: 1 1 auto; + white-space: pre-line; +-`,Ae=(e,t)=>{let s=e.includes("top")?1:-1,[a,o]=A()?[he,xe]:[ye(s),ge(s)];return{animation:t?`${z(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${z(o)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},C=l.memo(({toast:e,position:t,style:r,children:s})=>{let a=e.height?Ae(e.position||t||"top-center",e.visible):{opacity:0},o=l.createElement(M,{toast:e}),n=l.createElement(Se,{...e.ariaProps},f(e.message,e));return l.createElement(be,{className:e.className,style:{...a,...r,...e.style}},typeof s=="function"?s({icon:o,message:n}):l.createElement(l.Fragment,null,o,n))});import{css as Pe,setup as Re}from"goober";import*as T from"react";Re(T.createElement);var ve=({id:e,className:t,style:r,onHeightUpdate:s,children:a})=>{let o=T.useCallback(n=>{if(n){let i=()=>{let p=n.getBoundingClientRect().height;s(e,p)};i(),new MutationObserver(i).observe(n,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement("div",{ref:o,className:t,style:r},a)},Ee=(e,t)=>{let r=e.includes("top"),s=r?{top:0}:{bottom:0},a=e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:A()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(r?1:-1)}px)`,...s,...a}},De=Pe` ++`,Ae=(e,t)=>{let s=e.includes("top")?1:-1,[a,o]=A()?[he,xe]:[ye(s),ge(s)];return{animation:t?`${z(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${z(o)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},M=u.memo(({toast:e,position:t,style:r,children:s})=>{let a=e.height?Ae(e.position||t||"top-center",e.visible):{opacity:0},o=u.createElement(C,{toast:e}),n=u.createElement(Se,{...e.ariaProps},f(e.message,e));return u.createElement(be,{className:e.className,style:{...a,...r,...e.style}},typeof s=="function"?s({icon:o,message:n}):u.createElement(u.Fragment,null,o,n))});import{css as Pe,setup as Re}from"goober";import*as T from"react";Re(T.createElement);var ve=({id:e,className:t,style:r,onHeightUpdate:s,children:a})=>{let o=T.useCallback(n=>{if(n){let i=()=>{let p=n.getBoundingClientRect().height;s(e,p)};i(),new MutationObserver(i).observe(n,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement("div",{ref:o,className:t,style:r},a)},Ee=(e,t)=>{let r=e.includes("top")||e.includes("center-"),s=r?{top:e.includes("center-")?"50%":0}:{bottom:0},a=e.includes("center-right")?{justifyContent:"flex-end"}:e.includes("center-left")?{justifyContent:"flex-start"}:e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:A()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(r?1:-1)}px)`,...s,...a}},De=Pe` + z-index: 9999; + > * { + pointer-events: auto; + } +-`,R=16,Oe=({reverseOrder:e,position:t="top-center",toastOptions:r,gutter:s,children:a,containerStyle:o,containerClassName:n})=>{let{toasts:i,handlers:p}=O(r);return T.createElement("div",{id:"_rht_toaster",style:{position:"fixed",zIndex:9999,top:R,left:R,right:R,bottom:R,pointerEvents:"none",...o},className:n,onMouseEnter:p.startPause,onMouseLeave:p.endPause},i.map(d=>{let h=d.position||t,v=p.calculateOffset(d,{reverseOrder:e,gutter:s,defaultPosition:t}),S=Ee(h,v);return T.createElement(ve,{id:d.id,key:d.id,onHeightUpdate:p.updateHeight,className:d.visible?De:"",style:S},d.type==="custom"?f(d.message,d):a?a(d):T.createElement(C,{toast:d,position:h}))}))};var Vt=c;export{_ as CheckmarkIcon,k as ErrorIcon,V as LoaderIcon,C as ToastBar,M as ToastIcon,Oe as Toaster,Vt as default,f as resolveValue,c as toast,O as useToaster,D as useToasterStore}; ++`,R=16,Oe=({reverseOrder:e,position:t="top-center",toastOptions:r,gutter:s,children:a,containerStyle:o,containerClassName:n})=>{let{toasts:i,handlers:p}=O(r);return T.createElement("div",{id:"_rht_toaster",style:{position:"fixed",zIndex:9999,top:R,left:R,right:R,bottom:R,pointerEvents:"none",...o},className:n,onMouseEnter:p.startPause,onMouseLeave:p.endPause},i.map(d=>{let h=d.position||t,v=p.calculateOffset(d,{reverseOrder:e,gutter:s,defaultPosition:t}),S=Ee(h,v);return T.createElement(ve,{id:d.id,key:d.id,onHeightUpdate:p.updateHeight,className:d.visible?De:"",style:S},d.type==="custom"?f(d.message,d):a?a(d):T.createElement(M,{toast:d,position:h}))}))};var Vt=c;export{_ as CheckmarkIcon,k as ErrorIcon,V as LoaderIcon,M as ToastBar,C as ToastIcon,Oe as Toaster,Vt as default,f as resolveValue,c as toast,O as useToaster,D as useToasterStore}; + //# sourceMappingURL=index.mjs.map +\ No newline at end of file +diff --git a/dist/index.mjs.map b/dist/index.mjs.map +index 63cee938c6514cff7d02c20f501c401b3acf86a5..ff1b988e596dff551c403dd37f8fd93aa0fe043e 100644 +--- a/dist/index.mjs.map ++++ b/dist/index.mjs.map +@@ -1 +1 @@ +-{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx","../src/index.ts"],"sourcesContent":["import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\nimport { ToastIcon } from './toast-icon';\nimport { prefersReducedMotion } from '../core/utils';\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`;\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`;\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\n\nconst ToastBarBase = styled('div')`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`;\n\nconst Message = styled('div')`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`;\n\ninterface ToastBarProps {\n toast: Toast;\n position?: ToastPosition;\n style?: React.CSSProperties;\n children?: (components: {\n icon: Renderable;\n message: Renderable;\n }) => Renderable;\n}\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes('top');\n const factor = top ? 1 : -1;\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)];\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n };\n};\n\nexport const ToastBar: React.FC = React.memo(\n ({ toast, position, style, children }) => {\n const animationStyle: React.CSSProperties = toast.height\n ? getAnimationStyle(\n toast.position || position || 'top-center',\n toast.visible\n )\n : { opacity: 0 };\n\n const icon = ;\n const message = (\n \n {resolveValue(toast.message, toast)}\n \n );\n\n return (\n \n {typeof children === 'function' ? (\n children({\n icon,\n message,\n })\n ) : (\n <>\n {icon}\n {message}\n \n )}\n \n );\n }\n);\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast } from '../core/types';\nimport { ErrorIcon, ErrorTheme } from './error';\nimport { LoaderIcon, LoaderTheme } from './loader';\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\n\nconst StatusWrapper = styled('div')`\n position: absolute;\n`;\n\nconst IndicatorWrapper = styled('div')`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`;\n\nconst enter = keyframes`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nexport const AnimatedIconWrapper = styled('div')`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`;\n\nexport type IconThemes = Partial<{\n success: CheckmarkTheme;\n error: ErrorTheme;\n loading: LoaderTheme;\n}>;\n\nexport const ToastIcon: React.FC<{\n toast: Toast;\n}> = ({ toast }) => {\n const { icon, type, iconTheme } = toast;\n if (icon !== undefined) {\n if (typeof icon === 'string') {\n return {icon};\n } else {\n return icon;\n }\n }\n\n if (type === 'blank') {\n return null;\n }\n\n return (\n \n \n {type !== 'loading' && (\n \n {type === 'error' ? (\n \n ) : (\n \n )}\n \n )}\n \n );\n};\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`;\n\nconst firstLineAnimation = keyframes`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nconst secondLineAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`;\n\nexport interface ErrorTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const ErrorIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#ff4b4b'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${(p) => p.secondary || '#fff'};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;\n","import { styled, keyframes } from 'goober';\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport interface LoaderTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const LoaderIcon = styled('div')`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${(p) => p.secondary || '#e0e0e0'};\n border-right-color: ${(p) => p.primary || '#616161'};\n animation: ${rotate} 1s linear infinite;\n`;\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`;\n\nconst checkmarkAnimation = keyframes`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`;\n\nexport interface CheckmarkTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const CheckmarkIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#61d345'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${(p) => p.secondary || '#fff'};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;\n","import { css, setup } from 'goober';\nimport * as React from 'react';\nimport {\n resolveValue,\n ToasterProps,\n ToastPosition,\n ToastWrapperProps,\n} from '../core/types';\nimport { useToaster } from '../core/use-toaster';\nimport { prefersReducedMotion } from '../core/utils';\nimport { ToastBar } from './toast-bar';\n\nsetup(React.createElement);\n\nconst ToastWrapper = ({\n id,\n className,\n style,\n onHeightUpdate,\n children,\n}: ToastWrapperProps) => {\n const ref = React.useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const updateHeight = () => {\n const height = el.getBoundingClientRect().height;\n onHeightUpdate(id, height);\n };\n updateHeight();\n new MutationObserver(updateHeight).observe(el, {\n subtree: true,\n childList: true,\n characterData: true,\n });\n }\n },\n [id, onHeightUpdate]\n );\n\n return (\n
\n {children}\n
\n );\n};\n\nconst getPositionStyle = (\n position: ToastPosition,\n offset: number\n): React.CSSProperties => {\n const top = position.includes('top');\n const verticalStyle: React.CSSProperties = top ? { top: 0 } : { bottom: 0 };\n const horizontalStyle: React.CSSProperties = position.includes('center')\n ? {\n justifyContent: 'center',\n }\n : position.includes('right')\n ? {\n justifyContent: 'flex-end',\n }\n : {};\n return {\n left: 0,\n right: 0,\n display: 'flex',\n position: 'absolute',\n transition: prefersReducedMotion()\n ? undefined\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\n ...verticalStyle,\n ...horizontalStyle,\n };\n};\n\nconst activeClass = css`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`;\n\nconst DEFAULT_OFFSET = 16;\n\nexport const Toaster: React.FC = ({\n reverseOrder,\n position = 'top-center',\n toastOptions,\n gutter,\n children,\n containerStyle,\n containerClassName,\n}) => {\n const { toasts, handlers } = useToaster(toastOptions);\n\n return (\n \n {toasts.map((t) => {\n const toastPosition = t.position || position;\n const offset = handlers.calculateOffset(t, {\n reverseOrder,\n gutter,\n defaultPosition: position,\n });\n const positionStyle = getPositionStyle(toastPosition, offset);\n\n return (\n \n {t.type === 'custom' ? (\n resolveValue(t.message, t)\n ) : children ? (\n children(t)\n ) : (\n \n )}\n \n );\n })}\n \n );\n};\n","import { toast } from './core/toast';\n\nexport * from './headless';\n\nexport { ToastBar } from './components/toast-bar';\nexport { ToastIcon } from './components/toast-icon';\nexport { Toaster } from './components/toaster';\nexport { CheckmarkIcon } from './components/checkmark';\nexport { ErrorIcon } from './components/error';\nexport { LoaderIcon } from './components/loader';\n\nexport { toast };\nexport default toast;\n"],"mappings":"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","names":["isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","useEffect","useState","useRef","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","useState","initial","useRef","useEffect","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","useEffect","useCallback","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","useEffect","now","timeouts","t","durationLeft","toast","endPause","useCallback","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","React","styled","keyframes","React","styled","keyframes","styled","keyframes","circleAnimation","firstLineAnimation","secondLineAnimation","ErrorIcon","p","styled","keyframes","rotate","LoaderIcon","p","styled","keyframes","circleAnimation","checkmarkAnimation","CheckmarkIcon","p","StatusWrapper","styled","IndicatorWrapper","enter","keyframes","AnimatedIconWrapper","ToastIcon","toast","icon","type","iconTheme","LoaderIcon","ErrorIcon","CheckmarkIcon","enterAnimation","factor","exitAnimation","fadeInAnimation","fadeOutAnimation","ToastBarBase","styled","Message","getAnimationStyle","position","visible","enter","exit","prefersReducedMotion","keyframes","ToastBar","toast","style","children","animationStyle","icon","ToastIcon","message","resolveValue","css","setup","React","setup","ToastWrapper","id","className","style","onHeightUpdate","children","ref","el","updateHeight","height","getPositionStyle","position","offset","top","verticalStyle","horizontalStyle","prefersReducedMotion","activeClass","css","DEFAULT_OFFSET","Toaster","reverseOrder","toastOptions","gutter","containerStyle","containerClassName","toasts","handlers","useToaster","t","toastPosition","positionStyle","resolveValue","ToastBar","src_default","toast"]} +\ No newline at end of file ++{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/components/toast-bar.tsx","../src/components/toast-icon.tsx","../src/components/error.tsx","../src/components/loader.tsx","../src/components/checkmark.tsx","../src/components/toaster.tsx","../src/index.ts"],"sourcesContent":["import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'center-right'\n | 'center-left';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\nimport { ToastIcon } from './toast-icon';\nimport { prefersReducedMotion } from '../core/utils';\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`;\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`;\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\n\nconst ToastBarBase = styled('div')`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`;\n\nconst Message = styled('div')`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`;\n\ninterface ToastBarProps {\n toast: Toast;\n position?: ToastPosition;\n style?: React.CSSProperties;\n children?: (components: {\n icon: Renderable;\n message: Renderable;\n }) => Renderable;\n}\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes('top');\n const factor = top ? 1 : -1;\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)];\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n };\n};\n\nexport const ToastBar: React.FC = React.memo(\n ({ toast, position, style, children }) => {\n const animationStyle: React.CSSProperties = toast.height\n ? getAnimationStyle(\n toast.position || position || 'top-center',\n toast.visible\n )\n : { opacity: 0 };\n\n const icon = ;\n const message = (\n \n {resolveValue(toast.message, toast)}\n \n );\n\n return (\n \n {typeof children === 'function' ? (\n children({\n icon,\n message,\n })\n ) : (\n <>\n {icon}\n {message}\n \n )}\n \n );\n }\n);\n","import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast } from '../core/types';\nimport { ErrorIcon, ErrorTheme } from './error';\nimport { LoaderIcon, LoaderTheme } from './loader';\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\n\nconst StatusWrapper = styled('div')`\n position: absolute;\n`;\n\nconst IndicatorWrapper = styled('div')`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`;\n\nconst enter = keyframes`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nexport const AnimatedIconWrapper = styled('div')`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`;\n\nexport type IconThemes = Partial<{\n success: CheckmarkTheme;\n error: ErrorTheme;\n loading: LoaderTheme;\n}>;\n\nexport const ToastIcon: React.FC<{\n toast: Toast;\n}> = ({ toast }) => {\n const { icon, type, iconTheme } = toast;\n if (icon !== undefined) {\n if (typeof icon === 'string') {\n return {icon};\n } else {\n return icon;\n }\n }\n\n if (type === 'blank') {\n return null;\n }\n\n return (\n \n \n {type !== 'loading' && (\n \n {type === 'error' ? (\n \n ) : (\n \n )}\n \n )}\n \n );\n};\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`;\n\nconst firstLineAnimation = keyframes`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nconst secondLineAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`;\n\nexport interface ErrorTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const ErrorIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#ff4b4b'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${(p) => p.secondary || '#fff'};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;\n","import { styled, keyframes } from 'goober';\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport interface LoaderTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const LoaderIcon = styled('div')`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${(p) => p.secondary || '#e0e0e0'};\n border-right-color: ${(p) => p.primary || '#616161'};\n animation: ${rotate} 1s linear infinite;\n`;\n","import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`;\n\nconst checkmarkAnimation = keyframes`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`;\n\nexport interface CheckmarkTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const CheckmarkIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#61d345'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${(p) => p.secondary || '#fff'};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;\n","import { css, setup } from 'goober';\nimport * as React from 'react';\nimport {\n resolveValue,\n ToasterProps,\n ToastPosition,\n ToastWrapperProps,\n} from '../core/types';\nimport { useToaster } from '../core/use-toaster';\nimport { prefersReducedMotion } from '../core/utils';\nimport { ToastBar } from './toast-bar';\n\nsetup(React.createElement);\n\nconst ToastWrapper = ({\n id,\n className,\n style,\n onHeightUpdate,\n children,\n}: ToastWrapperProps) => {\n const ref = React.useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const updateHeight = () => {\n const height = el.getBoundingClientRect().height;\n onHeightUpdate(id, height);\n };\n updateHeight();\n new MutationObserver(updateHeight).observe(el, {\n subtree: true,\n childList: true,\n characterData: true,\n });\n }\n },\n [id, onHeightUpdate]\n );\n\n return (\n
\n {children}\n
\n );\n};\n\nconst getPositionStyle = (\n position: ToastPosition,\n offset: number\n): React.CSSProperties => {\n const top = position.includes('top') || position.includes('center-');\n\n const verticalStyle: React.CSSProperties = top\n ? {\n top: position.includes('center-') ? '50%' : 0,\n }\n : { bottom: 0 };\n\n const horizontalStyle: React.CSSProperties = position.includes('center-right')\n ? { justifyContent: 'flex-end' }\n : position.includes('center-left')\n ? { justifyContent: 'flex-start' }\n : position.includes('center')\n ? { justifyContent: 'center' }\n : position.includes('right')\n ? { justifyContent: 'flex-end' }\n : {};\n\n return {\n left: 0,\n right: 0,\n display: 'flex',\n position: 'absolute',\n transition: prefersReducedMotion()\n ? undefined\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\n ...verticalStyle,\n ...horizontalStyle,\n };\n};\n\nconst activeClass = css`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`;\n\nconst DEFAULT_OFFSET = 16;\n\nexport const Toaster: React.FC = ({\n reverseOrder,\n position = 'top-center',\n toastOptions,\n gutter,\n children,\n containerStyle,\n containerClassName,\n}) => {\n const { toasts, handlers } = useToaster(toastOptions);\n\n return (\n \n {toasts.map((t) => {\n const toastPosition = t.position || position;\n const offset = handlers.calculateOffset(t, {\n reverseOrder,\n gutter,\n defaultPosition: position,\n });\n const positionStyle = getPositionStyle(toastPosition, offset);\n\n return (\n \n {t.type === 'custom' ? (\n resolveValue(t.message, t)\n ) : children ? (\n children(t)\n ) : (\n \n )}\n \n );\n })}\n \n );\n};\n","import { toast } from './core/toast';\n\nexport * from './headless';\n\nexport { ToastBar } from './components/toast-bar';\nexport { ToastIcon } from './components/toast-icon';\nexport { Toaster } from './components/toaster';\nexport { CheckmarkIcon } from './components/checkmark';\nexport { ErrorIcon } from './components/error';\nexport { LoaderIcon } from './components/loader';\n\nexport { toast };\nexport default toast;\n"],"mappings":"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","names":["isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","useEffect","useState","useRef","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","useState","initial","useRef","useEffect","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","useEffect","useCallback","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","useEffect","now","timeouts","t","durationLeft","toast","endPause","useCallback","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","React","styled","keyframes","React","styled","keyframes","styled","keyframes","circleAnimation","firstLineAnimation","secondLineAnimation","ErrorIcon","p","styled","keyframes","rotate","LoaderIcon","p","styled","keyframes","circleAnimation","checkmarkAnimation","CheckmarkIcon","p","StatusWrapper","styled","IndicatorWrapper","enter","keyframes","AnimatedIconWrapper","ToastIcon","toast","icon","type","iconTheme","LoaderIcon","ErrorIcon","CheckmarkIcon","enterAnimation","factor","exitAnimation","fadeInAnimation","fadeOutAnimation","ToastBarBase","styled","Message","getAnimationStyle","position","visible","enter","exit","prefersReducedMotion","keyframes","ToastBar","toast","style","children","animationStyle","icon","ToastIcon","message","resolveValue","css","setup","React","setup","ToastWrapper","id","className","style","onHeightUpdate","children","ref","el","updateHeight","height","getPositionStyle","position","offset","top","verticalStyle","horizontalStyle","prefersReducedMotion","activeClass","css","DEFAULT_OFFSET","Toaster","reverseOrder","toastOptions","gutter","containerStyle","containerClassName","toasts","handlers","useToaster","t","toastPosition","positionStyle","resolveValue","ToastBar","src_default","toast"]} +\ No newline at end of file +diff --git a/headless/index.d.ts b/headless/index.d.ts +index 578bacd309a1884da11a50a6debbb20a0c41547d..33ec2c8d34759408718ffeed05ff396e592194c4 100644 +--- a/headless/index.d.ts ++++ b/headless/index.d.ts +@@ -1,7 +1,7 @@ + import { CSSProperties } from 'react'; + + type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom'; +-type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'; ++type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | 'center-right' | 'center-left'; + type Renderable = React.ReactElement | string | null; + interface IconTheme { + primary: string; +diff --git a/headless/index.js b/headless/index.js +index 92d20307002cebc4cfed14ad1529bc242233fd9b..6a242a062c810e4096746bfe81a1393febd5e369 100644 +--- a/headless/index.js ++++ b/headless/index.js +@@ -1,2 +1,2 @@ +-"use strict";var P=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var M=(e,t)=>{for(var r in t)P(e,r,{get:t[r],enumerable:!0})},U=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of v(t))!I.call(e,n)&&n!==r&&P(e,n,{get:()=>t[n],enumerable:!(a=_(t,n))||a.enumerable});return e};var F=e=>U(P({},"__esModule",{value:!0}),e);var j={};M(j,{default:()=>Y,resolveValue:()=>m,toast:()=>s,useToaster:()=>V,useToasterStore:()=>g});module.exports=F(j);var w=e=>typeof e=="function",m=(e,t)=>w(e)?e(t):e;var R=(()=>{let e=0;return()=>(++e).toString()})(),J=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();var p=require("react"),N=20;var h=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,N)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return h(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:a}=t;return{...e,toasts:e.toasts.map(o=>o.id===a||a===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let n=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+n}))}}},A=[],l={toasts:[],pausedAt:void 0},c=e=>{l=h(l,e),A.forEach(t=>{t(l)})},k={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},g=(e={})=>{let[t,r]=(0,p.useState)(l),a=(0,p.useRef)(l);(0,p.useEffect)(()=>(a.current!==l&&r(l),A.push(r),()=>{let o=A.indexOf(r);o>-1&&A.splice(o,1)}),[]);let n=t.toasts.map(o=>{var T,i,d;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((T=e[o.type])==null?void 0:T.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((i=e[o.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||k[o.type],style:{...e.style,...(d=e[o.type])==null?void 0:d.style,...o.style}}});return{...t,toasts:n}};var H=(e,t="blank",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||R()}),y=e=>(t,r)=>{let a=H(t,e,r);return c({type:2,toast:a}),a.id},s=(e,t)=>y("blank")(e,t);s.error=y("error");s.success=y("success");s.loading=y("loading");s.custom=y("custom");s.dismiss=e=>{c({type:3,toastId:e})};s.remove=e=>c({type:4,toastId:e});s.promise=(e,t,r)=>{let a=s.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e=="function"&&(e=e()),e.then(n=>{let o=t.success?m(t.success,n):void 0;return o?s.success(o,{id:a,...r,...r==null?void 0:r.success}):s.dismiss(a),n}).catch(n=>{let o=t.error?m(t.error,n):void 0;o?s.error(o,{id:a,...r,...r==null?void 0:r.error}):s.dismiss(a)}),e};var f=require("react");var L=(e,t)=>{c({type:1,toast:{id:e,height:t}})},Q=()=>{c({type:5,time:Date.now()})},S=new Map,B=1e3,W=(e,t=B)=>{if(S.has(e))return;let r=setTimeout(()=>{S.delete(e),c({type:4,toastId:e})},t);S.set(e,r)},V=e=>{let{toasts:t,pausedAt:r}=g(e);(0,f.useEffect)(()=>{if(r)return;let o=Date.now(),T=t.map(i=>{if(i.duration===1/0)return;let d=(i.duration||0)+i.pauseDuration-(o-i.createdAt);if(d<0){i.visible&&s.dismiss(i.id);return}return setTimeout(()=>s.dismiss(i.id),d)});return()=>{T.forEach(i=>i&&clearTimeout(i))}},[t,r]);let a=(0,f.useCallback)(()=>{r&&c({type:6,time:Date.now()})},[r]),n=(0,f.useCallback)((o,T)=>{let{reverseOrder:i=!1,gutter:d=8,defaultPosition:b}=T||{},D=t.filter(u=>(u.position||b)===(o.position||b)&&u.height),x=D.findIndex(u=>u.id===o.id),E=D.filter((u,O)=>Ou.visible).slice(...i?[E+1]:[0,E]).reduce((u,O)=>u+(O.height||0)+d,0)},[t]);return(0,f.useEffect)(()=>{t.forEach(o=>{if(o.dismissed)W(o.id,o.removeDelay);else{let T=S.get(o.id);T&&(clearTimeout(T),S.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:L,startPause:Q,endPause:a,calculateOffset:n}}};var Y=s;0&&(module.exports={resolveValue,toast,useToaster,useToasterStore}); ++"use strict";var P=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var M=(e,t)=>{for(var r in t)P(e,r,{get:t[r],enumerable:!0})},U=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of v(t))!I.call(e,n)&&n!==r&&P(e,n,{get:()=>t[n],enumerable:!(a=_(t,n))||a.enumerable});return e};var F=e=>U(P({},"__esModule",{value:!0}),e);var j={};M(j,{default:()=>Y,resolveValue:()=>m,toast:()=>s,useToaster:()=>V,useToasterStore:()=>g});module.exports=F(j);var w=e=>typeof e=="function",m=(e,t)=>w(e)?e(t):e;var h=(()=>{let e=0;return()=>(++e).toString()})(),J=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();var p=require("react"),N=20;var R=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,N)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return R(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:a}=t;return{...e,toasts:e.toasts.map(o=>o.id===a||a===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let n=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+n}))}}},A=[],l={toasts:[],pausedAt:void 0},c=e=>{l=R(l,e),A.forEach(t=>{t(l)})},k={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},g=(e={})=>{let[t,r]=(0,p.useState)(l),a=(0,p.useRef)(l);(0,p.useEffect)(()=>(a.current!==l&&r(l),A.push(r),()=>{let o=A.indexOf(r);o>-1&&A.splice(o,1)}),[]);let n=t.toasts.map(o=>{var T,i,d;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((T=e[o.type])==null?void 0:T.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((i=e[o.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||k[o.type],style:{...e.style,...(d=e[o.type])==null?void 0:d.style,...o.style}}});return{...t,toasts:n}};var H=(e,t="blank",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||h()}),y=e=>(t,r)=>{let a=H(t,e,r);return c({type:2,toast:a}),a.id},s=(e,t)=>y("blank")(e,t);s.error=y("error");s.success=y("success");s.loading=y("loading");s.custom=y("custom");s.dismiss=e=>{c({type:3,toastId:e})};s.remove=e=>c({type:4,toastId:e});s.promise=(e,t,r)=>{let a=s.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e=="function"&&(e=e()),e.then(n=>{let o=t.success?m(t.success,n):void 0;return o?s.success(o,{id:a,...r,...r==null?void 0:r.success}):s.dismiss(a),n}).catch(n=>{let o=t.error?m(t.error,n):void 0;o?s.error(o,{id:a,...r,...r==null?void 0:r.error}):s.dismiss(a)}),e};var f=require("react");var L=(e,t)=>{c({type:1,toast:{id:e,height:t}})},Q=()=>{c({type:5,time:Date.now()})},S=new Map,B=1e3,W=(e,t=B)=>{if(S.has(e))return;let r=setTimeout(()=>{S.delete(e),c({type:4,toastId:e})},t);S.set(e,r)},V=e=>{let{toasts:t,pausedAt:r}=g(e);(0,f.useEffect)(()=>{if(r)return;let o=Date.now(),T=t.map(i=>{if(i.duration===1/0)return;let d=(i.duration||0)+i.pauseDuration-(o-i.createdAt);if(d<0){i.visible&&s.dismiss(i.id);return}return setTimeout(()=>s.dismiss(i.id),d)});return()=>{T.forEach(i=>i&&clearTimeout(i))}},[t,r]);let a=(0,f.useCallback)(()=>{r&&c({type:6,time:Date.now()})},[r]),n=(0,f.useCallback)((o,T)=>{let{reverseOrder:i=!1,gutter:d=8,defaultPosition:b}=T||{},D=t.filter(u=>(u.position||b)===(o.position||b)&&u.height),x=D.findIndex(u=>u.id===o.id),E=D.filter((u,O)=>Ou.visible).slice(...i?[E+1]:[0,E]).reduce((u,O)=>u+(O.height||0)+d,0)},[t]);return(0,f.useEffect)(()=>{t.forEach(o=>{if(o.dismissed)W(o.id,o.removeDelay);else{let T=S.get(o.id);T&&(clearTimeout(T),S.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:L,startPause:Q,endPause:a,calculateOffset:n}}};var Y=s;0&&(module.exports={resolveValue,toast,useToaster,useToasterStore}); + //# sourceMappingURL=index.js.map +\ No newline at end of file +diff --git a/headless/index.js.map b/headless/index.js.map +index bf6172b08348e60acd5fd9118b15ccad79635b09..0d842dbfc2fb01ea326df4b914f38e2828d621b9 100644 +--- a/headless/index.js.map ++++ b/headless/index.js.map +@@ -1 +1 @@ +-{"version":3,"sources":["../src/headless/index.ts","../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts"],"sourcesContent":["import { toast } from '../core/toast';\n\nexport type {\n DefaultToastOptions,\n IconTheme,\n Renderable,\n Toast,\n ToasterProps,\n ToastOptions,\n ToastPosition,\n ToastType,\n ValueFunction,\n ValueOrFunction,\n} from '../core/types';\n\nexport { resolveValue } from '../core/types';\nexport { useToaster } from '../core/use-toaster';\nexport { useStore as useToasterStore } from '../core/store';\n\nexport { toast };\nexport default toast;\n","import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n"],"mappings":"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","names":["headless_exports","__export","headless_default","resolveValue","toast","useToaster","useStore","__toCommonJS","isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","import_react","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","initial","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","import_react","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","now","timeouts","t","durationLeft","toast","endPause","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","headless_default","toast"]} +\ No newline at end of file ++{"version":3,"sources":["../src/headless/index.ts","../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts"],"sourcesContent":["import { toast } from '../core/toast';\n\nexport type {\n DefaultToastOptions,\n IconTheme,\n Renderable,\n Toast,\n ToasterProps,\n ToastOptions,\n ToastPosition,\n ToastType,\n ValueFunction,\n ValueOrFunction,\n} from '../core/types';\n\nexport { resolveValue } from '../core/types';\nexport { useToaster } from '../core/use-toaster';\nexport { useStore as useToasterStore } from '../core/store';\n\nexport { toast };\nexport default toast;\n","import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'center-right'\n | 'center-left';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n"],"mappings":"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","names":["headless_exports","__export","headless_default","resolveValue","toast","useToaster","useStore","__toCommonJS","isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","import_react","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","initial","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","import_react","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","now","timeouts","t","durationLeft","toast","endPause","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","headless_default","toast"]} +\ No newline at end of file +diff --git a/headless/index.mjs b/headless/index.mjs +index 59587dc32a2f543b8f66258f9e0133f715ef57a6..9f905be9e6a2be04abb95386ed45feeac0115b4a 100644 +--- a/headless/index.mjs ++++ b/headless/index.mjs +@@ -1,2 +1,2 @@ +-var V=e=>typeof e=="function",m=(e,t)=>V(e)?e(t):e;var P=(()=>{let e=0;return()=>(++e).toString()})(),B=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();import{useEffect as x,useState as _,useRef as v}from"react";var I=20;var b=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,I)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return b(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:n}=t;return{...e,toasts:e.toasts.map(o=>o.id===n||n===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let i=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+i}))}}},y=[],l={toasts:[],pausedAt:void 0},c=e=>{l=b(l,e),y.forEach(t=>{t(l)})},M={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},g=(e={})=>{let[t,r]=_(l),n=v(l);x(()=>(n.current!==l&&r(l),y.push(r),()=>{let o=y.indexOf(r);o>-1&&y.splice(o,1)}),[]);let i=t.toasts.map(o=>{var T,a,d;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((T=e[o.type])==null?void 0:T.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((a=e[o.type])==null?void 0:a.duration)||(e==null?void 0:e.duration)||M[o.type],style:{...e.style,...(d=e[o.type])==null?void 0:d.style,...o.style}}});return{...t,toasts:i}};var F=(e,t="blank",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||P()}),p=e=>(t,r)=>{let n=F(t,e,r);return c({type:2,toast:n}),n.id},s=(e,t)=>p("blank")(e,t);s.error=p("error");s.success=p("success");s.loading=p("loading");s.custom=p("custom");s.dismiss=e=>{c({type:3,toastId:e})};s.remove=e=>c({type:4,toastId:e});s.promise=(e,t,r)=>{let n=s.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e=="function"&&(e=e()),e.then(i=>{let o=t.success?m(t.success,i):void 0;return o?s.success(o,{id:n,...r,...r==null?void 0:r.success}):s.dismiss(n),i}).catch(i=>{let o=t.error?m(t.error,i):void 0;o?s.error(o,{id:n,...r,...r==null?void 0:r.error}):s.dismiss(n)}),e};import{useEffect as E,useCallback as R}from"react";var w=(e,t)=>{c({type:1,toast:{id:e,height:t}})},N=()=>{c({type:5,time:Date.now()})},f=new Map,k=1e3,C=(e,t=k)=>{if(f.has(e))return;let r=setTimeout(()=>{f.delete(e),c({type:4,toastId:e})},t);f.set(e,r)},H=e=>{let{toasts:t,pausedAt:r}=g(e);E(()=>{if(r)return;let o=Date.now(),T=t.map(a=>{if(a.duration===1/0)return;let d=(a.duration||0)+a.pauseDuration-(o-a.createdAt);if(d<0){a.visible&&s.dismiss(a.id);return}return setTimeout(()=>s.dismiss(a.id),d)});return()=>{T.forEach(a=>a&&clearTimeout(a))}},[t,r]);let n=R(()=>{r&&c({type:6,time:Date.now()})},[r]),i=R((o,T)=>{let{reverseOrder:a=!1,gutter:d=8,defaultPosition:D}=T||{},S=t.filter(u=>(u.position||D)===(o.position||D)&&u.height),h=S.findIndex(u=>u.id===o.id),O=S.filter((u,A)=>Au.visible).slice(...a?[O+1]:[0,O]).reduce((u,A)=>u+(A.height||0)+d,0)},[t]);return E(()=>{t.forEach(o=>{if(o.dismissed)C(o.id,o.removeDelay);else{let T=f.get(o.id);T&&(clearTimeout(T),f.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:w,startPause:N,endPause:n,calculateOffset:i}}};var ie=s;export{ie as default,m as resolveValue,s as toast,H as useToaster,g as useToasterStore}; ++var V=e=>typeof e=="function",m=(e,t)=>V(e)?e(t):e;var P=(()=>{let e=0;return()=>(++e).toString()})(),B=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})();import{useEffect as x,useState as _,useRef as v}from"react";var I=20;var b=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,I)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return b(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:n}=t;return{...e,toasts:e.toasts.map(o=>o.id===n||n===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let i=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+i}))}}},y=[],l={toasts:[],pausedAt:void 0},c=e=>{l=b(l,e),y.forEach(t=>{t(l)})},M={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},g=(e={})=>{let[t,r]=_(l),n=v(l);x(()=>(n.current!==l&&r(l),y.push(r),()=>{let o=y.indexOf(r);o>-1&&y.splice(o,1)}),[]);let i=t.toasts.map(o=>{var T,a,d;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((T=e[o.type])==null?void 0:T.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((a=e[o.type])==null?void 0:a.duration)||(e==null?void 0:e.duration)||M[o.type],style:{...e.style,...(d=e[o.type])==null?void 0:d.style,...o.style}}});return{...t,toasts:i}};var F=(e,t="blank",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||P()}),p=e=>(t,r)=>{let n=F(t,e,r);return c({type:2,toast:n}),n.id},s=(e,t)=>p("blank")(e,t);s.error=p("error");s.success=p("success");s.loading=p("loading");s.custom=p("custom");s.dismiss=e=>{c({type:3,toastId:e})};s.remove=e=>c({type:4,toastId:e});s.promise=(e,t,r)=>{let n=s.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e=="function"&&(e=e()),e.then(i=>{let o=t.success?m(t.success,i):void 0;return o?s.success(o,{id:n,...r,...r==null?void 0:r.success}):s.dismiss(n),i}).catch(i=>{let o=t.error?m(t.error,i):void 0;o?s.error(o,{id:n,...r,...r==null?void 0:r.error}):s.dismiss(n)}),e};import{useEffect as E,useCallback as h}from"react";var w=(e,t)=>{c({type:1,toast:{id:e,height:t}})},N=()=>{c({type:5,time:Date.now()})},f=new Map,k=1e3,C=(e,t=k)=>{if(f.has(e))return;let r=setTimeout(()=>{f.delete(e),c({type:4,toastId:e})},t);f.set(e,r)},H=e=>{let{toasts:t,pausedAt:r}=g(e);E(()=>{if(r)return;let o=Date.now(),T=t.map(a=>{if(a.duration===1/0)return;let d=(a.duration||0)+a.pauseDuration-(o-a.createdAt);if(d<0){a.visible&&s.dismiss(a.id);return}return setTimeout(()=>s.dismiss(a.id),d)});return()=>{T.forEach(a=>a&&clearTimeout(a))}},[t,r]);let n=h(()=>{r&&c({type:6,time:Date.now()})},[r]),i=h((o,T)=>{let{reverseOrder:a=!1,gutter:d=8,defaultPosition:D}=T||{},S=t.filter(u=>(u.position||D)===(o.position||D)&&u.height),R=S.findIndex(u=>u.id===o.id),O=S.filter((u,A)=>Au.visible).slice(...a?[O+1]:[0,O]).reduce((u,A)=>u+(A.height||0)+d,0)},[t]);return E(()=>{t.forEach(o=>{if(o.dismissed)C(o.id,o.removeDelay);else{let T=f.get(o.id);T&&(clearTimeout(T),f.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:w,startPause:N,endPause:n,calculateOffset:i}}};var ie=s;export{ie as default,m as resolveValue,s as toast,H as useToaster,g as useToasterStore}; + //# sourceMappingURL=index.mjs.map +\ No newline at end of file +diff --git a/headless/index.mjs.map b/headless/index.mjs.map +index 122e18f6e916645b6622b708903e32e9d47957d4..f0ee18fcc0448d73ca2be04aa9aaf011a8340d74 100644 +--- a/headless/index.mjs.map ++++ b/headless/index.mjs.map +@@ -1 +1 @@ +-{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/headless/index.ts"],"sourcesContent":["import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import { toast } from '../core/toast';\n\nexport type {\n DefaultToastOptions,\n IconTheme,\n Renderable,\n Toast,\n ToasterProps,\n ToastOptions,\n ToastPosition,\n ToastType,\n ValueFunction,\n ValueOrFunction,\n} from '../core/types';\n\nexport { resolveValue } from '../core/types';\nexport { useToaster } from '../core/use-toaster';\nexport { useStore as useToasterStore } from '../core/store';\n\nexport { toast };\nexport default toast;\n"],"mappings":"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","names":["isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","useEffect","useState","useRef","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","useState","initial","useRef","useEffect","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","useEffect","useCallback","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","useEffect","now","timeouts","t","durationLeft","toast","endPause","useCallback","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","headless_default","toast"]} +\ No newline at end of file ++{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/store.ts","../src/core/toast.ts","../src/core/use-toaster.ts","../src/headless/index.ts"],"sourcesContent":["import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'center-right'\n | 'center-left';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n","export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n","import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nconst TOAST_LIMIT = 20;\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\ntype Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface State {\n toasts: Toast[];\n pausedAt: number | undefined;\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [], pausedAt: undefined };\n\nexport const dispatch = (action: Action) => {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n};\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (toastOptions: DefaultToastOptions = {}): State => {\n const [state, setState] = useState(memoryState);\n const initial = useRef(memoryState);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState) {\n setState(memoryState);\n }\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n","import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport { dispatch, ActionType } from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\ntoast.dismiss = (toastId?: string) => {\n dispatch({\n type: ActionType.DISMISS_TOAST,\n toastId,\n });\n};\n\ntoast.remove = (toastId?: string) =>\n dispatch({ type: ActionType.REMOVE_TOAST, toastId });\n\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n","import { useEffect, useCallback } from 'react';\nimport { dispatch, ActionType, useStore } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nconst updateHeight = (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n};\nconst startPause = () => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n};\n\nconst toastTimeouts = new Map>();\n\nexport const REMOVE_DELAY = 1000;\n\nconst addToRemoveQueue = (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const useToaster = (toastOptions?: DefaultToastOptions) => {\n const { toasts, pausedAt } = useStore(toastOptions);\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt]);\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n useEffect(() => {\n // Add dismissed toasts to remove queue\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n","import { toast } from '../core/toast';\n\nexport type {\n DefaultToastOptions,\n IconTheme,\n Renderable,\n Toast,\n ToasterProps,\n ToastOptions,\n ToastPosition,\n ToastType,\n ValueFunction,\n ValueOrFunction,\n} from '../core/types';\n\nexport { resolveValue } from '../core/types';\nexport { useToaster } from '../core/use-toaster';\nexport { useStore as useToasterStore } from '../core/store';\n\nexport { toast };\nexport default toast;\n"],"mappings":"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","names":["isFunction","valOrFunction","resolveValue","arg","genId","count","prefersReducedMotion","shouldReduceMotion","mediaQuery","useEffect","useState","useRef","TOAST_LIMIT","reducer","state","action","TOAST_LIMIT","t","toast","toastId","diff","listeners","memoryState","dispatch","listener","defaultTimeouts","useStore","toastOptions","setState","useState","initial","useRef","useEffect","index","mergedToasts","_a","_b","_c","createToast","message","type","opts","genId","createHandler","options","toast","dispatch","toastId","promise","msgs","id","p","successMessage","resolveValue","e","errorMessage","useEffect","useCallback","updateHeight","toastId","height","dispatch","startPause","toastTimeouts","REMOVE_DELAY","addToRemoveQueue","removeDelay","timeout","useToaster","toastOptions","toasts","pausedAt","useStore","useEffect","now","timeouts","t","durationLeft","toast","endPause","useCallback","calculateOffset","opts","reverseOrder","gutter","defaultPosition","relevantToasts","toastIndex","toastsBefore","i","acc","headless_default","toast"]} +\ No newline at end of file +diff --git a/src/components/toaster.tsx b/src/components/toaster.tsx +index 67c07e79e972c14d67dc16f531e11efc39c604c3..02b974fbebbb648285c923340e33aa3b6ddceceb 100644 +--- a/src/components/toaster.tsx ++++ b/src/components/toaster.tsx +@@ -48,17 +48,24 @@ const getPositionStyle = ( + position: ToastPosition, + offset: number + ): React.CSSProperties => { +- const top = position.includes('top'); +- const verticalStyle: React.CSSProperties = top ? { top: 0 } : { bottom: 0 }; +- const horizontalStyle: React.CSSProperties = position.includes('center') +- ? { +- justifyContent: 'center', +- } +- : position.includes('right') ++ const top = position.includes('top') || position.includes('center-'); ++ ++ const verticalStyle: React.CSSProperties = top + ? { +- justifyContent: 'flex-end', +- } +- : {}; ++ top: position.includes('center-') ? '50%' : 0, ++ } ++ : { bottom: 0 }; ++ ++ const horizontalStyle: React.CSSProperties = position.includes('center-right') ++ ? { justifyContent: 'flex-end' } ++ : position.includes('center-left') ++ ? { justifyContent: 'flex-start' } ++ : position.includes('center') ++ ? { justifyContent: 'center' } ++ : position.includes('right') ++ ? { justifyContent: 'flex-end' } ++ : {}; ++ + return { + left: 0, + right: 0, +diff --git a/src/core/types.ts b/src/core/types.ts +index 764a5d780cd5ffa1f51c9d26b41e94345a9fea02..281e222cdf1644a8b2edcd673c46fa4c358ddabc 100644 +--- a/src/core/types.ts ++++ b/src/core/types.ts +@@ -7,7 +7,9 @@ export type ToastPosition = + | 'top-right' + | 'bottom-left' + | 'bottom-center' +- | 'bottom-right'; ++ | 'bottom-right' ++ | 'center-right' ++ | 'center-left'; + + export type Renderable = React.ReactElement | string | null; + diff --git a/web/src/features/notifications/NotificationWrapper.tsx b/web/src/features/notifications/NotificationWrapper.tsx index 44a770f..de8af54 100644 --- a/web/src/features/notifications/NotificationWrapper.tsx +++ b/web/src/features/notifications/NotificationWrapper.tsx @@ -138,7 +138,7 @@ const Notifications: React.FC = () => { } else { iconColor = tinycolor(data.iconColor).toRgbString(); } - + toast.custom( (t) => (