{"version":3,"sources":["../../src/addons/use-notification-center/useNotificationCenter.ts","../../src/style.css","../../src/utils/propValidator.ts","../../src/utils/cssTransition.tsx","../../src/utils/collapseToast.ts","../../src/utils/mapper.ts","../../src/components/CloseButton.tsx","../../src/components/ProgressBar.tsx","../../src/components/ToastContainer.tsx","../../src/core/genToastId.ts","../../src/core/store.ts","../../src/core/toast.ts","../../src/hooks/useToastContainer.ts","../../src/hooks/useToast.ts","../../src/hooks/useIsomorphicLayoutEffect.ts","../../src/components/Toast.tsx","../../src/components/Icons.tsx","../../src/components/Transitions.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from 'react';\nimport { toast, ToastItem, Id } from '../../';\n\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\n\nexport interface NotificationCenterItem<Data = {}> extends Optional<ToastItem<Data>, 'content' | 'data' | 'status'> {\n  read: boolean;\n  createdAt: number;\n}\n\nexport type SortFn<Data> = (l: NotificationCenterItem<Data>, r: NotificationCenterItem<Data>) => number;\n\nexport type FilterFn<Data = {}> = (item: NotificationCenterItem<Data>) => boolean;\n\nexport interface UseNotificationCenterParams<Data = {}> {\n  /**\n   * initial data to rehydrate the notification center\n   */\n  data?: NotificationCenterItem<Data>[];\n\n  /**\n   * By default, the notifications are sorted from the newest to the oldest using\n   * the `createdAt` field. Use this to provide your own sort function\n   *\n   * Usage:\n   * ```\n   * // old notifications first\n   * useNotificationCenter({\n   *   sort: ((l, r) => l.createdAt - r.createdAt)\n   * })\n   * ```\n   */\n  sort?: SortFn<Data>;\n\n  /**\n   * Keep the toast that meets the condition specified in the callback function.\n   *\n   * Usage:\n   * ```\n   * // keep only the toasts when hidden is set to false\n   * useNotificationCenter({\n   *   filter: item => item.data.hidden === false\n   * })\n   * ```\n   */\n  filter?: FilterFn<Data>;\n}\n\nexport interface UseNotificationCenter<Data> {\n  /**\n   * Contains all the notifications\n   */\n  notifications: NotificationCenterItem<Data>[];\n\n  /**\n   * Clear all notifications\n   */\n  clear(): void;\n\n  /**\n   * Mark all notification as read\n   */\n  markAllAsRead(): void;\n\n  /**\n   * Mark all notification as read or not.\n   *\n   * Usage:\n   * ```\n   * markAllAsRead(false) // mark all notification as not read\n   *\n   * markAllAsRead(true) // same as calling markAllAsRead()\n   * ```\n   */\n  markAllAsRead(read?: boolean): void;\n\n  /**\n   * Mark one or more notifications as read.\n   *\n   * Usage:\n   * ```\n   * markAsRead(\"anId\")\n   * markAsRead([\"a\",\"list\", \"of\", \"id\"])\n   * ```\n   */\n  markAsRead(id: Id | Id[]): void;\n\n  /**\n   * Mark one or more notifications as read.The second parameter let you mark the notification as read or not.\n   *\n   * Usage:\n   * ```\n   * markAsRead(\"anId\", false)\n   * markAsRead([\"a\",\"list\", \"of\", \"id\"], false)\n   *\n   * markAsRead(\"anId\", true) // same as markAsRead(\"anId\")\n   * ```\n   */\n  markAsRead(id: Id | Id[], read?: boolean): void;\n\n  /**\n   * Remove one or more notifications\n   *\n   * Usage:\n   * ```\n   * remove(\"anId\")\n   * remove([\"a\",\"list\", \"of\", \"id\"])\n   * ```\n   */\n  remove(id: Id | Id[]): void;\n\n  /**\n   * Push a notification to the notification center.\n   * Returns null when an item with the given id already exists\n   *\n   * Usage:\n   * ```\n   * const id = add({id: \"id\", content: \"test\", data: { foo: \"hello\" } })\n   *\n   * // Return the id of the notification, generate one if none provided\n   * const id = add({ data: {title: \"a title\", text: \"some text\"} })\n   * ```\n   */\n  add(item: Partial<NotificationCenterItem<Data>>): Id | null;\n\n  /**\n   * Update the notification that match the id\n   * Returns null when no matching notification found\n   *\n   * Usage:\n   * ```\n   * const id = update(\"anId\",  {content: \"test\", data: { foo: \"hello\" } })\n   *\n   * // It's also possible to update the id\n   * const id = update(\"anId\"m { id:\"anotherOne\", data: {title: \"a title\", text: \"some text\"} })\n   * ```\n   */\n  update(id: Id, item: Partial<NotificationCenterItem<Data>>): Id | null;\n\n  /**\n   * Retrieve one or more notifications\n   *\n   * Usage:\n   * ```\n   * find(\"anId\")\n   * find([\"a\",\"list\", \"of\", \"id\"])\n   * ```\n   */\n  find(id: Id): NotificationCenterItem<Data> | undefined;\n\n  /**\n   * Retrieve one or more notifications\n   *\n   * Usage:\n   * ```\n   * find(\"anId\")\n   * find([\"a\",\"list\", \"of\", \"id\"])\n   * ```\n   */\n  find(id: Id[]): NotificationCenterItem<Data>[] | undefined;\n\n  /**\n   * Retrieve the count for unread notifications\n   */\n  unreadCount: number;\n\n  /**\n   * Sort notifications using the newly provided function\n   *\n   * Usage:\n   * ```\n   * // old notifications first\n   * sort((l, r) => l.createdAt - r.createdAt)\n   * ```\n   */\n  sort(sort: SortFn<Data>): void;\n}\n\nexport function useNotificationCenter<Data = {}>(\n  params: UseNotificationCenterParams<Data> = {}\n): UseNotificationCenter<Data> {\n  const sortFn = useRef(params.sort || defaultSort);\n  const filterFn = useRef(params.filter || null);\n  const [notifications, setNotifications] = useState<NotificationCenterItem<Data>[]>(() => {\n    if (params.data) {\n      return filterFn.current\n        ? params.data.filter(filterFn.current).sort(sortFn.current)\n        : [...params.data].sort(sortFn.current);\n    }\n    return [];\n  });\n\n  useEffect(() => {\n    return toast.onChange(item => {\n      if (item.status === 'added' || item.status === 'updated') {\n        const newItem = decorate(item as NotificationCenterItem<Data>);\n        if (filterFn.current && !filterFn.current(newItem)) return;\n\n        setNotifications(prev => {\n          let nextState: NotificationCenterItem<Data>[] = [];\n          const updateIdx = prev.findIndex(v => v.id === newItem.id);\n\n          if (updateIdx !== -1) {\n            nextState = prev.slice();\n            Object.assign(nextState[updateIdx], newItem, {\n              createdAt: Date.now()\n            });\n          } else if (prev.length === 0) {\n            nextState = [newItem];\n          } else {\n            nextState = [newItem, ...prev];\n          }\n          return nextState.sort(sortFn.current);\n        });\n      }\n    });\n  }, []);\n\n  const remove = (id: Id | Id[]) => {\n    setNotifications(prev => prev.filter(Array.isArray(id) ? v => !id.includes(v.id) : v => v.id !== id));\n  };\n\n  const clear = () => {\n    setNotifications([]);\n  };\n\n  const markAllAsRead = (read = true) => {\n    setNotifications(prev =>\n      prev.map(v => {\n        v.read = read;\n        return v;\n      })\n    );\n  };\n\n  const markAsRead = (id: Id | Id[], read = true) => {\n    let map = (v: NotificationCenterItem<Data>) => {\n      if (v.id === id) v.read = read;\n      return v;\n    };\n\n    if (Array.isArray(id)) {\n      map = v => {\n        if (id.includes(v.id)) v.read = read;\n        return v;\n      };\n    }\n\n    setNotifications(prev => prev.map(map));\n  };\n\n  const find = (id: Id | Id[]) => {\n    return Array.isArray(id) ? notifications.filter(v => id.includes(v.id)) : notifications.find(v => v.id === id);\n  };\n\n  const add = (item: Partial<NotificationCenterItem<Data>>) => {\n    if (notifications.find(v => v.id === item.id)) return null;\n\n    const newItem = decorate(item);\n\n    setNotifications(prev => [...prev, newItem].sort(sortFn.current));\n\n    return newItem.id;\n  };\n\n  const update = (id: Id, item: Partial<NotificationCenterItem<Data>>) => {\n    const index = notifications.findIndex(v => v.id === id);\n\n    if (index !== -1) {\n      setNotifications(prev => {\n        const nextState = [...prev];\n        Object.assign(nextState[index], item, {\n          createdAt: item.createdAt || Date.now()\n        });\n\n        return nextState.sort(sortFn.current);\n      });\n\n      return item.id as Id;\n    }\n\n    return null;\n  };\n\n  const sort = (compareFn: SortFn<Data>) => {\n    sortFn.current = compareFn;\n    setNotifications(prev => prev.slice().sort(compareFn));\n  };\n\n  return {\n    notifications,\n    clear,\n    markAllAsRead,\n    markAsRead,\n    add,\n    update,\n    remove,\n    // @ts-ignore fixme: overloading issue\n    find,\n    sort,\n    get unreadCount() {\n      return notifications.reduce((prev, cur) => (!cur.read ? prev + 1 : prev), 0);\n    }\n  };\n}\n\nexport function decorate<Data>(item: NotificationCenterItem<Data> | Partial<NotificationCenterItem<Data>>) {\n  if (item.id == null) item.id = Date.now().toString(36).substring(2, 9);\n  if (!item.createdAt) item.createdAt = Date.now();\n  if (item.read == null) item.read = false;\n  return item as NotificationCenterItem<Data>;\n}\n\n// newest to oldest\nfunction defaultSort<Data>(l: NotificationCenterItem<Data>, r: NotificationCenterItem<Data>) {\n  return r.createdAt - l.createdAt;\n}\n","\nfunction injectStyle(css) {\n  if (!css || typeof document === 'undefined') return\n\n  const head = document.head || document.getElementsByTagName('head')[0]\n  const style = document.createElement('style')\n  style.type = 'text/css'\n          \n  if(head.firstChild) {\n    head.insertBefore(style, head.firstChild)\n  } else {\n    head.appendChild(style)\n  }\n\n  if(style.styleSheet) {\n    style.styleSheet.cssText = css\n  } else {\n    style.appendChild(document.createTextNode(css))\n  }\n}\ninjectStyle(\":root{--toastify-color-light: #fff;--toastify-color-dark: #121212;--toastify-color-info: #3498db;--toastify-color-success: #07bc0c;--toastify-color-warning: #f1c40f;--toastify-color-error: hsl(6, 78%, 57%);--toastify-color-transparent: rgba(255, 255, 255, .7);--toastify-icon-color-info: var(--toastify-color-info);--toastify-icon-color-success: var(--toastify-color-success);--toastify-icon-color-warning: var(--toastify-color-warning);--toastify-icon-color-error: var(--toastify-color-error);--toastify-container-width: fit-content;--toastify-toast-width: 320px;--toastify-toast-offset: 16px;--toastify-toast-top: max(var(--toastify-toast-offset), env(safe-area-inset-top));--toastify-toast-right: max(var(--toastify-toast-offset), env(safe-area-inset-right));--toastify-toast-left: max(var(--toastify-toast-offset), env(safe-area-inset-left));--toastify-toast-bottom: max(var(--toastify-toast-offset), env(safe-area-inset-bottom));--toastify-toast-background: #fff;--toastify-toast-padding: 14px;--toastify-toast-min-height: 64px;--toastify-toast-max-height: 800px;--toastify-toast-bd-radius: 6px;--toastify-toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toastify-font-family: sans-serif;--toastify-z-index: 9999;--toastify-text-color-light: #757575;--toastify-text-color-dark: #fff;--toastify-text-color-info: #fff;--toastify-text-color-success: #fff;--toastify-text-color-warning: #fff;--toastify-text-color-error: #fff;--toastify-spinner-color: #616161;--toastify-spinner-color-empty-area: #e0e0e0;--toastify-color-progress-light: linear-gradient(to right, #4cd964, #5ac8fa, #007aff, #34aadc, #5856d6, #ff2d55);--toastify-color-progress-dark: #bb86fc;--toastify-color-progress-info: var(--toastify-color-info);--toastify-color-progress-success: var(--toastify-color-success);--toastify-color-progress-warning: var(--toastify-color-warning);--toastify-color-progress-error: var(--toastify-color-error);--toastify-color-progress-bgo: .2}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index));position:fixed;width:var(--toastify-container-width);box-sizing:border-box;color:#fff;display:flex;flex-direction:column}.Toastify__toast-container:not(.Toastify__toast-container--stacked){gap:8px}.Toastify__toast-container--top-left{top:var(--toastify-toast-top);left:var(--toastify-toast-left)}.Toastify__toast-container--top-center{top:var(--toastify-toast-top);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--top-right{top:var(--toastify-toast-top);right:var(--toastify-toast-right);align-items:end}.Toastify__toast-container--bottom-left{bottom:var(--toastify-toast-bottom);left:var(--toastify-toast-left)}.Toastify__toast-container--bottom-center{bottom:var(--toastify-toast-bottom);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--bottom-right{bottom:var(--toastify-toast-bottom);right:var(--toastify-toast-right);align-items:end}.Toastify__toast{--y: 0;position:relative;touch-action:none;width:var(--toastify-toast-width);min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:var(--toastify-toast-padding);border-radius:var(--toastify-toast-bd-radius);box-shadow:var(--toastify-toast-shadow);max-height:var(--toastify-toast-max-height);font-family:var(--toastify-font-family);z-index:0;display:flex;flex:1 auto;align-items:center;word-break:break-word}.Toastify__toast-container[data-stacked=true]{width:var(--toastify-toast-width)}.Toastify__toast--stacked{position:absolute;width:100%;transform:translate3d(0,var(--y),0) scale(var(--s));transition:transform .3s}.Toastify__toast--stacked[data-collapsed] .Toastify__toast-body,.Toastify__toast--stacked[data-collapsed] .Toastify__close-button{transition:opacity .1s}.Toastify__toast--stacked[data-collapsed=false]{overflow:visible}.Toastify__toast--stacked[data-collapsed=true]:not(:last-child)>*{opacity:0}.Toastify__toast--stacked:after{content:\\\"\\\";position:absolute;left:0;right:0;height:calc(var(--g) * 1px);bottom:100%}.Toastify__toast--stacked[data-pos=top]{top:0}.Toastify__toast--stacked[data-pos=bot]{bottom:0}.Toastify__toast--stacked[data-pos=bot].Toastify__toast--stacked:before{transform-origin:top}.Toastify__toast--stacked[data-pos=top].Toastify__toast--stacked:before{transform-origin:bottom}.Toastify__toast--stacked:before{content:\\\"\\\";position:absolute;left:0;right:0;bottom:0;height:100%;transform:scaleY(3);z-index:-1;pointer-events:none}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-icon{margin-inline-end:10px;width:22px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.5s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light,.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--toastify-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;position:absolute;top:6px;right:6px;background:transparent;outline:none;border:none;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;z-index:1}.Toastify__toast--rtl .Toastify__close-button{left:6px;right:unset}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;left:0;width:100%;height:100%;z-index:1;opacity:.7;transform-origin:left}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{right:0;left:initial;transform-origin:right;border-bottom-left-radius:initial}.Toastify__progress-bar--wrp{position:absolute;overflow:hidden;bottom:0;left:0;width:100%;height:5px;border-bottom-left-radius:var(--toastify-toast-bd-radius);border-bottom-right-radius:var(--toastify-toast-bd-radius)}.Toastify__progress-bar--wrp[data-hidden=true]{opacity:0}.Toastify__progress-bar--bg{opacity:var(--toastify-color-progress-bgo);width:100%;height:100%}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);animation:Toastify__spin .65s linear infinite}.Toastify__close-all-toast{cursor:pointer;margin-bottom:0;align-items:center;justify-content:center;padding:7px 14px;height:32px;min-height:32px}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,var(--y),0)}to{opacity:0;transform:translate3d(2000px,var(--y),0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,var(--y),0)}to{opacity:0;transform:translate3d(-2000px,var(--y),0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:translate3d(0,var(--y),0) scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:translate3d(0,var(--y),0) perspective(400px)}30%{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(-20deg);opacity:1}to{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(90deg);opacity:0}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideOutRight{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(110%,var(--y),0)}}@keyframes Toastify__slideOutLeft{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(-110%,var(--y),0)}}@keyframes Toastify__slideOutDown{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes Toastify__slideOutUp{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:Toastify__slideOutLeft;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:Toastify__slideOutRight;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown;animation-timing-function:ease-in;animation-duration:.3s}@keyframes Toastify__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.Toastify__no-animation-enter,.Toastify__no-animation-exit{animation:none}\\n\");","import { isValidElement } from 'react';\nimport { Id } from '../types';\n\nexport const isNum = (v: any): v is Number => typeof v === 'number' && !isNaN(v);\n\nexport const isStr = (v: any): v is String => typeof v === 'string';\n\nexport const isFn = (v: any): v is Function => typeof v === 'function';\n\nexport const isId = (v: unknown): v is Id => isStr(v) || isNum(v);\n\nexport const parseClassName = (v: any) => (isStr(v) || isFn(v) ? v : null);\n\nexport const getAutoCloseDelay = (toastAutoClose?: false | number, containerAutoClose?: false | number) =>\n  toastAutoClose === false || (isNum(toastAutoClose) && toastAutoClose > 0) ? toastAutoClose : containerAutoClose;\n\nexport const canBeRendered = <T>(content: T): boolean =>\n  isValidElement(content) || isStr(content) || isFn(content) || isNum(content);\n","import React, { useEffect, useLayoutEffect, useRef } from 'react';\nimport { collapseToast } from './collapseToast';\nimport { Default } from './constant';\n\nimport { ToastTransitionProps } from '../types';\n\nexport interface CSSTransitionProps {\n  /**\n   * Css class to apply when toast enter\n   */\n  enter: string;\n\n  /**\n   * Css class to apply when toast leave\n   */\n  exit: string;\n\n  /**\n   * Append current toast position to the classname.\n   * If multiple classes are provided, only the last one will get the position\n   * For instance `myclass--top-center`...\n   * `Default: false`\n   */\n  appendPosition?: boolean;\n\n  /**\n   * Collapse toast smoothly when exit animation end\n   * `Default: true`\n   */\n  collapse?: boolean;\n\n  /**\n   * Collapse transition duration\n   * `Default: 300`\n   */\n  collapseDuration?: number;\n}\n\nconst enum AnimationStep {\n  Enter,\n  Exit\n}\n\n/**\n * Css animation that just work.\n * You could use animate.css for instance\n *\n *\n * ```\n * cssTransition({\n *   enter: \"animate__animated animate__bounceIn\",\n *   exit: \"animate__animated animate__bounceOut\"\n * })\n * ```\n *\n */\nexport function cssTransition({\n  enter,\n  exit,\n  appendPosition = false,\n  collapse = true,\n  collapseDuration = Default.COLLAPSE_DURATION\n}: CSSTransitionProps) {\n  return function ToastTransition({\n    children,\n    position,\n    preventExitTransition,\n    done,\n    nodeRef,\n    isIn,\n    playToast\n  }: ToastTransitionProps) {\n    const enterClassName = appendPosition ? `${enter}--${position}` : enter;\n    const exitClassName = appendPosition ? `${exit}--${position}` : exit;\n    const animationStep = useRef(AnimationStep.Enter);\n\n    useLayoutEffect(() => {\n      const node = nodeRef.current!;\n      const classToToken = enterClassName.split(' ');\n\n      const onEntered = (e: AnimationEvent) => {\n        if (e.target !== nodeRef.current) return;\n\n        playToast();\n        node.removeEventListener('animationend', onEntered);\n        node.removeEventListener('animationcancel', onEntered);\n        if (animationStep.current === AnimationStep.Enter && e.type !== 'animationcancel') {\n          node.classList.remove(...classToToken);\n        }\n      };\n\n      const onEnter = () => {\n        node.classList.add(...classToToken);\n        node.addEventListener('animationend', onEntered);\n        node.addEventListener('animationcancel', onEntered);\n      };\n\n      onEnter();\n    }, []);\n\n    useEffect(() => {\n      const node = nodeRef.current!;\n\n      const onExited = () => {\n        node.removeEventListener('animationend', onExited);\n        collapse ? collapseToast(node, done, collapseDuration) : done();\n      };\n\n      const onExit = () => {\n        animationStep.current = AnimationStep.Exit;\n        node.className += ` ${exitClassName}`;\n        node.addEventListener('animationend', onExited);\n      };\n\n      if (!isIn) preventExitTransition ? onExited() : onExit();\n    }, [isIn]);\n\n    return <>{children}</>;\n  };\n}\n","import { Default } from './constant';\n\n/**\n * Used to collapse toast after exit animation\n */\nexport function collapseToast(node: HTMLElement, done: () => void, duration = Default.COLLAPSE_DURATION) {\n  const { scrollHeight, style } = node;\n\n  requestAnimationFrame(() => {\n    style.minHeight = 'initial';\n    style.height = scrollHeight + 'px';\n    style.transition = `all ${duration}ms`;\n\n    requestAnimationFrame(() => {\n      style.height = '0';\n      style.padding = '0';\n      style.margin = '0';\n      setTimeout(done, duration as number);\n    });\n  });\n}\n","import { Toast, ToastContentProps, ToastItem, ToastItemStatus, ToastProps } from '../types';\nimport { cloneElement, isValidElement, ReactElement } from 'react';\nimport { isFn, isStr } from './propValidator';\n\nexport function toToastItem(toast: Toast, status: ToastItemStatus): ToastItem {\n  return {\n    content: renderContent(toast.content, toast.props),\n    containerId: toast.props.containerId,\n    id: toast.props.toastId,\n    theme: toast.props.theme,\n    type: toast.props.type,\n    data: toast.props.data || {},\n    isLoading: toast.props.isLoading,\n    icon: toast.props.icon,\n    reason: toast.removalReason,\n    status\n  };\n}\n\nexport function renderContent(content: unknown, props: ToastProps, isPaused: boolean = false) {\n  if (isValidElement(content) && !isStr(content.type)) {\n    return cloneElement<ToastContentProps>(content as ReactElement<any>, {\n      closeToast: props.closeToast,\n      toastProps: props,\n      data: props.data,\n      isPaused\n    });\n  } else if (isFn(content)) {\n    return content({\n      closeToast: props.closeToast,\n      toastProps: props,\n      data: props.data,\n      isPaused\n    });\n  }\n\n  return content;\n}\n","import React from 'react';\nimport { Default } from '../utils';\nimport { CloseToastFunc, Theme, TypeOptions } from '../types';\n\nexport interface CloseButtonProps {\n  closeToast: CloseToastFunc;\n  type: TypeOptions;\n  ariaLabel?: string;\n  theme: Theme;\n}\n\nexport function CloseButton({ closeToast, theme, ariaLabel = 'close' }: CloseButtonProps) {\n  return (\n    <button\n      className={`${Default.CSS_NAMESPACE}__close-button ${Default.CSS_NAMESPACE}__close-button--${theme}`}\n      type=\"button\"\n      onClick={e => {\n        e.stopPropagation();\n        closeToast(true);\n      }}\n      aria-label={ariaLabel}\n    >\n      <svg aria-hidden=\"true\" viewBox=\"0 0 14 16\">\n        <path\n          fillRule=\"evenodd\"\n          d=\"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z\"\n        />\n      </svg>\n    </button>\n  );\n}\n","import React from 'react';\nimport cx from 'clsx';\n\nimport { Default, isFn, Type } from '../utils';\nimport { Theme, ToastClassName, TypeOptions } from '../types';\n\nexport interface ProgressBarProps {\n  /**\n   * The animation delay which determine when to close the toast\n   */\n  delay: number;\n\n  /**\n   * The animation is running or paused\n   */\n  isRunning: boolean;\n\n  /**\n   * Func to close the current toast\n   */\n  closeToast: () => void;\n\n  /**\n   * Optional type : info, success ...\n   */\n  type?: TypeOptions;\n\n  /**\n   * The theme that is currently used\n   */\n  theme: Theme;\n\n  /**\n   * Hide or not the progress bar\n   */\n  hide?: boolean;\n\n  /**\n   * Optional className\n   */\n  className?: ToastClassName;\n\n  /**\n   * Tell whether a controlled progress bar is used\n   */\n  controlledProgress?: boolean;\n\n  /**\n   * Controlled progress value\n   */\n  progress?: number | string;\n\n  /**\n   * Support rtl content\n   */\n  rtl?: boolean;\n\n  /**\n   * Tell if the component is visible on screen or not\n   */\n  isIn?: boolean;\n}\n\nexport function ProgressBar({\n  delay,\n  isRunning,\n  closeToast,\n  type = Type.DEFAULT,\n  hide,\n  className,\n  controlledProgress,\n  progress,\n  rtl,\n  isIn,\n  theme\n}: ProgressBarProps) {\n  const isHidden = hide || (controlledProgress && progress === 0);\n  const style: React.CSSProperties = {\n    animationDuration: `${delay}ms`,\n    animationPlayState: isRunning ? 'running' : 'paused'\n  };\n\n  if (controlledProgress) style.transform = `scaleX(${progress})`;\n  const defaultClassName = cx(\n    `${Default.CSS_NAMESPACE}__progress-bar`,\n    controlledProgress\n      ? `${Default.CSS_NAMESPACE}__progress-bar--controlled`\n      : `${Default.CSS_NAMESPACE}__progress-bar--animated`,\n    `${Default.CSS_NAMESPACE}__progress-bar-theme--${theme}`,\n    `${Default.CSS_NAMESPACE}__progress-bar--${type}`,\n    {\n      [`${Default.CSS_NAMESPACE}__progress-bar--rtl`]: rtl\n    }\n  );\n  const classNames = isFn(className)\n    ? className({\n        rtl,\n        type,\n        defaultClassName\n      })\n    : cx(defaultClassName, className);\n\n  // 🧐 controlledProgress is derived from progress\n  // so if controlledProgress is set\n  // it means that this is also the case for progress\n  const animationEvent = {\n    [controlledProgress && (progress as number)! >= 1 ? 'onTransitionEnd' : 'onAnimationEnd']:\n      controlledProgress && (progress as number)! < 1\n        ? null\n        : () => {\n            isIn && closeToast();\n          }\n  };\n\n  // TODO: add aria-valuenow, aria-valuemax, aria-valuemin\n\n  return (\n    <div className={`${Default.CSS_NAMESPACE}__progress-bar--wrp`} data-hidden={isHidden}>\n      <div\n        className={`${Default.CSS_NAMESPACE}__progress-bar--bg ${Default.CSS_NAMESPACE}__progress-bar-theme--${theme} ${Default.CSS_NAMESPACE}__progress-bar--${type}`}\n      />\n      <div\n        role=\"progressbar\"\n        aria-hidden={isHidden ? 'true' : 'false'}\n        aria-label=\"notification timer\"\n        className={classNames}\n        style={style}\n        {...animationEvent}\n      />\n    </div>\n  );\n}\n","import cx from 'clsx';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { toast } from '../core';\nimport { useToastContainer } from '../hooks';\nimport { useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect';\nimport { ToastContainerProps, ToastPosition } from '../types';\nimport { Default, Direction, isFn, parseClassName } from '../utils';\nimport { Toast } from './Toast';\nimport { Bounce, NoAnimation } from './Transitions';\n\nexport const defaultProps: ToastContainerProps = {\n  position: 'top-right',\n  transition: Bounce,\n  autoClose: 5000,\n  closeButton: true,\n  pauseOnHover: true,\n  pauseOnFocusLoss: true,\n  draggable: 'touch',\n  draggablePercent: Default.DRAGGABLE_PERCENT as number,\n  draggableDirection: Direction.X,\n  role: 'alert',\n  theme: 'light',\n  'aria-label': 'Notifications Alt+T',\n  hotKeys: e => e.altKey && e.code === 'KeyT'\n};\n\nexport function ToastContainer(props: ToastContainerProps) {\n  let containerProps: ToastContainerProps = {\n    ...defaultProps,\n    ...props\n  };\n  const stacked = props.stacked;\n  const [collapsed, setIsCollapsed] = useState(true);\n  const [showCloseAllToast, setShowCloseAllToast] = useState(false);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const { getToastToRender, isToastActive, count } = useToastContainer(containerProps);\n  const { className, style, disableCloseAllToast, closeAllToastClassName, rtl, containerId, hotKeys } = containerProps;\n\n  useEffect(() => {\n    if (collapsed === false && count === 0) {\n      setIsCollapsed(true);\n    }\n\n    if (count > 1) {\n      setShowCloseAllToast(true);\n    } else {\n      setShowCloseAllToast(false);\n    }\n  }, [count]);\n\n  useEffect(() => {\n    toast.dismiss();\n  }, [stacked]);\n\n  function getClassName(position: ToastPosition) {\n    const defaultClassName = cx(\n      `${Default.CSS_NAMESPACE}__toast-container`,\n      `${Default.CSS_NAMESPACE}__toast-container--${position}`,\n      { [`${Default.CSS_NAMESPACE}__toast-container--rtl`]: rtl },\n      { [`${Default.CSS_NAMESPACE}__toast-container--stacked`]: stacked }\n    );\n    return isFn(className)\n      ? className({\n          position,\n          rtl,\n          defaultClassName\n        })\n      : cx(defaultClassName, parseClassName(className));\n  }\n\n  function collapseAll() {\n    if (stacked) {\n      setIsCollapsed(true);\n      toast.play();\n    }\n  }\n\n  useIsomorphicLayoutEffect(() => {\n    if (stacked) {\n      const nodes = containerRef.current!.querySelectorAll('[data-in=\"true\"]');\n      const gap = 12;\n      const isTop = containerProps.position?.includes('top');\n      let usedHeight = 0;\n      let prevS = 0;\n\n      Array.from(nodes)\n        .reverse()\n        .forEach((n, i) => {\n          const node = n as HTMLElement;\n          node.classList.add(`${Default.CSS_NAMESPACE}__toast--stacked`);\n\n          if (i > 0) node.dataset.collapsed = `${collapsed}`;\n\n          if (!node.dataset.pos) node.dataset.pos = isTop ? 'top' : 'bot';\n\n          const y = usedHeight * (collapsed ? 0.2 : 1) + (collapsed ? 0 : gap * i);\n\n          node.style.setProperty('--y', `${isTop ? y : y * -1}px`);\n          node.style.setProperty('--g', `${gap}`);\n          node.style.setProperty('--s', `${1 - (collapsed ? prevS : 0)}`);\n\n          usedHeight += node.offsetHeight;\n          prevS += 0.025;\n        });\n    }\n  }, [collapsed, count, stacked]);\n\n  useEffect(() => {\n    function focusFirst(e: KeyboardEvent) {\n      const node = containerRef.current;\n      if (hotKeys(e)) {\n        (node.querySelector('[tabIndex=\"0\"]') as HTMLElement)?.focus();\n        setIsCollapsed(false);\n        toast.pause();\n      }\n      if (e.key === 'Escape' && (document.activeElement === node || node?.contains(document.activeElement))) {\n        setIsCollapsed(true);\n        toast.play();\n      }\n    }\n\n    document.addEventListener('keydown', focusFirst);\n\n    return () => {\n      document.removeEventListener('keydown', focusFirst);\n    };\n  }, [hotKeys]);\n\n  return (\n    <section\n      ref={containerRef}\n      className={Default.CSS_NAMESPACE as string}\n      id={containerId as string}\n      onMouseEnter={() => {\n        if (stacked) {\n          setIsCollapsed(false);\n          toast.pause();\n        }\n      }}\n      onMouseLeave={collapseAll}\n      aria-live=\"polite\"\n      aria-atomic=\"false\"\n      aria-relevant=\"additions text\"\n      aria-label={containerProps['aria-label']}\n    >\n      {getToastToRender((position, toastList) => {\n        const containerStyle: React.CSSProperties = !toastList.length\n          ? { ...style, pointerEvents: 'none' }\n          : { ...style };\n\n        return (\n          <div\n            tabIndex={-1}\n            className={getClassName(position)}\n            data-stacked={stacked}\n            style={containerStyle}\n            key={`c-${position}`}\n          >\n            {!disableCloseAllToast && showCloseAllToast && (\n              <Toast\n                toastId=\"closeAllToast\"\n                key=\"closeAllToast\"\n                isIn={true}\n                transition={NoAnimation}\n                closeToast={() => {}}\n                deleteToast={() => {}}\n                position={containerProps.position}\n                draggablePercent={0}\n                theme={containerProps.theme}\n                type=\"default\"\n                stacked={stacked}\n                collapseAll={collapseAll}\n                closeButton={false}\n                onClick={() => {\n                  toastList.forEach(toastElem => toast.dismiss(toastElem.props.toastId));\n                  setShowCloseAllToast(false);\n                }}\n                className={cx(`${Default.CSS_NAMESPACE}__close-all-toast`, closeAllToastClassName)}\n              >\n                Dismiss All\n              </Toast>\n            )}\n            {toastList.map(({ content, props: toastProps }) => {\n              return (\n                <Toast\n                  {...toastProps}\n                  stacked={stacked}\n                  collapseAll={collapseAll}\n                  isIn={isToastActive(toastProps.toastId, toastProps.containerId)}\n                  key={`t-${toastProps.key}`}\n                >\n                  {content}\n                </Toast>\n              );\n            })}\n          </div>\n        );\n      })}\n    </section>\n  );\n}\n","let TOAST_ID = 1;\n\nexport const genToastId = () => `${TOAST_ID++}`;\n","import {\n  ClearWaitingQueueParams,\n  Id,\n  NotValidatedToastProps,\n  OnChangeCallback,\n  ToastContainerProps,\n  ToastContent,\n  ToastItem,\n  ToastOptions\n} from '../types';\nimport { Default, canBeRendered, isId } from '../utils';\nimport { ContainerObserver, createContainerObserver } from './containerObserver';\n\ninterface EnqueuedToast {\n  content: ToastContent<any>;\n  options: NotValidatedToastProps;\n}\n\ninterface RemoveParams {\n  id?: Id;\n  containerId: Id;\n}\n\nconst containers = new Map<Id, ContainerObserver>();\nlet renderQueue: EnqueuedToast[] = [];\nconst listeners = new Set<OnChangeCallback>();\n\nconst dispatchChanges = (data: ToastItem) => listeners.forEach(cb => cb(data));\n\nconst hasContainers = () => containers.size > 0;\n\nfunction flushRenderQueue() {\n  renderQueue.forEach(v => pushToast(v.content, v.options));\n  renderQueue = [];\n}\n\nexport const getToast = (id: Id, { containerId }: ToastOptions) =>\n  containers.get(containerId || Default.CONTAINER_ID)?.toasts.get(id);\n\nexport function isToastActive(id: Id, containerId?: Id) {\n  if (containerId) return !!containers.get(containerId)?.isToastActive(id);\n\n  let isActive = false;\n  containers.forEach(c => {\n    if (c.isToastActive(id)) isActive = true;\n  });\n\n  return isActive;\n}\n\nexport function removeToast(params?: Id | RemoveParams) {\n  if (!hasContainers()) {\n    renderQueue = renderQueue.filter(v => params != null && v.options.toastId !== params);\n    return;\n  }\n\n  if (params == null || isId(params)) {\n    containers.forEach(c => {\n      c.removeToast(params as Id);\n    });\n  } else if (params && ('containerId' in params || 'id' in params)) {\n    const container = containers.get(params.containerId);\n    container\n      ? container.removeToast(params.id)\n      : containers.forEach(c => {\n          c.removeToast(params.id);\n        });\n  }\n}\n\nexport const clearWaitingQueue = (p: ClearWaitingQueueParams = {}) => {\n  containers.forEach(c => {\n    if (c.props.limit && (!p.containerId || c.id === p.containerId)) {\n      c.clearQueue();\n    }\n  });\n};\n\nexport function pushToast<TData>(content: ToastContent<TData>, options: NotValidatedToastProps) {\n  if (!canBeRendered(content)) return;\n  if (!hasContainers()) renderQueue.push({ content, options });\n\n  containers.forEach(c => {\n    c.buildToast(content, options);\n  });\n}\n\ninterface ToggleToastParams {\n  id?: Id;\n  containerId?: Id;\n}\n\ntype RegisterToggleOpts = {\n  id: Id;\n  containerId?: Id;\n  fn: (v: boolean) => void;\n};\n\nexport function registerToggle(opts: RegisterToggleOpts) {\n  containers.get(opts.containerId || Default.CONTAINER_ID)?.setToggle(opts.id, opts.fn);\n}\n\nexport function toggleToast(v: boolean, opt?: ToggleToastParams) {\n  containers.forEach(c => {\n    if (opt == null || !opt?.containerId) {\n      c.toggle(v, opt?.id);\n    } else if (opt?.containerId === c.id) {\n      c.toggle(v, opt?.id);\n    }\n  });\n}\n\nexport function registerContainer(props: ToastContainerProps) {\n  const id = props.containerId || Default.CONTAINER_ID;\n  return {\n    subscribe(notify: () => void) {\n      const container = createContainerObserver(id, props, dispatchChanges);\n\n      containers.set(id, container);\n      const unobserve = container.observe(notify);\n      flushRenderQueue();\n\n      return () => {\n        unobserve();\n        containers.delete(id);\n      };\n    },\n    setProps(p: ToastContainerProps) {\n      containers.get(id)?.setProps(p);\n    },\n    getSnapshot() {\n      return containers.get(id)?.getSnapshot();\n    }\n  };\n}\n\nexport function onChange(cb: OnChangeCallback) {\n  listeners.add(cb);\n\n  return () => {\n    listeners.delete(cb);\n  };\n}\n","import {\n  ClearWaitingQueueFunc,\n  Id,\n  IdOpts,\n  NotValidatedToastProps,\n  OnChangeCallback,\n  ToastContent,\n  ToastOptions,\n  ToastProps,\n  TypeOptions,\n  UpdateOptions\n} from '../types';\nimport { isFn, isNum, isStr, Type } from '../utils';\nimport { genToastId } from './genToastId';\nimport { clearWaitingQueue, getToast, isToastActive, onChange, pushToast, removeToast, toggleToast } from './store';\n\n/**\n * Generate a toastId or use the one provided\n */\nfunction getToastId<TData>(options?: ToastOptions<TData>) {\n  return options && (isStr(options.toastId) || isNum(options.toastId)) ? options.toastId : genToastId();\n}\n\n/**\n * If the container is not mounted, the toast is enqueued\n */\nfunction dispatchToast<TData>(content: ToastContent<TData>, options: NotValidatedToastProps): Id {\n  pushToast(content, options);\n  return options.toastId;\n}\n\n/**\n * Merge provided options with the defaults settings and generate the toastId\n */\nfunction mergeOptions<TData>(type: string, options?: ToastOptions<TData>) {\n  return {\n    ...options,\n    type: (options && options.type) || type,\n    toastId: getToastId(options)\n  } as NotValidatedToastProps;\n}\n\nfunction createToastByType(type: string) {\n  return <TData = unknown>(content: ToastContent<TData>, options?: ToastOptions<TData>) =>\n    dispatchToast(content, mergeOptions(type, options));\n}\n\nfunction toast<TData = unknown>(content: ToastContent<TData>, options?: ToastOptions<TData>) {\n  return dispatchToast(content, mergeOptions(Type.DEFAULT, options));\n}\n\ntoast.loading = <TData = unknown>(content: ToastContent<TData>, options?: ToastOptions<TData>) =>\n  dispatchToast(\n    content,\n    mergeOptions(Type.DEFAULT, {\n      isLoading: true,\n      autoClose: false,\n      closeOnClick: false,\n      closeButton: false,\n      draggable: false,\n      ...options\n    })\n  );\n\nexport interface ToastPromiseParams<TData = unknown, TError = unknown, TPending = unknown> {\n  pending?: string | UpdateOptions<TPending>;\n  success?: string | UpdateOptions<TData>;\n  error?: string | UpdateOptions<TError>;\n}\n\nfunction handlePromise<TData = unknown, TError = unknown, TPending = unknown>(\n  promise: Promise<TData> | (() => Promise<TData>),\n  { pending, error, success }: ToastPromiseParams<TData, TError, TPending>,\n  options?: ToastOptions<TData>\n) {\n  let id: Id;\n\n  if (pending) {\n    id = isStr(pending)\n      ? toast.loading(pending, options)\n      : toast.loading(pending.render, {\n          ...options,\n          ...(pending as ToastOptions)\n        } as ToastOptions<TPending>);\n  }\n\n  const resetParams = {\n    isLoading: null,\n    autoClose: null,\n    closeOnClick: null,\n    closeButton: null,\n    draggable: null\n  };\n\n  const resolver = <T>(type: TypeOptions, input: string | UpdateOptions<T> | undefined, result: T) => {\n    // Remove the toast if the input has not been provided. This prevents the toast from hanging\n    // in the pending state if a success/error toast has not been provided.\n    if (input == null) {\n      toast.dismiss(id);\n      return;\n    }\n\n    const baseParams = {\n      type,\n      ...resetParams,\n      ...options,\n      data: result\n    };\n    const params = isStr(input) ? { render: input } : input;\n\n    // if the id is set we know that it's an update\n    if (id) {\n      toast.update(id, {\n        ...baseParams,\n        ...params\n      } as UpdateOptions);\n    } else {\n      // using toast.promise without loading\n      toast(params!.render, {\n        ...baseParams,\n        ...params\n      } as ToastOptions<T>);\n    }\n\n    return result;\n  };\n\n  const p = isFn(promise) ? promise() : promise;\n\n  //call the resolvers only when needed\n  p.then(result => resolver('success', success, result)).catch(err => resolver('error', error, err));\n\n  return p;\n}\n\n/**\n * Supply a promise or a function that return a promise and the notification will be updated if it resolves or fails.\n * When the promise is pending a spinner is displayed by default.\n * `toast.promise` returns the provided promise so you can chain it.\n *\n * Simple example:\n *\n * ```\n * toast.promise(MyPromise,\n *  {\n *    pending: 'Promise is pending',\n *    success: 'Promise resolved 👌',\n *    error: 'Promise rejected 🤯'\n *  }\n * )\n *\n * ```\n *\n * Advanced usage:\n * ```\n * toast.promise<{name: string}, {message: string}, undefined>(\n *    resolveWithSomeData,\n *    {\n *      pending: {\n *        render: () => \"I'm loading\",\n *        icon: false,\n *      },\n *      success: {\n *        render: ({data}) => `Hello ${data.name}`,\n *        icon: \"🟢\",\n *      },\n *      error: {\n *        render({data}){\n *          // When the promise reject, data will contains the error\n *          return <MyErrorComponent message={data.message} />\n *        }\n *      }\n *    }\n * )\n * ```\n */\ntoast.promise = handlePromise;\ntoast.success = createToastByType(Type.SUCCESS);\ntoast.info = createToastByType(Type.INFO);\ntoast.error = createToastByType(Type.ERROR);\ntoast.warning = createToastByType(Type.WARNING);\ntoast.warn = toast.warning;\ntoast.dark = (content: ToastContent, options?: ToastOptions) =>\n  dispatchToast(\n    content,\n    mergeOptions(Type.DEFAULT, {\n      theme: 'dark',\n      ...options\n    })\n  );\n\ninterface RemoveParams {\n  id?: Id;\n  containerId: Id;\n}\n\nfunction dismiss(params: RemoveParams): void;\nfunction dismiss(params?: Id): void;\nfunction dismiss(params?: Id | RemoveParams) {\n  removeToast(params);\n}\n\n/**\n * Remove toast programmatically\n *\n * - Remove all toasts:\n * ```\n * toast.dismiss()\n * ```\n *\n * - Remove all toasts that belongs to a given container\n * ```\n * toast.dismiss({ container: \"123\" })\n * ```\n *\n * - Remove toast that has a given id regardless the container\n * ```\n * toast.dismiss({ id: \"123\" })\n * ```\n *\n * - Remove toast that has a given id for a specific container\n * ```\n * toast.dismiss({ id: \"123\", containerId: \"12\" })\n * ```\n */\ntoast.dismiss = dismiss;\n\n/**\n * Clear waiting queue when limit is used\n */\ntoast.clearWaitingQueue = clearWaitingQueue as ClearWaitingQueueFunc;\n\n/**\n * Check if a toast is active\n *\n * - Check regardless the container\n * ```\n * toast.isActive(\"123\")\n * ```\n *\n * - Check in a specific container\n * ```\n * toast.isActive(\"123\", \"containerId\")\n * ```\n */\ntoast.isActive = isToastActive;\n\n/**\n * Update a toast, see https://fkhadra.github.io/react-toastify/update-toast/ for more\n *\n * Example:\n * ```\n * // With a string\n * toast.update(toastId, {\n *    render: \"New content\",\n *    type: \"info\",\n * });\n *\n * // Or with a component\n * toast.update(toastId, {\n *    render: MyComponent\n * });\n *\n * // Or a function\n * toast.update(toastId, {\n *    render: () => <div>New content</div>\n * });\n *\n * // Apply a transition\n * toast.update(toastId, {\n *   render: \"New Content\",\n *   type: toast.TYPE.INFO,\n *   transition: Rotate\n * })\n * ```\n */\ntoast.update = <TData = unknown>(toastId: Id, options: UpdateOptions<TData> = {}) => {\n  const toast = getToast(toastId, options as ToastOptions);\n\n  if (toast) {\n    const { props: oldOptions, content: oldContent } = toast;\n\n    const nextOptions = {\n      delay: 0,\n      ...oldOptions,\n      ...options,\n      toastId: options.toastId || toastId,\n      updateId: genToastId()\n    } as ToastProps & UpdateOptions;\n\n    if (nextOptions.toastId !== toastId) nextOptions.staleId = toastId;\n\n    const content = nextOptions.render || oldContent;\n    delete nextOptions.render;\n\n    dispatchToast(content, nextOptions);\n  }\n};\n\n/**\n * Used for controlled progress bar. It will automatically close the notification.\n *\n * If you don't want your notification to be clsoed when the timer is done you should use `toast.update` instead as follow instead:\n *\n * ```\n * toast.update(id, {\n *    progress: null, // remove controlled progress bar\n *    render: \"ok\",\n *    type: \"success\",\n *    autoClose: 5000 // set autoClose to the desired value\n *   });\n * ```\n */\ntoast.done = (id: Id) => {\n  toast.update(id, {\n    progress: 1\n  });\n};\n\n/**\n * Subscribe to change when a toast is added, removed and updated\n *\n * Usage:\n * ```\n * const unsubscribe = toast.onChange((payload) => {\n *   switch (payload.status) {\n *   case \"added\":\n *     // new toast added\n *     break;\n *   case \"updated\":\n *     // toast updated\n *     break;\n *   case \"removed\":\n *     // toast has been removed\n *     break;\n *   }\n * })\n * ```\n */\ntoast.onChange = onChange as (cb: OnChangeCallback) => () => void;\n\n/**\n * Play a toast(s) timer progammatically\n *\n * Usage:\n *\n * - Play all toasts\n * ```\n * toast.play()\n * ```\n *\n * - Play all toasts for a given container\n * ```\n * toast.play({ containerId: \"123\" })\n * ```\n *\n * - Play toast that has a given id regardless the container\n * ```\n * toast.play({ id: \"123\" })\n * ```\n *\n * - Play toast that has a given id for a specific container\n * ```\n * toast.play({ id: \"123\", containerId: \"12\" })\n * ```\n */\ntoast.play = (opts?: IdOpts) => toggleToast(true, opts);\n\n/**\n * Pause a toast(s) timer progammatically\n *\n * Usage:\n *\n * - Pause all toasts\n * ```\n * toast.pause()\n * ```\n *\n * - Pause all toasts for a given container\n * ```\n * toast.pause({ containerId: \"123\" })\n * ```\n *\n * - Pause toast that has a given id regardless the container\n * ```\n * toast.pause({ id: \"123\" })\n * ```\n *\n * - Pause toast that has a given id for a specific container\n * ```\n * toast.pause({ id: \"123\", containerId: \"12\" })\n * ```\n */\ntoast.pause = (opts?: IdOpts) => toggleToast(false, opts);\n\nexport { toast };\n","import { useRef, useSyncExternalStore } from 'react';\nimport { isToastActive, registerContainer } from '../core/store';\nimport { Toast, ToastContainerProps, ToastPosition } from '../types';\n\nexport function useToastContainer(props: ToastContainerProps) {\n  const { subscribe, getSnapshot, setProps } = useRef(registerContainer(props)).current;\n  setProps(props);\n  const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)?.slice();\n\n  function getToastToRender<T>(cb: (position: ToastPosition, toastList: Toast[]) => T) {\n    if (!snapshot) return [];\n\n    const toRender = new Map<ToastPosition, Toast[]>();\n\n    if (props.newestOnTop) snapshot.reverse();\n\n    snapshot.forEach(toast => {\n      const { position } = toast.props;\n      toRender.has(position) || toRender.set(position, []);\n      toRender.get(position)!.push(toast);\n    });\n\n    return Array.from(toRender, p => cb(p[0], p[1]));\n  }\n\n  return {\n    getToastToRender,\n    isToastActive,\n    count: snapshot?.length\n  };\n}\n","import { DOMAttributes, useEffect, useRef, useState } from 'react';\n\nimport { ToastProps } from '../types';\nimport { Default, Direction } from '../utils';\nimport { registerToggle } from '../core/store';\n\ninterface Draggable {\n  start: number;\n  delta: number;\n  removalDistance: number;\n  canCloseOnClick: boolean;\n  canDrag: boolean;\n  didMove: boolean;\n}\n\nexport function useToast(props: ToastProps) {\n  const [isRunning, setIsRunning] = useState(false);\n  const [preventExitTransition, setPreventExitTransition] = useState(false);\n  const toastRef = useRef<HTMLDivElement>(null);\n  const drag = useRef<Draggable>({\n    start: 0,\n    delta: 0,\n    removalDistance: 0,\n    canCloseOnClick: true,\n    canDrag: false,\n    didMove: false\n  }).current;\n  const { autoClose, pauseOnHover, closeToast, onClick, closeOnClick } = props;\n\n  registerToggle({\n    id: props.toastId,\n    containerId: props.containerId,\n    fn: setIsRunning\n  });\n\n  useEffect(() => {\n    if (props.pauseOnFocusLoss) {\n      bindFocusEvents();\n\n      return () => {\n        unbindFocusEvents();\n      };\n    }\n  }, [props.pauseOnFocusLoss]);\n\n  function bindFocusEvents() {\n    if (!document.hasFocus()) pauseToast();\n\n    window.addEventListener('focus', playToast);\n    window.addEventListener('blur', pauseToast);\n  }\n\n  function unbindFocusEvents() {\n    window.removeEventListener('focus', playToast);\n    window.removeEventListener('blur', pauseToast);\n  }\n\n  function onDragStart(e: React.PointerEvent<HTMLElement>) {\n    if (props.draggable === true || props.draggable === e.pointerType) {\n      bindDragEvents();\n      const toast = toastRef.current!;\n      drag.canCloseOnClick = true;\n      drag.canDrag = true;\n      toast.style.transition = 'none';\n\n      if (props.draggableDirection === Direction.X) {\n        drag.start = e.clientX;\n        drag.removalDistance = toast.offsetWidth * (props.draggablePercent / 100);\n      } else {\n        drag.start = e.clientY;\n        drag.removalDistance =\n          (toast.offsetHeight *\n            (props.draggablePercent === Default.DRAGGABLE_PERCENT\n              ? props.draggablePercent * 1.5\n              : props.draggablePercent)) /\n          100;\n      }\n    }\n  }\n\n  function onDragTransitionEnd(e: React.PointerEvent<HTMLElement>) {\n    const { top, bottom, left, right } = toastRef.current!.getBoundingClientRect();\n\n    if (\n      e.nativeEvent.type !== 'touchend' &&\n      props.pauseOnHover &&\n      e.clientX >= left &&\n      e.clientX <= right &&\n      e.clientY >= top &&\n      e.clientY <= bottom\n    ) {\n      pauseToast();\n    } else {\n      playToast();\n    }\n  }\n\n  function playToast() {\n    setIsRunning(true);\n  }\n\n  function pauseToast() {\n    setIsRunning(false);\n  }\n\n  function bindDragEvents() {\n    drag.didMove = false;\n    document.addEventListener('pointermove', onDragMove);\n    document.addEventListener('pointerup', onDragEnd);\n  }\n\n  function unbindDragEvents() {\n    document.removeEventListener('pointermove', onDragMove);\n    document.removeEventListener('pointerup', onDragEnd);\n  }\n\n  function onDragMove(e: PointerEvent) {\n    const toast = toastRef.current!;\n    if (drag.canDrag && toast) {\n      drag.didMove = true;\n      if (isRunning) pauseToast();\n      if (props.draggableDirection === Direction.X) {\n        drag.delta = e.clientX - drag.start;\n      } else {\n        drag.delta = e.clientY - drag.start;\n      }\n\n      // prevent false positive during a toast click\n      if (drag.start !== e.clientX) drag.canCloseOnClick = false;\n      const translate =\n        props.draggableDirection === 'x' ? `${drag.delta}px, var(--y)` : `0, calc(${drag.delta}px + var(--y))`;\n      toast.style.transform = `translate3d(${translate},0)`;\n      toast.style.opacity = `${1 - Math.abs(drag.delta / drag.removalDistance)}`;\n    }\n  }\n\n  function onDragEnd() {\n    unbindDragEvents();\n    const toast = toastRef.current!;\n    if (drag.canDrag && drag.didMove && toast) {\n      drag.canDrag = false;\n      if (Math.abs(drag.delta) > drag.removalDistance) {\n        setPreventExitTransition(true);\n        props.closeToast(true);\n        props.collapseAll();\n        return;\n      }\n\n      toast.style.transition = 'transform 0.2s, opacity 0.2s';\n      toast.style.removeProperty('transform');\n      toast.style.removeProperty('opacity');\n    }\n  }\n\n  const eventHandlers: DOMAttributes<HTMLElement> = {\n    onPointerDown: onDragStart,\n    onPointerUp: onDragTransitionEnd\n  };\n\n  if (autoClose && pauseOnHover) {\n    eventHandlers.onMouseEnter = pauseToast;\n\n    // progress control is delegated to the container\n    if (!props.stacked) eventHandlers.onMouseLeave = playToast;\n  }\n\n  // prevent toast from closing when user drags the toast\n  if (closeOnClick) {\n    eventHandlers.onClick = (e: React.MouseEvent) => {\n      onClick && onClick(e);\n      drag.canCloseOnClick && closeToast(true);\n    };\n  }\n\n  return {\n    playToast,\n    pauseToast,\n    isRunning,\n    preventExitTransition,\n    toastRef,\n    eventHandlers\n  };\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","import cx from 'clsx';\nimport React, { cloneElement, isValidElement } from 'react';\n\nimport { useToast } from '../hooks/useToast';\nimport { ToastProps } from '../types';\nimport { Default, isFn, renderContent } from '../utils';\nimport { CloseButton } from './CloseButton';\nimport { ProgressBar } from './ProgressBar';\nimport { getIcon } from './Icons';\n\nexport const Toast: React.FC<ToastProps> = props => {\n  const { isRunning, preventExitTransition, toastRef, eventHandlers, playToast } = useToast(props);\n  const {\n    closeButton,\n    children,\n    autoClose,\n    onClick,\n    type,\n    hideProgressBar,\n    closeToast,\n    transition: Transition,\n    position,\n    className,\n    style,\n    progressClassName,\n    updateId,\n    role,\n    progress,\n    rtl,\n    toastId,\n    deleteToast,\n    isIn,\n    isLoading,\n    closeOnClick,\n    theme,\n    ariaLabel\n  } = props;\n  const defaultClassName = cx(\n    `${Default.CSS_NAMESPACE}__toast`,\n    `${Default.CSS_NAMESPACE}__toast-theme--${theme}`,\n    `${Default.CSS_NAMESPACE}__toast--${type}`,\n    {\n      [`${Default.CSS_NAMESPACE}__toast--rtl`]: rtl\n    },\n    {\n      [`${Default.CSS_NAMESPACE}__toast--close-on-click`]: closeOnClick\n    }\n  );\n  const cssClasses = isFn(className)\n    ? className({\n        rtl,\n        position,\n        type,\n        defaultClassName\n      })\n    : cx(defaultClassName, className);\n  const icon = getIcon(props);\n  const isProgressControlled = !!progress || !autoClose;\n\n  const closeButtonProps = { closeToast, type, theme };\n  let Close: React.ReactNode = null;\n\n  if (closeButton === false) {\n    // hide\n  } else if (isFn(closeButton)) {\n    Close = closeButton(closeButtonProps);\n  } else if (isValidElement(closeButton)) {\n    Close = cloneElement(closeButton, closeButtonProps);\n  } else {\n    Close = CloseButton(closeButtonProps);\n  }\n\n  return (\n    <Transition\n      isIn={isIn}\n      done={deleteToast}\n      position={position}\n      preventExitTransition={preventExitTransition}\n      nodeRef={toastRef}\n      playToast={playToast}\n    >\n      <div\n        id={toastId as string}\n        tabIndex={0}\n        onClick={onClick}\n        data-in={isIn}\n        className={cx(cssClasses)}\n        {...eventHandlers}\n        style={style}\n        ref={toastRef}\n        {...(isIn && { role: role, 'aria-label': ariaLabel })}\n      >\n        {/* <div className={`${Default.CSS_NAMESPACE}__toast-container-body`}>\n          <div className={`${Default.CSS_NAMESPACE}__toast-icon-gradient`}></div> */}\n        {icon != null && (\n          <div\n            className={cx(`${Default.CSS_NAMESPACE}__toast-icon`, {\n              [`${Default.CSS_NAMESPACE}--animate-icon ${Default.CSS_NAMESPACE}__zoom-enter`]: !isLoading\n            })}\n          >\n            {icon}\n          </div>\n        )}\n        {renderContent(children, props, !isRunning)}\n        {Close}\n        {!props.customProgressBar && (\n          <ProgressBar\n            {...(updateId && !isProgressControlled ? { key: `p-${updateId}` } : {})}\n            rtl={rtl}\n            theme={theme}\n            delay={autoClose as number}\n            isRunning={isRunning}\n            isIn={isIn}\n            closeToast={closeToast}\n            hide={hideProgressBar}\n            type={type}\n            className={progressClassName}\n            controlledProgress={isProgressControlled}\n            progress={progress || 0}\n          />\n        )}\n        {/* </div> */}\n      </div>\n    </Transition>\n  );\n};\n","import React, { cloneElement, isValidElement } from 'react';\n\nimport { Theme, ToastProps, TypeOptions } from '../types';\nimport { Default, isFn } from '../utils';\n\n/**\n * Used when providing custom icon\n */\nexport interface IconProps {\n  theme: Theme;\n  type: TypeOptions;\n  isLoading?: boolean;\n}\n\nexport type BuiltInIconProps = React.SVGProps<SVGSVGElement> & IconProps;\n\nconst Svg: React.FC<BuiltInIconProps> = ({ theme, type, isLoading, ...rest }) => (\n  <svg\n    viewBox=\"0 0 24 24\"\n    width=\"100%\"\n    height=\"100%\"\n    fill={theme === 'colored' ? 'currentColor' : `var(--toastify-icon-color-${type})`}\n    {...rest}\n  />\n);\n\nfunction Warning(props: BuiltInIconProps) {\n  return (\n    <Svg {...props}>\n      <path d=\"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z\" />\n    </Svg>\n  );\n}\n\nfunction Info(props: BuiltInIconProps) {\n  return (\n    <Svg {...props}>\n      <path d=\"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z\" />\n    </Svg>\n  );\n}\n\nfunction Success(props: BuiltInIconProps) {\n  return (\n    <Svg {...props}>\n      <path d=\"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z\" />\n    </Svg>\n  );\n}\n\nfunction Error(props: BuiltInIconProps) {\n  return (\n    <Svg {...props}>\n      <path d=\"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z\" />\n    </Svg>\n  );\n}\n\nfunction Spinner() {\n  return <div className={`${Default.CSS_NAMESPACE}__spinner`} />;\n}\n\nexport const Icons = {\n  info: Info,\n  warning: Warning,\n  success: Success,\n  error: Error,\n  spinner: Spinner\n};\n\nconst maybeIcon = (type: string): type is keyof typeof Icons => type in Icons;\n\nexport type IconParams = Pick<ToastProps, 'theme' | 'icon' | 'type' | 'isLoading'>;\n\nexport function getIcon({ theme, type, isLoading, icon }: IconParams) {\n  let Icon: React.ReactNode = null;\n  const iconProps = { theme, type };\n\n  if (icon === false) {\n    // hide\n  } else if (isFn(icon)) {\n    Icon = icon({ ...iconProps, isLoading });\n  } else if (isValidElement(icon)) {\n    Icon = cloneElement(icon, iconProps);\n  } else if (isLoading) {\n    Icon = Icons.spinner();\n  } else if (maybeIcon(type)) {\n    Icon = Icons[type](iconProps);\n  }\n\n  return Icon;\n}\n","import { cssTransition, Default } from '../utils';\n\nconst getConfig = (animationName: string, appendPosition = false) => ({\n  enter: `${Default.CSS_NAMESPACE}--animate ${Default.CSS_NAMESPACE}__${animationName}-enter`,\n  exit: `${Default.CSS_NAMESPACE}--animate ${Default.CSS_NAMESPACE}__${animationName}-exit`,\n  appendPosition\n});\n\nconst Bounce = cssTransition(getConfig('bounce', true));\n\nconst Slide = cssTransition(getConfig('slide', true));\n\nconst Zoom = cssTransition(getConfig('zoom'));\n\nconst Flip = cssTransition(getConfig('flip'));\n\nconst NoAnimation = cssTransition(getConfig('no-animation'));\n\nexport { Bounce, Slide, Zoom, Flip, NoAnimation };\n"],"mappings":"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","names":["useState","useEffect","useRef","injectStyle","css","head","style","isValidElement","isNum","v","isStr","isFn","isId","canBeRendered","content","isValidElement","isStr","isFn","isNum","React","useEffect","useLayoutEffect","useRef","collapseToast","node","done","duration","scrollHeight","style","cssTransition","enter","exit","appendPosition","collapse","collapseDuration","children","position","preventExitTransition","done","nodeRef","isIn","playToast","enterClassName","exitClassName","animationStep","useRef","useLayoutEffect","node","classToToken","onEntered","e","useEffect","onExited","collapseToast","React","cloneElement","isValidElement","React","React","cx","cx","React","useEffect","useRef","useState","TOAST_ID","genToastId","containers","renderQueue","listeners","hasContainers","containers","getToast","id","containerId","_a","containers","isToastActive","isActive","c","removeToast","params","hasContainers","renderQueue","v","isId","container","clearWaitingQueue","p","pushToast","content","options","canBeRendered","toggleToast","v","opt","containers","c","onChange","cb","listeners","getToastId","options","isStr","isNum","genToastId","dispatchToast","content","pushToast","mergeOptions","type","createToastByType","toast","handlePromise","promise","pending","error","success","id","resetParams","resolver","input","result","baseParams","params","p","isFn","err","dismiss","removeToast","clearWaitingQueue","isToastActive","toastId","getToast","oldOptions","oldContent","nextOptions","onChange","opts","toggleToast","useRef","useSyncExternalStore","useEffect","useRef","useState","useEffect","useLayoutEffect","cx","React","cloneElement","isValidElement","React","cloneElement","isValidElement","getConfig","animationName","appendPosition","Bounce","cssTransition","Slide","Zoom","Flip","NoAnimation","defaultProps","Bounce","e","useNotificationCenter","params","sortFn","useRef","defaultSort","filterFn","notifications","setNotifications","useState","useEffect","toast","item","newItem","decorate","prev","nextState","updateIdx","v","read","id","map","index","compareFn","cur","l","r"]}