toast-23 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +113 -102
- package/dist/context.d.ts.map +1 -1
- package/dist/devtools.d.ts +24 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/headless-store.d.ts +3 -0
- package/dist/headless-store.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +1464 -279
- package/dist/index.mjs.map +1 -1
- package/dist/inject-styles.d.ts +13 -0
- package/dist/inject-styles.d.ts.map +1 -0
- package/dist/notification.d.ts +4 -0
- package/dist/notification.d.ts.map +1 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/sound.d.ts +3 -0
- package/dist/sound.d.ts.map +1 -0
- package/dist/standalone.d.ts +14 -22
- package/dist/standalone.d.ts.map +1 -1
- package/dist/toast-23.css +1 -1
- package/dist/toast-container.d.ts +5 -5
- package/dist/toast-container.d.ts.map +1 -1
- package/dist/toast-item.d.ts +16 -3
- package/dist/toast-item.d.ts.map +1 -1
- package/dist/types.d.ts +137 -39
- package/dist/types.d.ts.map +1 -1
- package/dist/use-toast-headless.d.ts +14 -0
- package/dist/use-toast-headless.d.ts.map +1 -0
- package/dist/use-toast.d.ts.map +1 -1
- package/dist/utils.d.ts +4 -6
- package/dist/utils.d.ts.map +1 -1
- package/package.json +9 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/context.tsx","../src/icons.tsx","../src/utils.ts","../src/toast-item.tsx","../src/toast-container.tsx","../src/provider.tsx","../src/use-toast.ts","../src/standalone.ts"],"sourcesContent":["/**\r\n * toast-23 — React Context & Reducer\r\n */\r\n\r\nimport { createContext } from \"react\";\r\nimport type {\r\n InternalToast,\r\n ToasterAction,\r\n ToasterContextValue,\r\n} from \"./types\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Context — consumed by useToast() and internal components\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const ToasterContext = createContext<ToasterContextValue | null>(null);\r\n\r\n// ---------------------------------------------------------------------------\r\n// Reducer — pure state transitions for the toast queue\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function toasterReducer(\r\n state: InternalToast[],\r\n action: ToasterAction,\r\n): InternalToast[] {\r\n switch (action.type) {\r\n case \"ADD\":\r\n return [...state, action.toast];\r\n\r\n case \"UPSERT\": {\r\n const exists = state.some((t) => t.id === action.toast.id);\r\n if (exists) {\r\n return state.map((t) =>\r\n t.id === action.toast.id\r\n ? {\r\n ...t,\r\n ...action.toast,\r\n version: t.version + 1,\r\n isExiting: false,\r\n }\r\n : t,\r\n );\r\n }\r\n return [...state, action.toast];\r\n }\r\n\r\n case \"UPDATE\":\r\n return state.map((t) =>\r\n t.id === action.id\r\n ? {\r\n ...t,\r\n ...action.updates,\r\n // Bump version so progress bar restarts\r\n version: t.version + 1,\r\n // If the toast was exiting, cancel exit on update\r\n isExiting: false,\r\n }\r\n : t,\r\n );\r\n\r\n case \"DISMISS\":\r\n // Omit id → dismiss all\r\n if (!action.id) {\r\n return state.map((t) => ({ ...t, isExiting: true }));\r\n }\r\n return state.map((t) =>\r\n t.id === action.id ? { ...t, isExiting: true } : t,\r\n );\r\n\r\n case \"REMOVE\":\r\n // Omit id → remove all instantly\r\n if (!action.id) return [];\r\n return state.filter((t) => t.id !== action.id);\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","/**\r\n * toast-23 — Inline SVG Icons (Filled style)\r\n *\r\n * Solid colored circles/triangles with white inner symbols, designed to be used with the default styles. Each icon inherits `currentColor` so it can be colored via CSS.\r\n */\r\n\r\nimport type { SVGProps, FC } from \"react\";\r\n\r\ntype IconProps = SVGProps<SVGSVGElement>;\r\n\r\n/** Green filled circle with white checkmark */\r\nexport const CheckCircleIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <circle cx={12} cy={12} r={10} fill=\"currentColor\" />\r\n <path\r\n d=\"M8 12.5l2.5 2.5 5-5\"\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n fill=\"none\"\r\n />\r\n </svg>\r\n);\r\n\r\n/** Red filled circle with white exclamation */\r\nexport const XCircleIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <circle cx={12} cy={12} r={10} fill=\"currentColor\" />\r\n <line\r\n x1={12}\r\n y1={8}\r\n x2={12}\r\n y2={13}\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n <circle cx={12} cy={16} r={1} fill=\"#fff\" />\r\n </svg>\r\n);\r\n\r\n/** Yellow filled triangle with white exclamation */\r\nexport const AlertTriangleIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <path\r\n d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\r\n fill=\"currentColor\"\r\n />\r\n <line\r\n x1={12}\r\n y1={9.5}\r\n x2={12}\r\n y2={14}\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n <circle cx={12} cy={17} r={1} fill=\"#fff\" />\r\n </svg>\r\n);\r\n\r\n/** Blue filled circle with white \"i\" */\r\nexport const InfoIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <circle cx={12} cy={12} r={10} fill=\"currentColor\" />\r\n <line\r\n x1={12}\r\n y1={11}\r\n x2={12}\r\n y2={16}\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n <circle cx={12} cy={8} r={1} fill=\"#fff\" />\r\n </svg>\r\n);\r\n\r\n/** Thin X icon for dismiss button */\r\nexport const XIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n width=\"0.875em\"\r\n height=\"0.875em\"\r\n {...props}\r\n >\r\n <line x1={18} y1={6} x2={6} y2={18} />\r\n <line x1={6} y1={6} x2={18} y2={18} />\r\n </svg>\r\n);\r\n\r\n/** CSS-only loading spinner */\r\nexport const SpinnerIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n className=\"toast23-spinner\"\r\n {...props}\r\n >\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n </svg>\r\n);\r\n","/**\r\n * toast-23 — Utility helpers\r\n */\r\n\r\nlet counter = 0;\r\n\r\n/**\r\n * Generates a unique toast id.\r\n * Works in SSR (no dependency on `crypto`).\r\n */\r\nexport function generateId(): string {\r\n return `t23-${++counter}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\n/**\r\n * Deterministic class-name builder (replaces clsx dependency).\r\n */\r\nexport function cx(...args: (string | false | null | undefined | 0)[]): string {\r\n return args.filter(Boolean).join(\" \");\r\n}\r\n","/**\r\n * toast-23 — Individual Toast Component\r\n *\r\n * Manages its own enter / exit CSS transitions and auto-dismiss timer.\r\n * Progress bar is JS-driven so it can reverse (refill) on hover.\r\n */\r\n\r\n\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport type { InternalToast } from \"./types\";\r\nimport {\r\n CheckCircleIcon,\r\n XCircleIcon,\r\n AlertTriangleIcon,\r\n InfoIcon,\r\n SpinnerIcon,\r\n XIcon,\r\n} from \"./icons\";\r\nimport { cx } from \"./utils\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Icon map\r\n// ---------------------------------------------------------------------------\r\n\r\nconst variantIcon: Record<string, React.FC<React.SVGProps<SVGSVGElement>>> = {\r\n success: CheckCircleIcon,\r\n error: XCircleIcon,\r\n warning: AlertTriangleIcon,\r\n info: InfoIcon,\r\n default: InfoIcon,\r\n loading: SpinnerIcon,\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Component\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface ToastItemProps {\r\n toast: InternalToast;\r\n onDismiss: (id: string) => void;\r\n onRemove: (id: string) => void;\r\n}\r\n\r\nconst EXIT_DURATION = 300; // ms — must match CSS transition duration\r\n// const MIN_REFILL_DURATION = 200; // ms — minimum refill time so very short hovers aren't instant\r\n\r\nexport const ToastItem: React.FC<ToastItemProps> = React.memo(\r\n ({ toast, onDismiss, onRemove }) => {\r\n // ----- animation state -----\r\n const [hasEntered, setHasEntered] = useState(false);\r\n\r\n // Trigger enter transition on next frame\r\n useEffect(() => {\r\n const raf = requestAnimationFrame(() => setHasEntered(true));\r\n return () => cancelAnimationFrame(raf);\r\n }, []);\r\n\r\n // When the provider marks the toast as exiting, it waits for the CSS\r\n // transition to finish then actually remove it from state.\r\n useEffect(() => {\r\n if (!toast.isExiting) return;\r\n const delay = toast.removeDelay ?? EXIT_DURATION;\r\n const timer = setTimeout(() => onRemove(toast.id), delay);\r\n return () => clearTimeout(timer);\r\n }, [toast.isExiting, toast.id, toast.removeDelay, onRemove]);\r\n\r\n // ----- auto-dismiss timer with hover-pause -----\r\n const [isPaused, setIsPaused] = useState(false);\r\n const remainingRef = useRef(toast.duration);\r\n // const startRef = useRef(0);\r\n\r\n // ----- JS-driven progress bar -----\r\n // progress: 100 = full, 0 = empty\r\n const [progress, setProgress] = useState(100);\r\n // transition duration for the progress bar\r\n const [progressTransition, setProgressTransition] = useState(\"none\");\r\n // const rafRef = useRef<number>(0);\r\n\r\n // Reset remaining time when version changes (e.g. promise resolved)\r\n useEffect(() => {\r\n remainingRef.current = toast.duration;\r\n setProgress(100);\r\n setProgressTransition(\"none\");\r\n }, [toast.version, toast.duration]);\r\n\r\n useEffect(() => {\r\n // Don't auto-dismiss: persistent, loading, still entering, or already exiting\r\n if (\r\n toast.duration <= 0 ||\r\n toast.variant === \"loading\" ||\r\n !hasEntered ||\r\n toast.isExiting\r\n )\r\n return;\r\n\r\n // if (isPaused) {\r\n // // How long the bar was shrinking before hover\r\n // const elapsed = Date.now() - startRef.current;\r\n // // Snapshot remaining time\r\n // remainingRef.current = Math.max(0, remainingRef.current - elapsed);\r\n\r\n // // Reverse at the same speed it was shrinking (proportional duration)\r\n // const refillDuration = Math.max(MIN_REFILL_DURATION, elapsed);\r\n // setProgressTransition(`width ${refillDuration}ms ease-out`);\r\n // setProgress(100);\r\n // return;\r\n // }\r\n\r\n // // Start shrinking\r\n // startRef.current = Date.now();\r\n // const remaining = remainingRef.current;\r\n\r\n // Set transition to match remaining time and shrink to 0\r\n // Use rAF to ensure the refill transition has settled before starting shrink\r\n // rafRef.current = requestAnimationFrame(() => {\r\n // setProgressTransition(`width ${remaining}ms linear`);\r\n // setProgress(0);\r\n // });\r\n\r\n // const timer = setTimeout(() => {\r\n // onDismiss(toast.id);\r\n // }, remaining);\r\n\r\n // return () => {\r\n // clearTimeout(timer);\r\n // cancelAnimationFrame(rafRef.current);\r\n // };\r\n // }, [\r\n // isPaused,\r\n // hasEntered,\r\n // toast.isExiting,\r\n // toast.duration,\r\n // toast.variant,\r\n // toast.id,\r\n // toast.version,\r\n // onDismiss,\r\n // ]);\r\n if (isPaused) {\r\n // refill instantly\r\n setProgressTransition(\"width 200ms ease-out\");\r\n setProgress(100);\r\n return;\r\n }\r\n\r\n // restart shrink animation from full\r\n setProgress(100);\r\n requestAnimationFrame(() => {\r\n setProgressTransition(`width ${toast.duration}ms linear`);\r\n setProgress(0);\r\n });\r\n\r\n const timer = setTimeout(() => {\r\n onDismiss(toast.id);\r\n }, toast.duration);\r\n\r\n return () => clearTimeout(timer);\r\n}, [\r\n isPaused,\r\n toast.duration,\r\n toast.variant,\r\n toast.isExiting,\r\n toast.id,\r\n hasEntered,\r\n onDismiss,\r\n]);\r\n\r\n // ----- handlers -----\r\n const handleMouseEnter = useCallback(() => setIsPaused(true), []);\r\n const handleMouseLeave = useCallback(() => setIsPaused(false), []);\r\n\r\n // ----- render -----\r\n const Icon = variantIcon[toast.variant] ?? InfoIcon;\r\n\r\n // Custom toast — render raw content with no default chrome\r\n if (toast.isCustom) {\r\n return (\r\n <div\r\n className={cx(\r\n \"toast23-item toast23-item--custom\",\r\n !hasEntered && \"toast23-item--entering\",\r\n toast.isExiting && \"toast23-item--exiting\",\r\n )}\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n {toast.message}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cx(\r\n \"toast23-item\",\r\n `toast23-item--${toast.variant}`,\r\n !hasEntered && \"toast23-item--entering\",\r\n toast.isExiting && \"toast23-item--exiting\",\r\n )}\r\n role=\"alert\"\r\n aria-live={toast.variant === \"error\" ? \"assertive\" : \"polite\"}\r\n aria-atomic=\"true\"\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n {/* Icon */}\r\n <span className={cx(\"toast23-icon\", `toast23-icon--${toast.variant}`)}>\r\n <Icon />\r\n </span>\r\n\r\n {/* Content */}\r\n <div className=\"toast23-content\">\r\n {toast.title && <div className=\"toast23-title\">{toast.title}</div>}\r\n <div\r\n className={cx(\r\n \"toast23-message\",\r\n toast.title && \"toast23-message--with-title\",\r\n )}\r\n >\r\n {toast.message}\r\n </div>\r\n </div>\r\n\r\n {/* Dismiss button */}\r\n {toast.dismissible && (\r\n <button\r\n type=\"button\"\r\n className=\"toast23-dismiss\"\r\n onClick={() => onDismiss(toast.id)}\r\n aria-label=\"Dismiss notification\"\r\n >\r\n <XIcon />\r\n </button>\r\n )}\r\n\r\n {/* Progress bar — JS-driven width for hover reversal */}\r\n {toast.duration > 0 && toast.variant !== \"loading\" && (\r\n <div\r\n className={cx(\r\n \"toast23-progress\",\r\n `toast23-progress--${toast.variant}`,\r\n )}\r\n style={{\r\n width: `${progress}%`,\r\n transition: progressTransition,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nToastItem.displayName = \"ToastItem\";\r\n","/**\r\n * toast-23 — Positioned Toast Container\r\n *\r\n * Renders a group of toasts for a given screen position.\r\n * Handles queue logic: only `maxVisible` non-exiting toasts are shown,\r\n * plus any currently animating-out toasts.\r\n */\r\n\r\n\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useContext } from \"react\";\r\nimport type { InternalToast, ToastPosition } from \"./types\";\r\nimport { ToasterContext } from \"./context\";\r\nimport { ToastItem } from \"./toast-item\";\r\nimport { cx } from \"./utils\";\r\n\r\ninterface ToastContainerProps {\r\n position: ToastPosition;\r\n toasts: InternalToast[];\r\n maxVisible: number;\r\n}\r\n\r\nexport const ToastContainer: React.FC<ToastContainerProps> = React.memo(\r\n ({ position, toasts, maxVisible }: ToastContainerProps) => {\r\n const ctx = useContext(ToasterContext);\r\n if (!ctx) return null;\r\n\r\n // Separate actives vs. exiting toasts\r\n const active = toasts.filter((t) => !t.isExiting);\r\n const exiting = toasts.filter((t) => t.isExiting);\r\n\r\n // Only shows up to maxVisible active toasts, plus all currently exiting\r\n const visible = [...active.slice(0, maxVisible), ...exiting];\r\n\r\n if (visible.length === 0) return null;\r\n\r\n // Queue count for optional badge\r\n const queuedCount = Math.max(0, active.length - maxVisible);\r\n\r\n return (\r\n <div\r\n className={cx(\"toast23-container\", `toast23-container--${position}`)}\r\n aria-label=\"Notifications\"\r\n role=\"region\"\r\n >\r\n {visible.map((toast) => (\r\n <ToastItem\r\n key={toast.id}\r\n toast={toast}\r\n onDismiss={ctx.dismissToast}\r\n onRemove={ctx.removeToast}\r\n />\r\n ))}\r\n {queuedCount > 0 && (\r\n <div className=\"toast23-queue-badge\" aria-live=\"polite\">\r\n +{queuedCount} more\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nToastContainer.displayName = \"ToastContainer\";\r\n","/**\r\n * toast-23 — Toast23Provider\r\n *\r\n * Wrap your application with this provider to enable toast notifications.\r\n *\r\n * ```tsx\r\n * <Toast23Provider position=\"top-right\" maxVisible={5}>\r\n * <App />\r\n * </Toast23Provider>\r\n * ```\r\n */\r\n\r\n\"use client\";\r\n\r\nimport { useCallback, useMemo, useReducer } from \"react\";\r\nimport type {\r\n InternalToast,\r\n Toast23ProviderProps,\r\n ToasterContextValue,\r\n ToastOptions,\r\n ToastPosition,\r\n} from \"./types\";\r\nimport type { ReactNode } from \"react\";\r\nimport { ToasterContext, toasterReducer } from \"./context\";\r\nimport { ToastContainer } from \"./toast-container\";\r\nimport { generateId } from \"./utils\";\r\n\r\nconst ALL_POSITIONS: ToastPosition[] = [\r\n \"top-right\",\r\n \"top-left\",\r\n \"top-center\",\r\n \"bottom-right\",\r\n \"bottom-left\",\r\n \"bottom-center\",\r\n];\r\n\r\nexport const Toast23Provider: React.FC<Toast23ProviderProps> = ({\r\n children,\r\n maxVisible = 5,\r\n position: defaultPosition = \"top-right\" as ToastPosition,\r\n duration: defaultDuration = 5000,\r\n}) => {\r\n const [toasts, dispatch] = useReducer(toasterReducer, []);\r\n\r\n // ------ stable callbacks (dispatch is always stable from useReducer) ------\r\n\r\n const addToast = useCallback(\r\n (message: string | ReactNode, options?: ToastOptions & { variant?: any; isCustom?: boolean }): string => {\r\n const id = options?.id ?? generateId();\r\n const toast: InternalToast = {\r\n id,\r\n message,\r\n title: options?.title,\r\n variant: options?.variant ?? \"default\",\r\n duration: options?.duration ?? defaultDuration,\r\n position: options?.position ?? defaultPosition,\r\n dismissible: options?.dismissible ?? true,\r\n removeDelay: options?.removeDelay ?? 1000,\r\n isExiting: false,\r\n createdAt: Date.now(),\r\n version: 0,\r\n isCustom: options?.isCustom,\r\n };\r\n // If an id is provided, upsert (update-or-insert)\r\n if (options?.id) {\r\n dispatch({ type: \"UPSERT\", toast });\r\n } else {\r\n dispatch({ type: \"ADD\", toast });\r\n }\r\n return id;\r\n },\r\n [defaultDuration, defaultPosition],\r\n );\r\n\r\n const updateToast = useCallback(\r\n (\r\n id: string,\r\n updates: Partial<\r\n Pick<\r\n InternalToast,\r\n \"message\" | \"title\" | \"variant\" | \"duration\" | \"dismissible\"\r\n >\r\n >,\r\n ) => {\r\n dispatch({ type: \"UPDATE\", id, updates });\r\n },\r\n [],\r\n );\r\n\r\n const dismissToast = useCallback((id?: string) => {\r\n dispatch({ type: \"DISMISS\", id });\r\n }, []);\r\n\r\n const removeToast = useCallback((id?: string) => {\r\n dispatch({ type: \"REMOVE\", id });\r\n }, []);\r\n\r\n // ------ context value (stable as long as callbacks are stable) ------\r\n\r\n const contextValue: ToasterContextValue = useMemo(\r\n () => ({\r\n addToast,\r\n updateToast,\r\n dismissToast,\r\n removeToast,\r\n config: {\r\n maxVisible,\r\n position: defaultPosition,\r\n duration: defaultDuration,\r\n },\r\n }),\r\n [\r\n addToast,\r\n updateToast,\r\n dismissToast,\r\n removeToast,\r\n maxVisible,\r\n defaultPosition,\r\n defaultDuration,\r\n ],\r\n );\r\n\r\n // ------ group toasts by position ------\r\n\r\n const groupedToasts = useMemo(() => {\r\n const groups: Record<ToastPosition, InternalToast[]> = {\r\n \"top-right\": [],\r\n \"top-left\": [],\r\n \"top-center\": [],\r\n \"bottom-right\": [],\r\n \"bottom-left\": [],\r\n \"bottom-center\": [],\r\n };\r\n for (const t of toasts) {\r\n groups[t.position].push(t);\r\n }\r\n return groups;\r\n }, [toasts]);\r\n\r\n return (\r\n <ToasterContext.Provider value={contextValue}>\r\n {children}\r\n\r\n {/* Render one container per position that has toasts */}\r\n {ALL_POSITIONS.map((pos) =>\r\n groupedToasts[pos].length > 0 ? (\r\n <ToastContainer\r\n key={pos}\r\n position={pos}\r\n toasts={groupedToasts[pos]}\r\n maxVisible={maxVisible}\r\n />\r\n ) : null,\r\n )}\r\n </ToasterContext.Provider>\r\n );\r\n};\r\n\r\nToast23Provider.displayName = \"Toast23Provider\";\r\n","/**\r\n * toast-23 — useToast Hook\r\n *\r\n * Returns a callable `ToastApi` object:\r\n *\r\n * ```ts\r\n * const toast = useToast();\r\n *\r\n * toast(\"Hello!\"); // default variant\r\n * toast.success(\"Done!\"); // success variant\r\n * toast.error(\"Oops\"); // error variant\r\n * toast.promise(fetchData(), { ... }); // promise tracking\r\n * toast.dismiss(id); // manual dismiss\r\n * ```\r\n */\r\n\r\n\"use client\";\r\n\r\nimport { useContext, useMemo } from \"react\";\r\nimport { ToasterContext } from \"./context\";\r\nimport type { ToastApi, ToastOptions, PromiseOptions } from \"./types\";\r\nimport type { ReactNode } from \"react\";\r\n\r\nexport function useToast(): ToastApi {\r\n const ctx = useContext(ToasterContext);\r\n\r\n if (!ctx) {\r\n throw new Error(\r\n \"[toast-23] useToast() must be used inside a <Toast23Provider>. \" +\r\n \"Wrap your application root with <Toast23Provider> to fix this.\",\r\n );\r\n }\r\n\r\n return useMemo(() => {\r\n // Base callable — toast(\"message\", opts?)\r\n const toast = ((message: string | ReactNode, options?: ToastOptions) =>\r\n ctx.addToast(message, options)) as ToastApi;\r\n\r\n // Variant shortcuts\r\n toast.success = (msg, opts) =>\r\n ctx.addToast(msg, { ...opts, variant: \"success\" });\r\n\r\n toast.error = (msg, opts) =>\r\n ctx.addToast(msg, { ...opts, variant: \"error\" });\r\n\r\n toast.warning = (msg, opts) =>\r\n ctx.addToast(msg, { ...opts, variant: \"warning\" });\r\n\r\n toast.info = (msg, opts) => ctx.addToast(msg, { ...opts, variant: \"info\" });\r\n\r\n // Loading shortcut\r\n toast.loading = (msg, opts) =>\r\n ctx.addToast(msg, {\r\n ...opts,\r\n variant: \"loading\" as any,\r\n duration: opts?.duration ?? 0,\r\n dismissible: opts?.dismissible ?? false,\r\n });\r\n\r\n // Custom toast — no default styles\r\n toast.custom = (content, opts) =>\r\n ctx.addToast(content, { ...opts, variant: \"default\", isCustom: true });\r\n\r\n // Dismiss (with optional id — omit to dismiss all)\r\n toast.dismiss = (id?: string) => ctx.dismissToast(id);\r\n\r\n // Remove instantly (with optional id — omit to remove all)\r\n toast.remove = (id?: string) => ctx.removeToast(id);\r\n\r\n // Promise tracking (accepts Promise or () => Promise, optional 3rd arg for toast options)\r\n toast.promise = async <T>(\r\n promiseOrFn: Promise<T> | (() => Promise<T>),\r\n opts: PromiseOptions<T>,\r\n toastOpts?: ToastOptions,\r\n ): Promise<T> => {\r\n const id = ctx.addToast(opts.loading, {\r\n ...toastOpts,\r\n variant: \"loading\" as any,\r\n duration: 0,\r\n dismissible: false,\r\n } as ToastOptions);\r\n\r\n const promise =\r\n typeof promiseOrFn === \"function\" ? promiseOrFn() : promiseOrFn;\r\n\r\n try {\r\n const result = await promise;\r\n const msg =\r\n typeof opts.success === \"function\"\r\n ? opts.success(result)\r\n : opts.success;\r\n ctx.updateToast(id, {\r\n message: msg,\r\n variant: \"success\",\r\n duration: toastOpts?.duration ?? ctx.config.duration,\r\n dismissible: true,\r\n });\r\n return result;\r\n } catch (error) {\r\n const msg =\r\n typeof opts.error === \"function\" ? opts.error(error) : opts.error;\r\n ctx.updateToast(id, {\r\n message: msg,\r\n variant: \"error\",\r\n duration: toastOpts?.duration ?? ctx.config.duration,\r\n dismissible: true,\r\n });\r\n throw error;\r\n }\r\n };\r\n\r\n return toast;\r\n }, [\r\n ctx.addToast,\r\n ctx.updateToast,\r\n ctx.dismissToast,\r\n ctx.removeToast,\r\n ctx.config.duration,\r\n ]);\r\n}\r\n","/**\r\n * toast-23 — Standalone / Imperative API\r\n *\r\n * Used when you need toast notifications outside of React (Angular, Vue,\r\n * Svelte, vanilla JS, etc.). It internally bootstraps a minimal React root.\r\n *\r\n * ```ts\r\n * import { createToast23 } from \"toast-23\";\r\n *\r\n * const toast = createToast23({ position: \"top-right\" });\r\n *\r\n * toast.success(\"Saved!\");\r\n * toast.error(\"Something went wrong\");\r\n * toast.dismiss(id);\r\n *\r\n * // Cleanup when done (e.g. on app destroy)\r\n * toast.destroy();\r\n * ```\r\n */\r\n\r\nimport * as React from \"react\";\r\nimport { createRoot, type Root } from \"react-dom/client\";\r\nimport { Toast23Provider } from \"./provider\";\r\nimport { useToast } from \"./use-toast\";\r\nimport type {\r\n ToastPosition,\r\n ToastOptions,\r\n PromiseOptions,\r\n ToastApi,\r\n} from \"./types\";\r\nimport type { ReactNode } from \"react\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface StandaloneOptions {\r\n /** Where on screen toasts appear. @default \"top-right\" */\r\n position?: ToastPosition;\r\n /** Max simultaneous toasts. @default 5 */\r\n maxVisible?: number;\r\n /** Default auto-dismiss duration in ms. @default 5000 */\r\n duration?: number;\r\n}\r\n\r\nexport interface StandaloneToastApi {\r\n /** Shows a default toast. Returns the toast id. */\r\n (message: string | ReactNode, options?: ToastOptions): string;\r\n /** Shows a success toast. */\r\n success: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n /** Shows an error toast. */\r\n error: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n /** Shows a warning toast. */\r\n warning: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n /** Shows an info toast. */\r\n info: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n /** Shows a loading toast. Returns the toast id for later update. */\r\n loading: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n /** Shows a custom toast with JSX content and no default styles. */\r\n custom: (\r\n content: ReactNode,\r\n options?: Omit<ToastOptions, \"variant\">,\r\n ) => string;\r\n /** Track an async operation with loading → success / error transitions. */\r\n promise: <T>(\r\n promise: Promise<T> | (() => Promise<T>),\r\n options: PromiseOptions<T>,\r\n toastOptions?: ToastOptions,\r\n ) => Promise<T>;\r\n /** Manually dismisses a toast by id. Omits id to dismiss all. */\r\n dismiss: (id?: string) => void;\r\n /** Instantly removes a toast from DOM (no exit animation). Omits id to remove all. */\r\n remove: (id?: string) => void;\r\n /** Unmounts the React root and removes the container from the DOM. */\r\n destroy: () => void;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Bridge component — captures the useToast API and passes it out\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _resolveApi: ((api: ToastApi) => void) | null = null;\r\n\r\nfunction Bridge() {\r\n const api = useToast();\r\n\r\n // Resolves the promise on first render; update the ref on every render\r\n // so the external caller always has the latest stable API reference.\r\n React.useEffect(() => {\r\n if (_resolveApi) {\r\n _resolveApi(api);\r\n _resolveApi = null;\r\n }\r\n }, [api]);\r\n\r\n // Also stores on ref for synchronous access after first mount\r\n\r\n return null;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Factory\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n *\r\n * Internally mounts a tiny React tree (provider + bridge) into a hidden\r\n * container. Returns a callable toast object with `.success()`, `.error()`, etc.\r\n *\r\n * Call `.destroy()` when your application unmounts to clean up.\r\n */\r\nexport function createToast23(\r\n options: StandaloneOptions = {},\r\n): StandaloneToastApi {\r\n const { position = \"top-right\", maxVisible = 5, duration = 5000 } = options;\r\n\r\n // Creates a hidden container\r\n const container = document.createElement(\"div\");\r\n container.setAttribute(\"data-toast23-standalone\", \"\");\r\n container.style.display = \"contents\"; // invisible wrapper\r\n document.body.appendChild(container);\r\n\r\n //Waits for React to render before the API is available.\r\n // Use of promise + queue approach so calls before mount are buffered.\r\n let root: Root | null = createRoot(container);\r\n\r\n const apiReady = new Promise<ToastApi>((resolve) => {\r\n _resolveApi = resolve;\r\n });\r\n\r\n // Queue for calls made before React has mounted\r\n type QueuedCall = { method: string; args: unknown[] };\r\n const queue: QueuedCall[] = [];\r\n let resolvedApi: ToastApi | null = null;\r\n\r\n // Flushes queued calls once the API is ready\r\n apiReady.then((api) => {\r\n resolvedApi = api;\r\n for (const call of queue) {\r\n if (call.method === \"__call__\") {\r\n (api as any)(...call.args);\r\n } else {\r\n (api as any)[call.method](...call.args);\r\n }\r\n }\r\n queue.length = 0;\r\n });\r\n\r\n // Mounts React tree\r\n root.render(\r\n React.createElement(\r\n Toast23Provider,\r\n { position, maxVisible, duration } as any,\r\n React.createElement(Bridge),\r\n ),\r\n );\r\n\r\n // Builds the proxy API\r\n const proxyCall = (method: string, ...args: unknown[]): any => {\r\n if (resolvedApi) {\r\n return (resolvedApi as any)[method](...args);\r\n }\r\n queue.push({ method, args });\r\n return \"queued\";\r\n };\r\n\r\n const toast = ((message: string | ReactNode, opts?: ToastOptions) => {\r\n if (resolvedApi) return resolvedApi(message, opts);\r\n queue.push({ method: \"__call__\", args: [message, opts] });\r\n return \"queued\";\r\n }) as StandaloneToastApi;\r\n\r\n toast.success = (msg, opts) => proxyCall(\"success\", msg, opts);\r\n toast.error = (msg, opts) => proxyCall(\"error\", msg, opts);\r\n toast.warning = (msg, opts) => proxyCall(\"warning\", msg, opts);\r\n toast.info = (msg, opts) => proxyCall(\"info\", msg, opts);\r\n toast.loading = (msg, opts) => proxyCall(\"loading\", msg, opts);\r\n toast.custom = (content, opts) => proxyCall(\"custom\", content, opts);\r\n toast.dismiss = (id?) => proxyCall(\"dismiss\", id);\r\n toast.remove = (id?) => proxyCall(\"remove\", id);\r\n\r\n toast.promise = (promise, opts, toastOpts?) => {\r\n if (resolvedApi) return resolvedApi.promise(promise, opts, toastOpts);\r\n // For promises, it needs to wait for the API\r\n return apiReady.then((api) => api.promise(promise, opts, toastOpts));\r\n };\r\n\r\n toast.destroy = () => {\r\n if (root) {\r\n root.unmount();\r\n root = null;\r\n }\r\n container.remove();\r\n resolvedApi = null;\r\n };\r\n\r\n return toast;\r\n}\r\n"],"names":["ToasterContext","createContext","toasterReducer","state","action","t","CheckCircleIcon","props","jsxs","jsx","XCircleIcon","AlertTriangleIcon","InfoIcon","XIcon","SpinnerIcon","counter","generateId","cx","args","variantIcon","EXIT_DURATION","ToastItem","React","toast","onDismiss","onRemove","hasEntered","setHasEntered","useState","useEffect","raf","delay","timer","isPaused","setIsPaused","remainingRef","useRef","progress","setProgress","progressTransition","setProgressTransition","handleMouseEnter","useCallback","handleMouseLeave","Icon","ToastContainer","position","toasts","maxVisible","ctx","useContext","active","exiting","visible","queuedCount","ALL_POSITIONS","Toast23Provider","children","defaultPosition","defaultDuration","dispatch","useReducer","addToast","message","options","id","updateToast","updates","dismissToast","removeToast","contextValue","useMemo","groupedToasts","groups","pos","useToast","msg","opts","content","promiseOrFn","toastOpts","promise","result","error","_resolveApi","Bridge","api","createToast23","duration","container","root","createRoot","apiReady","resolve","queue","resolvedApi","call","proxyCall","method"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/context.tsx","../src/icons.tsx","../src/utils.ts","../src/toast-item.tsx","../src/toast-container.tsx","../src/inject-styles.ts","../src/sound.ts","../src/notification.ts","../src/headless-store.ts","../src/provider.tsx","../src/devtools.tsx","../src/use-toast.ts","../src/use-toast-headless.ts","../src/standalone.ts"],"sourcesContent":["/**\r\n * toast-23 — React Context & Reducer\r\n */\r\n\r\nimport { createContext } from \"react\";\r\nimport type {\r\n InternalToast,\r\n ToasterAction,\r\n ToasterContextValue,\r\n} from \"./types\";\r\n\r\nexport const ToasterContext = createContext<ToasterContextValue | null>(null);\r\n\r\nexport function toasterReducer(\r\n state: InternalToast[],\r\n action: ToasterAction,\r\n): InternalToast[] {\r\n switch (action.type) {\r\n case \"ADD\":\r\n return [...state, action.toast];\r\n\r\n case \"UPSERT\": {\r\n const exists = state.some((t) => t.id === action.toast.id);\r\n if (exists) {\r\n return state.map((t) =>\r\n t.id === action.toast.id\r\n ? {\r\n ...t,\r\n ...action.toast,\r\n version: t.version + 1,\r\n isExiting: false,\r\n }\r\n : t,\r\n );\r\n }\r\n return [...state, action.toast];\r\n }\r\n\r\n case \"UPDATE\":\r\n return state.map((t) =>\r\n t.id === action.id\r\n ? {\r\n ...t,\r\n ...action.updates,\r\n version: t.version + 1,\r\n isExiting: false,\r\n }\r\n : t,\r\n );\r\n\r\n case \"DISMISS\":\r\n if (!action.id) {\r\n return state.map((t) => (t.isExiting ? t : { ...t, isExiting: true }));\r\n }\r\n return state.map((t) =>\r\n t.id === action.id && !t.isExiting ? { ...t, isExiting: true } : t,\r\n );\r\n\r\n case \"REMOVE\":\r\n if (!action.id) return [];\r\n return state.filter((t) => t.id !== action.id);\r\n\r\n case \"DISMISS_GROUP\":\r\n return state.map((t) =>\r\n t.group === action.group && !t.isExiting\r\n ? { ...t, isExiting: true }\r\n : t,\r\n );\r\n\r\n case \"REMOVE_GROUP\":\r\n return state.filter((t) => t.group !== action.group);\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","/**\r\n * toast-23 — Inline SVG Icons (Filled style)\r\n *\r\n * Solid colored circles/triangles with white inner symbols, designed to be used with the default styles. Each icon inherits `currentColor` so it can be colored via CSS.\r\n */\r\n\r\nimport type { SVGProps, FC } from \"react\";\r\n\r\ntype IconProps = SVGProps<SVGSVGElement>;\r\n\r\n/** Green filled circle with white checkmark */\r\nexport const CheckCircleIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <circle cx={12} cy={12} r={10} fill=\"currentColor\" />\r\n <path\r\n d=\"M8 12.5l2.5 2.5 5-5\"\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n fill=\"none\"\r\n />\r\n </svg>\r\n);\r\n\r\n/** Red filled circle with white exclamation */\r\nexport const XCircleIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <circle cx={12} cy={12} r={10} fill=\"currentColor\" />\r\n <line\r\n x1={12}\r\n y1={8}\r\n x2={12}\r\n y2={13}\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n <circle cx={12} cy={16} r={1} fill=\"#fff\" />\r\n </svg>\r\n);\r\n\r\n/** Yellow filled triangle with white exclamation */\r\nexport const AlertTriangleIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <path\r\n d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\r\n fill=\"currentColor\"\r\n />\r\n <line\r\n x1={12}\r\n y1={9.5}\r\n x2={12}\r\n y2={14}\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n <circle cx={12} cy={17} r={1} fill=\"#fff\" />\r\n </svg>\r\n);\r\n\r\n/** Blue filled circle with white \"i\" */\r\nexport const InfoIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n fill=\"none\"\r\n {...props}\r\n >\r\n <circle cx={12} cy={12} r={10} fill=\"currentColor\" />\r\n <line\r\n x1={12}\r\n y1={11}\r\n x2={12}\r\n y2={16}\r\n stroke=\"#fff\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n <circle cx={12} cy={8} r={1} fill=\"#fff\" />\r\n </svg>\r\n);\r\n\r\n/** Thin X icon for dismiss button */\r\nexport const XIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n width=\"0.875em\"\r\n height=\"0.875em\"\r\n {...props}\r\n >\r\n <line x1={18} y1={6} x2={6} y2={18} />\r\n <line x1={6} y1={6} x2={18} y2={18} />\r\n </svg>\r\n);\r\n\r\n/** CSS-only loading spinner */\r\nexport const SpinnerIcon: FC<IconProps> = (props: IconProps) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n width=\"1.25em\"\r\n height=\"1.25em\"\r\n className=\"toast23-spinner\"\r\n {...props}\r\n >\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n </svg>\r\n);\r\n","/**\r\n * toast-23 — Utility helpers\r\n */\r\n\r\nlet counter = 0;\r\n\r\nexport function generateId(): string {\r\n return `t23-${++counter}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\nexport function cx(...args: (string | false | null | undefined | 0)[]): string {\r\n return args.filter(Boolean).join(\" \");\r\n}\r\n\r\n/**\r\n * Returns the swipe-axis sign for a position: -1 means swipe-left dismisses,\r\n * +1 means swipe-right dismisses. Top/bottom-center positions allow either.\r\n */\r\nexport function getSwipeDirection(position: string): -1 | 0 | 1 {\r\n if (position.endsWith(\"right\")) return 1;\r\n if (position.endsWith(\"left\")) return -1;\r\n return 0; // center positions accept either direction\r\n}\r\n","/**\r\n * toast-23 — Individual Toast Component\r\n *\r\n * Hover behavior (by design): hovering REFILLS the progress bar to 100% and\r\n * pauses the dismiss timer. Unhovering restarts the countdown from 100% over\r\n * the full duration.\r\n *\r\n * Progress bar uses `transform: scaleX()` for GPU-accelerated animation.\r\n * If `toast.progress` is set (0..1), the bar shows that determinate value\r\n * instead of the auto-shrink animation.\r\n */\r\n\r\n\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n type PointerEvent as ReactPointerEvent,\r\n} from \"react\";\r\nimport type { InternalToast, ToastDirection } from \"./types\";\r\nimport {\r\n CheckCircleIcon,\r\n XCircleIcon,\r\n AlertTriangleIcon,\r\n InfoIcon,\r\n SpinnerIcon,\r\n XIcon,\r\n} from \"./icons\";\r\nimport { cx, getSwipeDirection } from \"./utils\";\r\n\r\nconst variantIcon: Record<string, React.FC<React.SVGProps<SVGSVGElement>>> = {\r\n success: CheckCircleIcon,\r\n error: XCircleIcon,\r\n warning: AlertTriangleIcon,\r\n info: InfoIcon,\r\n default: InfoIcon,\r\n loading: SpinnerIcon,\r\n};\r\n\r\nconst REFILL_DURATION = 200;\r\n// Off-screen fling animation when a swipe crosses the dismiss threshold. The\r\n// dismiss is fired only after it completes so the toast doesn't pop early.\r\nconst SWIPE_FLING_DURATION = 180;\r\n\r\ninterface ToastItemProps {\r\n toast: InternalToast;\r\n onDismiss: (id: string) => void;\r\n onRemove: (id: string) => void;\r\n globallyPaused: boolean;\r\n swipeEnabled: boolean;\r\n swipeThreshold: number;\r\n stackIndex: number;\r\n stackMode: boolean;\r\n stackExpanded: boolean;\r\n stackIsBottom: boolean;\r\n dir: ToastDirection;\r\n}\r\n\r\nexport const ToastItem: React.FC<ToastItemProps> = React.memo(\r\n ({\r\n toast,\r\n onDismiss,\r\n onRemove,\r\n globallyPaused,\r\n swipeEnabled,\r\n swipeThreshold,\r\n stackIndex,\r\n stackMode,\r\n stackExpanded,\r\n stackIsBottom,\r\n dir: _dir,\r\n }) => {\r\n const [hasEntered, setHasEntered] = useState(false);\r\n useEffect(() => {\r\n const raf = requestAnimationFrame(() => setHasEntered(true));\r\n return () => cancelAnimationFrame(raf);\r\n }, []);\r\n\r\n // Exit/remove: wait `removeDelay` then unmount.\r\n useEffect(() => {\r\n if (!toast.isExiting) return;\r\n const timer = setTimeout(() => onRemove(toast.id), toast.removeDelay);\r\n return () => clearTimeout(timer);\r\n }, [toast.isExiting, toast.id, toast.removeDelay, onRemove]);\r\n\r\n // ----- Hover (restart-on-hover) -----\r\n const [isHovered, setIsHovered] = useState(false);\r\n const isPaused = isHovered || globallyPaused;\r\n\r\n // ----- Progress bar -----\r\n const [progress, setProgress] = useState(1);\r\n const [progressTransition, setProgressTransition] = useState(\"none\");\r\n\r\n // Reset progress on version change (e.g. promise resolved).\r\n useEffect(() => {\r\n setProgress(1);\r\n setProgressTransition(\"none\");\r\n }, [toast.version, toast.duration]);\r\n\r\n // Determinate progress override (toast.progress 0..1) — short-circuit\r\n // the auto-shrink effect when present.\r\n const hasDeterminateProgress = typeof toast.progress === \"number\";\r\n\r\n useEffect(() => {\r\n if (!hasDeterminateProgress) return;\r\n setProgressTransition(\"transform 120ms linear\");\r\n setProgress(toast.progress ?? 0);\r\n }, [toast.progress, hasDeterminateProgress]);\r\n\r\n // Auto-dismiss timer + bar shrink/refill animation.\r\n useEffect(() => {\r\n if (\r\n hasDeterminateProgress ||\r\n toast.duration <= 0 ||\r\n toast.variant === \"loading\" ||\r\n !hasEntered ||\r\n toast.isExiting\r\n ) {\r\n return;\r\n }\r\n\r\n if (isPaused) {\r\n setProgressTransition(`transform ${REFILL_DURATION}ms ease-out`);\r\n setProgress(1);\r\n return;\r\n }\r\n\r\n setProgressTransition(\"none\");\r\n setProgress(1);\r\n const raf = requestAnimationFrame(() => {\r\n setProgressTransition(`transform ${toast.duration}ms linear`);\r\n setProgress(0);\r\n });\r\n const timer = setTimeout(() => onDismiss(toast.id), toast.duration);\r\n\r\n return () => {\r\n cancelAnimationFrame(raf);\r\n clearTimeout(timer);\r\n };\r\n }, [\r\n isPaused,\r\n hasEntered,\r\n toast.isExiting,\r\n toast.duration,\r\n toast.variant,\r\n toast.id,\r\n toast.version,\r\n hasDeterminateProgress,\r\n onDismiss,\r\n ]);\r\n\r\n // ----- Swipe-to-dismiss -----\r\n const swipeRef = useRef({\r\n startX: 0,\r\n startY: 0,\r\n dx: 0,\r\n isDragging: false,\r\n pointerId: -1,\r\n });\r\n const [swipeDx, setSwipeDx] = useState(0);\r\n const [swipeTransition, setSwipeTransition] = useState(\"\");\r\n\r\n const swipeAxis = getSwipeDirection(toast.position);\r\n\r\n const onPointerDown = useCallback(\r\n (e: ReactPointerEvent<HTMLDivElement>) => {\r\n if (!swipeEnabled) return;\r\n // Only main button (mouse) or touch\r\n if (e.button !== undefined && e.button !== 0) return;\r\n const target = e.target as HTMLElement;\r\n // Don't start swipe when interacting with a button (dismiss/action).\r\n if (target.closest(\"button\")) return;\r\n swipeRef.current.startX = e.clientX;\r\n swipeRef.current.startY = e.clientY;\r\n swipeRef.current.dx = 0;\r\n swipeRef.current.isDragging = true;\r\n swipeRef.current.pointerId = e.pointerId;\r\n setSwipeTransition(\"\");\r\n },\r\n [swipeEnabled],\r\n );\r\n\r\n const onPointerMove = useCallback(\r\n (e: ReactPointerEvent<HTMLDivElement>) => {\r\n if (!swipeRef.current.isDragging) return;\r\n if (e.pointerId !== swipeRef.current.pointerId) return;\r\n const dx = e.clientX - swipeRef.current.startX;\r\n const dy = e.clientY - swipeRef.current.startY;\r\n // Ignore primarily-vertical drags so users can scroll.\r\n if (Math.abs(dy) > Math.abs(dx) && Math.abs(dy) > 10) return;\r\n // Constrain to allowed direction.\r\n const constrained =\r\n swipeAxis === 0\r\n ? dx\r\n : swipeAxis === 1\r\n ? Math.max(0, dx)\r\n : Math.min(0, dx);\r\n swipeRef.current.dx = constrained;\r\n setSwipeDx(constrained);\r\n },\r\n [swipeAxis],\r\n );\r\n\r\n const onPointerEnd = useCallback(\r\n (e: ReactPointerEvent<HTMLDivElement>) => {\r\n if (!swipeRef.current.isDragging) return;\r\n if (e.pointerId !== swipeRef.current.pointerId) return;\r\n swipeRef.current.isDragging = false;\r\n const dx = swipeRef.current.dx;\r\n const dismissed = Math.abs(dx) >= swipeThreshold;\r\n if (dismissed) {\r\n // Fling off-screen\r\n setSwipeTransition(\r\n `transform ${SWIPE_FLING_DURATION}ms ease-out, opacity ${SWIPE_FLING_DURATION}ms ease-out`,\r\n );\r\n setSwipeDx(dx > 0 ? window.innerWidth : -window.innerWidth);\r\n setTimeout(() => onDismiss(toast.id), SWIPE_FLING_DURATION);\r\n } else {\r\n // Snap back\r\n setSwipeTransition(\"transform 180ms ease-out\");\r\n setSwipeDx(0);\r\n }\r\n },\r\n [swipeThreshold, onDismiss, toast.id],\r\n );\r\n\r\n // ----- Stack-mode offsets -----\r\n // Each toast behind the front one is translated + scaled.\r\n const STACK_OFFSET = 10; // px per layer\r\n const STACK_SCALE_STEP = 0.06; // shrink per layer\r\n const STACK_MAX_LAYERS = 3;\r\n const stackDepth = Math.min(stackIndex, STACK_MAX_LAYERS);\r\n\r\n const stackTransform = (() => {\r\n if (!stackMode) return \"\";\r\n if (stackExpanded) return \"\"; // expanded → no offset\r\n const dirY = stackIsBottom ? 1 : -1;\r\n const offsetY = dirY * stackDepth * STACK_OFFSET;\r\n const scale = 1 - stackDepth * STACK_SCALE_STEP;\r\n return `translateY(${offsetY}px) scale(${scale})`;\r\n })();\r\n\r\n const stackOpacity = stackMode && !stackExpanded && stackDepth > 0\r\n ? Math.max(0.4, 1 - stackDepth * 0.25)\r\n : undefined;\r\n\r\n // Combine swipe + stack transforms (swipe wins when active)\r\n const wrapperTransform = swipeDx !== 0\r\n ? `translateX(${swipeDx}px)`\r\n : stackTransform;\r\n\r\n const swipeOpacity = swipeDx !== 0\r\n ? Math.max(0, 1 - Math.abs(swipeDx) / (swipeThreshold * 2))\r\n : undefined;\r\n\r\n const handleMouseEnter = useCallback(() => setIsHovered(true), []);\r\n const handleMouseLeave = useCallback(() => setIsHovered(false), []);\r\n\r\n const Icon = variantIcon[toast.variant] ?? InfoIcon;\r\n\r\n // ----- Action button -----\r\n const dismissSelf = useCallback(\r\n () => onDismiss(toast.id),\r\n [onDismiss, toast.id],\r\n );\r\n\r\n const handleActionClick = useCallback(() => {\r\n if (!toast.action) return;\r\n const shouldDismiss = toast.action.dismissOnClick !== false;\r\n toast.action.onClick(dismissSelf);\r\n if (shouldDismiss) dismissSelf();\r\n }, [toast.action, dismissSelf]);\r\n\r\n const handleCancelClick = useCallback(() => {\r\n if (!toast.cancelAction) return;\r\n const shouldDismiss = toast.cancelAction.dismissOnClick !== false;\r\n toast.cancelAction.onClick(dismissSelf);\r\n if (shouldDismiss) dismissSelf();\r\n }, [toast.cancelAction, dismissSelf]);\r\n\r\n // Custom toast — render raw content, no chrome.\r\n if (toast.isCustom) {\r\n return (\r\n <div\r\n className={cx(\r\n \"toast23-item toast23-item--custom\",\r\n !hasEntered && \"toast23-item--entering\",\r\n toast.isExiting && \"toast23-item--exiting\",\r\n )}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n style={{\r\n transform: wrapperTransform || undefined,\r\n opacity: swipeOpacity ?? stackOpacity,\r\n transition: swipeTransition || undefined,\r\n pointerEvents: stackMode && !stackExpanded && stackDepth > 0\r\n ? \"none\"\r\n : undefined,\r\n }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n onPointerDown={onPointerDown}\r\n onPointerMove={onPointerMove}\r\n onPointerUp={onPointerEnd}\r\n onPointerCancel={onPointerEnd}\r\n >\r\n {toast.message}\r\n </div>\r\n );\r\n }\r\n\r\n // Toasts with both an action and a cancel use the confirm layout (styled\r\n // in CSS): buttons stack below the message, dismiss × in the corner.\r\n const isConfirmLayout = !!(toast.action && toast.cancelAction);\r\n\r\n return (\r\n <div\r\n className={cx(\r\n \"toast23-item\",\r\n `toast23-item--${toast.variant}`,\r\n !hasEntered && \"toast23-item--entering\",\r\n toast.isExiting && \"toast23-item--exiting\",\r\n stackMode && \"toast23-item--stack\",\r\n isConfirmLayout && \"toast23-item--confirm\",\r\n )}\r\n role={toast.variant === \"error\" ? \"alert\" : \"status\"}\r\n aria-live={toast.variant === \"error\" ? \"assertive\" : \"polite\"}\r\n aria-atomic=\"true\"\r\n style={{\r\n transform: wrapperTransform || undefined,\r\n opacity: swipeOpacity ?? stackOpacity,\r\n transition: swipeTransition || undefined,\r\n }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n onPointerDown={onPointerDown}\r\n onPointerMove={onPointerMove}\r\n onPointerUp={onPointerEnd}\r\n onPointerCancel={onPointerEnd}\r\n >\r\n <span className={cx(\"toast23-icon\", `toast23-icon--${toast.variant}`)}>\r\n <Icon />\r\n </span>\r\n\r\n <div className=\"toast23-content\">\r\n {toast.title && <div className=\"toast23-title\">{toast.title}</div>}\r\n <div\r\n className={cx(\r\n \"toast23-message\",\r\n toast.title && \"toast23-message--with-title\",\r\n )}\r\n >\r\n {toast.message}\r\n </div>\r\n </div>\r\n\r\n {(toast.action || toast.cancelAction) && (\r\n <div className=\"toast23-actions\">\r\n {toast.cancelAction && (\r\n <button\r\n type=\"button\"\r\n className={cx(\r\n \"toast23-action toast23-action--cancel\",\r\n toast.cancelAction.className,\r\n )}\r\n onClick={handleCancelClick}\r\n >\r\n {toast.cancelAction.label}\r\n </button>\r\n )}\r\n {toast.action && (\r\n <button\r\n type=\"button\"\r\n className={cx(\"toast23-action\", toast.action.className)}\r\n onClick={handleActionClick}\r\n >\r\n {toast.action.label}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {toast.dismissible && (\r\n <button\r\n type=\"button\"\r\n className=\"toast23-dismiss\"\r\n onClick={() => onDismiss(toast.id)}\r\n aria-label=\"Dismiss notification\"\r\n >\r\n <XIcon />\r\n </button>\r\n )}\r\n\r\n {(toast.duration > 0 || hasDeterminateProgress) &&\r\n toast.variant !== \"loading\" && (\r\n <div\r\n className={cx(\r\n \"toast23-progress\",\r\n `toast23-progress--${toast.variant}`,\r\n )}\r\n style={{\r\n transform: `scaleX(${progress})`,\r\n transition: progressTransition,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nToastItem.displayName = \"ToastItem\";\r\n","/**\n * toast-23 — Positioned Toast Container\n */\n\n\"use client\";\n\nimport * as React from \"react\";\nimport { useContext, useState, useCallback } from \"react\";\nimport type {\n InternalToast,\n ToastDirection,\n ToastLayout,\n ToastPosition,\n ToastTheme,\n} from \"./types\";\nimport { ToasterContext } from \"./context\";\nimport { ToastItem } from \"./toast-item\";\nimport { cx } from \"./utils\";\n\ninterface ToastContainerProps {\n position: ToastPosition;\n toasts: InternalToast[];\n maxVisible: number;\n layout: ToastLayout;\n dir: ToastDirection;\n theme: ToastTheme;\n inline: boolean;\n}\n\nexport const ToastContainer: React.FC<ToastContainerProps> = React.memo(\n ({ position, toasts, maxVisible, layout, dir, theme, inline }) => {\n const ctx = useContext(ToasterContext);\n const [isExpanded, setIsExpanded] = useState(false);\n\n const onContainerEnter = useCallback(() => setIsExpanded(true), []);\n const onContainerLeave = useCallback(() => setIsExpanded(false), []);\n\n if (!ctx) return null;\n\n const active = toasts.filter((t) => !t.isExiting);\n const exiting = toasts.filter((t) => t.isExiting);\n const visible = [...active.slice(0, maxVisible), ...exiting];\n const queuedCount = Math.max(0, active.length - maxVisible);\n\n if (visible.length === 0) return null;\n\n // For stack layout, compute z-index + transform offsets per index.\n // Newest-first index, so first toast is \"on top\" in the stack.\n const stackMode = layout === \"stack\";\n const isBottom = position.startsWith(\"bottom\");\n\n return (\n <div\n className={cx(\n \"toast23-container\",\n `toast23-container--${position}`,\n stackMode && \"toast23-container--stack\",\n stackMode && isExpanded && \"toast23-container--expanded\",\n inline && \"toast23-container--inline\",\n dir === \"rtl\" && \"toast23-container--rtl\",\n theme === \"dark\" && \"toast23-container--dark\",\n theme === \"light\" && \"toast23-container--light\",\n )}\n dir={dir}\n aria-label=\"Notifications\"\n role=\"region\"\n tabIndex={-1}\n data-toast23-region=\"true\"\n onMouseEnter={stackMode ? onContainerEnter : undefined}\n onMouseLeave={stackMode ? onContainerLeave : undefined}\n >\n {visible.map((toast, i) => {\n // Determine stack index: 0 = front. Bottom positions invert visually\n // because the container is flex-column-reverse, but we still want\n // index 0 to be the \"front\" toast in stack mode.\n const stackIndex = stackMode ? i : 0;\n return (\n <ToastItem\n key={toast.id}\n toast={toast}\n stackIndex={stackIndex}\n stackMode={stackMode}\n stackExpanded={isExpanded}\n stackIsBottom={isBottom}\n dir={dir}\n onDismiss={ctx.dismissToast}\n onRemove={ctx.removeToast}\n globallyPaused={ctx.isPausedGlobally}\n swipeEnabled={ctx.config.swipeEnabled}\n swipeThreshold={ctx.config.swipeThreshold}\n />\n );\n })}\n {queuedCount > 0 && (\n <div className=\"toast23-queue-badge\" aria-live=\"polite\">\n +{queuedCount} more\n </div>\n )}\n </div>\n );\n },\n);\n\nToastContainer.displayName = \"ToastContainer\";\n","/**\n * toast-23 — Automatic style injection.\n *\n * The CSS is bundled into the JS as a string (via Vite `?inline`) and inserted\n * into `<head>` the first time the provider or standalone API mounts. Users\n * never need to import `toast-23/styles.css` manually.\n *\n * SSR-safe: skips when `document` is unavailable.\n * Idempotent: a `data-toast23` marker prevents double-injection across\n * multiple providers, hot reloads, and remounts.\n */\n\nimport css from \"./styles.css?inline\";\n\nconst MARKER = \"data-toast23-styles\";\n\nexport function injectStyles(): void {\n if (typeof document === \"undefined\") return;\n if (document.querySelector(`style[${MARKER}]`)) return;\n\n const style = document.createElement(\"style\");\n style.setAttribute(MARKER, \"\");\n style.textContent = css;\n document.head.appendChild(style);\n}\n","/**\n * toast-23 — Sound notifications (opt-in, WebAudio-based).\n *\n * Generates short distinct tones per variant on the fly — no audio assets to\n * ship. Lazy-creates a single AudioContext, respects user gesture rules, and\n * fails silently on unsupported environments.\n */\n\nimport type { InternalVariant } from \"./types\";\n\nlet ctx: AudioContext | null = null;\n\nfunction getCtx(): AudioContext | null {\n if (typeof window === \"undefined\") return null;\n if (ctx) return ctx;\n const Ctor = window.AudioContext ?? (window as any).webkitAudioContext;\n if (!Ctor) return null;\n try {\n ctx = new Ctor();\n return ctx;\n } catch {\n return null;\n }\n}\n\n/**\n * Per-variant note sequences. Frequencies sit in the 500–1200 Hz band\n * where humans hear best; triangle waveforms carry better than pure sine\n * for the louder variants.\n */\ntype Note = {\n freq: number;\n ms: number;\n /** Peak gain (0..1). */\n gain: number;\n /** Oscillator waveform. */\n type: OscillatorType;\n};\n\nconst PATCHES: Record<InternalVariant, Note[]> = {\n // Cheerful two-note rise.\n success: [\n { freq: 660, ms: 90, gain: 0.18, type: \"sine\" },\n { freq: 880, ms: 130, gain: 0.18, type: \"sine\" },\n ],\n // Descending \"uh-oh\" — triangle gives richer harmonics so it cuts through.\n error: [\n { freq: 622, ms: 140, gain: 0.3, type: \"triangle\" },\n { freq: 415, ms: 220, gain: 0.3, type: \"triangle\" },\n ],\n // Quick double pulse — alert feel.\n warning: [\n { freq: 880, ms: 110, gain: 0.24, type: \"triangle\" },\n { freq: 880, ms: 110, gain: 0.24, type: \"triangle\" },\n ],\n // Soft single chime.\n info: [{ freq: 784, ms: 130, gain: 0.18, type: \"sine\" }],\n default: [{ freq: 660, ms: 100, gain: 0.16, type: \"sine\" }],\n loading: [],\n};\n\n/** Schedule one note relative to `startAt` on the shared AudioContext. */\nfunction scheduleNote(audio: AudioContext, note: Note, startAt: number): number {\n const dur = note.ms / 1000;\n const osc = audio.createOscillator();\n const gain = audio.createGain();\n osc.type = note.type;\n osc.frequency.value = note.freq;\n\n // Short attack ramp avoids the click of an instant-on oscillator.\n const attack = 0.008;\n gain.gain.setValueAtTime(0.0001, startAt);\n gain.gain.exponentialRampToValueAtTime(note.gain, startAt + attack);\n gain.gain.exponentialRampToValueAtTime(0.0001, startAt + dur);\n\n osc.connect(gain).connect(audio.destination);\n osc.start(startAt);\n osc.stop(startAt + dur);\n return startAt + dur;\n}\n\nfunction schedulePatch(audio: AudioContext, notes: Note[]): void {\n try {\n // 30ms lead-in covers the gap between resume() resolving and the audio\n // thread actually being ready. Without it, Chromium drops the first note.\n let cursor = audio.currentTime + 0.03;\n const gap = 0.02;\n for (const note of notes) {\n cursor = scheduleNote(audio, note, cursor) + gap;\n }\n } catch {\n /* audio is best-effort */\n }\n}\n\nexport function playToastSound(variant: InternalVariant): void {\n const audio = getCtx();\n if (!audio) return;\n const notes = PATCHES[variant];\n if (!notes || notes.length === 0) return;\n\n // Browsers suspend AudioContext until a user gesture. resume() is async,\n // so wait for it to settle — scheduling against a suspended context yields\n // silence on the first call.\n if (audio.state === \"suspended\") {\n audio.resume().then(\n () => schedulePatch(audio, notes),\n () => {},\n );\n return;\n }\n schedulePatch(audio, notes);\n}\n","/**\n * toast-23 — Browser Notification API fallback.\n *\n * When document is hidden, optionally surface a real OS notification so the\n * user sees the message even when they've switched tabs.\n */\n\nimport type { InternalVariant } from \"./types\";\n\nexport function shouldFallback(): boolean {\n if (typeof document === \"undefined\") return false;\n if (typeof Notification === \"undefined\") return false;\n return document.hidden;\n}\n\nlet permissionRequested = false;\n\nexport function maybeFallbackToNotification(\n message: string,\n variant: InternalVariant,\n title?: string,\n): void {\n if (!shouldFallback()) return;\n\n const fire = () => {\n try {\n new Notification(title ?? `[${variant}]`, {\n body: message,\n tag: \"toast-23\",\n });\n } catch {\n /* swallow */\n }\n };\n\n if (Notification.permission === \"granted\") {\n fire();\n return;\n }\n\n if (Notification.permission === \"default\" && !permissionRequested) {\n permissionRequested = true;\n Notification.requestPermission()\n .then((p) => {\n if (p === \"granted\") fire();\n })\n .catch(() => {\n /* swallow */\n });\n }\n}\n","/**\n * toast-23 — External store for headless consumers (and DevTools).\n *\n * Each provider owns its own store instance (created via `createHeadlessStore`\n * and handed out through context), so multiple `<Toast23Provider>`s — or\n * multiple `createToast23()` standalone instances — stay fully isolated. The\n * provider pushes its current toast array here on every render; subscribers\n * (`useToast23Headless`, `Toast23DevTools`) read it via `useSyncExternalStore`.\n *\n * Keeping this separate from the React context means the regular `useToast()`\n * hook's returned API stays referentially stable across toast changes — only\n * components that opt-in via the headless hook re-render on every dispatch.\n */\n\nimport type { HeadlessStore, InternalToast } from \"./types\";\n\nexport function createHeadlessStore(): HeadlessStore {\n let snapshot: ReadonlyArray<InternalToast> = [];\n const listeners = new Set<() => void>();\n\n return {\n publish(next) {\n if (snapshot === next) return;\n snapshot = next;\n listeners.forEach((l) => l());\n },\n getSnapshot() {\n return snapshot;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","/**\r\n * toast-23 — Toast23Provider\r\n */\r\n\r\n\"use client\";\r\n\r\nimport {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useReducer,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport type {\r\n InternalToast,\r\n Toast23ProviderProps,\r\n ToasterContextValue,\r\n ToastHistoryEntry,\r\n ToastOptions,\r\n ToastPosition,\r\n InternalVariant,\r\n} from \"./types\";\r\nimport type { ReactNode } from \"react\";\r\nimport { ToasterContext, toasterReducer } from \"./context\";\r\nimport { ToastContainer } from \"./toast-container\";\r\nimport { generateId } from \"./utils\";\r\nimport { injectStyles } from \"./inject-styles\";\r\nimport { playToastSound } from \"./sound\";\r\nimport { maybeFallbackToNotification } from \"./notification\";\r\nimport { createHeadlessStore } from \"./headless-store\";\r\nimport type { HeadlessStore } from \"./types\";\r\n\r\ninjectStyles();\r\n\r\nconst ALL_POSITIONS: ToastPosition[] = [\r\n \"top-right\",\r\n \"top-left\",\r\n \"top-center\",\r\n \"bottom-right\",\r\n \"bottom-left\",\r\n \"bottom-center\",\r\n];\r\n\r\nexport const Toast23Provider: React.FC<Toast23ProviderProps> = ({\r\n children,\r\n maxVisible = 5,\r\n position: defaultPosition = \"top-right\",\r\n duration: defaultDuration = 5000,\r\n layout = \"default\",\r\n dir = \"ltr\",\r\n theme = \"auto\",\r\n target = null,\r\n historySize = 50,\r\n focusShortcut = \"F8\",\r\n swipeThreshold = 80,\r\n swipeEnabled = true,\r\n sound: defaultSound = false,\r\n fallbackToNotification: defaultFallback = false,\r\n}) => {\r\n const [toasts, dispatch] = useReducer(toasterReducer, []);\r\n const [isPausedGlobally, setIsPausedGlobally] = useState(false);\r\n\r\n // Latest toasts mirrored into a ref so the dismiss/remove callbacks can read\r\n // current state without listing `toasts` in their dependency arrays. That\r\n // keeps their identity stable — otherwise every queue change would hand each\r\n // ToastItem a new `onDismiss`/`onRemove`, restarting its auto-dismiss timer\r\n // and snapping the progress bar back to full.\r\n const toastsRef = useRef(toasts);\r\n toastsRef.current = toasts;\r\n\r\n // Per-provider headless store — created once. Isolating it here (rather than\r\n // a module global) keeps multiple providers / standalone instances separate.\r\n const headlessStoreRef = useRef<HeadlessStore>();\r\n if (!headlessStoreRef.current) {\r\n headlessStoreRef.current = createHeadlessStore();\r\n }\r\n const headlessStore = headlessStoreRef.current;\r\n\r\n // History ring buffer — stored in a ref so it doesn't trigger re-renders.\r\n const historyRef = useRef<ToastHistoryEntry[]>([]);\r\n\r\n // Deduplicate history entries — a toast can hit the dismiss path more than\r\n // once (manual dismiss → exit animation → timer cleanup), and we want it\r\n // logged exactly once. Ids are pruned when a toast is removed so the set\r\n // tracks only live toasts rather than growing for the lifetime of the app.\r\n const dismissedIdsRef = useRef<Set<string>>(new Set());\r\n\r\n const recordHistory = useCallback(\r\n (t: InternalToast) => {\r\n if (dismissedIdsRef.current.has(t.id)) return;\r\n dismissedIdsRef.current.add(t.id);\r\n const entry: ToastHistoryEntry = {\r\n id: t.id,\r\n message: t.message,\r\n title: t.title,\r\n variant: t.variant === \"loading\" ? \"info\" : t.variant,\r\n dismissedAt: Date.now(),\r\n group: t.group,\r\n };\r\n historyRef.current = [entry, ...historyRef.current].slice(0, historySize);\r\n // Fire user-supplied onDismiss callback exactly once per toast.\r\n if (t.onDismiss) {\r\n try {\r\n t.onDismiss();\r\n } catch {\r\n /* swallow user errors */\r\n }\r\n }\r\n },\r\n [historySize],\r\n );\r\n\r\n const addToast = useCallback(\r\n (\r\n message: string | ReactNode,\r\n options?: Omit<ToastOptions, \"variant\"> & {\r\n variant?: InternalVariant;\r\n isCustom?: boolean;\r\n },\r\n ): string => {\r\n const id = options?.id ?? generateId();\r\n const variant: InternalVariant = options?.variant ?? \"default\";\r\n const toast: InternalToast = {\r\n id,\r\n message,\r\n title: options?.title,\r\n variant,\r\n duration: options?.duration ?? defaultDuration,\r\n position: options?.position ?? defaultPosition,\r\n dismissible: options?.dismissible ?? true,\r\n removeDelay: options?.removeDelay ?? 300,\r\n isExiting: false,\r\n createdAt: Date.now(),\r\n version: 0,\r\n isCustom: options?.isCustom,\r\n action: options?.action,\r\n cancelAction: options?.cancelAction,\r\n onDismiss: options?.onDismiss,\r\n group: options?.group,\r\n sound: options?.sound ?? defaultSound,\r\n fallbackToNotification:\r\n options?.fallbackToNotification ?? defaultFallback,\r\n };\r\n\r\n if (options?.id) dispatch({ type: \"UPSERT\", toast });\r\n else dispatch({ type: \"ADD\", toast });\r\n\r\n // Side effects: sound + browser notification fallback\r\n if (toast.sound) playToastSound(variant);\r\n if (toast.fallbackToNotification && typeof message === \"string\") {\r\n maybeFallbackToNotification(message, variant, toast.title);\r\n }\r\n\r\n return id;\r\n },\r\n [defaultDuration, defaultPosition, defaultSound, defaultFallback],\r\n );\r\n\r\n const updateToast = useCallback(\r\n (id: string, updates: Partial<InternalToast>) => {\r\n dispatch({ type: \"UPDATE\", id, updates });\r\n },\r\n [],\r\n );\r\n\r\n const dismissToast = useCallback(\r\n (id?: string) => {\r\n // Record history before dispatching\r\n if (id) {\r\n const t = toastsRef.current.find((x) => x.id === id);\r\n if (t) recordHistory(t);\r\n } else {\r\n toastsRef.current.forEach(recordHistory);\r\n }\r\n dispatch({ type: \"DISMISS\", id });\r\n },\r\n [recordHistory],\r\n );\r\n\r\n const removeToast = useCallback(\r\n (id?: string) => {\r\n if (id) {\r\n const t = toastsRef.current.find((x) => x.id === id);\r\n if (t) recordHistory(t);\r\n dispatch({ type: \"REMOVE\", id });\r\n // Toast is gone — drop its dedup entry so a reused id can log again.\r\n dismissedIdsRef.current.delete(id);\r\n } else {\r\n toastsRef.current.forEach(recordHistory);\r\n dispatch({ type: \"REMOVE\", id });\r\n dismissedIdsRef.current.clear();\r\n }\r\n },\r\n [recordHistory],\r\n );\r\n\r\n const dismissGroup = useCallback(\r\n (group: string) => {\r\n toastsRef.current\r\n .filter((t) => t.group === group)\r\n .forEach(recordHistory);\r\n dispatch({ type: \"DISMISS_GROUP\", group });\r\n },\r\n [recordHistory],\r\n );\r\n\r\n const removeGroup = useCallback(\r\n (group: string) => {\r\n const inGroup = toastsRef.current.filter((t) => t.group === group);\r\n inGroup.forEach(recordHistory);\r\n dispatch({ type: \"REMOVE_GROUP\", group });\r\n for (const t of inGroup) dismissedIdsRef.current.delete(t.id);\r\n },\r\n [recordHistory],\r\n );\r\n\r\n const pauseAll = useCallback(() => setIsPausedGlobally(true), []);\r\n const resumeAll = useCallback(() => setIsPausedGlobally(false), []);\r\n const history = useCallback(() => historyRef.current, []);\r\n\r\n const contextValue: ToasterContextValue = useMemo(\r\n () => ({\r\n addToast,\r\n updateToast,\r\n dismissToast,\r\n removeToast,\r\n dismissGroup,\r\n removeGroup,\r\n pauseAll,\r\n resumeAll,\r\n history,\r\n headlessStore,\r\n config: {\r\n maxVisible,\r\n position: defaultPosition,\r\n duration: defaultDuration,\r\n layout,\r\n dir,\r\n theme,\r\n swipeThreshold,\r\n swipeEnabled,\r\n sound: defaultSound,\r\n fallbackToNotification: defaultFallback,\r\n },\r\n isPausedGlobally,\r\n }),\r\n [\r\n addToast,\r\n updateToast,\r\n dismissToast,\r\n removeToast,\r\n dismissGroup,\r\n removeGroup,\r\n pauseAll,\r\n resumeAll,\r\n history,\r\n headlessStore,\r\n maxVisible,\r\n defaultPosition,\r\n defaultDuration,\r\n layout,\r\n dir,\r\n theme,\r\n swipeThreshold,\r\n swipeEnabled,\r\n defaultSound,\r\n defaultFallback,\r\n isPausedGlobally,\r\n ],\r\n );\r\n\r\n // Publishes current state to this provider's headless store on every render.\r\n useEffect(() => {\r\n headlessStore.publish(toasts);\r\n }, [toasts, headlessStore]);\r\n\r\n // Keyboard shortcut to focus first toast container.\r\n useEffect(() => {\r\n if (!focusShortcut || typeof window === \"undefined\") return;\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key !== focusShortcut) return;\r\n const region = document.querySelector<HTMLElement>(\r\n '[data-toast23-region=\"true\"]',\r\n );\r\n if (region) {\r\n e.preventDefault();\r\n region.focus();\r\n }\r\n };\r\n window.addEventListener(\"keydown\", onKey);\r\n return () => window.removeEventListener(\"keydown\", onKey);\r\n }, [focusShortcut]);\r\n\r\n // Group toasts by position.\r\n const groupedToasts = useMemo(() => {\r\n const groups: Record<ToastPosition, InternalToast[]> = {\r\n \"top-right\": [],\r\n \"top-left\": [],\r\n \"top-center\": [],\r\n \"bottom-right\": [],\r\n \"bottom-left\": [],\r\n \"bottom-center\": [],\r\n };\r\n for (const t of toasts) {\r\n const bucket = groups[t.position] ?? groups[defaultPosition];\r\n bucket.push(t);\r\n }\r\n return groups;\r\n }, [toasts, defaultPosition]);\r\n\r\n const containers = (\r\n <>\r\n {ALL_POSITIONS.map((pos) =>\r\n groupedToasts[pos].length > 0 ? (\r\n <ToastContainer\r\n key={pos}\r\n position={pos}\r\n toasts={groupedToasts[pos]}\r\n maxVisible={maxVisible}\r\n layout={layout}\r\n dir={dir}\r\n theme={theme}\r\n inline={target !== null && target !== undefined}\r\n />\r\n ) : null,\r\n )}\r\n </>\r\n );\r\n\r\n // Portal target: explicit `target` (inline mode) wins, otherwise document.body.\r\n const portalTarget =\r\n target ??\r\n (typeof document !== \"undefined\" ? document.body : null);\r\n\r\n return (\r\n <ToasterContext.Provider value={contextValue}>\r\n {children}\r\n {portalTarget ? createPortal(containers, portalTarget) : containers}\r\n </ToasterContext.Provider>\r\n );\r\n};\r\n\r\nToast23Provider.displayName = \"Toast23Provider\";\r\n","/**\n * toast-23 — DevTools overlay\n *\n * An optional inspector panel for the toast queue. Drop `<Toast23DevTools />`\n * inside the provider (or at the app root). Three states:\n * - chip: a small floating pill, just a count\n * - compact: ~360x480 panel with tabs (default expanded state)\n * - expanded: enlarged panel for serious inspection\n *\n * Tabs:\n * - Queue: live active toasts, dismiss/remove/copy\n * - History: dismissed toasts, replay/copy\n * - Settings: provider config readout, position/duration test overrides,\n * spawn-test buttons, and a sound preview row\n */\n\n\"use client\";\n\nimport * as React from \"react\";\nimport {\n useCallback,\n useContext,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { ToasterContext } from \"./context\";\nimport { createHeadlessStore } from \"./headless-store\";\nimport { playToastSound } from \"./sound\";\nimport type {\n InternalVariant,\n ToastHistoryEntry,\n ToastPosition,\n} from \"./types\";\n\ntype DevToolsTab = \"queue\" | \"history\" | \"settings\";\ntype DevToolsSize = \"compact\" | \"expanded\";\n\nexport interface Toast23DevToolsProps {\n /** Screen corner to dock the panel. @default \"bottom-left\" */\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Start in the small chip state. @default true */\n collapsed?: boolean;\n}\n\nconst ALL_VARIANTS: InternalVariant[] = [\n \"default\",\n \"success\",\n \"info\",\n \"warning\",\n \"error\",\n \"loading\",\n];\n\nconst ALL_POSITIONS: ToastPosition[] = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n];\n\nconst VARIANT_COLORS: Record<InternalVariant, string> = {\n success: \"#16a34a\",\n error: \"#dc2626\",\n warning: \"#ca8a04\",\n info: \"#2563eb\",\n loading: \"#7c3aed\",\n default: \"#6b7280\",\n};\n\nconst SIZE = {\n compact: { width: 360, height: 480 },\n expanded: { width: 620, height: 720 },\n} as const;\n\n// Empty store used only when DevTools is rendered outside a provider — keeps\n// the `useSyncExternalStore` hook order stable before the `!ctx` early return.\nconst EMPTY_STORE = createHeadlessStore();\n\nexport const Toast23DevTools: React.FC<Toast23DevToolsProps> = ({\n position = \"bottom-left\",\n collapsed: collapsedInitial = true,\n}) => {\n const ctx = useContext(ToasterContext);\n const [collapsed, setCollapsed] = useState(collapsedInitial);\n const [size, setSize] = useState<DevToolsSize>(\"compact\");\n const [tab, setTab] = useState<DevToolsTab>(\"queue\");\n const [hidden, setHidden] = useState<Set<InternalVariant>>(new Set());\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\n\n // Settings tab — overrides applied to \"spawn test\" toasts only.\n const [testPosition, setTestPosition] = useState<ToastPosition | \"\">(\"\");\n const [testDuration, setTestDuration] = useState<number>(4000);\n\n const store = ctx?.headlessStore ?? EMPTY_STORE;\n const toasts = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n\n const history = useMemo(\n () => (ctx ? ctx.history() : []),\n // `toasts` is in the deps so this memo invalidates whenever the queue\n // mutates — which is also when `ctx.history()` gains/loses entries.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [ctx, toasts],\n );\n\n const toggleVariant = useCallback((v: InternalVariant) => {\n setHidden((prev) => {\n const next = new Set(prev);\n if (next.has(v)) next.delete(v);\n else next.add(v);\n return next;\n });\n }, []);\n\n const flashCopied = useCallback((key: string) => {\n setCopiedKey(key);\n window.setTimeout(() => {\n setCopiedKey((curr) => (curr === key ? null : curr));\n }, 1200);\n }, []);\n\n const copyJson = useCallback(\n (payload: Record<string, unknown>, key: string) => {\n const json = JSON.stringify(payload, null, 2);\n try {\n if (navigator?.clipboard?.writeText) {\n navigator.clipboard.writeText(json).then(\n () => flashCopied(key),\n () => flashCopied(key),\n );\n } else {\n flashCopied(key);\n }\n } catch {\n flashCopied(key);\n }\n },\n [flashCopied],\n );\n\n if (!ctx) return null;\n\n const visibleQueue = toasts.filter((t) => !hidden.has(t.variant));\n const visibleHistory = history.filter((h) => !hidden.has(h.variant));\n\n const queueCount = toasts.length;\n\n // ---- Replay & test-spawn handlers -----------------------------------------\n\n const replay = (h: ToastHistoryEntry) => {\n ctx.addToast(h.message, {\n variant: h.variant,\n title: h.title,\n group: h.group,\n });\n };\n\n const spawnTest = (variant: InternalVariant) => {\n ctx.addToast(`Test ${variant} toast`, {\n variant,\n title: variant === \"default\" ? undefined : variant.toUpperCase(),\n duration: testDuration,\n position: testPosition || undefined,\n });\n };\n\n // ---- Styles ---------------------------------------------------------------\n\n const dims = SIZE[size];\n const isTop = position.startsWith(\"top\");\n const isRight = position.endsWith(\"right\");\n\n const styles: Record<string, React.CSSProperties> = {\n chip: {\n position: \"fixed\",\n [isTop ? \"top\" : \"bottom\"]: 16,\n [isRight ? \"right\" : \"left\"]: 16,\n zIndex: 100000,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n background: \"rgba(17, 24, 39, 0.96)\",\n color: \"#f9fafb\",\n borderRadius: 999,\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: 11,\n lineHeight: 1,\n boxShadow: \"0 6px 20px rgba(0,0,0,0.25)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n cursor: \"pointer\",\n userSelect: \"none\",\n },\n panel: {\n position: \"fixed\",\n [isTop ? \"top\" : \"bottom\"]: 16,\n [isRight ? \"right\" : \"left\"]: 16,\n zIndex: 100000,\n width: `min(${dims.width}px, calc(100vw - 32px))`,\n height: `min(${dims.height}px, calc(100vh - 32px))`,\n background: \"rgba(17, 24, 39, 0.97)\",\n color: \"#f9fafb\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: 11,\n lineHeight: 1.5,\n borderRadius: 10,\n boxShadow: \"0 10px 30px rgba(0,0,0,0.35)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"8px 10px\",\n borderBottom: \"1px solid rgba(255,255,255,0.08)\",\n },\n title: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontWeight: 700,\n letterSpacing: 0.3,\n },\n badge: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n padding: \"0 5px\",\n borderRadius: 999,\n background: \"#3b82f6\",\n color: \"#fff\",\n fontSize: 10,\n fontWeight: 700,\n },\n iconBtn: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 22,\n height: 22,\n padding: 0,\n borderRadius: 4,\n background: \"transparent\",\n color: \"#cbd5e1\",\n border: \"1px solid rgba(255,255,255,0.12)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontFamily: \"inherit\",\n },\n tabs: {\n display: \"flex\",\n gap: 4,\n padding: \"8px 10px 0\",\n },\n tab: {\n flex: 1,\n padding: \"5px 8px\",\n borderRadius: 6,\n background: \"transparent\",\n color: \"#9ca3af\",\n border: \"1px solid transparent\",\n cursor: \"pointer\",\n fontSize: 10,\n fontFamily: \"inherit\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n },\n tabActive: {\n background: \"rgba(59, 130, 246, 0.15)\",\n color: \"#bfdbfe\",\n borderColor: \"rgba(59, 130, 246, 0.4)\",\n },\n chipRow: {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 4,\n padding: \"8px 10px\",\n borderBottom: \"1px solid rgba(255,255,255,0.05)\",\n },\n filterChip: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"2px 7px\",\n borderRadius: 999,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(255,255,255,0.04)\",\n color: \"#e5e7eb\",\n fontSize: 9,\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: 0.4,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n },\n filterChipOff: {\n opacity: 0.35,\n textDecoration: \"line-through\",\n },\n body: {\n flex: 1,\n overflow: \"auto\",\n },\n empty: {\n padding: \"20px 12px\",\n color: \"#6b7280\",\n textAlign: \"center\",\n },\n row: {\n padding: \"8px 12px\",\n borderBottom: \"1px solid rgba(255,255,255,0.04)\",\n },\n rowTop: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 4,\n },\n variantTag: {\n fontSize: 9,\n padding: \"1px 6px\",\n borderRadius: 3,\n color: \"#fff\",\n textTransform: \"uppercase\",\n letterSpacing: 0.3,\n fontWeight: 700,\n },\n rowMeta: {\n color: \"#9ca3af\",\n fontSize: 10,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n rowMessage: {\n color: \"#e5e7eb\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n },\n rowActions: {\n display: \"flex\",\n gap: 4,\n marginTop: 6,\n },\n smallBtn: {\n flex: 1,\n padding: \"3px 7px\",\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n color: \"#f9fafb\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n cursor: \"pointer\",\n fontSize: 10,\n fontFamily: \"inherit\",\n },\n smallBtnActive: {\n background: \"rgba(34, 197, 94, 0.18)\",\n borderColor: \"rgba(34, 197, 94, 0.5)\",\n color: \"#bbf7d0\",\n },\n footer: {\n display: \"flex\",\n gap: 4,\n padding: \"8px 10px\",\n borderTop: \"1px solid rgba(255,255,255,0.08)\",\n background: \"rgba(0,0,0,0.2)\",\n },\n section: {\n padding: \"10px 12px\",\n borderBottom: \"1px solid rgba(255,255,255,0.04)\",\n },\n sectionTitle: {\n fontSize: 9,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: 0.6,\n color: \"#9ca3af\",\n marginBottom: 8,\n },\n grid3: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: 4,\n },\n grid6: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(6, 1fr)\",\n gap: 4,\n },\n kvRow: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"3px 0\",\n color: \"#cbd5e1\",\n fontSize: 10,\n },\n kvKey: { color: \"#9ca3af\" },\n inputRow: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n },\n input: {\n flex: 1,\n padding: \"3px 6px\",\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n color: \"#f9fafb\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n fontSize: 10,\n fontFamily: \"inherit\",\n },\n };\n\n const variantStyle = (v: InternalVariant): React.CSSProperties => ({\n ...styles.variantTag,\n background: VARIANT_COLORS[v],\n });\n\n const Chip = (\n <button\n type=\"button\"\n style={styles.chip}\n onClick={() => setCollapsed(false)}\n data-toast23-devtools=\"chip\"\n aria-label={`Open toast-23 devtools (${queueCount} active)`}\n >\n <span style={{ fontWeight: 700, letterSpacing: 0.3 }}>\n toast-23 devtools\n </span>\n <span style={styles.badge}>{queueCount}</span>\n {ctx.isPausedGlobally && (\n <span style={{ ...styles.badge, background: \"#dc2626\" }}>paused</span>\n )}\n </button>\n );\n\n if (collapsed) return Chip;\n\n // ---- Tab bodies -----------------------------------------------------------\n\n const filterChips = (\n <div style={styles.chipRow}>\n {ALL_VARIANTS.map((v) => {\n const off = hidden.has(v);\n return (\n <button\n key={v}\n type=\"button\"\n onClick={() => toggleVariant(v)}\n style={{\n ...styles.filterChip,\n ...(off ? styles.filterChipOff : null),\n borderColor: off\n ? \"rgba(255,255,255,0.12)\"\n : VARIANT_COLORS[v] + \"80\",\n }}\n aria-pressed={!off}\n title={off ? `Show ${v}` : `Hide ${v}`}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: 999,\n background: VARIANT_COLORS[v],\n display: \"inline-block\",\n }}\n />\n {v}\n </button>\n );\n })}\n </div>\n );\n\n const QueueTab = (\n <>\n {filterChips}\n <div style={styles.body}>\n {visibleQueue.length === 0 && (\n <div style={styles.empty}>\n {toasts.length === 0\n ? \"Queue is empty.\"\n : \"All variants filtered out.\"}\n </div>\n )}\n {visibleQueue.map((t) => {\n const copyKey = `q-${t.id}`;\n return (\n <div key={t.id} style={styles.row}>\n <div style={styles.rowTop}>\n <span style={variantStyle(t.variant)}>{t.variant}</span>\n <span style={styles.rowMeta} title={t.id}>\n {t.id}\n </span>\n </div>\n <div style={styles.rowMessage}>\n {typeof t.message === \"string\"\n ? t.message\n : \"[ReactNode message]\"}\n </div>\n <div style={{ ...styles.rowMeta, marginTop: 2 }}>\n {t.duration}ms · {t.position}\n {t.group && ` · group: ${t.group}`}\n {t.isExiting && \" · exiting\"}\n </div>\n <div style={styles.rowActions}>\n <button\n type=\"button\"\n style={styles.smallBtn}\n onClick={() => ctx.dismissToast(t.id)}\n >\n Dismiss\n </button>\n <button\n type=\"button\"\n style={styles.smallBtn}\n onClick={() => ctx.removeToast(t.id)}\n >\n Remove\n </button>\n <button\n type=\"button\"\n style={\n copiedKey === copyKey\n ? { ...styles.smallBtn, ...styles.smallBtnActive }\n : styles.smallBtn\n }\n onClick={() =>\n copyJson(\n {\n id: t.id,\n variant: t.variant,\n message:\n typeof t.message === \"string\"\n ? t.message\n : \"[ReactNode]\",\n title: t.title,\n duration: t.duration,\n position: t.position,\n group: t.group,\n createdAt: t.createdAt,\n },\n copyKey,\n )\n }\n >\n {copiedKey === copyKey ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n <div style={styles.footer}>\n <button\n type=\"button\"\n style={styles.smallBtn}\n onClick={() =>\n ctx.isPausedGlobally ? ctx.resumeAll() : ctx.pauseAll()\n }\n >\n {ctx.isPausedGlobally ? \"Resume all\" : \"Pause all\"}\n </button>\n <button\n type=\"button\"\n style={styles.smallBtn}\n onClick={() => ctx.dismissToast()}\n >\n Dismiss all\n </button>\n <button\n type=\"button\"\n style={styles.smallBtn}\n onClick={() => ctx.removeToast()}\n >\n Clear\n </button>\n </div>\n </>\n );\n\n const HistoryTab = (\n <>\n {filterChips}\n <div style={styles.body}>\n {visibleHistory.length === 0 && (\n <div style={styles.empty}>\n {history.length === 0\n ? \"No dismissed toasts yet. Fire a toast and dismiss it.\"\n : \"All variants filtered out.\"}\n </div>\n )}\n {visibleHistory.map((h) => {\n const copyKey = `h-${h.id}`;\n const ago = formatAgo(Date.now() - h.dismissedAt);\n return (\n <div key={h.id} style={styles.row}>\n <div style={styles.rowTop}>\n <span style={variantStyle(h.variant)}>{h.variant}</span>\n <span style={styles.rowMeta} title={new Date(h.dismissedAt).toISOString()}>\n {ago}\n </span>\n </div>\n {h.title && (\n <div\n style={{ fontWeight: 700, color: \"#f9fafb\", marginBottom: 2 }}\n >\n {h.title}\n </div>\n )}\n <div style={styles.rowMessage}>\n {typeof h.message === \"string\"\n ? h.message\n : \"[ReactNode message]\"}\n </div>\n {h.group && (\n <div style={{ ...styles.rowMeta, marginTop: 2 }}>\n group: {h.group}\n </div>\n )}\n <div style={styles.rowActions}>\n <button\n type=\"button\"\n style={styles.smallBtn}\n onClick={() => replay(h)}\n title=\"Re-fire this toast\"\n >\n Replay\n </button>\n <button\n type=\"button\"\n style={\n copiedKey === copyKey\n ? { ...styles.smallBtn, ...styles.smallBtnActive }\n : styles.smallBtn\n }\n onClick={() =>\n copyJson(\n {\n id: h.id,\n variant: h.variant,\n message:\n typeof h.message === \"string\"\n ? h.message\n : \"[ReactNode]\",\n title: h.title,\n group: h.group,\n dismissedAt: h.dismissedAt,\n },\n copyKey,\n )\n }\n >\n {copiedKey === copyKey ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n <div style={styles.footer}>\n <span style={{ ...styles.rowMeta, alignSelf: \"center\", flex: 1 }}>\n {history.length} entries · cap {history.length >= 50 ? \"reached\" : \"ok\"}\n </span>\n </div>\n </>\n );\n\n const SettingsTab = (\n <div style={styles.body}>\n <div style={styles.section}>\n <div style={styles.sectionTitle}>Spawn test toast</div>\n <div style={styles.grid6}>\n {ALL_VARIANTS.map((v) => (\n <button\n key={v}\n type=\"button\"\n style={{\n ...styles.smallBtn,\n background: VARIANT_COLORS[v] + \"33\",\n borderColor: VARIANT_COLORS[v] + \"80\",\n color: \"#fff\",\n }}\n onClick={() => spawnTest(v)}\n title={`Fire a ${v} toast`}\n >\n {v}\n </button>\n ))}\n </div>\n </div>\n\n <div style={styles.section}>\n <div style={styles.sectionTitle}>Sound preview</div>\n <div style={styles.grid6}>\n {ALL_VARIANTS.map((v) => (\n <button\n key={v}\n type=\"button\"\n style={styles.smallBtn}\n onClick={() => playToastSound(v)}\n title={`Play ${v} tone`}\n >\n ♪ {v.slice(0, 4)}\n </button>\n ))}\n </div>\n <div style={{ ...styles.rowMeta, marginTop: 6 }}>\n Plays the tone patch directly. Requires a prior user gesture (browser\n autoplay policy).\n </div>\n </div>\n\n <div style={styles.section}>\n <div style={styles.sectionTitle}>Test overrides</div>\n <div style={styles.inputRow}>\n <span style={styles.kvKey}>duration</span>\n <input\n type=\"number\"\n min={0}\n step={500}\n value={testDuration}\n onChange={(e) => setTestDuration(Number(e.target.value) || 0)}\n style={styles.input}\n />\n <span style={styles.kvKey}>ms</span>\n </div>\n <div style={{ ...styles.kvKey, marginBottom: 4, fontSize: 10 }}>\n position\n </div>\n <div style={styles.grid3}>\n <button\n type=\"button\"\n style={\n testPosition === \"\"\n ? { ...styles.smallBtn, ...styles.smallBtnActive }\n : styles.smallBtn\n }\n onClick={() => setTestPosition(\"\")}\n >\n inherit\n </button>\n {ALL_POSITIONS.map((p) => (\n <button\n key={p}\n type=\"button\"\n style={\n testPosition === p\n ? { ...styles.smallBtn, ...styles.smallBtnActive }\n : styles.smallBtn\n }\n onClick={() => setTestPosition(p)}\n title={p}\n >\n {p.replace(\"top-\", \"↑\").replace(\"bottom-\", \"↓\")}\n </button>\n ))}\n </div>\n </div>\n\n <div style={styles.section}>\n <div\n style={{\n ...styles.sectionTitle,\n display: \"flex\",\n justifyContent: \"space-between\",\n }}\n >\n <span>Provider config</span>\n <button\n type=\"button\"\n style={\n copiedKey === \"config\"\n ? {\n ...styles.smallBtn,\n ...styles.smallBtnActive,\n flex: \"0 0 auto\",\n padding: \"2px 8px\",\n }\n : { ...styles.smallBtn, flex: \"0 0 auto\", padding: \"2px 8px\" }\n }\n onClick={() => copyJson({ ...ctx.config }, \"config\")}\n >\n {copiedKey === \"config\" ? \"Copied\" : \"Copy JSON\"}\n </button>\n </div>\n {Object.entries(ctx.config).map(([k, v]) => (\n <div key={k} style={styles.kvRow}>\n <span style={styles.kvKey}>{k}</span>\n <span>{String(v)}</span>\n </div>\n ))}\n <div style={{ ...styles.kvRow, marginTop: 6 }}>\n <span style={styles.kvKey}>paused</span>\n <span>{ctx.isPausedGlobally ? \"yes\" : \"no\"}</span>\n </div>\n </div>\n </div>\n );\n\n return (\n <div style={styles.panel} data-toast23-devtools=\"panel\">\n <div style={styles.header}>\n <span style={styles.title}>\n toast-23\n <span style={styles.badge}>{queueCount}</span>\n {ctx.isPausedGlobally && (\n <span style={{ ...styles.badge, background: \"#dc2626\" }}>\n paused\n </span>\n )}\n </span>\n <span style={{ display: \"inline-flex\", gap: 4 }}>\n <button\n type=\"button\"\n style={styles.iconBtn}\n onClick={() =>\n setSize((s) => (s === \"compact\" ? \"expanded\" : \"compact\"))\n }\n title={size === \"compact\" ? \"Expand\" : \"Shrink\"}\n aria-label={size === \"compact\" ? \"Expand panel\" : \"Shrink panel\"}\n >\n {size === \"compact\" ? \"⤢\" : \"⤡\"}\n </button>\n <button\n type=\"button\"\n style={styles.iconBtn}\n onClick={() => setCollapsed(true)}\n title=\"Collapse to chip\"\n aria-label=\"Collapse to chip\"\n >\n –\n </button>\n </span>\n </div>\n\n <div style={styles.tabs}>\n {([\"queue\", \"history\", \"settings\"] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n style={\n tab === t ? { ...styles.tab, ...styles.tabActive } : styles.tab\n }\n onClick={() => setTab(t)}\n >\n {t}\n {t === \"queue\" && queueCount > 0 ? ` (${queueCount})` : \"\"}\n {t === \"history\" && history.length > 0\n ? ` (${history.length})`\n : \"\"}\n </button>\n ))}\n </div>\n\n {tab === \"queue\" && QueueTab}\n {tab === \"history\" && HistoryTab}\n {tab === \"settings\" && SettingsTab}\n </div>\n );\n};\n\nToast23DevTools.displayName = \"Toast23DevTools\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatAgo(ms: number): string {\n if (ms < 0) return \"now\";\n const s = Math.floor(ms / 1000);\n if (s < 5) return \"just now\";\n if (s < 60) return `${s}s ago`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ago`;\n return `${Math.floor(h / 24)}d ago`;\n}\n","/**\r\n * toast-23 — useToast Hook\r\n */\r\n\r\n\"use client\";\r\n\r\nimport { useContext, useMemo } from \"react\";\r\nimport { ToasterContext } from \"./context\";\r\nimport type {\r\n ConfirmOptions,\r\n PromiseOptions,\r\n ToastApi,\r\n ToastOptions,\r\n} from \"./types\";\r\nimport type { ReactNode } from \"react\";\r\nimport { generateId } from \"./utils\";\r\n\r\nexport function useToast(): ToastApi {\r\n const ctx = useContext(ToasterContext);\r\n\r\n if (!ctx) {\r\n throw new Error(\r\n \"[toast-23] useToast() must be used inside a <Toast23Provider>. \" +\r\n \"Wrap your application root with <Toast23Provider> to fix this.\",\r\n );\r\n }\r\n\r\n return useMemo(() => {\r\n const toast = ((message: string | ReactNode, options?: ToastOptions) =>\r\n ctx.addToast(message, options)) as ToastApi;\r\n\r\n toast.success = (msg, opts) =>\r\n ctx.addToast(msg, { ...opts, variant: \"success\" });\r\n toast.error = (msg, opts) =>\r\n ctx.addToast(msg, { ...opts, variant: \"error\" });\r\n toast.warning = (msg, opts) =>\r\n ctx.addToast(msg, { ...opts, variant: \"warning\" });\r\n toast.info = (msg, opts) =>\r\n ctx.addToast(msg, { ...opts, variant: \"info\" });\r\n\r\n toast.loading = (msg, opts) =>\r\n ctx.addToast(msg, {\r\n ...opts,\r\n variant: \"loading\",\r\n duration: opts?.duration ?? 0,\r\n dismissible: opts?.dismissible ?? false,\r\n });\r\n\r\n toast.custom = (content, opts) =>\r\n ctx.addToast(content, { ...opts, variant: \"default\", isCustom: true });\r\n\r\n toast.dismiss = (id?: string) => ctx.dismissToast(id);\r\n toast.remove = (id?: string) => ctx.removeToast(id);\r\n toast.dismissGroup = (group: string) => ctx.dismissGroup(group);\r\n toast.removeGroup = (group: string) => ctx.removeGroup(group);\r\n toast.pauseAll = () => ctx.pauseAll();\r\n toast.resumeAll = () => ctx.resumeAll();\r\n toast.history = () => ctx.history();\r\n\r\n toast.promise = async <T>(\r\n promiseOrFn: Promise<T> | (() => Promise<T>),\r\n opts: PromiseOptions<T>,\r\n toastOpts?: ToastOptions,\r\n ): Promise<T> => {\r\n const id = ctx.addToast(opts.loading, {\r\n ...toastOpts,\r\n variant: \"loading\",\r\n duration: 0,\r\n dismissible: false,\r\n });\r\n\r\n // If a progress reporter is supplied, wire it up to updateToast.\r\n if (opts.progress) {\r\n try {\r\n opts.progress((pct) => {\r\n ctx.updateToast(id, { progress: Math.max(0, Math.min(1, pct)) });\r\n });\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n\r\n const promise =\r\n typeof promiseOrFn === \"function\" ? promiseOrFn() : promiseOrFn;\r\n\r\n try {\r\n const result = await promise;\r\n const msg =\r\n typeof opts.success === \"function\"\r\n ? opts.success(result)\r\n : opts.success;\r\n ctx.updateToast(id, {\r\n message: msg,\r\n variant: \"success\",\r\n duration: toastOpts?.duration ?? ctx.config.duration,\r\n dismissible: true,\r\n progress: undefined,\r\n });\r\n return result;\r\n } catch (error) {\r\n const msg =\r\n typeof opts.error === \"function\" ? opts.error(error) : opts.error;\r\n ctx.updateToast(id, {\r\n message: msg,\r\n variant: \"error\",\r\n duration: toastOpts?.duration ?? ctx.config.duration,\r\n dismissible: true,\r\n progress: undefined,\r\n });\r\n throw error;\r\n }\r\n };\r\n\r\n toast.confirm = (message: string, opts?: ConfirmOptions) => {\r\n return new Promise<boolean>((resolve) => {\r\n const id = generateId();\r\n let settled = false;\r\n const settle = (answer: boolean) => {\r\n if (settled) return;\r\n settled = true;\r\n resolve(answer);\r\n };\r\n\r\n ctx.addToast(message, {\r\n id,\r\n variant: opts?.variant ?? \"warning\",\r\n title: opts?.title,\r\n position: opts?.position,\r\n duration: 0, // never auto-dismiss\r\n dismissible: true,\r\n action: {\r\n label: opts?.confirmLabel ?? \"Confirm\",\r\n onClick: (dismiss) => {\r\n settle(true);\r\n dismiss();\r\n },\r\n dismissOnClick: false,\r\n className: \"toast23-action--confirm\",\r\n },\r\n cancelAction: {\r\n label: opts?.cancelLabel ?? \"Cancel\",\r\n onClick: (dismiss) => {\r\n settle(false);\r\n dismiss();\r\n },\r\n dismissOnClick: false,\r\n },\r\n // If user closes via X button or anything else, treat as cancel.\r\n onDismiss: () => settle(false),\r\n });\r\n });\r\n };\r\n\r\n return toast;\r\n }, [\r\n ctx.addToast,\r\n ctx.updateToast,\r\n ctx.dismissToast,\r\n ctx.removeToast,\r\n ctx.dismissGroup,\r\n ctx.removeGroup,\r\n ctx.pauseAll,\r\n ctx.resumeAll,\r\n ctx.history,\r\n ctx.config.duration,\r\n ]);\r\n}\r\n","/**\n * toast-23 — Headless hook.\n *\n * Exposes the raw toast queue + dismiss helpers so consumers can render\n * their own UI. Useful for React Native ports, custom designs, or when the\n * bundled CSS doesn't fit.\n *\n * Subscribes via `useSyncExternalStore` so only headless components re-render\n * on queue changes — components using the regular `useToast()` hook are\n * unaffected.\n */\n\n\"use client\";\n\nimport { useContext, useSyncExternalStore } from \"react\";\nimport { ToasterContext } from \"./context\";\nimport type { InternalToast, ToastHistoryEntry } from \"./types\";\n\nexport interface HeadlessApi {\n toasts: ReadonlyArray<InternalToast>;\n dismiss: (id?: string) => void;\n remove: (id?: string) => void;\n dismissGroup: (group: string) => void;\n removeGroup: (group: string) => void;\n pauseAll: () => void;\n resumeAll: () => void;\n history: () => ReadonlyArray<ToastHistoryEntry>;\n isPausedGlobally: boolean;\n}\n\nexport function useToast23Headless(): HeadlessApi {\n const ctx = useContext(ToasterContext);\n if (!ctx) {\n throw new Error(\n \"[toast-23] useToast23Headless() must be used inside a <Toast23Provider>.\",\n );\n }\n\n const { headlessStore } = ctx;\n const toasts = useSyncExternalStore(\n headlessStore.subscribe,\n headlessStore.getSnapshot,\n headlessStore.getSnapshot,\n );\n\n return {\n toasts,\n dismiss: ctx.dismissToast,\n remove: ctx.removeToast,\n dismissGroup: ctx.dismissGroup,\n removeGroup: ctx.removeGroup,\n pauseAll: ctx.pauseAll,\n resumeAll: ctx.resumeAll,\n history: ctx.history,\n isPausedGlobally: ctx.isPausedGlobally,\n };\n}\n","/**\r\n * toast-23 — Standalone / Imperative API\r\n *\r\n * For use outside React (Angular, Vue, Svelte, vanilla JS). Internally mounts\r\n * a minimal React tree.\r\n *\r\n * Multiple `createToast23()` calls are safe and isolated — each instance gets\r\n * its own Bridge component and resolver.\r\n */\r\n\r\nimport * as React from \"react\";\r\nimport { createRoot, type Root } from \"react-dom/client\";\r\nimport { Toast23Provider } from \"./provider\";\r\nimport { useToast } from \"./use-toast\";\r\nimport { injectStyles } from \"./inject-styles\";\r\nimport { generateId } from \"./utils\";\r\nimport type {\r\n ConfirmOptions,\r\n PromiseOptions,\r\n ToastApi,\r\n ToastHistoryEntry,\r\n ToastLayout,\r\n ToastDirection,\r\n ToastPosition,\r\n ToastOptions,\r\n} from \"./types\";\r\nimport type { ReactNode } from \"react\";\r\n\r\nexport interface StandaloneOptions {\r\n position?: ToastPosition;\r\n maxVisible?: number;\r\n duration?: number;\r\n layout?: ToastLayout;\r\n dir?: ToastDirection;\r\n historySize?: number;\r\n sound?: boolean;\r\n fallbackToNotification?: boolean;\r\n swipeEnabled?: boolean;\r\n swipeThreshold?: number;\r\n}\r\n\r\nexport interface StandaloneToastApi {\r\n (message: string | ReactNode, options?: ToastOptions): string;\r\n success: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n error: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n warning: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n info: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n loading: (message: string, options?: Omit<ToastOptions, \"variant\">) => string;\r\n custom: (\r\n content: ReactNode,\r\n options?: Omit<ToastOptions, \"variant\">,\r\n ) => string;\r\n promise: <T>(\r\n promise: Promise<T> | (() => Promise<T>),\r\n options: PromiseOptions<T>,\r\n toastOptions?: ToastOptions,\r\n ) => Promise<T>;\r\n confirm: (message: string, options?: ConfirmOptions) => Promise<boolean>;\r\n dismiss: (id?: string) => void;\r\n remove: (id?: string) => void;\r\n dismissGroup: (group: string) => void;\r\n removeGroup: (group: string) => void;\r\n pauseAll: () => void;\r\n resumeAll: () => void;\r\n history: () => ReadonlyArray<ToastHistoryEntry>;\r\n destroy: () => void;\r\n}\r\n\r\n/**\r\n * Per-instance Bridge — captures the React-side API via useToast() and writes\r\n * it back into a closure-scoped resolver. No module globals → safe to call\r\n * `createToast23()` multiple times.\r\n */\r\nfunction makeBridge(setApi: (api: ToastApi) => void): React.FC {\r\n return function Bridge() {\r\n const api = useToast();\r\n React.useEffect(() => {\r\n setApi(api);\r\n }, [api]);\r\n return null;\r\n };\r\n}\r\n\r\nexport function createToast23(\r\n options: StandaloneOptions = {},\r\n): StandaloneToastApi {\r\n const {\r\n position = \"top-right\",\r\n maxVisible = 5,\r\n duration = 5000,\r\n layout = \"default\",\r\n dir = \"ltr\",\r\n historySize,\r\n sound,\r\n fallbackToNotification,\r\n swipeEnabled,\r\n swipeThreshold,\r\n } = options;\r\n\r\n injectStyles();\r\n\r\n const container = document.createElement(\"div\");\r\n container.setAttribute(\"data-toast23-standalone\", \"\");\r\n container.style.display = \"contents\";\r\n document.body.appendChild(container);\r\n\r\n let root: Root | null = createRoot(container);\r\n let resolvedApi: ToastApi | null = null;\r\n\r\n type QueuedCall = { method: string; args: unknown[] };\r\n const queue: QueuedCall[] = [];\r\n\r\n let readyResolve: (api: ToastApi) => void;\r\n const apiReady = new Promise<ToastApi>((resolve) => {\r\n readyResolve = resolve;\r\n });\r\n\r\n const setApi = (api: ToastApi) => {\r\n resolvedApi = api;\r\n readyResolve(api);\r\n while (queue.length > 0) {\r\n const call = queue.shift()!;\r\n try {\r\n if (call.method === \"__call__\") (api as any)(...call.args);\r\n else (api as any)[call.method](...call.args);\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n };\r\n\r\n const Bridge = makeBridge(setApi);\r\n\r\n root.render(\r\n React.createElement(\r\n Toast23Provider,\r\n {\r\n position,\r\n maxVisible,\r\n duration,\r\n layout,\r\n dir,\r\n ...(historySize !== undefined && { historySize }),\r\n ...(sound !== undefined && { sound }),\r\n ...(fallbackToNotification !== undefined && { fallbackToNotification }),\r\n ...(swipeEnabled !== undefined && { swipeEnabled }),\r\n ...(swipeThreshold !== undefined && { swipeThreshold }),\r\n } as any,\r\n React.createElement(Bridge),\r\n ),\r\n );\r\n\r\n const proxyCall = (method: string, ...args: unknown[]): any => {\r\n if (resolvedApi) return (resolvedApi as any)[method](...args);\r\n queue.push({ method, args });\r\n return undefined;\r\n };\r\n\r\n // For the id-returning toast methods: when the React tree hasn't mounted yet,\r\n // pre-generate the id, queue the call with it pinned, and return it. The\r\n // flushed call carries the same id, so a follow-up `dismiss(id)` works even\r\n // for toasts fired before mount.\r\n const proxyToast = (\r\n method: string,\r\n content: string | ReactNode,\r\n opts?: ToastOptions,\r\n ): string => {\r\n if (resolvedApi) return (resolvedApi as any)[method](content, opts);\r\n const id = opts?.id ?? generateId();\r\n queue.push({ method, args: [content, { ...opts, id }] });\r\n return id;\r\n };\r\n\r\n const toast = ((message: string | ReactNode, opts?: ToastOptions) => {\r\n if (resolvedApi) return resolvedApi(message, opts);\r\n const id = opts?.id ?? generateId();\r\n queue.push({ method: \"__call__\", args: [message, { ...opts, id }] });\r\n return id;\r\n }) as StandaloneToastApi;\r\n\r\n toast.success = (msg, opts) => proxyToast(\"success\", msg, opts);\r\n toast.error = (msg, opts) => proxyToast(\"error\", msg, opts);\r\n toast.warning = (msg, opts) => proxyToast(\"warning\", msg, opts);\r\n toast.info = (msg, opts) => proxyToast(\"info\", msg, opts);\r\n toast.loading = (msg, opts) => proxyToast(\"loading\", msg, opts);\r\n toast.custom = (content, opts) => proxyToast(\"custom\", content, opts);\r\n toast.dismiss = (id?) => proxyCall(\"dismiss\", id);\r\n toast.remove = (id?) => proxyCall(\"remove\", id);\r\n toast.dismissGroup = (group) => proxyCall(\"dismissGroup\", group);\r\n toast.removeGroup = (group) => proxyCall(\"removeGroup\", group);\r\n toast.pauseAll = () => proxyCall(\"pauseAll\");\r\n toast.resumeAll = () => proxyCall(\"resumeAll\");\r\n toast.history = () => (resolvedApi ? resolvedApi.history() : []);\r\n\r\n toast.promise = (promise, opts, toastOpts?) => {\r\n if (resolvedApi) return resolvedApi.promise(promise, opts, toastOpts);\r\n return apiReady.then((api) => api.promise(promise, opts, toastOpts));\r\n };\r\n\r\n toast.confirm = (message, opts?) => {\r\n if (resolvedApi) return resolvedApi.confirm(message, opts);\r\n return apiReady.then((api) => api.confirm(message, opts));\r\n };\r\n\r\n toast.destroy = () => {\r\n queue.length = 0;\r\n if (root) {\r\n root.unmount();\r\n root = null;\r\n }\r\n container.remove();\r\n resolvedApi = null;\r\n };\r\n\r\n return toast;\r\n}\r\n"],"names":["ToasterContext","createContext","toasterReducer","state","action","t","CheckCircleIcon","props","jsxs","jsx","XCircleIcon","AlertTriangleIcon","InfoIcon","XIcon","SpinnerIcon","counter","generateId","cx","args","getSwipeDirection","position","variantIcon","REFILL_DURATION","SWIPE_FLING_DURATION","ToastItem","React","toast","onDismiss","onRemove","globallyPaused","swipeEnabled","swipeThreshold","stackIndex","stackMode","stackExpanded","stackIsBottom","_dir","hasEntered","setHasEntered","useState","useEffect","raf","timer","isHovered","setIsHovered","isPaused","progress","setProgress","progressTransition","setProgressTransition","hasDeterminateProgress","swipeRef","useRef","swipeDx","setSwipeDx","swipeTransition","setSwipeTransition","swipeAxis","onPointerDown","useCallback","e","onPointerMove","dx","dy","constrained","onPointerEnd","STACK_OFFSET","STACK_SCALE_STEP","stackDepth","stackTransform","offsetY","scale","stackOpacity","wrapperTransform","swipeOpacity","handleMouseEnter","handleMouseLeave","Icon","dismissSelf","handleActionClick","shouldDismiss","handleCancelClick","isConfirmLayout","ToastContainer","toasts","maxVisible","layout","dir","theme","inline","ctx","useContext","isExpanded","setIsExpanded","onContainerEnter","onContainerLeave","active","exiting","visible","queuedCount","isBottom","i","MARKER","injectStyles","style","css","getCtx","Ctor","PATCHES","scheduleNote","audio","note","startAt","dur","osc","gain","attack","schedulePatch","notes","cursor","gap","playToastSound","variant","shouldFallback","permissionRequested","maybeFallbackToNotification","message","title","fire","createHeadlessStore","snapshot","listeners","next","l","listener","ALL_POSITIONS","Toast23Provider","children","defaultPosition","defaultDuration","target","historySize","focusShortcut","defaultSound","defaultFallback","dispatch","useReducer","isPausedGlobally","setIsPausedGlobally","toastsRef","headlessStoreRef","headlessStore","historyRef","dismissedIdsRef","recordHistory","entry","addToast","options","id","updateToast","updates","dismissToast","x","removeToast","dismissGroup","group","removeGroup","inGroup","pauseAll","resumeAll","history","contextValue","useMemo","onKey","region","groupedToasts","groups","containers","pos","portalTarget","createPortal","ALL_VARIANTS","VARIANT_COLORS","SIZE","EMPTY_STORE","Toast23DevTools","collapsedInitial","collapsed","setCollapsed","size","setSize","tab","setTab","hidden","setHidden","copiedKey","setCopiedKey","testPosition","setTestPosition","testDuration","setTestDuration","store","useSyncExternalStore","toggleVariant","v","prev","flashCopied","key","curr","copyJson","payload","json","visibleQueue","visibleHistory","h","queueCount","replay","spawnTest","dims","isTop","isRight","styles","variantStyle","Chip","filterChips","off","QueueTab","Fragment","copyKey","HistoryTab","ago","formatAgo","SettingsTab","p","k","s","ms","m","useToast","msg","opts","content","promiseOrFn","toastOpts","pct","promise","result","error","resolve","settled","settle","answer","dismiss","useToast23Headless","makeBridge","setApi","api","createToast23","duration","sound","fallbackToNotification","container","root","createRoot","resolvedApi","queue","readyResolve","apiReady","Bridge","call","proxyCall","method","proxyToast"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export { Toast23Provider } from './provider';
|
|
2
|
+
export { Toast23DevTools } from './devtools';
|
|
3
|
+
export type { Toast23DevToolsProps } from './devtools';
|
|
2
4
|
export { useToast } from './use-toast';
|
|
5
|
+
export { useToast23Headless } from './use-toast-headless';
|
|
6
|
+
export type { HeadlessApi } from './use-toast-headless';
|
|
3
7
|
export { createToast23 } from './standalone';
|
|
4
|
-
export type { ToastVariant, ToastPosition, ToastOptions, ToastApi, Toast23ProviderProps, PromiseOptions, } from './types';
|
|
5
8
|
export type { StandaloneOptions, StandaloneToastApi } from './standalone';
|
|
9
|
+
export type { ToastVariant, ToastPosition, ToastDirection, ToastTheme, ToastLayout, ToastOptions, ToastAction, ToastApi, Toast23ProviderProps, PromiseOptions, ConfirmOptions, ToastHistoryEntry, } from './types';
|
|
6
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG1E,YAAY,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|