{"version":3,"sources":["../src/ToastPortal.tsx","../src/ToastProvider.tsx","../src/useToast.ts","../src/index.ts"],"names":["useEffect","useState","memo","useRef","useCallback","useMemo","React","findHighestZIndex","cachedZIndex","lastCheck","CACHE_DURATION","now","highestZ","elements","i","element","style","zIndex","classList","elementZIndex","error","DEVICE_BREAKPOINTS","TOAST_WIDTHS","SVGIcon","svgString","className","memoizedSVG","jsx","AccessibilityAnnouncer","toasts","announcement","setAnnouncement","announcementRef","lastToastIdRef","latestToast","text","useSwipeGesture","enabled","onSwipe","threshold","touchStartX","touchStartY","isSwiping","handleTouchStart","e","touch","handleTouchMove","deltaX","deltaY","handleTouchEnd","ToastItem","toast","onDismiss","onPause","onResume","animation","position","toastTheme","defaultStyle","toastRef","handleDismiss","handlePause","handleResume","handleProgressComplete","swipeGesture","handleRippleEffect","toastElement","rect","x","y","ripple","variantClasses","isDark","styleClass","styleAttributes","animationVariants","animationType","toastPosition","isTop","isBottom","isLeft","isRight","isCenter","initial","exit","additionalClasses","classes","visualStyle","iconColor","progressBarClasses","baseClass","emojiComponent","iconString","motion","jsxs","ToastContainer","positionStyle","defaultAnimation","containerClassName","AnimatePresence","ToastPortal","topOffset","bottomOffset","leftOffset","rightOffset","enableAccessibleAnnouncements","suppressHydrationWarning","isMounted","setIsMounted","portalElement","setPortalElement","screenWidth","setScreenWidth","deviceType","setDeviceType","removeToast","pauseToast","resumeToast","effectiveTheme","updateEffectiveTheme","useToastStore","darkModeQuery","handleThemeChange","handleResize","width","newDeviceType","div","resizeTimer","throttledResize","toastsWithValidPositions","toastsByPosition","acc","getToastWidth","getPositionStyle","toastWidth","baseStyle","safeWidth","currentTheme","portalContent","Fragment","positionToasts","createPortal","ToastPortal_default","createContext","useContext","ToastProviderContext","ToastProvider","children","theme","maxToasts","defaultDuration","defaultDismissible","defaultPauseOnHover","defaultDismissOnClick","defaultProgressBarStyle","defaultProgressBarColor","defaultProgressBarPosition","defaultProgressBarThickness","defaultProgressAnimation","defaultFloating","defaultRippleEffect","defaultSwipeToDismiss","defaultPriority","defaultStagger","enableDevMode","enableDevTools","globalClassName","globalStyle","initialized","setInitialized","setTheme","setMaxToasts","contextValue","shouldShowDevTools","ToastDevTools","useToastProvider","context","useToast","plugins","addToast","updateToast","clearAllToasts","registerPlugin","unregisterPlugin","stats","total","byVariant","byPosition","getToastById","id","hasToasts","cssInjected","injectCSS","cssContent","progressStylesContent","existingToastLibs","lib","__require"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { useToastStore } from './toast';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport type { Toast, ToastPosition, ToastAnimation, ToastStyle } from './toast';\nimport type { TargetAndTransition } from 'framer-motion';\n\nconst { useEffect, useState, memo, useRef, useCallback, useMemo } = React;\n\n/**\n * Finds the highest z-index in use in the document with caching\n */\nconst findHighestZIndex = (() => {\n  let cachedZIndex: number | null = null;\n  let lastCheck = 0;\n  const CACHE_DURATION = 5000; // 5 seconds\n\n  return (): number => {\n    const now = Date.now();\n\n    if (cachedZIndex !== null && (now - lastCheck) < CACHE_DURATION) {\n      return cachedZIndex;\n    }\n\n    let highestZ = 99998; // Bắt đầu từ số cao hơn để đảm bảo luôn trên cùng\n\n    if (typeof window === 'undefined') return highestZ;\n\n    try {\n      const elements = document.getElementsByTagName('*');\n      for (let i = 0; i < elements.length; i++) {\n        const element = elements[i];\n        const style = window.getComputedStyle(element);\n        const zIndex = parseInt(style.zIndex, 10);\n        \n        // Kiểm tra cả z-index và các class dialog/modal phổ biến\n        if (zIndex && zIndex > highestZ) {\n          highestZ = zIndex;\n        }\n        \n        // Kiểm tra các class dialog/modal phổ biến và đặt z-index cao hơn\n        const classList = element.classList;\n        if (classList.contains('rpt-dialog') || \n            classList.contains('modal') || \n            classList.contains('dialog') ||\n            classList.contains('overlay') ||\n            element.tagName === 'DIALOG') {\n          const elementZIndex = parseInt(style.zIndex, 10) || 1000;\n          if (elementZIndex > highestZ) {\n            highestZ = elementZIndex;\n          }\n        }\n      }\n    } catch (error) {\n      console.warn('React Toast Kit: Failed to find highest z-index', error);\n    }\n\n    // Đảm bảo toast luôn có z-index cao nhất + 1000\n    cachedZIndex = Math.max(highestZ + 1000, 99999);\n    lastCheck = now;\n    return cachedZIndex;\n  };\n})();\n\ninterface ToastPortalProps {\n  containerClassName?: string;\n  topOffset?: number;\n  bottomOffset?: number;\n  leftOffset?: number;\n  rightOffset?: number;\n  defaultAnimation?: ToastAnimation;\n  defaultStyle?: ToastStyle;\n  enableAccessibleAnnouncements?: boolean;\n  suppressHydrationWarning?: boolean;\n}\n\n// Device breakpoints with enhanced detection\nconst DEVICE_BREAKPOINTS = {\n  mobile: 640,\n  tablet: 1024,\n};\n\nconst TOAST_WIDTHS = {\n  mobile: 320,\n  tablet: 360,\n  desktop: 380,\n};\n\n// Enhanced SVG Icon component with better performance\nconst SVGIcon = memo(({\n  svgString,\n  className = ''\n}: {\n  svgString: string;\n  className?: string;\n}) => {\n  const memoizedSVG = useMemo(() => ({ __html: svgString }), [svgString]);\n\n  return (\n    <div\n      className={className}\n      dangerouslySetInnerHTML={memoizedSVG}\n    />\n  );\n});\nSVGIcon.displayName = 'SVGIcon';\n\n// Accessibility announcer component\nconst AccessibilityAnnouncer = memo(({ toasts }: { toasts: Toast[] }) => {\n  const [announcement, setAnnouncement] = useState<string>('');\n  const announcementRef = useRef<string>('');\n  const lastToastIdRef = useRef<string | null>(null);\n\n  useEffect(() => {\n    if (toasts.length === 0) return;\n    \n    // Get the most recent toast\n    const latestToast = toasts[0];\n    \n    // Skip if it's the same toast being announced\n    if (latestToast.id === lastToastIdRef.current) return;\n    \n    // Create the announcement text\n    let text = '';\n    \n    if (latestToast.variant) {\n      text += `${latestToast.variant} notification: `;\n    }\n    \n    if (latestToast.title) {\n      text += latestToast.title;\n      if (latestToast.description) {\n        text += '. ';\n      }\n    }\n    \n    if (latestToast.description) {\n      text += latestToast.description;\n    }\n    \n    // Only announce if different from the last announcement\n    if (text && text !== announcementRef.current) {\n      announcementRef.current = text;\n      lastToastIdRef.current = latestToast.id;\n      setAnnouncement(text);\n      \n      // Clear announcement after a delay for screen readers to process\n      setTimeout(() => {\n        setAnnouncement('');\n      }, 1000);\n    }\n  }, [toasts]);\n\n  if (!announcement) return null;\n  \n  return (\n    <div \n      aria-live=\"polite\"\n      aria-atomic=\"true\" \n      className=\"sr-only\"\n      role=\"status\"\n    >\n      {announcement}\n    </div>\n  );\n});\nAccessibilityAnnouncer.displayName = 'AccessibilityAnnouncer';\n\n// Hook for swipe gesture detection\nconst useSwipeGesture = (\n  enabled: boolean,\n  onSwipe: () => void,\n  threshold: number = 100\n) => {\n  const touchStartX = useRef<number>(0);\n  const touchStartY = useRef<number>(0);\n  const isSwiping = useRef<boolean>(false);\n\n  const handleTouchStart = useCallback((e: React.TouchEvent) => {\n    if (!enabled) return;\n\n    const touch = e.touches[0];\n    touchStartX.current = touch.clientX;\n    touchStartY.current = touch.clientY;\n    isSwiping.current = false;\n  }, [enabled]);\n\n  const handleTouchMove = useCallback((e: React.TouchEvent) => {\n    if (!enabled) return;\n\n    const touch = e.touches[0];\n    const deltaX = Math.abs(touch.clientX - touchStartX.current);\n    const deltaY = Math.abs(touch.clientY - touchStartY.current);\n\n    // Start swiping if horizontal movement is greater than vertical\n    if (deltaX > deltaY && deltaX > 10) {\n      isSwiping.current = true;\n      e.preventDefault(); // Prevent scrolling\n    }\n  }, [enabled]);\n\n  const handleTouchEnd = useCallback((e: React.TouchEvent) => {\n    if (!enabled || !isSwiping.current) return;\n\n    const touch = e.changedTouches[0];\n    const deltaX = Math.abs(touch.clientX - touchStartX.current);\n\n    if (deltaX > threshold) {\n      onSwipe();\n    }\n\n    isSwiping.current = false;\n  }, [enabled, onSwipe, threshold]);\n\n  return {\n    handleTouchStart,\n    handleTouchMove,\n    handleTouchEnd,\n  };\n};\n\n// Enhanced ToastItem component with better memoization\nconst ToastItem = memo(({\n  toast,\n  onDismiss,\n  onPause,\n  onResume,\n  animation,\n  position,\n  toastTheme,\n  defaultStyle\n}: {\n  toast: Toast;\n  onDismiss: (id: string) => void;\n  onPause: (id: string) => void;\n  onResume: (id: string) => void;\n  animation: ToastAnimation;\n  position: ToastPosition;\n  toastTheme: 'light' | 'dark';\n  defaultStyle: ToastStyle;\n}) => {\n  const toastRef = useRef<HTMLDivElement>(null);\n\n  // Memoize handlers to prevent unnecessary re-renders\n  const handleDismiss = useCallback(() => {\n    onDismiss(toast.id);\n  }, [onDismiss, toast.id]);\n\n  const handlePause = useCallback(() => {\n    if (toast.pauseOnHover) onPause(toast.id);\n  }, [onPause, toast.id, toast.pauseOnHover]);\n\n  const handleResume = useCallback(() => {\n    onResume(toast.id);\n  }, [onResume, toast.id]);\n\n  // Handler for progress animation completion\n  const handleProgressComplete = useCallback(() => {\n    if (toast.duration > 0) {\n      handleDismiss();\n    }\n  }, [handleDismiss, toast.duration]);\n\n  // Swipe gesture handlers\n  const swipeGesture = useSwipeGesture(\n    toast.swipeToDismiss || false,\n    handleDismiss\n  );\n\n  // Enhanced ripple effect with better performance\n  const handleRippleEffect = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n    if (toast.rippleEffect && toastRef.current) {\n      const toastElement = toastRef.current;\n      const rect = toastElement.getBoundingClientRect();\n      const x = e.clientX - rect.left;\n      const y = e.clientY - rect.top;\n\n      // Create ripple element\n      const ripple = document.createElement('div');\n      ripple.className = 'toast-ripple-element';\n      ripple.style.left = `${x}px`;\n      ripple.style.top = `${y}px`;\n\n      toastElement.appendChild(ripple);\n\n      // Use requestAnimationFrame for better performance\n      requestAnimationFrame(() => {\n        setTimeout(() => {\n          if (toastElement.contains(ripple)) {\n            toastElement.removeChild(ripple);\n          }\n        }, 700);\n      });\n    }\n\n    if (toast.dismissOnClick) {\n      handleDismiss();\n    }\n  }, [toast.rippleEffect, toast.dismissOnClick, handleDismiss]);\n\n  // Memoize variant classes\n  const variantClasses = useMemo(() => {\n    const isDark = toastTheme === 'dark';\n    \n    // Use the visualStyle from toast or default\n    const styleClass = toast.visualStyle || defaultStyle;\n    \n    // Create additional style attributes\n    const styleAttributes: Record<string, string> = {};\n    \n    // Customize gradient colors based on variant if using gradient style\n    if (styleClass === 'gradient') {\n      switch (toast.variant) {\n        case 'success':\n          styleAttributes['--toast-gradient-from'] = isDark ? 'rgba(5, 95, 70, 0.9)' : 'rgba(16, 185, 129, 0.8)';\n          styleAttributes['--toast-gradient-to'] = isDark ? 'rgba(4, 120, 87, 0.8)' : 'rgba(5, 150, 105, 0.7)';\n          break;\n        case 'error':\n          styleAttributes['--toast-gradient-from'] = isDark ? 'rgba(153, 27, 27, 0.9)' : 'rgba(239, 68, 68, 0.8)';\n          styleAttributes['--toast-gradient-to'] = isDark ? 'rgba(185, 28, 28, 0.8)' : 'rgba(220, 38, 38, 0.7)';\n          break;\n        case 'warning':\n          styleAttributes['--toast-gradient-from'] = isDark ? 'rgba(146, 64, 14, 0.9)' : 'rgba(245, 158, 11, 0.8)';\n          styleAttributes['--toast-gradient-to'] = isDark ? 'rgba(180, 83, 9, 0.8)' : 'rgba(217, 119, 6, 0.7)';\n          break;\n        case 'info':\n          styleAttributes['--toast-gradient-from'] = isDark ? 'rgba(30, 64, 175, 0.9)' : 'rgba(59, 130, 246, 0.8)';\n          styleAttributes['--toast-gradient-to'] = isDark ? 'rgba(29, 78, 216, 0.8)' : 'rgba(37, 99, 235, 0.7)';\n          break;\n        default:\n          styleAttributes['--toast-gradient-from'] = isDark ? 'rgba(55, 65, 81, 0.9)' : 'rgba(229, 231, 235, 0.8)';\n          styleAttributes['--toast-gradient-to'] = isDark ? 'rgba(75, 85, 99, 0.8)' : 'rgba(209, 213, 219, 0.7)';\n      }\n    }\n\n    // Return the style attributes for use in the component render\n    return styleAttributes;\n  }, [toast.variant, toastTheme, toast.visualStyle, defaultStyle]);\n\n  // Memoize animation variants with proper typing\n  const animationVariants = useMemo(() => {\n    // Use custom animation if provided and properly typed\n    if (toast.customAnimation) {\n      return {\n        initial: toast.customAnimation.initial as TargetAndTransition,\n        animate: toast.customAnimation.animate as TargetAndTransition,\n        exit: toast.customAnimation.exit as TargetAndTransition\n      };\n    }\n\n    const animationType = toast.animation || animation;\n    const toastPosition = toast.position || position;\n    const isTop = toastPosition.startsWith('top');\n    const isBottom = toastPosition.startsWith('bottom');\n    const isLeft = toastPosition.endsWith('left');\n    const isRight = toastPosition.endsWith('right');\n    const isCenter = toastPosition.endsWith('center');\n\n    if (animationType === 'none') {\n      return {\n        initial: { opacity: 1 },\n        animate: { opacity: 1 },\n        exit: { opacity: 1 }\n      };\n    }\n\n    if (animationType === 'fade') {\n      return {\n        initial: { opacity: 0 },\n        animate: { opacity: 1 },\n        exit: { opacity: 0 }\n      };\n    }\n\n    if (animationType === 'bounce') {\n      const initial: TargetAndTransition = { opacity: 0, scale: 0.9 };\n      if (isTop) Object.assign(initial, { y: -80 });\n      else if (isBottom) Object.assign(initial, { y: 80 });\n      else if (isLeft) Object.assign(initial, { x: -80 });\n      else if (isRight) Object.assign(initial, { x: 80 });\n\n      return {\n        initial,\n        animate: {\n          opacity: 1,\n          y: 0,\n          x: 0,\n          scale: 1,\n          transition: {\n            type: 'spring',\n            stiffness: 350,\n            damping: 25\n          }\n        },\n        exit: {\n          opacity: 0,\n          scale: 0.9,\n          transition: { duration: 0.2 }\n        }\n      };\n    }\n\n    if (animationType === 'flip') {\n      return {\n        initial: {\n          opacity: 0,\n          rotateX: 90,\n          perspective: 400\n        },\n        animate: {\n          opacity: 1,\n          rotateX: 0,\n          perspective: 400,\n          transition: {\n            type: 'spring',\n            stiffness: 300,\n            damping: 25\n          }\n        },\n        exit: {\n          opacity: 0,\n          rotateX: 90,\n          perspective: 400,\n          transition: { duration: 0.3 }\n        }\n      };\n    }\n\n    if (animationType === 'zoom') {\n      return {\n        initial: { opacity: 0, scale: 0.5 },\n        animate: {\n          opacity: 1,\n          scale: 1,\n          transition: {\n            type: 'spring',\n            stiffness: 400,\n            damping: 30\n          }\n        },\n        exit: {\n          opacity: 0,\n          scale: 0.5,\n          transition: { duration: 0.2 }\n        }\n      };\n    }\n\n    // Default slide animation\n    const initial: TargetAndTransition = { opacity: 0 };\n    const exit: TargetAndTransition = { opacity: 0 };\n\n    if (isTop) {\n      Object.assign(initial, { y: -20 });\n      Object.assign(exit, { y: -20 });\n    } else if (isBottom) {\n      Object.assign(initial, { y: 20 });\n      Object.assign(exit, { y: 20 });\n    } else if (isLeft) {\n      Object.assign(initial, { x: -20 });\n      Object.assign(exit, { x: -20 });\n    } else if (isRight) {\n      Object.assign(initial, { x: 20 });\n      Object.assign(exit, { x: 20 });\n    } else if (isCenter) {\n      if (isTop) {\n        Object.assign(initial, { y: -20 });\n        Object.assign(exit, { y: -20 });\n      } else {\n        Object.assign(initial, { y: 20 });\n        Object.assign(exit, { y: 20 });\n      }\n    }\n\n    return {\n      initial,\n      animate: { opacity: 1, y: 0, x: 0 },\n      exit\n    };\n  }, [toast.customAnimation, toast.animation, animation, toast.position, position]);\n\n  // Memoize additional classes\n  const additionalClasses = useMemo(() => {\n    const classes: string[] = [];\n\n    if (toast.floating) classes.push('react-toast-floating');\n    if (toast.rippleEffect) classes.push('toast-ripple');\n\n    const visualStyle = toast.visualStyle || defaultStyle;\n    if (visualStyle === 'glass' || visualStyle === 'gradient') {\n      classes.push('toast-soft-shadow');\n    }\n\n    return classes.join(' ');\n  }, [toast.floating, toast.rippleEffect, toast.visualStyle, defaultStyle]);\n\n  // Memoize icon color\n  const iconColor = useMemo(() => {\n    if (toast.variant === 'custom') return '';\n\n    if (!toast.variant || toast.variant === 'default') {\n      return toastTheme === 'dark' ? 'text-gray-300' : 'text-gray-500';\n    }\n\n    return 'text-white';\n  }, [toast.variant, toastTheme]);\n\n  // Memoize progress bar classes\n  const progressBarClasses = useMemo(() => {\n    const baseClass = 'react-toast-progress';\n    \n    // Return the style class based on the progress bar style\n    if (toast.progressBarStyle) {\n      return `${baseClass} ${toast.progressBarStyle}`;\n    }\n\n    if (toast.variant === 'custom') return `${baseClass} bg-white/20`;\n\n    if (!toast.variant || toast.variant === 'default') {\n      return toastTheme === 'dark'\n        ? `${baseClass} bg-gray-600`\n        : `${baseClass} bg-gray-300`;\n    }\n\n    return `${baseClass} bg-white/30`;\n  }, [toast.progressBarStyle, toast.variant, toastTheme]);\n\n  // Memoize emoji component\n  const emojiComponent = useMemo(() => {\n    if (!toast.emoji) return null;\n\n    return (\n      <div className=\"flex-shrink-0 mr-3 toast-emoji\">\n        {toast.emoji}\n      </div>\n    );\n  }, [toast.emoji]);\n\n  // Get icon string with proper typing\n  const iconString = toast.iconString;\n\n  return (\n    <motion.div\n      key={toast.id}\n      className=\"react-toast-item w-full\"\n      initial={animationVariants.initial}\n      animate={animationVariants.animate}\n      exit={animationVariants.exit}\n      transition={{\n        duration: toast.updating ? 0.1 : 0.2\n      }}\n      layout\n    >\n      <div\n        ref={toastRef}\n        role={toast.variant === 'error' ? 'alert' : 'status'}\n        aria-live={toast.variant === 'error' ? 'assertive' : 'polite'}\n        className={`relative overflow-hidden shadow-lg rounded-lg react-toast w-full ${toast.className || ''} ${additionalClasses}`}\n        style={{...(toast.style || {}), ...variantClasses}}\n        onMouseEnter={handlePause}\n        onMouseLeave={handleResume}\n        onClick={handleRippleEffect}\n        onTouchStart={swipeGesture.handleTouchStart}\n        onTouchMove={swipeGesture.handleTouchMove}\n        onTouchEnd={swipeGesture.handleTouchEnd}\n        data-variant={toast.variant}\n        data-theme={toastTheme}\n        data-style={toast.visualStyle || defaultStyle}\n        data-progress-position={toast.progressBarPosition || 'bottom'}\n        data-testid={`toast-${toast.id}`}\n        tabIndex={0}\n      >\n        {/* Progress indicator for timed toasts */}\n        {toast.duration > 0 && (\n          <div className={progressBarClasses}>\n            <motion.div\n              initial={{ width: '100%' }}\n              animate={{ width: '0%' }}\n              transition={{\n                duration: toast.duration / 1000,\n                ease: toast.progressAnimation || 'linear',\n              }}\n              onAnimationComplete={handleProgressComplete}\n              className=\"react-toast-progress-fill\"\n              style={{\n                backgroundColor: toast.progressBarColor || undefined,\n                height: toast.progressBarThickness ? `${toast.progressBarThickness}px` : undefined,\n                [toast.progressBarPosition === 'left' || toast.progressBarPosition === 'right' ? 'width' : 'height']: \n                  toast.progressBarThickness ? `${toast.progressBarThickness}px` : undefined,\n              }}\n            />\n          </div>\n        )}\n        \n        <div className=\"p-4 toast-content\">\n          {toast.variant === 'custom' && toast.component ? (\n            toast.component\n          ) : (\n            <div className=\"flex items-start\">\n              {/* Render emoji, custom icon, SVG string icon, or nothing */}\n              {emojiComponent || (toast.icon ? (\n                <div className={`flex-shrink-0 mr-3 ${iconColor} toast-icon-container toast-icon-animated`}>\n                  {toast.icon}\n                </div>\n              ) : iconString ? (\n                <div className={`flex-shrink-0 mr-3 ${iconColor} toast-icon-container toast-icon-animated`}>\n                  <SVGIcon svgString={iconString} className={iconColor} />\n                </div>\n              ) : null)}\n\n              <div className=\"flex-1\">\n                {toast.title && <h4 className=\"font-medium mb-1\">{toast.title}</h4>}\n                {toast.description && <div>{toast.description}</div>}\n              </div>\n\n              {toast.dismissible && (\n                <button\n                  onClick={(e) => {\n                    e.stopPropagation();\n                    handleDismiss();\n                  }}\n                  className=\"react-toast-close\" /* Use the dedicated class for styling */\n                  aria-label=\"Close notification\"\n                  data-dismiss=\"toast\"\n                >\n                  <svg\n                    className=\"w-4 h-4\"\n                    fill=\"none\"\n                    stroke=\"currentColor\"\n                    viewBox=\"0 0 24 24\"\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                  >\n                    <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n                  </svg>\n                </button>\n              )}\n            </div>\n          )}\n        </div>\n      </div>\n    </motion.div>\n  );\n});\nToastItem.displayName = 'ToastItem';\n\n// Enhanced Toast container with better memoization\nconst ToastContainer = memo(({\n  position,\n  toasts,\n  positionStyle,\n  onDismiss,\n  onPause,\n  onResume,\n  defaultAnimation,\n  toastTheme,\n  defaultStyle,\n  containerClassName\n}: {\n  position: ToastPosition;\n  toasts: Toast[];\n  positionStyle: React.CSSProperties;\n  onDismiss: (id: string) => void;\n  onPause: (id: string) => void;\n  onResume: (id: string) => void;\n  defaultAnimation: ToastAnimation;\n  toastTheme: 'light' | 'dark';\n  defaultStyle: ToastStyle;\n  containerClassName?: string;\n}) => (\n  <div\n    className={`fixed flex flex-col z-50 react-toast-container ${containerClassName || ''}`}\n    data-position={position}\n    data-theme={toastTheme}\n    style={positionStyle}\n  >\n    <AnimatePresence mode=\"sync\">\n      {toasts.map((toast) => (\n        <ToastItem\n          key={toast.id}\n          toast={toast}\n          onDismiss={onDismiss}\n          onPause={onPause}\n          onResume={onResume}\n          animation={toast.animation || defaultAnimation}\n          position={position}\n          toastTheme={toastTheme}\n          defaultStyle={defaultStyle}\n        />\n      ))}\n    </AnimatePresence>\n  </div>\n));\nToastContainer.displayName = 'ToastContainer';\n\n/**\n * Enhanced ToastPortal component with performance optimizations\n * This component is client-only and handles all SSR concerns internally\n */\nconst ToastPortal: React.FC<ToastPortalProps> = ({\n  containerClassName = '',\n  topOffset = 16,\n  bottomOffset = 16,\n  leftOffset = 16,\n  rightOffset = 16,\n  defaultAnimation = 'slide',\n  defaultStyle = 'solid',\n  enableAccessibleAnnouncements = true,\n  suppressHydrationWarning = false\n}) => {\n  // Always call hooks at the top level\n  const [isMounted, setIsMounted] = useState(false);\n  const [portalElement, setPortalElement] = useState<HTMLDivElement | null>(null);\n  const [screenWidth, setScreenWidth] = useState<number>(1024); // Default for SSR\n  const [deviceType, setDeviceType] = useState<'mobile' | 'tablet' | 'desktop'>('desktop'); // Default for SSR\n\n  const { toasts, removeToast, pauseToast, resumeToast, effectiveTheme, updateEffectiveTheme } = useToastStore();\n\n  // Set up theme detection and monitoring\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    \n    // Initial theme detection\n    updateEffectiveTheme();\n    \n    // Setup listeners for system theme changes\n    const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');\n    \n    const handleThemeChange = () => {\n      updateEffectiveTheme();\n    };\n    \n    // Use the appropriate event listener based on browser support\n    if (darkModeQuery.addEventListener) {\n      darkModeQuery.addEventListener('change', handleThemeChange);\n    } else if (darkModeQuery.addListener) {\n      // For older browsers\n      darkModeQuery.addListener(handleThemeChange);\n    }\n    \n    return () => {\n      // Clean up listeners\n      if (darkModeQuery.removeEventListener) {\n        darkModeQuery.removeEventListener('change', handleThemeChange);\n      } else if (darkModeQuery.removeListener) {\n        darkModeQuery.removeListener(handleThemeChange);\n      }\n    };\n  }, [updateEffectiveTheme]);\n\n  // Throttled resize handler for better performance\n  const handleResize = useCallback(() => {\n    if (typeof window === 'undefined') return;\n\n    const width = window.innerWidth;\n    setScreenWidth(width);\n\n    const newDeviceType = width < DEVICE_BREAKPOINTS.mobile\n      ? 'mobile'\n      : width < DEVICE_BREAKPOINTS.tablet\n        ? 'tablet'\n        : 'desktop';\n\n    if (newDeviceType !== deviceType) {\n      setDeviceType(newDeviceType);\n    }\n  }, [deviceType]);\n\n  // Initialize portal and event listeners - only on client\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n\n    // Set initial values\n    handleResize();\n    setIsMounted(true);\n\n    let div = document.getElementById('react-toast-kit-portal') as HTMLDivElement;\n\n    if (!div) {\n      div = document.createElement('div');\n      div.id = 'react-toast-kit-portal';\n      div.style.position = 'fixed';\n      div.style.top = '0';\n      div.style.left = '0';\n      div.style.width = '0';\n      div.style.height = '0';\n      div.style.pointerEvents = 'none'; // Cho phép click-through container\n      \n      // Đảm bảo z-index luôn cao nhất\n      const highestZ = findHighestZIndex();\n      div.style.zIndex = highestZ.toString();\n      \n      // Add suppressHydrationWarning attribute if enabled\n      if (suppressHydrationWarning) {\n        div.setAttribute('data-suppress-hydration-warning', 'true');\n      }\n      \n      // Thêm các attribute để dễ debug\n      div.setAttribute('data-react-toast-kit', 'true');\n      div.setAttribute('data-z-index', highestZ.toString());\n      \n      document.body.appendChild(div);\n    } else {\n      // Cập nhật z-index nếu portal đã tồn tại\n      const highestZ = findHighestZIndex();\n      div.style.zIndex = highestZ.toString();\n      div.setAttribute('data-z-index', highestZ.toString());\n    }\n\n    setPortalElement(div);\n\n    // Throttled resize listener\n    let resizeTimer: number;\n    const throttledResize = () => {\n      clearTimeout(resizeTimer);\n      resizeTimer = window.setTimeout(handleResize, 100);\n    };\n\n    window.addEventListener('resize', throttledResize);\n\n    return () => {\n      window.removeEventListener('resize', throttledResize);\n      clearTimeout(resizeTimer);\n\n      // Only remove if we created it\n      if (div && div.parentNode && !document.getElementById('react-toast-kit-portal-static')) {\n        document.body.removeChild(div);\n      }\n    };\n  }, [handleResize, suppressHydrationWarning]);\n\n  // Memoize toasts with valid positions - always call this useMemo\n  const toastsWithValidPositions = useMemo(() => {\n    return toasts.map((toast) => ({\n      ...toast,\n      position: toast.position || ('top-right' as ToastPosition)\n    }));\n  }, [toasts]);\n\n  // Memoize toasts grouped by position - always call this useMemo\n  const toastsByPosition = useMemo(() => {\n    return toastsWithValidPositions.reduce<Record<ToastPosition, Toast[]>>(\n      (acc, toast) => {\n        const position = toast.position;\n        if (!acc[position]) {\n          acc[position] = [];\n        }\n        acc[position].push(toast);\n        return acc;\n      },\n      {} as Record<ToastPosition, Toast[]>\n    );\n  }, [toastsWithValidPositions]);\n\n  // Memoize toast width calculation - always call this useCallback\n  const getToastWidth = useCallback((): number => {\n    return TOAST_WIDTHS[deviceType];\n  }, [deviceType]);\n\n  // Memoize position style calculation - always call this useCallback\n  const getPositionStyle = useCallback((position: ToastPosition): React.CSSProperties => {\n    const toastWidth = getToastWidth();\n\n    const baseStyle: React.CSSProperties = {\n      position: 'fixed',\n      width: `${toastWidth}px`,\n      display: 'flex',\n      flexDirection: 'column',\n      gap: '0.5rem',\n    };\n\n    // For mobile devices, ensure responsive width\n    if (deviceType === 'mobile') {\n      const safeWidth = Math.min(toastWidth, screenWidth - (leftOffset + rightOffset));\n      baseStyle.width = `${safeWidth}px`;\n      baseStyle.maxWidth = `calc(100vw - ${leftOffset + rightOffset}px)`;\n    }\n\n    switch (position) {\n      case 'top-left':\n        return {\n          ...baseStyle,\n          top: `${topOffset}px`,\n          left: `${leftOffset}px`,\n          alignItems: 'flex-start'\n        };\n      case 'top-center':\n        return {\n          ...baseStyle,\n          top: `${topOffset}px`,\n          left: '50%',\n          transform: 'translateX(-50%)',\n          alignItems: 'center'\n        };\n      case 'top-right':\n        return {\n          ...baseStyle,\n          top: `${topOffset}px`,\n          right: `${rightOffset}px`,\n          alignItems: 'flex-end'\n        };\n      case 'bottom-left':\n        return {\n          ...baseStyle,\n          bottom: `${bottomOffset}px`,\n          left: `${leftOffset}px`,\n          alignItems: 'flex-start'\n        };\n      case 'bottom-center':\n        return {\n          ...baseStyle,\n          bottom: `${bottomOffset}px`,\n          left: '50%',\n          transform: 'translateX(-50%)',\n          alignItems: 'center'\n        };\n      case 'bottom-right':\n        return {\n          ...baseStyle,\n          bottom: `${bottomOffset}px`,\n          right: `${rightOffset}px`,\n          alignItems: 'flex-end'\n        };\n      default:\n        return {\n          ...baseStyle,\n          top: `${topOffset}px`,\n          right: `${rightOffset}px`,\n          alignItems: 'flex-end'\n        };\n    }\n  }, [getToastWidth, deviceType, screenWidth, leftOffset, rightOffset, topOffset, bottomOffset]);\n\n  // Always calculate currentTheme to maintain hook order\n  const currentTheme = effectiveTheme || 'light';\n  \n  // Memoize portal content to prevent unnecessary re-renders - always call this useMemo\n  const portalContent = useMemo(() => (\n    <>\n      {enableAccessibleAnnouncements && <AccessibilityAnnouncer toasts={toasts} />}\n      \n      {Object.entries(toastsByPosition).map(([position, positionToasts]) => (\n        <ToastContainer\n          key={position}\n          position={position as ToastPosition}\n          toasts={positionToasts}\n          positionStyle={getPositionStyle(position as ToastPosition)}\n          onDismiss={removeToast}\n          onPause={pauseToast}\n          onResume={resumeToast}\n          defaultAnimation={defaultAnimation}\n          toastTheme={currentTheme as 'light' | 'dark'}\n          defaultStyle={defaultStyle}\n          containerClassName={containerClassName}\n        />\n      ))}\n    </>\n  ), [\n    toastsByPosition,\n    getPositionStyle,\n    removeToast,\n    pauseToast,\n    resumeToast,\n    defaultAnimation,\n    currentTheme,\n    defaultStyle,\n    containerClassName,\n    toasts,\n    enableAccessibleAnnouncements\n  ]);\n\n  // Move conditional return after all hooks are called\n  if (!isMounted || !portalElement) {\n    return null;\n  }\n\n  // Apply suppressHydrationWarning to the portal content if enabled\n  const portalContentWithSuppression = suppressHydrationWarning ? (\n    <div suppressHydrationWarning={true}>\n      {portalContent}\n    </div>\n  ) : portalContent;\n\n  return createPortal(portalContentWithSuppression, portalElement);\n};\nToastPortal.displayName = 'ToastPortal';\n\nexport default memo(ToastPortal);","import * as React from 'react';\nimport { useToastStore } from './toast';\nimport type { ToastTheme, ToastPosition, ToastAnimation, ToastStyle, ProgressBarStyle } from './toast';\nimport ToastPortal from './ToastPortal';\nimport { ToastDevTools } from './DevTools';\n\nconst { createContext, useContext, useEffect, useState, useRef } = React;\n\ninterface ToastProviderProps {\n  children: React.ReactNode;\n  \n  // Basic configuration\n  theme?: ToastTheme;\n  position?: ToastPosition;\n  maxToasts?: number;\n  \n  // Default styling options\n  defaultAnimation?: ToastAnimation;\n  defaultStyle?: ToastStyle;\n  defaultDuration?: number;\n  \n  // Default behavior options\n  defaultDismissible?: boolean;\n  defaultPauseOnHover?: boolean;\n  defaultDismissOnClick?: boolean;\n  \n  // Progress bar defaults\n  defaultProgressBarStyle?: ProgressBarStyle;\n  defaultProgressBarColor?: string;\n  defaultProgressBarPosition?: 'top' | 'bottom' | 'left' | 'right';\n  defaultProgressBarThickness?: number;\n  defaultProgressAnimation?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring';\n  \n  // Advanced defaults\n  defaultFloating?: boolean;\n  defaultRippleEffect?: boolean;\n  defaultSwipeToDismiss?: boolean;\n  defaultPriority?: 'low' | 'normal' | 'high';\n  defaultStagger?: number;\n  \n  // Container styling\n  containerClassName?: string;\n  topOffset?: number;\n  bottomOffset?: number;\n  leftOffset?: number;\n  rightOffset?: number;\n  \n  // Features\n  enableAccessibleAnnouncements?: boolean;\n  enableDevMode?: boolean;\n  enableDevTools?: boolean; // NEW: Enable visual DevTools UI\n  suppressHydrationWarning?: boolean;\n  \n  // Global overrides (apply to all toasts unless explicitly overridden)\n  globalClassName?: string;\n  globalStyle?: React.CSSProperties;\n}\n\ninterface ToastProviderContext {\n  theme: ToastTheme;\n  effectiveTheme: 'light' | 'dark';\n  position: ToastPosition;\n  maxToasts: number;\n  defaultAnimation: ToastAnimation;\n  defaultStyle: ToastStyle;\n  \n  // Extended defaults\n  defaultDuration: number;\n  defaultDismissible: boolean;\n  defaultPauseOnHover: boolean;\n  defaultDismissOnClick: boolean;\n  defaultProgressBarStyle?: ProgressBarStyle;\n  defaultProgressBarColor?: string;\n  defaultProgressBarPosition: 'top' | 'bottom' | 'left' | 'right';\n  defaultProgressBarThickness: number;\n  defaultProgressAnimation: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring';\n  defaultFloating: boolean;\n  defaultRippleEffect: boolean;\n  defaultSwipeToDismiss: boolean;\n  defaultPriority: 'low' | 'normal' | 'high';\n  defaultStagger: number;\n  globalClassName?: string;\n  globalStyle?: React.CSSProperties;\n}\n\nconst ToastProviderContext = createContext<ToastProviderContext | null>(null);\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n  children,\n  theme = 'system',\n  position = 'top-right',\n  maxToasts = 3,\n  defaultAnimation = 'slide',\n  defaultStyle = 'solid',\n  defaultDuration = 4000,\n  defaultDismissible = true,\n  defaultPauseOnHover = true,\n  defaultDismissOnClick = false,\n  defaultProgressBarStyle,\n  defaultProgressBarColor,\n  defaultProgressBarPosition = 'bottom',\n  defaultProgressBarThickness = 3,\n  defaultProgressAnimation = 'linear',\n  defaultFloating = false,\n  defaultRippleEffect = false,\n  defaultSwipeToDismiss = false,\n  defaultPriority = 'normal',\n  defaultStagger = 0,\n  containerClassName,\n  topOffset,\n  bottomOffset,\n  leftOffset,\n  rightOffset,\n  enableAccessibleAnnouncements = true,\n  enableDevMode = false,\n  enableDevTools = false, // NEW: Default to false\n  suppressHydrationWarning = false,\n  globalClassName,\n  globalStyle,\n}) => {\n  // Track component lifecycle using refs to prevent state updates after unmount\n  const isMounted = useRef(false);\n  const [initialized, setInitialized] = useState(false);\n  \n  // Access store methods - this must be called in every render\n  const { setTheme, setMaxToasts, effectiveTheme, theme: currentTheme } = useToastStore();\n\n  // Single effect for initialization - this runs once\n  useEffect(() => {\n    isMounted.current = true;\n    \n    // Only set theme and maxToasts if they differ from current values\n    if (currentTheme !== theme) {\n      setTheme(theme);\n    }\n    \n    setMaxToasts(maxToasts);\n\n    // Set up dev mode if enabled\n    if (enableDevMode && typeof window !== 'undefined' && process.env.NODE_ENV === 'development') {\n      (window as any).__TOAST_DEV_MODE__ = true;\n      (window as any).__TOAST_DEFAULTS__ = {\n        duration: defaultDuration,\n        dismissible: defaultDismissible,\n        pauseOnHover: defaultPauseOnHover,\n        dismissOnClick: defaultDismissOnClick,\n        animation: defaultAnimation,\n        style: defaultStyle,\n        progressBarStyle: defaultProgressBarStyle,\n        progressBarColor: defaultProgressBarColor,\n        progressBarPosition: defaultProgressBarPosition,\n        progressBarThickness: defaultProgressBarThickness,\n        progressAnimation: defaultProgressAnimation,\n        floating: defaultFloating,\n        rippleEffect: defaultRippleEffect,\n        swipeToDismiss: defaultSwipeToDismiss,\n        priority: defaultPriority,\n        stagger: defaultStagger,\n        globalClassName,\n        globalStyle,\n      };\n    }\n    \n    // Set global defaults in window for toast function to access\n    if (typeof window !== 'undefined') {\n      (window as any).__TOAST_CONFIG__ = {\n        defaultDuration,\n        defaultDismissible,\n        defaultPauseOnHover,\n        defaultDismissOnClick,\n        defaultAnimation,\n        defaultStyle,\n        defaultProgressBarStyle,\n        defaultProgressBarColor,\n        defaultProgressBarPosition,\n        defaultProgressBarThickness,\n        defaultProgressAnimation,\n        defaultFloating,\n        defaultRippleEffect,\n        defaultSwipeToDismiss,\n        defaultPriority,\n        defaultStagger,\n        globalClassName,\n        globalStyle,\n      };\n    }\n    \n    setInitialized(true);\n    \n    return () => {\n      isMounted.current = false;\n      if (typeof window !== 'undefined') {\n        delete (window as any).__TOAST_DEV_MODE__;\n        delete (window as any).__TOAST_DEFAULTS__;\n        delete (window as any).__TOAST_CONFIG__;\n      }\n    };\n  }, []); // Empty deps for initial setup only\n\n  // Track theme changes\n  useEffect(() => {\n    if (initialized && isMounted.current) {\n      setTheme(theme);\n    }\n  }, [theme, initialized, setTheme]);\n  \n  // Track maxToasts changes\n  useEffect(() => {\n    if (initialized && isMounted.current) {\n      setMaxToasts(maxToasts);\n    }\n  }, [maxToasts, initialized, setMaxToasts]);\n\n  // Update global config when defaults change\n  useEffect(() => {\n    if (initialized && typeof window !== 'undefined') {\n      (window as any).__TOAST_CONFIG__ = {\n        defaultDuration,\n        defaultDismissible,\n        defaultPauseOnHover,\n        defaultDismissOnClick,\n        defaultAnimation,\n        defaultStyle,\n        defaultProgressBarStyle,\n        defaultProgressBarColor,\n        defaultProgressBarPosition,\n        defaultProgressBarThickness,\n        defaultProgressAnimation,\n        defaultFloating,\n        defaultRippleEffect,\n        defaultSwipeToDismiss,\n        defaultPriority,\n        defaultStagger,\n        globalClassName,\n        globalStyle,\n      };\n    }\n  }, [\n    initialized,\n    defaultDuration,\n    defaultDismissible,\n    defaultPauseOnHover,\n    defaultDismissOnClick,\n    defaultAnimation,\n    defaultStyle,\n    defaultProgressBarStyle,\n    defaultProgressBarColor,\n    defaultProgressBarPosition,\n    defaultProgressBarThickness,\n    defaultProgressAnimation,\n    defaultFloating,\n    defaultRippleEffect,\n    defaultSwipeToDismiss,\n    defaultPriority,\n    defaultStagger,\n    globalClassName,\n    globalStyle,\n  ]);\n\n  // Monitor system theme changes\n  useEffect(() => {\n    if (theme === 'system' && typeof window !== 'undefined') {\n      // Initial update\n      useToastStore.getState().updateEffectiveTheme();\n      \n      // Setup theme change listener\n      const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');\n      \n      const handleThemeChange = () => {\n        useToastStore.getState().updateEffectiveTheme();\n      };\n      \n      if (darkModeQuery.addEventListener) {\n        darkModeQuery.addEventListener('change', handleThemeChange);\n      } else if (darkModeQuery.addListener) {\n        darkModeQuery.addListener(handleThemeChange);\n      }\n      \n      return () => {\n        if (darkModeQuery.removeEventListener) {\n          darkModeQuery.removeEventListener('change', handleThemeChange);\n        } else if (darkModeQuery.removeListener) {\n          darkModeQuery.removeListener(handleThemeChange);\n        }\n      };\n    }\n  }, [theme]);\n\n  const contextValue: ToastProviderContext = {\n    theme,\n    effectiveTheme,\n    position,\n    maxToasts,\n    defaultAnimation,\n    defaultStyle,\n    defaultDuration,\n    defaultDismissible,\n    defaultPauseOnHover,\n    defaultDismissOnClick,\n    defaultProgressBarStyle,\n    defaultProgressBarColor,\n    defaultProgressBarPosition,\n    defaultProgressBarThickness,\n    defaultProgressAnimation,\n    defaultFloating,\n    defaultRippleEffect,\n    defaultSwipeToDismiss,\n    defaultPriority,\n    defaultStagger,\n    globalClassName,\n    globalStyle,\n  };\n\n  // Direct DevTools component rendering\n  const shouldShowDevTools = enableDevTools && process.env.NODE_ENV === 'development';\n\n  return (\n    <ToastProviderContext.Provider value={contextValue}>\n      {children}\n      <ToastPortal\n        containerClassName={containerClassName}\n        topOffset={topOffset}\n        bottomOffset={bottomOffset}\n        leftOffset={leftOffset}\n        rightOffset={rightOffset}\n        defaultAnimation={defaultAnimation}\n        defaultStyle={defaultStyle}\n        enableAccessibleAnnouncements={enableAccessibleAnnouncements}\n        suppressHydrationWarning={suppressHydrationWarning}\n      />\n      {shouldShowDevTools && <ToastDevTools />}\n    </ToastProviderContext.Provider>\n  );\n};\n\nexport const useToastProvider = () => {\n  const context = useContext(ToastProviderContext);\n  if (!context) {\n    throw new Error('useToastProvider must be used within a ToastProvider');\n  }\n  return context;\n};","import * as React from 'react';\nimport { useToastStore } from './toast';\nimport type { ToastTheme, ToastPosition } from './toast';\n\nconst { useCallback, useMemo } = React;\n\n/**\n * Hook to access toast functionality\n * Provides a convenient way to access toast functions and state\n */\nexport const useToast = () => {\n  const { \n    toasts, \n    theme, \n    effectiveTheme, \n    maxToasts, \n    plugins,\n    addToast,\n    removeToast,\n    updateToast,\n    clearAllToasts,\n    pauseToast,\n    resumeToast,\n    setTheme,\n    setMaxToasts,\n    registerPlugin,\n    unregisterPlugin\n  } = useToastStore();\n\n  // Memoize toast statistics for performance\n  const stats = useMemo(() => {\n    const total = toasts.length;\n    const byVariant = toasts.reduce<Record<string, number>>((acc, toast) => {\n      acc[toast.variant] = (acc[toast.variant] || 0) + 1;\n      return acc;\n    }, {});\n    \n    const byPosition = toasts.reduce<Record<ToastPosition, number>>((acc, toast) => {\n      acc[toast.position] = (acc[toast.position] || 0) + 1;\n      return acc;\n    }, {} as Record<ToastPosition, number>);\n\n    return { total, byVariant, byPosition };\n  }, [toasts]);\n\n  // Helper function to get toast by ID\n  const getToastById = useCallback((id: string) => {\n    return toasts.find(toast => toast.id === id);\n  }, [toasts]);\n\n  // Helper function to check if there are any toasts\n  const hasToasts = useCallback(() => {\n    return toasts.length > 0;\n  }, [toasts]);\n\n  return {\n    // State\n    toasts,\n    theme,\n    effectiveTheme,\n    maxToasts,\n    plugins,\n    \n    // Actions\n    addToast,\n    removeToast,\n    updateToast,\n    clearAllToasts,\n    pauseToast,\n    resumeToast,\n    setTheme,\n    setMaxToasts,\n    registerPlugin,\n    unregisterPlugin,\n    \n    // Helpers\n    getToastById,\n    hasToasts,\n    stats,\n  };\n};\n\n/**\n * Hook to access toast configuration\n */\nexport const useToastConfig = () => {\n  const { theme, effectiveTheme, setTheme, maxToasts, setMaxToasts } = useToastStore();\n  \n  return {\n    theme,\n    effectiveTheme,\n    setTheme,\n    maxToasts,\n    setMaxToasts,\n  };\n};\n\n/**\n * Hook to access toast statistics\n */\nexport const useToastStats = () => {\n  const { toasts } = useToastStore();\n  \n  return useMemo(() => ({\n    total: toasts.length,\n    byVariant: toasts.reduce((acc, toast) => {\n      acc[toast.variant] = (acc[toast.variant] || 0) + 1;\n      return acc;\n    }, {} as Record<string, number>),\n    byPosition: toasts.reduce((acc, toast) => {\n      acc[toast.position] = (acc[toast.position] || 0) + 1;\n      return acc;\n    }, {} as Record<ToastPosition, number>),\n    byTheme: toasts.reduce((acc, toast) => {\n      acc[toast.theme] = (acc[toast.theme] || 0) + 1;\n      return acc;\n    }, {} as Record<ToastTheme, number>)\n  }), [toasts]);\n};","// CSS Auto-injection for React Toast Kit\n// Không khai báo fs và path để tránh lỗi TypeScript về biến không sử dụng\n// Sẽ sử dụng CSS đã nhúng cứng thay vì đọc file\n\nlet cssInjected = false;\n\nconst injectCSS = () => {\n  if (typeof document === 'undefined' || cssInjected) return;\n  \n  // Check if CSS is already injected\n  if (document.getElementById('react-toast-kit-styles')) {\n    cssInjected = true;\n    return;\n  }\n  \n  try {\n    const style = document.createElement('style');\n    style.id = 'react-toast-kit-styles';\n    style.setAttribute('data-toast-kit-version', '1.0.3');\n    \n    // Inject CSS directly instead of reading from file\n    // This content will be replaced by build script\n    const cssContent = '/* CSS will be injected during build */';\n    \n    // Also include progress bar styles\n    const progressStylesContent = '/* Progress bar styles will be injected during build */';\n\n    style.textContent = cssContent + progressStylesContent;\n    \n    // Insert at the beginning of head for proper CSS precedence\n    if (document.head) {\n      if (document.head.firstChild) {\n        document.head.insertBefore(style, document.head.firstChild);\n      } else {\n        document.head.appendChild(style);\n      }\n    }\n    \n    cssInjected = true;\n    \n    // Removed console.log for production\n  } catch (error) {\n    console.warn('[react-toast-kit] Could not auto-inject CSS:', error);\n  }\n};\n\n// Auto-inject CSS when this module is imported\nif (typeof window !== 'undefined') {\n  // Immediate injection if DOM is ready\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', injectCSS);\n  } else {\n    injectCSS();\n  }\n}\n\n// Enhanced version check for development\nif (typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n  // Development mode warnings\n  if (typeof window !== 'undefined') {\n    // Check for common conflicts\n    if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') {\n      setTimeout(() => {\n        const existingToastLibs = [\n          'react-hot-toast',\n          'react-toastify',\n          'react-toast-notifications'\n        ].filter(lib => {\n          try {\n            return require.resolve(lib);\n          } catch {\n            return false;\n          }\n        });\n        \n        if (existingToastLibs.length > 0) {\n          console.warn(\n            `React Toast Kit: Detected other toast libraries: ${existingToastLibs.join(', ')}. ` +\n            'This may cause conflicts. Consider removing them.'\n          );\n        }\n      }, 1000);\n    }\n  }\n}\n\n// Core exports - optimized for tree shaking\n// Note: toast function doesn't use React hooks, so it's safe to export directly\nexport { toast } from './toast';\n\n// Provider exports - these are client components\nexport { ToastProvider } from './ToastProvider';\n\n// Hook exports - these need to be used in client components\nexport { useToast } from './useToast';\nexport { useToastStore } from './toast';\n\n// Enhanced exports - new functionality\nexport { \n  registerPlugin, \n  unregisterPlugin, \n  cleanup\n} from './toast';\n\n// Type exports with better organization\nexport type {\n  // Core types\n  Toast,\n  ToastOptions,\n  ToastPosition,\n  ToastVariant,\n  ToastTheme,\n  ToastAnimation,\n  ToastStyle,\n  ProgressBarStyle,\n  \n  // Enhanced types\n  CustomAnimation,\n  ToastPlugin,\n  StrictToastOptions\n} from './toast';\n\n// Provider context export\nexport { useToastProvider } from './ToastProvider';\n\n// Export CSS injection function for manual control\nexport { injectCSS };"]}