{"version":3,"file":"imperative.mjs","names":["BaseToast"],"sources":["../../../src/base-ui/Toast/imperative.tsx"],"sourcesContent":["'use client';\n\nimport { Toast as BaseToast } from '@base-ui/react/toast';\nimport { cx } from 'antd-style';\nimport { memo, useEffect, useState } from 'react';\n\nimport { useIsClient } from '@/hooks/useIsClient';\nimport { useAppElement } from '@/ThemeProvider';\n\nimport { acquireLayerZIndex } from '../zIndex';\nimport { ToastContext } from './context';\nimport { viewportVariants } from './style';\nimport ToastItem from './Toast';\nimport {\n  type ToastAPI,\n  type ToastInstance,\n  type ToastOptions,\n  type ToastPosition,\n  type ToastPromiseOptions,\n  type ToastType,\n} from './type';\n\n// All possible positions\nconst ALL_POSITIONS: ToastPosition[] = [\n  'top',\n  'top-left',\n  'top-right',\n  'bottom',\n  'bottom-left',\n  'bottom-right',\n];\n\n// Global state management\ninterface ToastState {\n  duration: number;\n  limit: number;\n  position: ToastPosition;\n  swipeDirection: ('left' | 'right' | 'up' | 'down') | ('left' | 'right' | 'up' | 'down')[];\n}\n\nlet globalState: ToastState = {\n  duration: 5000,\n  limit: 5,\n  position: 'bottom-right',\n  swipeDirection: ['down', 'right'],\n};\n\n// Toast managers for each position\nconst toastManagers: Record<ToastPosition, ReturnType<typeof BaseToast.createToastManager>> = {\n  'bottom': BaseToast.createToastManager(),\n  'bottom-left': BaseToast.createToastManager(),\n  'bottom-right': BaseToast.createToastManager(),\n  'top': BaseToast.createToastManager(),\n  'top-left': BaseToast.createToastManager(),\n  'top-right': BaseToast.createToastManager(),\n};\n\nconst activeToastIds: Record<ToastPosition, Set<string>> = {\n  'bottom': new Set(),\n  'bottom-left': new Set(),\n  'bottom-right': new Set(),\n  'top': new Set(),\n  'top-left': new Set(),\n  'top-right': new Set(),\n};\n\nconst getManager = (position: ToastPosition) => toastManagers[position];\n\nconst normalizeOptions = (\n  optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n  type: ToastType,\n): ToastOptions => {\n  if (typeof optionsOrMessage === 'string') {\n    return {\n      description: optionsOrMessage,\n      type,\n    };\n  }\n  return {\n    ...optionsOrMessage,\n    type,\n  };\n};\n\nconst createToastInstance = (id: string, position: ToastPosition): ToastInstance => ({\n  close: () => getManager(position).close(id),\n  id,\n  update: (options) => {\n    getManager(position).update(id, {\n      data: options,\n      description: options.description,\n      title: options.title,\n    });\n  },\n});\n\nconst addToast = (options: ToastOptions): ToastInstance => {\n  const position = options.placement ?? globalState.position;\n  const manager = getManager(position);\n  const onRemove = options.onRemove;\n  const id = manager.add({\n    data: options,\n    description: options.description,\n    onClose: options.onClose,\n    onRemove: () => {\n      activeToastIds[position].delete(id);\n      onRemove?.();\n    },\n    timeout: options.duration ?? globalState.duration,\n    title: options.title,\n  });\n  activeToastIds[position].add(id);\n  return createToastInstance(id, position);\n};\n\nconst dismissToast = (id?: string) => {\n  if (id) {\n    // Try to close from all managers since we don't know which position the toast is in\n    for (const [position, manager] of Object.entries(toastManagers)) {\n      activeToastIds[position as ToastPosition].delete(id);\n      manager.close(id);\n    }\n  } else {\n    // Clear all toasts\n    for (const [position, manager] of Object.entries(toastManagers)) {\n      const ids = Array.from(activeToastIds[position as ToastPosition]);\n      for (const toastId of ids) {\n        manager.close(toastId);\n      }\n      activeToastIds[position as ToastPosition].clear();\n    }\n  }\n};\n\nconst createSuccessToast = (\n  optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n): ToastInstance => {\n  return addToast(normalizeOptions(optionsOrMessage, 'success'));\n};\n\nconst createErrorToast = (optionsOrMessage: Omit<ToastOptions, 'type'> | string): ToastInstance => {\n  return addToast(normalizeOptions(optionsOrMessage, 'error'));\n};\n\nconst createInfoToast = (optionsOrMessage: Omit<ToastOptions, 'type'> | string): ToastInstance => {\n  return addToast(normalizeOptions(optionsOrMessage, 'info'));\n};\n\nconst createWarningToast = (\n  optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n): ToastInstance => {\n  return addToast(normalizeOptions(optionsOrMessage, 'warning'));\n};\n\nconst createLoadingToast = (\n  optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n): ToastInstance => {\n  const options = normalizeOptions(optionsOrMessage, 'loading');\n  // Loading toasts don't auto-dismiss by default\n  return addToast({ duration: 0, ...options });\n};\n\nasync function promiseToast<T>(promise: Promise<T>, options: ToastPromiseOptions<T>): Promise<T> {\n  const loadingOptions =\n    typeof options.loading === 'string'\n      ? { description: options.loading }\n      : (options.loading as ToastOptions);\n\n  const loadingToast = addToast({\n    closable: false,\n    duration: 0,\n    type: 'loading',\n    ...loadingOptions,\n  });\n\n  try {\n    const result = await promise;\n\n    loadingToast.close();\n\n    const successOptions = (() => {\n      if (typeof options.success === 'string') {\n        return { description: options.success };\n      }\n      if (typeof options.success === 'function') {\n        return { description: options.success(result) };\n      }\n      return options.success as ToastOptions;\n    })();\n\n    addToast({ type: 'success', ...successOptions });\n\n    return result;\n  } catch (error) {\n    loadingToast.close();\n\n    const errorOptions = (() => {\n      if (typeof options.error === 'string') {\n        return { description: options.error };\n      }\n      if (typeof options.error === 'function') {\n        return { description: options.error(error as Error) };\n      }\n      return options.error as ToastOptions;\n    })();\n\n    addToast({ type: 'error', ...errorOptions });\n\n    throw error;\n  }\n}\n\n// Base toast function\nconst baseToast = (options: ToastOptions): ToastInstance => {\n  return addToast({ type: 'default', ...options });\n};\n\n// Toast API\nexport const toast: ToastAPI = Object.assign(baseToast, {\n  dismiss: dismissToast,\n  error: createErrorToast,\n  info: createInfoToast,\n  loading: createLoadingToast,\n  promise: promiseToast,\n  success: createSuccessToast,\n  warning: createWarningToast,\n});\n\n// Toast List Component\nconst ToastList = memo(() => {\n  const { toasts } = BaseToast.useToastManager();\n  return toasts.map((t) => <ToastItem key={t.id} toast={t} />);\n});\n\nToastList.displayName = 'ToastList';\n\nexport interface ToastHostProps {\n  className?: string;\n  /**\n   * Default duration for toasts\n   * @default 5000\n   */\n  duration?: number;\n  /**\n   * Maximum number of toasts\n   * @default 5\n   */\n  limit?: number;\n  /**\n   * Toast position\n   * @default 'bottom-right'\n   */\n  position?: ToastPosition;\n  /**\n   * Root element for portal\n   */\n  root?: HTMLElement | ShadowRoot | null;\n  /**\n   * Swipe direction to dismiss\n   * @default ['down', 'right']\n   */\n  swipeDirection?: ('left' | 'right' | 'up' | 'down') | ('left' | 'right' | 'up' | 'down')[];\n}\n\nexport const ToastHost = memo(\n  ({\n    root,\n    className,\n    duration = 5000,\n    limit = 5,\n    position = 'bottom-right',\n    swipeDirection = ['down', 'right'],\n  }: ToastHostProps) => {\n    const isClient = useIsClient();\n    const appElement = useAppElement();\n    const [viewportZIndex, setViewportZIndex] = useState<number | undefined>(undefined);\n\n    useEffect(() => {\n      globalState = {\n        duration,\n        limit,\n        position,\n        swipeDirection,\n      };\n    }, [duration, limit, position, swipeDirection]);\n\n    useEffect(() => {\n      setViewportZIndex(acquireLayerZIndex('toast'));\n    }, []);\n\n    if (!isClient) return null;\n\n    const container = root ?? appElement ?? document.body;\n\n    return ALL_POSITIONS.map((pos) => (\n      <ToastContext key={pos} value={{ position: pos, swipeDirection }}>\n        <BaseToast.Provider limit={limit} timeout={duration} toastManager={getManager(pos)}>\n          <BaseToast.Portal container={container}>\n            <BaseToast.Viewport\n              className={cx(viewportVariants({ position: pos }), className)}\n              style={{ zIndex: viewportZIndex }}\n            >\n              <ToastList />\n            </BaseToast.Viewport>\n          </BaseToast.Portal>\n        </BaseToast.Provider>\n      </ToastContext>\n    ));\n  },\n);\n\nToastHost.displayName = 'ToastHost';\n\n// Hook to use toast manager\nexport const useToast = () => toast;\n"],"mappings":";;;;;;;;;;;;AAuBA,MAAM,gBAAiC;CACrC;CACA;CACA;CACA;CACA;CACA;AACF;AAUA,IAAI,cAA0B;CAC5B,UAAU;CACV,OAAO;CACP,UAAU;CACV,gBAAgB,CAAC,QAAQ,OAAO;AAClC;AAGA,MAAM,gBAAwF;CAC5F,UAAUA,MAAU,mBAAmB;CACvC,eAAeA,MAAU,mBAAmB;CAC5C,gBAAgBA,MAAU,mBAAmB;CAC7C,OAAOA,MAAU,mBAAmB;CACpC,YAAYA,MAAU,mBAAmB;CACzC,aAAaA,MAAU,mBAAmB;AAC5C;AAEA,MAAM,iBAAqD;CACzD,0BAAU,IAAI,IAAI;CAClB,+BAAe,IAAI,IAAI;CACvB,gCAAgB,IAAI,IAAI;CACxB,uBAAO,IAAI,IAAI;CACf,4BAAY,IAAI,IAAI;CACpB,6BAAa,IAAI,IAAI;AACvB;AAEA,MAAM,cAAc,aAA4B,cAAc;AAE9D,MAAM,oBACJ,kBACA,SACiB;CACjB,IAAI,OAAO,qBAAqB,UAC9B,OAAO;EACL,aAAa;EACb;CACF;CAEF,OAAO;EACL,GAAG;EACH;CACF;AACF;AAEA,MAAM,uBAAuB,IAAY,cAA4C;CACnF,aAAa,WAAW,QAAQ,CAAC,CAAC,MAAM,EAAE;CAC1C;CACA,SAAS,YAAY;EACnB,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI;GAC9B,MAAM;GACN,aAAa,QAAQ;GACrB,OAAO,QAAQ;EACjB,CAAC;CACH;AACF;AAEA,MAAM,YAAY,YAAyC;CACzD,MAAM,WAAW,QAAQ,aAAa,YAAY;CAClD,MAAM,UAAU,WAAW,QAAQ;CACnC,MAAM,WAAW,QAAQ;CACzB,MAAM,KAAK,QAAQ,IAAI;EACrB,MAAM;EACN,aAAa,QAAQ;EACrB,SAAS,QAAQ;EACjB,gBAAgB;GACd,eAAe,SAAS,CAAC,OAAO,EAAE;GAClC,WAAW;EACb;EACA,SAAS,QAAQ,YAAY,YAAY;EACzC,OAAO,QAAQ;CACjB,CAAC;CACD,eAAe,SAAS,CAAC,IAAI,EAAE;CAC/B,OAAO,oBAAoB,IAAI,QAAQ;AACzC;AAEA,MAAM,gBAAgB,OAAgB;CACpC,IAAI,IAEF,KAAK,MAAM,CAAC,UAAU,YAAY,OAAO,QAAQ,aAAa,GAAG;EAC/D,eAAe,SAA0B,CAAC,OAAO,EAAE;EACnD,QAAQ,MAAM,EAAE;CAClB;MAGA,KAAK,MAAM,CAAC,UAAU,YAAY,OAAO,QAAQ,aAAa,GAAG;EAC/D,MAAM,MAAM,MAAM,KAAK,eAAe,SAA0B;EAChE,KAAK,MAAM,WAAW,KACpB,QAAQ,MAAM,OAAO;EAEvB,eAAe,SAA0B,CAAC,MAAM;CAClD;AAEJ;AAEA,MAAM,sBACJ,qBACkB;CAClB,OAAO,SAAS,iBAAiB,kBAAkB,SAAS,CAAC;AAC/D;AAEA,MAAM,oBAAoB,qBAAyE;CACjG,OAAO,SAAS,iBAAiB,kBAAkB,OAAO,CAAC;AAC7D;AAEA,MAAM,mBAAmB,qBAAyE;CAChG,OAAO,SAAS,iBAAiB,kBAAkB,MAAM,CAAC;AAC5D;AAEA,MAAM,sBACJ,qBACkB;CAClB,OAAO,SAAS,iBAAiB,kBAAkB,SAAS,CAAC;AAC/D;AAEA,MAAM,sBACJ,qBACkB;CAClB,MAAM,UAAU,iBAAiB,kBAAkB,SAAS;CAE5D,OAAO,SAAS;EAAE,UAAU;EAAG,GAAG;CAAQ,CAAC;AAC7C;AAEA,eAAe,aAAgB,SAAqB,SAA6C;CAC/F,MAAM,iBACJ,OAAO,QAAQ,YAAY,WACvB,EAAE,aAAa,QAAQ,QAAQ,IAC9B,QAAQ;CAEf,MAAM,eAAe,SAAS;EAC5B,UAAU;EACV,UAAU;EACV,MAAM;EACN,GAAG;CACL,CAAC;CAED,IAAI;EACF,MAAM,SAAS,MAAM;EAErB,aAAa,MAAM;EAEnB,MAAM,wBAAwB;GAC5B,IAAI,OAAO,QAAQ,YAAY,UAC7B,OAAO,EAAE,aAAa,QAAQ,QAAQ;GAExC,IAAI,OAAO,QAAQ,YAAY,YAC7B,OAAO,EAAE,aAAa,QAAQ,QAAQ,MAAM,EAAE;GAEhD,OAAO,QAAQ;EACjB,EAAA,CAAG;EAEH,SAAS;GAAE,MAAM;GAAW,GAAG;EAAe,CAAC;EAE/C,OAAO;CACT,SAAS,OAAO;EACd,aAAa,MAAM;EAEnB,MAAM,sBAAsB;GAC1B,IAAI,OAAO,QAAQ,UAAU,UAC3B,OAAO,EAAE,aAAa,QAAQ,MAAM;GAEtC,IAAI,OAAO,QAAQ,UAAU,YAC3B,OAAO,EAAE,aAAa,QAAQ,MAAM,KAAc,EAAE;GAEtD,OAAO,QAAQ;EACjB,EAAA,CAAG;EAEH,SAAS;GAAE,MAAM;GAAS,GAAG;EAAa,CAAC;EAE3C,MAAM;CACR;AACF;AAGA,MAAM,aAAa,YAAyC;CAC1D,OAAO,SAAS;EAAE,MAAM;EAAW,GAAG;CAAQ,CAAC;AACjD;AAGA,MAAa,QAAkB,OAAO,OAAO,WAAW;CACtD,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;AACX,CAAC;AAGD,MAAM,YAAY,WAAW;CAC3B,MAAM,EAAE,WAAWA,MAAU,gBAAgB;CAC7C,OAAO,OAAO,KAAK,MAAM,oBAAC,WAAD,EAAsB,OAAO,EAAI,GAAjB,EAAE,EAAe,CAAC;AAC7D,CAAC;AAED,UAAU,cAAc;AA8BxB,MAAa,YAAY,MACtB,EACC,MACA,WACA,WAAW,KACX,QAAQ,GACR,WAAW,gBACX,iBAAiB,CAAC,QAAQ,OAAO,QACb;CACpB,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,cAAc;CACjC,MAAM,CAAC,gBAAgB,qBAAqB,SAA6B,KAAA,CAAS;CAElF,gBAAgB;EACd,cAAc;GACZ;GACA;GACA;GACA;EACF;CACF,GAAG;EAAC;EAAU;EAAO;EAAU;CAAc,CAAC;CAE9C,gBAAgB;EACd,kBAAkB,mBAAmB,OAAO,CAAC;CAC/C,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,UAAU,OAAO;CAEtB,MAAM,YAAY,QAAQ,cAAc,SAAS;CAEjD,OAAO,cAAc,KAAK,QACxB,oBAAC,cAAD;EAAwB,OAAO;GAAE,UAAU;GAAK;EAAe;YAC7D,oBAACA,MAAU,UAAX;GAA2B;GAAO,SAAS;GAAU,cAAc,WAAW,GAAG;aAC/E,oBAACA,MAAU,QAAX;IAA6B;cAC3B,oBAACA,MAAU,UAAX;KACE,WAAW,GAAG,iBAAiB,EAAE,UAAU,IAAI,CAAC,GAAG,SAAS;KAC5D,OAAO,EAAE,QAAQ,eAAe;eAEhC,oBAAC,WAAD,CAAY,CAAA;IACM,CAAA;GACJ,CAAA;EACA,CAAA;CACR,GAXK,GAWL,CACf;AACH,CACF;AAEA,UAAU,cAAc;AAGxB,MAAa,iBAAiB"}