{"version":3,"file":"Toasts.mjs","sources":["../../../../src/lib/ui/feedback/Toasts.tsx"],"sourcesContent":["/**\n * @file Toasts Component\n * @description Toast manager hooked into global state / error reporting\n * Uses theme tokens for consistent styling and z-index management\n * @refresh reset\n */\n\nimport React, {\n  useContext,\n  useCallback,\n  useState,\n  useEffect,\n  memo,\n  useMemo,\n  type ReactNode,\n  type CSSProperties,\n} from 'react';\nimport {\n  ToastContext,\n  type Toast,\n  type ToastContextValue,\n  type ToastVariant,\n} from '../../contexts/ToastContext';\nimport { tokens, colorTokens } from '../../theme/tokens';\n\n/**\n * Toast types - alias from context\n */\nexport type ToastType = ToastVariant;\n\n/**\n * Toast position\n */\nexport type ToastPosition =\n  | 'top-left'\n  | 'top-center'\n  | 'top-right'\n  | 'bottom-left'\n  | 'bottom-center'\n  | 'bottom-right';\n\n/**\n * Generate unique toast ID\n */\nfunction generateId(): string {\n  return `toast_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Toast provider props\n */\nexport interface ToastProviderProps {\n  children: ReactNode;\n  position?: ToastPosition;\n  maxToasts?: number;\n  defaultDuration?: number;\n}\n\n/**\n * Toast provider component\n */\nexport function ToastProvider({\n  children,\n  position = 'top-right',\n  maxToasts = 5,\n  defaultDuration = 5000,\n}: ToastProviderProps): React.ReactElement {\n  const [toasts, setToasts] = useState<Toast[]>([]);\n\n  const removeToast = useCallback((id: string) => {\n    setToasts((prev) => prev.filter((t) => t.id !== id));\n  }, []);\n\n  const addToast = useCallback(\n    (message: string | ReactNode, variant: ToastVariant) => {\n      const id = generateId();\n      const newToast: Toast = {\n        id,\n        message,\n        variant,\n        duration: defaultDuration,\n        dismissible: true,\n      };\n\n      setToasts((prev) => {\n        const updated = [newToast, ...prev];\n        // Limit max toasts\n        return updated.slice(0, maxToasts);\n      });\n\n      return id;\n    },\n    [defaultDuration, maxToasts]\n  );\n\n  const clearAll = useCallback(() => {\n    setToasts([]);\n  }, []);\n\n  const showToast = useCallback(\n    (message: string | ReactNode, variant: ToastVariant = 'info') => {\n      return addToast(message, variant);\n    },\n    [addToast]\n  );\n\n  const value: ToastContextValue = {\n    toasts,\n    showToast,\n    dismissToast: removeToast,\n    dismissAll: clearAll,\n  };\n\n  return (\n    <ToastContext.Provider value={value}>\n      {children}\n      <ToastContainer toasts={toasts} position={position} onRemove={removeToast} />\n    </ToastContext.Provider>\n  );\n}\n\nToastProvider.displayName = 'ToastProvider';\n\n/**\n * Hook to use toast context\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useToast(): ToastContextValue {\n  const context = useContext(ToastContext);\n  if (!context) {\n    throw new Error('useToast must be used within ToastProvider');\n  }\n  return context;\n}\n\n/**\n * Props for ToastContainer component\n */\ninterface ToastContainerProps {\n  toasts: Toast[];\n  position: ToastPosition;\n  onRemove: (id: string) => void;\n}\n\n/**\n * Get animation direction based on position\n */\nfunction getAnimationName(position: ToastPosition): string {\n  if (position.includes('left')) return 'slideInFromLeft';\n  if (position.includes('center')) return 'slideInFromTop';\n  return 'slideInFromRight';\n}\n\n/**\n * Toast container component - memoized for performance\n */\nconst ToastContainer = memo(\n  ({ toasts, position, onRemove }: ToastContainerProps): React.ReactElement | null => {\n    // Position styles - uses theme token for z-index\n    const positionStyles: React.CSSProperties = {\n      position: 'fixed',\n      zIndex: parseInt(tokens.zIndex.toast),\n      display: 'flex',\n      flexDirection: 'column',\n      gap: tokens.spacing.sm,\n      padding: tokens.spacing.md,\n      maxWidth: '24rem',\n      width: '100%',\n    };\n\n    if (position.includes('top')) {\n      positionStyles.top = 0;\n    } else {\n      positionStyles.bottom = 0;\n      positionStyles.flexDirection = 'column-reverse';\n    }\n\n    if (position.includes('left')) {\n      positionStyles.left = 0;\n    } else if (position.includes('right')) {\n      positionStyles.right = 0;\n    } else {\n      positionStyles.left = '50%';\n      positionStyles.transform = 'translateX(-50%)';\n    }\n\n    if (toasts.length === 0) return null;\n\n    return (\n      <div style={positionStyles} aria-live=\"polite\" aria-atomic=\"true\">\n        {toasts.map((toast) => (\n          <ToastItem key={toast.id} toast={toast} position={position} onRemove={onRemove} />\n        ))}\n      </div>\n    );\n  }\n);\n\nToastContainer.displayName = 'ToastContainer';\n\n/**\n * Props for ToastItem component\n */\ninterface ToastItemProps {\n  toast: Toast;\n  position: ToastPosition;\n  onRemove: (id: string) => void;\n}\n\n// Toast item static styles - using theme tokens\nconst toastItemBaseStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'flex-start',\n  gap: tokens.spacing.md,\n  padding: tokens.spacing.md,\n  borderRadius: tokens.radius.lg,\n  boxShadow: tokens.shadow.md,\n};\n\nconst iconContainerStyle: CSSProperties = {\n  flexShrink: 0,\n};\n\nconst contentContainerStyle: CSSProperties = {\n  flex: 1,\n  minWidth: 0,\n};\n\nconst messageStyle: CSSProperties = {\n  fontSize: tokens.fontSize.sm,\n  color: colorTokens.text.secondary,\n};\n\nconst dismissButtonStyle: CSSProperties = {\n  padding: tokens.spacing.xs,\n  backgroundColor: 'transparent',\n  border: 'none',\n  cursor: 'pointer',\n  color: colorTokens.neutral[400],\n  borderRadius: tokens.radius.sm,\n};\n\n// Type colors constant - using theme color tokens\nconst typeColors: Record<ToastVariant, { bg: string; border: string; icon: string }> = {\n  success: {\n    bg: colorTokens.success.lighter,\n    border: colorTokens.success.light,\n    icon: colorTokens.success.default,\n  },\n  error: {\n    bg: colorTokens.error.lighter,\n    border: colorTokens.error.light,\n    icon: colorTokens.error.default,\n  },\n  warning: {\n    bg: colorTokens.warning.lighter,\n    border: colorTokens.warning.light,\n    icon: colorTokens.warning.default,\n  },\n  info: {\n    bg: colorTokens.info.lighter,\n    border: colorTokens.info.light,\n    icon: colorTokens.info.default,\n  },\n};\n\n// ============================================================================\n// ANIMATION STYLES - Injected once at module load to prevent memory leak\n// Direction-aware animations based on toast position\n// ============================================================================\n\nconst TOAST_ANIMATION_STYLES = `\n@keyframes slideInFromRight {\n  from {\n    transform: translateX(100%);\n    opacity: 0;\n  }\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n@keyframes slideInFromLeft {\n  from {\n    transform: translateX(-100%);\n    opacity: 0;\n  }\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n@keyframes slideInFromTop {\n  from {\n    transform: translateY(-20px);\n    opacity: 0;\n  }\n  to {\n    transform: translateY(0);\n    opacity: 1;\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  [role=\"alert\"] {\n    animation: none !important;\n    opacity: 1;\n    transform: none;\n  }\n}\n`;\n\n// Inject animation styles once at module load (SSR-safe)\nif (typeof document !== 'undefined') {\n  const styleId = 'toast-animation-styles';\n  if (!document.getElementById(styleId)) {\n    const styleElement = document.createElement('style');\n    styleElement.id = styleId;\n    styleElement.textContent = TOAST_ANIMATION_STYLES;\n    document.head.appendChild(styleElement);\n  }\n}\n\n/**\n * Individual toast item - memoized for performance\n */\nconst ToastItem = memo(({ toast, position, onRemove }: ToastItemProps): React.ReactElement => {\n  // Auto-dismiss\n  useEffect(() => {\n    if (toast.duration !== undefined && toast.duration !== null && toast.duration > 0) {\n      const timer = setTimeout(() => {\n        onRemove(toast.id);\n      }, toast.duration);\n      return () => clearTimeout(timer);\n    }\n    return undefined;\n  }, [toast.id, toast.duration, onRemove]);\n\n  // Stable dismiss callback\n  const handleDismiss = useCallback(() => {\n    onRemove(toast.id);\n  }, [onRemove, toast.id]);\n\n  const colors = typeColors[toast.variant];\n  const animationName = getAnimationName(position);\n\n  // Memoize container style with variant-specific colors and position-aware animation\n  const containerStyle = useMemo<CSSProperties>(\n    () => ({\n      ...toastItemBaseStyle,\n      backgroundColor: colors.bg,\n      border: `1px solid ${colors.border}`,\n      animation: `${animationName} 0.3s ease-out`,\n    }),\n    [colors.bg, colors.border, animationName]\n  );\n\n  // Memoize icon style with color\n  const iconStyle = useMemo<CSSProperties>(\n    () => ({\n      ...iconContainerStyle,\n      color: colors.icon,\n    }),\n    [colors.icon]\n  );\n\n  return (\n    <div role=\"alert\" style={containerStyle}>\n      {/* Icon - decorative, hidden from screen readers */}\n      <span style={iconStyle} aria-hidden=\"true\">\n        {toast.variant === 'success' && (\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n            <path\n              fillRule=\"evenodd\"\n              d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n              clipRule=\"evenodd\"\n            />\n          </svg>\n        )}\n        {toast.variant === 'error' && (\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n            <path\n              fillRule=\"evenodd\"\n              d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n              clipRule=\"evenodd\"\n            />\n          </svg>\n        )}\n        {toast.variant === 'warning' && (\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n            <path\n              fillRule=\"evenodd\"\n              d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n              clipRule=\"evenodd\"\n            />\n          </svg>\n        )}\n        {toast.variant === 'info' && (\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n            <path\n              fillRule=\"evenodd\"\n              d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n              clipRule=\"evenodd\"\n            />\n          </svg>\n        )}\n      </span>\n\n      {/* Screen reader announcement of toast type */}\n      <span className=\"sr-only\">\n        {toast.variant === 'success' && 'Success: '}\n        {toast.variant === 'error' && 'Error: '}\n        {toast.variant === 'warning' && 'Warning: '}\n        {toast.variant === 'info' && 'Info: '}\n      </span>\n\n      {/* Content */}\n      <div style={contentContainerStyle}>\n        <div style={messageStyle}>{toast.message}</div>\n      </div>\n\n      {/* Dismiss button */}\n      {toast.dismissible === true && (\n        <button onClick={handleDismiss} style={dismissButtonStyle} aria-label=\"Dismiss\">\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n            <path\n              fillRule=\"evenodd\"\n              d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n              clipRule=\"evenodd\"\n            />\n          </svg>\n        </button>\n      )}\n      {/* Animation styles injected at module level - see TOAST_ANIMATION_STYLES */}\n    </div>\n  );\n});\n\nToastItem.displayName = 'ToastItem';\n"],"names":["generateId","ToastProvider","children","position","maxToasts","defaultDuration","toasts","setToasts","useState","removeToast","useCallback","id","prev","t","addToast","message","variant","newToast","clearAll","showToast","value","jsxs","ToastContext","jsx","ToastContainer","useToast","context","useContext","getAnimationName","memo","onRemove","positionStyles","tokens","toast","ToastItem","toastItemBaseStyle","iconContainerStyle","contentContainerStyle","messageStyle","colorTokens","dismissButtonStyle","typeColors","TOAST_ANIMATION_STYLES","styleId","styleElement","useEffect","timer","handleDismiss","colors","animationName","containerStyle","useMemo","iconStyle"],"mappings":"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"}