@bigbinary/neeto-atoms 1.0.83 → 1.0.85

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.
@@ -4,6 +4,7 @@ import { c as cn } from './utils-BJnb9o5c.js';
4
4
  import { T as TriangleAlert } from './triangle-alert-C434HydH.js';
5
5
  import { I as Info } from './info-BlwkmMZr.js';
6
6
  import { X } from './x-_o2T3n6D.js';
7
+ import i18n from 'i18next';
7
8
  import { isValidElement } from 'react';
8
9
 
9
10
  const ICONS = {
@@ -32,6 +33,7 @@ const ToastrBody = ({
32
33
  "div",
33
34
  {
34
35
  role: type === "error" || type === "warning" ? "alert" : "status",
36
+ "data-testid": `toastr-${type}-container`,
35
37
  className: cn(
36
38
  "flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg",
37
39
  VARIANT_CLASSES[type]
@@ -44,6 +46,7 @@ const ToastrBody = ({
44
46
  {
45
47
  type: "button",
46
48
  onClick: onAction,
49
+ "data-testid": `toastr-${type}-button`,
47
50
  className: "shrink-0 text-sm font-medium underline-offset-2 hover:underline",
48
51
  children: buttonLabel
49
52
  }
@@ -54,6 +57,7 @@ const ToastrBody = ({
54
57
  type: "button",
55
58
  "aria-label": "Dismiss",
56
59
  onClick: onDismiss,
60
+ "data-testid": "toastr-close-button",
57
61
  className: "shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2",
58
62
  children: /* @__PURE__ */ jsx(X, { "aria-hidden": true, className: "size-4" })
59
63
  }
@@ -80,7 +84,7 @@ function resolveMessage(message) {
80
84
  const obj = message;
81
85
  if (obj.customMessage) return obj.customMessage;
82
86
  if (obj.notice) return obj.notice;
83
- if (obj.noticeCode) return obj.noticeCode;
87
+ if (obj.noticeCode) return i18n.t(obj.noticeCode);
84
88
  }
85
89
  return String(message);
86
90
  }
@@ -184,4 +188,4 @@ const Toastr = {
184
188
  };
185
189
 
186
190
  export { Toastr as T };
187
- //# sourceMappingURL=Toastr-DA3Lcm18.js.map
191
+ //# sourceMappingURL=Toastr-DP7naHnr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toastr-DP7naHnr.js","sources":["../src/components/Toastr/ToastrBody.tsx","../src/components/Toastr/utils.ts","../src/components/Toastr/Toastr.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n OctagonXIcon,\n TriangleAlertIcon,\n XIcon,\n type LucideIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\ntype ToastrType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst ICONS: Record<ToastrType, LucideIcon> = {\n success: CircleCheckIcon,\n info: InfoIcon,\n warning: TriangleAlertIcon,\n error: OctagonXIcon,\n};\n\nconst VARIANT_CLASSES: Record<ToastrType, string> = {\n success:\n \"bg-success-solid text-success-solid-foreground border-success-solid/30\",\n error: \"bg-error-solid text-error-solid-foreground border-error-solid/30\",\n warning:\n \"bg-warning-solid text-warning-solid-foreground border-warning-solid/30\",\n info: \"bg-info-solid text-info-solid-foreground border-info-solid/30\",\n};\n\nexport interface ToastrBodyProps {\n type: ToastrType;\n message: ReactNode;\n showIcon?: boolean;\n dismissible?: boolean;\n buttonLabel?: string;\n onAction?: () => void;\n onDismiss: () => void;\n}\n\nconst ToastrBody = ({\n type,\n message,\n showIcon = true,\n dismissible = true,\n buttonLabel,\n onAction,\n onDismiss,\n}: ToastrBodyProps) => {\n const Icon = ICONS[type];\n\n return (\n <div\n role={type === \"error\" || type === \"warning\" ? \"alert\" : \"status\"}\n data-testid={`toastr-${type}-container`}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg\",\n VARIANT_CLASSES[type]\n )}\n >\n {showIcon && <Icon aria-hidden className=\"size-4 shrink-0\" />}\n <span className=\"flex-1\">{message}</span>\n {buttonLabel && (\n <button\n type=\"button\"\n onClick={onAction}\n data-testid={`toastr-${type}-button`}\n className=\"shrink-0 text-sm font-medium underline-offset-2 hover:underline\"\n >\n {buttonLabel}\n </button>\n )}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n data-testid=\"toastr-close-button\"\n className=\"shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <XIcon aria-hidden className=\"size-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport { ToastrBody };\n","import i18next from \"i18next\";\nimport { isValidElement, type ReactNode } from \"react\";\n\nimport type { ToastrConfig, ToastrErrorInput, ToastrMessage } from \"./Toastr\";\n\nconst activeToasts = new Set<string>();\n\nfunction toastKey(\n type: string,\n message: ReactNode,\n buttonLabel?: string\n): string | null {\n if (typeof message !== \"string\") return null;\n return `${type}::${message}::${buttonLabel ?? \"\"}`;\n}\n\nfunction getContentDir(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") return \"ltr\";\n return (\n (document.documentElement.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n (document.body.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n \"ltr\"\n );\n}\n\nfunction resolveMessage(message: ToastrMessage): ReactNode {\n if (typeof message === \"string\") return message;\n if (isValidElement(message)) return message;\n // Arrays of ReactNodes (e.g. [<a/>, \" \", <b/>]) render natively via {message}.\n if (Array.isArray(message)) return message;\n if (message && typeof message === \"object\") {\n const obj = message as {\n noticeCode?: string;\n customMessage?: string;\n notice?: string;\n };\n if (obj.customMessage) return obj.customMessage;\n if (obj.notice) return obj.notice;\n if (obj.noticeCode) return i18next.t(obj.noticeCode);\n }\n return String(message);\n}\n\nfunction resolveErrorMessage(errorObject: ToastrErrorInput): ReactNode {\n if (typeof errorObject === \"string\") return errorObject;\n\n if (errorObject && typeof errorObject === \"object\") {\n // Axios-style error\n const axiosLike = errorObject as {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n };\n\n if (axiosLike.response?.data) {\n const data = axiosLike.response.data;\n if (data.customMessage) return String(data.customMessage);\n if (data.error) return String(data.error);\n if (Array.isArray(data.errors)) return data.errors.join(\"\\n\");\n if (data.noticeCode) return String(data.noticeCode);\n }\n\n if (axiosLike.isAxiosError && axiosLike.message) return axiosLike.message;\n\n // Native Error\n if (errorObject instanceof Error) return errorObject.message;\n\n // ToastrMessage (string, React element, array, or notice-shape object)\n return resolveMessage(errorObject as ToastrMessage);\n }\n\n return \"Something went wrong.\";\n}\n\nfunction parseConfig(args: unknown[]): ToastrConfig {\n if (args.length === 0) return {};\n\n const first = args[0];\n if (typeof first === \"object\" && first !== null && !Array.isArray(first)) {\n return first as ToastrConfig;\n }\n\n // Legacy positional args: buttonLabel, onClick, customConfig, showIcon\n const [buttonLabel, onClick, customConfig, showIcon] = args as [\n string?,\n (() => void)?,\n Record<string, unknown>?,\n boolean?,\n ];\n\n return {\n ...(buttonLabel ? { buttonLabel } : {}),\n ...(onClick ? { onClick } : {}),\n ...(showIcon !== undefined ? { showIcon } : {}),\n ...(customConfig ?? {}),\n };\n}\n\nexport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n};\n","import type { ReactNode } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { ToastrBody } from \"./ToastrBody\";\nimport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n} from \"./utils\";\n\nexport interface ToastrConfig {\n /** Label for an action button inside the toast. */\n buttonLabel?: string;\n /** Callback when the action button is clicked. */\n onClick?: () => void;\n /** Whether to show the type icon in the toast. */\n showIcon?: boolean;\n /** Whether the toast can be dismissed (shows X button + enables swipe). Defaults to true. */\n dismissible?: boolean;\n /** Additional sonner toast options (duration, position, etc.). */\n [key: string]: unknown;\n}\n\nexport type ToastrMessage =\n | ReactNode\n | { noticeCode?: string; customMessage?: string; notice?: string };\n\nexport type ToastrErrorInput =\n | string\n | Error\n | {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n }\n | ToastrMessage;\n\ntype SonnerType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nfunction showToast(\n type: SonnerType,\n message: ReactNode,\n config?: ToastrConfig\n): string | number | undefined {\n const {\n buttonLabel,\n onClick,\n showIcon,\n dismissible = true,\n onDismiss: userOnDismiss,\n onAutoClose: userOnAutoClose,\n ...restConfig\n } = config ?? {};\n\n const key = toastKey(type, message, buttonLabel);\n\n if (key !== null && activeToasts.has(key)) return undefined;\n if (key !== null) activeToasts.add(key);\n\n const options: Record<string, unknown> = {\n ...restConfig,\n position: getContentDir() === \"rtl\" ? \"bottom-right\" : \"bottom-left\",\n dismissible,\n onDismiss: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnDismiss as ((t: unknown) => void) | undefined)?.(t);\n },\n onAutoClose: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnAutoClose as ((t: unknown) => void) | undefined)?.(t);\n },\n };\n\n return toast.custom(\n id => (\n <ToastrBody\n buttonLabel={buttonLabel}\n dismissible={dismissible}\n message={message}\n showIcon={showIcon}\n type={type}\n onAction={() => {\n try {\n onClick?.();\n } finally {\n toast.dismiss(id);\n }\n }}\n onDismiss={() => toast.dismiss(id)}\n />\n ),\n options\n );\n}\n\nconst Toastr = {\n success(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"success\", resolveMessage(message), parseConfig(args));\n },\n\n info(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n show(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n warning(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"warning\", resolveMessage(message), parseConfig(args));\n },\n\n error(errorObject: ToastrErrorInput, ...args: unknown[]) {\n const msg = resolveErrorMessage(errorObject);\n return showToast(\"error\", msg, parseConfig(args));\n },\n};\n\nexport { Toastr };\n"],"names":["CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","XIcon","i18next"],"mappings":"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"}
@@ -6,8 +6,13 @@ var utils = require('./utils-BhM0B89p.js');
6
6
  var triangleAlert = require('./triangle-alert-CC-cck8p.js');
7
7
  var info = require('./info-DGfDptn1.js');
8
8
  var x = require('./x-Brw3FJst.js');
9
+ var i18n = require('i18next');
9
10
  var React = require('react');
10
11
 
12
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
+
14
+ var i18n__default = /*#__PURE__*/_interopDefault(i18n);
15
+
11
16
  const ICONS = {
12
17
  success: index.CircleCheck,
13
18
  info: info.Info,
@@ -34,6 +39,7 @@ const ToastrBody = ({
34
39
  "div",
35
40
  {
36
41
  role: type === "error" || type === "warning" ? "alert" : "status",
42
+ "data-testid": `toastr-${type}-container`,
37
43
  className: utils.cn(
38
44
  "flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg",
39
45
  VARIANT_CLASSES[type]
@@ -46,6 +52,7 @@ const ToastrBody = ({
46
52
  {
47
53
  type: "button",
48
54
  onClick: onAction,
55
+ "data-testid": `toastr-${type}-button`,
49
56
  className: "shrink-0 text-sm font-medium underline-offset-2 hover:underline",
50
57
  children: buttonLabel
51
58
  }
@@ -56,6 +63,7 @@ const ToastrBody = ({
56
63
  type: "button",
57
64
  "aria-label": "Dismiss",
58
65
  onClick: onDismiss,
66
+ "data-testid": "toastr-close-button",
59
67
  className: "shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2",
60
68
  children: /* @__PURE__ */ jsxRuntime.jsx(x.X, { "aria-hidden": true, className: "size-4" })
61
69
  }
@@ -82,7 +90,7 @@ function resolveMessage(message) {
82
90
  const obj = message;
83
91
  if (obj.customMessage) return obj.customMessage;
84
92
  if (obj.notice) return obj.notice;
85
- if (obj.noticeCode) return obj.noticeCode;
93
+ if (obj.noticeCode) return i18n__default.default.t(obj.noticeCode);
86
94
  }
87
95
  return String(message);
88
96
  }
@@ -186,4 +194,4 @@ const Toastr = {
186
194
  };
187
195
 
188
196
  exports.Toastr = Toastr;
189
- //# sourceMappingURL=Toastr-BgT_Fq7J.js.map
197
+ //# sourceMappingURL=Toastr-CgRy7bg-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toastr-CgRy7bg-.js","sources":["../../src/components/Toastr/ToastrBody.tsx","../../src/components/Toastr/utils.ts","../../src/components/Toastr/Toastr.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n OctagonXIcon,\n TriangleAlertIcon,\n XIcon,\n type LucideIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\ntype ToastrType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst ICONS: Record<ToastrType, LucideIcon> = {\n success: CircleCheckIcon,\n info: InfoIcon,\n warning: TriangleAlertIcon,\n error: OctagonXIcon,\n};\n\nconst VARIANT_CLASSES: Record<ToastrType, string> = {\n success:\n \"bg-success-solid text-success-solid-foreground border-success-solid/30\",\n error: \"bg-error-solid text-error-solid-foreground border-error-solid/30\",\n warning:\n \"bg-warning-solid text-warning-solid-foreground border-warning-solid/30\",\n info: \"bg-info-solid text-info-solid-foreground border-info-solid/30\",\n};\n\nexport interface ToastrBodyProps {\n type: ToastrType;\n message: ReactNode;\n showIcon?: boolean;\n dismissible?: boolean;\n buttonLabel?: string;\n onAction?: () => void;\n onDismiss: () => void;\n}\n\nconst ToastrBody = ({\n type,\n message,\n showIcon = true,\n dismissible = true,\n buttonLabel,\n onAction,\n onDismiss,\n}: ToastrBodyProps) => {\n const Icon = ICONS[type];\n\n return (\n <div\n role={type === \"error\" || type === \"warning\" ? \"alert\" : \"status\"}\n data-testid={`toastr-${type}-container`}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg\",\n VARIANT_CLASSES[type]\n )}\n >\n {showIcon && <Icon aria-hidden className=\"size-4 shrink-0\" />}\n <span className=\"flex-1\">{message}</span>\n {buttonLabel && (\n <button\n type=\"button\"\n onClick={onAction}\n data-testid={`toastr-${type}-button`}\n className=\"shrink-0 text-sm font-medium underline-offset-2 hover:underline\"\n >\n {buttonLabel}\n </button>\n )}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n data-testid=\"toastr-close-button\"\n className=\"shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <XIcon aria-hidden className=\"size-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport { ToastrBody };\n","import i18next from \"i18next\";\nimport { isValidElement, type ReactNode } from \"react\";\n\nimport type { ToastrConfig, ToastrErrorInput, ToastrMessage } from \"./Toastr\";\n\nconst activeToasts = new Set<string>();\n\nfunction toastKey(\n type: string,\n message: ReactNode,\n buttonLabel?: string\n): string | null {\n if (typeof message !== \"string\") return null;\n return `${type}::${message}::${buttonLabel ?? \"\"}`;\n}\n\nfunction getContentDir(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") return \"ltr\";\n return (\n (document.documentElement.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n (document.body.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n \"ltr\"\n );\n}\n\nfunction resolveMessage(message: ToastrMessage): ReactNode {\n if (typeof message === \"string\") return message;\n if (isValidElement(message)) return message;\n // Arrays of ReactNodes (e.g. [<a/>, \" \", <b/>]) render natively via {message}.\n if (Array.isArray(message)) return message;\n if (message && typeof message === \"object\") {\n const obj = message as {\n noticeCode?: string;\n customMessage?: string;\n notice?: string;\n };\n if (obj.customMessage) return obj.customMessage;\n if (obj.notice) return obj.notice;\n if (obj.noticeCode) return i18next.t(obj.noticeCode);\n }\n return String(message);\n}\n\nfunction resolveErrorMessage(errorObject: ToastrErrorInput): ReactNode {\n if (typeof errorObject === \"string\") return errorObject;\n\n if (errorObject && typeof errorObject === \"object\") {\n // Axios-style error\n const axiosLike = errorObject as {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n };\n\n if (axiosLike.response?.data) {\n const data = axiosLike.response.data;\n if (data.customMessage) return String(data.customMessage);\n if (data.error) return String(data.error);\n if (Array.isArray(data.errors)) return data.errors.join(\"\\n\");\n if (data.noticeCode) return String(data.noticeCode);\n }\n\n if (axiosLike.isAxiosError && axiosLike.message) return axiosLike.message;\n\n // Native Error\n if (errorObject instanceof Error) return errorObject.message;\n\n // ToastrMessage (string, React element, array, or notice-shape object)\n return resolveMessage(errorObject as ToastrMessage);\n }\n\n return \"Something went wrong.\";\n}\n\nfunction parseConfig(args: unknown[]): ToastrConfig {\n if (args.length === 0) return {};\n\n const first = args[0];\n if (typeof first === \"object\" && first !== null && !Array.isArray(first)) {\n return first as ToastrConfig;\n }\n\n // Legacy positional args: buttonLabel, onClick, customConfig, showIcon\n const [buttonLabel, onClick, customConfig, showIcon] = args as [\n string?,\n (() => void)?,\n Record<string, unknown>?,\n boolean?,\n ];\n\n return {\n ...(buttonLabel ? { buttonLabel } : {}),\n ...(onClick ? { onClick } : {}),\n ...(showIcon !== undefined ? { showIcon } : {}),\n ...(customConfig ?? {}),\n };\n}\n\nexport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n};\n","import type { ReactNode } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { ToastrBody } from \"./ToastrBody\";\nimport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n} from \"./utils\";\n\nexport interface ToastrConfig {\n /** Label for an action button inside the toast. */\n buttonLabel?: string;\n /** Callback when the action button is clicked. */\n onClick?: () => void;\n /** Whether to show the type icon in the toast. */\n showIcon?: boolean;\n /** Whether the toast can be dismissed (shows X button + enables swipe). Defaults to true. */\n dismissible?: boolean;\n /** Additional sonner toast options (duration, position, etc.). */\n [key: string]: unknown;\n}\n\nexport type ToastrMessage =\n | ReactNode\n | { noticeCode?: string; customMessage?: string; notice?: string };\n\nexport type ToastrErrorInput =\n | string\n | Error\n | {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n }\n | ToastrMessage;\n\ntype SonnerType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nfunction showToast(\n type: SonnerType,\n message: ReactNode,\n config?: ToastrConfig\n): string | number | undefined {\n const {\n buttonLabel,\n onClick,\n showIcon,\n dismissible = true,\n onDismiss: userOnDismiss,\n onAutoClose: userOnAutoClose,\n ...restConfig\n } = config ?? {};\n\n const key = toastKey(type, message, buttonLabel);\n\n if (key !== null && activeToasts.has(key)) return undefined;\n if (key !== null) activeToasts.add(key);\n\n const options: Record<string, unknown> = {\n ...restConfig,\n position: getContentDir() === \"rtl\" ? \"bottom-right\" : \"bottom-left\",\n dismissible,\n onDismiss: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnDismiss as ((t: unknown) => void) | undefined)?.(t);\n },\n onAutoClose: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnAutoClose as ((t: unknown) => void) | undefined)?.(t);\n },\n };\n\n return toast.custom(\n id => (\n <ToastrBody\n buttonLabel={buttonLabel}\n dismissible={dismissible}\n message={message}\n showIcon={showIcon}\n type={type}\n onAction={() => {\n try {\n onClick?.();\n } finally {\n toast.dismiss(id);\n }\n }}\n onDismiss={() => toast.dismiss(id)}\n />\n ),\n options\n );\n}\n\nconst Toastr = {\n success(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"success\", resolveMessage(message), parseConfig(args));\n },\n\n info(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n show(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n warning(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"warning\", resolveMessage(message), parseConfig(args));\n },\n\n error(errorObject: ToastrErrorInput, ...args: unknown[]) {\n const msg = resolveErrorMessage(errorObject);\n return showToast(\"error\", msg, parseConfig(args));\n },\n};\n\nexport { Toastr };\n"],"names":["CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","jsxs","cn","jsx","XIcon","isValidElement","i18next","toast"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var Toastr = require('../Toastr-BgT_Fq7J.js');
3
+ var Toastr = require('../Toastr-CgRy7bg-.js');
4
4
  require('react/jsx-runtime');
5
5
  require('../index-CPmGpPzg.js');
6
6
  require('../createLucideIcon-D0tRgV6l.js');
@@ -10,6 +10,7 @@ require('../utils-BhM0B89p.js');
10
10
  require('../triangle-alert-CC-cck8p.js');
11
11
  require('../info-DGfDptn1.js');
12
12
  require('../x-Brw3FJst.js');
13
+ require('i18next');
13
14
 
14
15
 
15
16
 
@@ -1 +1 @@
1
- {"version":3,"file":"Toastr.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Toastr.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
@@ -31,7 +31,7 @@ var Tabs = require('../Tabs-COMRjTVU.js');
31
31
  var Textarea = require('../Textarea-yWv-66yX.js');
32
32
  var TimePicker = require('../TimePicker-DW7OM3IE.js');
33
33
  var TimePickerPanel = require('../TimePickerPanel-DX6cjrSN.js');
34
- var Toastr = require('../Toastr-BgT_Fq7J.js');
34
+ var Toastr = require('../Toastr-CgRy7bg-.js');
35
35
  var Tooltip = require('../Tooltip-Dph_R3Ct.js');
36
36
  var TranslationProvider = require('../TranslationProvider-Dh5_Fzzk.js');
37
37
  var Tree = require('../Tree-DAyVPLnJ.js');
package/dist/cjs/index.js CHANGED
@@ -35,7 +35,7 @@ var Switch = require('./Switch-bY6bZw78.js');
35
35
  var Tabs = require('./Tabs-COMRjTVU.js');
36
36
  var Textarea = require('./Textarea-yWv-66yX.js');
37
37
  var TimePicker = require('./TimePicker-DW7OM3IE.js');
38
- var Toastr = require('./Toastr-BgT_Fq7J.js');
38
+ var Toastr = require('./Toastr-CgRy7bg-.js');
39
39
  var Tooltip = require('./Tooltip-Dph_R3Ct.js');
40
40
  var Tree = require('./Tree-DAyVPLnJ.js');
41
41
  var TreeSelect = require('./TreeSelect-qLtRIP-s.js');
@@ -1,4 +1,4 @@
1
- export { T as Toastr } from '../Toastr-DA3Lcm18.js';
1
+ export { T as Toastr } from '../Toastr-DP7naHnr.js';
2
2
  import 'react/jsx-runtime';
3
3
  import '../index-CDo_esrR.js';
4
4
  import '../createLucideIcon-C8ycilSN.js';
@@ -8,4 +8,5 @@ import '../utils-BJnb9o5c.js';
8
8
  import '../triangle-alert-C434HydH.js';
9
9
  import '../info-BlwkmMZr.js';
10
10
  import '../x-_o2T3n6D.js';
11
+ import 'i18next';
11
12
  //# sourceMappingURL=Toastr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toastr.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"Toastr.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -29,7 +29,7 @@ export { T as Tabs } from '../Tabs-BCUdAnva.js';
29
29
  export { T as Textarea } from '../Textarea-B2Uhx-Yy.js';
30
30
  export { T as TimePicker } from '../TimePicker-Ca7iF-a_.js';
31
31
  export { T as TimePickerPanel } from '../TimePickerPanel--KDX5QwS.js';
32
- export { T as Toastr } from '../Toastr-DA3Lcm18.js';
32
+ export { T as Toastr } from '../Toastr-DP7naHnr.js';
33
33
  export { T as Tooltip } from '../Tooltip-CA3irJ2q.js';
34
34
  export { T as TranslationProvider } from '../TranslationProvider-BvRvUsPS.js';
35
35
  export { T as Tree } from '../Tree-BlzjThRi.js';
package/dist/index.js CHANGED
@@ -34,7 +34,7 @@ export { S as Switch } from './Switch-b4ZAjhRy.js';
34
34
  export { T as Tabs } from './Tabs-BCUdAnva.js';
35
35
  export { T as Textarea } from './Textarea-B2Uhx-Yy.js';
36
36
  export { T as TimePicker } from './TimePicker-Ca7iF-a_.js';
37
- export { T as Toastr } from './Toastr-DA3Lcm18.js';
37
+ export { T as Toastr } from './Toastr-DP7naHnr.js';
38
38
  export { T as Tooltip } from './Tooltip-CA3irJ2q.js';
39
39
  export { T as Tree } from './Tree-BlzjThRi.js';
40
40
  export { T as TreeSelect } from './TreeSelect-BwF2rY6f.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigbinary/neeto-atoms",
3
- "version": "1.0.83",
3
+ "version": "1.0.85",
4
4
  "author": "BigBinary",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toastr-DA3Lcm18.js","sources":["../src/components/Toastr/ToastrBody.tsx","../src/components/Toastr/utils.ts","../src/components/Toastr/Toastr.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n OctagonXIcon,\n TriangleAlertIcon,\n XIcon,\n type LucideIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\ntype ToastrType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst ICONS: Record<ToastrType, LucideIcon> = {\n success: CircleCheckIcon,\n info: InfoIcon,\n warning: TriangleAlertIcon,\n error: OctagonXIcon,\n};\n\nconst VARIANT_CLASSES: Record<ToastrType, string> = {\n success:\n \"bg-success-solid text-success-solid-foreground border-success-solid/30\",\n error: \"bg-error-solid text-error-solid-foreground border-error-solid/30\",\n warning:\n \"bg-warning-solid text-warning-solid-foreground border-warning-solid/30\",\n info: \"bg-info-solid text-info-solid-foreground border-info-solid/30\",\n};\n\nexport interface ToastrBodyProps {\n type: ToastrType;\n message: ReactNode;\n showIcon?: boolean;\n dismissible?: boolean;\n buttonLabel?: string;\n onAction?: () => void;\n onDismiss: () => void;\n}\n\nconst ToastrBody = ({\n type,\n message,\n showIcon = true,\n dismissible = true,\n buttonLabel,\n onAction,\n onDismiss,\n}: ToastrBodyProps) => {\n const Icon = ICONS[type];\n\n return (\n <div\n role={type === \"error\" || type === \"warning\" ? \"alert\" : \"status\"}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg\",\n VARIANT_CLASSES[type]\n )}\n >\n {showIcon && <Icon aria-hidden className=\"size-4 shrink-0\" />}\n <span className=\"flex-1\">{message}</span>\n {buttonLabel && (\n <button\n type=\"button\"\n onClick={onAction}\n className=\"shrink-0 text-sm font-medium underline-offset-2 hover:underline\"\n >\n {buttonLabel}\n </button>\n )}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n className=\"shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <XIcon aria-hidden className=\"size-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport { ToastrBody };\n","import { isValidElement, type ReactNode } from \"react\";\n\nimport type { ToastrConfig, ToastrErrorInput, ToastrMessage } from \"./Toastr\";\n\nconst activeToasts = new Set<string>();\n\nfunction toastKey(\n type: string,\n message: ReactNode,\n buttonLabel?: string\n): string | null {\n if (typeof message !== \"string\") return null;\n return `${type}::${message}::${buttonLabel ?? \"\"}`;\n}\n\nfunction getContentDir(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") return \"ltr\";\n return (\n (document.documentElement.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n (document.body.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n \"ltr\"\n );\n}\n\nfunction resolveMessage(message: ToastrMessage): ReactNode {\n if (typeof message === \"string\") return message;\n if (isValidElement(message)) return message;\n // Arrays of ReactNodes (e.g. [<a/>, \" \", <b/>]) render natively via {message}.\n if (Array.isArray(message)) return message;\n if (message && typeof message === \"object\") {\n const obj = message as {\n noticeCode?: string;\n customMessage?: string;\n notice?: string;\n };\n if (obj.customMessage) return obj.customMessage;\n if (obj.notice) return obj.notice;\n if (obj.noticeCode) return obj.noticeCode;\n }\n return String(message);\n}\n\nfunction resolveErrorMessage(errorObject: ToastrErrorInput): ReactNode {\n if (typeof errorObject === \"string\") return errorObject;\n\n if (errorObject && typeof errorObject === \"object\") {\n // Axios-style error\n const axiosLike = errorObject as {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n };\n\n if (axiosLike.response?.data) {\n const data = axiosLike.response.data;\n if (data.customMessage) return String(data.customMessage);\n if (data.error) return String(data.error);\n if (Array.isArray(data.errors)) return data.errors.join(\"\\n\");\n if (data.noticeCode) return String(data.noticeCode);\n }\n\n if (axiosLike.isAxiosError && axiosLike.message) return axiosLike.message;\n\n // Native Error\n if (errorObject instanceof Error) return errorObject.message;\n\n // ToastrMessage (string, React element, array, or notice-shape object)\n return resolveMessage(errorObject as ToastrMessage);\n }\n\n return \"Something went wrong.\";\n}\n\nfunction parseConfig(args: unknown[]): ToastrConfig {\n if (args.length === 0) return {};\n\n const first = args[0];\n if (typeof first === \"object\" && first !== null && !Array.isArray(first)) {\n return first as ToastrConfig;\n }\n\n // Legacy positional args: buttonLabel, onClick, customConfig, showIcon\n const [buttonLabel, onClick, customConfig, showIcon] = args as [\n string?,\n (() => void)?,\n Record<string, unknown>?,\n boolean?,\n ];\n\n return {\n ...(buttonLabel ? { buttonLabel } : {}),\n ...(onClick ? { onClick } : {}),\n ...(showIcon !== undefined ? { showIcon } : {}),\n ...(customConfig ?? {}),\n };\n}\n\nexport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n};\n","import type { ReactNode } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { ToastrBody } from \"./ToastrBody\";\nimport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n} from \"./utils\";\n\nexport interface ToastrConfig {\n /** Label for an action button inside the toast. */\n buttonLabel?: string;\n /** Callback when the action button is clicked. */\n onClick?: () => void;\n /** Whether to show the type icon in the toast. */\n showIcon?: boolean;\n /** Whether the toast can be dismissed (shows X button + enables swipe). Defaults to true. */\n dismissible?: boolean;\n /** Additional sonner toast options (duration, position, etc.). */\n [key: string]: unknown;\n}\n\nexport type ToastrMessage =\n | ReactNode\n | { noticeCode?: string; customMessage?: string; notice?: string };\n\nexport type ToastrErrorInput =\n | string\n | Error\n | {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n }\n | ToastrMessage;\n\ntype SonnerType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nfunction showToast(\n type: SonnerType,\n message: ReactNode,\n config?: ToastrConfig\n): string | number | undefined {\n const {\n buttonLabel,\n onClick,\n showIcon,\n dismissible = true,\n onDismiss: userOnDismiss,\n onAutoClose: userOnAutoClose,\n ...restConfig\n } = config ?? {};\n\n const key = toastKey(type, message, buttonLabel);\n\n if (key !== null && activeToasts.has(key)) return undefined;\n if (key !== null) activeToasts.add(key);\n\n const options: Record<string, unknown> = {\n ...restConfig,\n position: getContentDir() === \"rtl\" ? \"bottom-right\" : \"bottom-left\",\n dismissible,\n onDismiss: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnDismiss as ((t: unknown) => void) | undefined)?.(t);\n },\n onAutoClose: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnAutoClose as ((t: unknown) => void) | undefined)?.(t);\n },\n };\n\n return toast.custom(\n id => (\n <ToastrBody\n buttonLabel={buttonLabel}\n dismissible={dismissible}\n message={message}\n showIcon={showIcon}\n type={type}\n onAction={() => {\n try {\n onClick?.();\n } finally {\n toast.dismiss(id);\n }\n }}\n onDismiss={() => toast.dismiss(id)}\n />\n ),\n options\n );\n}\n\nconst Toastr = {\n success(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"success\", resolveMessage(message), parseConfig(args));\n },\n\n info(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n show(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n warning(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"warning\", resolveMessage(message), parseConfig(args));\n },\n\n error(errorObject: ToastrErrorInput, ...args: unknown[]) {\n const msg = resolveErrorMessage(errorObject);\n return showToast(\"error\", msg, parseConfig(args));\n },\n};\n\nexport { Toastr };\n"],"names":["CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","XIcon"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toastr-BgT_Fq7J.js","sources":["../../src/components/Toastr/ToastrBody.tsx","../../src/components/Toastr/utils.ts","../../src/components/Toastr/Toastr.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n OctagonXIcon,\n TriangleAlertIcon,\n XIcon,\n type LucideIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\ntype ToastrType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst ICONS: Record<ToastrType, LucideIcon> = {\n success: CircleCheckIcon,\n info: InfoIcon,\n warning: TriangleAlertIcon,\n error: OctagonXIcon,\n};\n\nconst VARIANT_CLASSES: Record<ToastrType, string> = {\n success:\n \"bg-success-solid text-success-solid-foreground border-success-solid/30\",\n error: \"bg-error-solid text-error-solid-foreground border-error-solid/30\",\n warning:\n \"bg-warning-solid text-warning-solid-foreground border-warning-solid/30\",\n info: \"bg-info-solid text-info-solid-foreground border-info-solid/30\",\n};\n\nexport interface ToastrBodyProps {\n type: ToastrType;\n message: ReactNode;\n showIcon?: boolean;\n dismissible?: boolean;\n buttonLabel?: string;\n onAction?: () => void;\n onDismiss: () => void;\n}\n\nconst ToastrBody = ({\n type,\n message,\n showIcon = true,\n dismissible = true,\n buttonLabel,\n onAction,\n onDismiss,\n}: ToastrBodyProps) => {\n const Icon = ICONS[type];\n\n return (\n <div\n role={type === \"error\" || type === \"warning\" ? \"alert\" : \"status\"}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg\",\n VARIANT_CLASSES[type]\n )}\n >\n {showIcon && <Icon aria-hidden className=\"size-4 shrink-0\" />}\n <span className=\"flex-1\">{message}</span>\n {buttonLabel && (\n <button\n type=\"button\"\n onClick={onAction}\n className=\"shrink-0 text-sm font-medium underline-offset-2 hover:underline\"\n >\n {buttonLabel}\n </button>\n )}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n className=\"shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <XIcon aria-hidden className=\"size-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport { ToastrBody };\n","import { isValidElement, type ReactNode } from \"react\";\n\nimport type { ToastrConfig, ToastrErrorInput, ToastrMessage } from \"./Toastr\";\n\nconst activeToasts = new Set<string>();\n\nfunction toastKey(\n type: string,\n message: ReactNode,\n buttonLabel?: string\n): string | null {\n if (typeof message !== \"string\") return null;\n return `${type}::${message}::${buttonLabel ?? \"\"}`;\n}\n\nfunction getContentDir(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") return \"ltr\";\n return (\n (document.documentElement.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n (document.body.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n \"ltr\"\n );\n}\n\nfunction resolveMessage(message: ToastrMessage): ReactNode {\n if (typeof message === \"string\") return message;\n if (isValidElement(message)) return message;\n // Arrays of ReactNodes (e.g. [<a/>, \" \", <b/>]) render natively via {message}.\n if (Array.isArray(message)) return message;\n if (message && typeof message === \"object\") {\n const obj = message as {\n noticeCode?: string;\n customMessage?: string;\n notice?: string;\n };\n if (obj.customMessage) return obj.customMessage;\n if (obj.notice) return obj.notice;\n if (obj.noticeCode) return obj.noticeCode;\n }\n return String(message);\n}\n\nfunction resolveErrorMessage(errorObject: ToastrErrorInput): ReactNode {\n if (typeof errorObject === \"string\") return errorObject;\n\n if (errorObject && typeof errorObject === \"object\") {\n // Axios-style error\n const axiosLike = errorObject as {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n };\n\n if (axiosLike.response?.data) {\n const data = axiosLike.response.data;\n if (data.customMessage) return String(data.customMessage);\n if (data.error) return String(data.error);\n if (Array.isArray(data.errors)) return data.errors.join(\"\\n\");\n if (data.noticeCode) return String(data.noticeCode);\n }\n\n if (axiosLike.isAxiosError && axiosLike.message) return axiosLike.message;\n\n // Native Error\n if (errorObject instanceof Error) return errorObject.message;\n\n // ToastrMessage (string, React element, array, or notice-shape object)\n return resolveMessage(errorObject as ToastrMessage);\n }\n\n return \"Something went wrong.\";\n}\n\nfunction parseConfig(args: unknown[]): ToastrConfig {\n if (args.length === 0) return {};\n\n const first = args[0];\n if (typeof first === \"object\" && first !== null && !Array.isArray(first)) {\n return first as ToastrConfig;\n }\n\n // Legacy positional args: buttonLabel, onClick, customConfig, showIcon\n const [buttonLabel, onClick, customConfig, showIcon] = args as [\n string?,\n (() => void)?,\n Record<string, unknown>?,\n boolean?,\n ];\n\n return {\n ...(buttonLabel ? { buttonLabel } : {}),\n ...(onClick ? { onClick } : {}),\n ...(showIcon !== undefined ? { showIcon } : {}),\n ...(customConfig ?? {}),\n };\n}\n\nexport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n};\n","import type { ReactNode } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { ToastrBody } from \"./ToastrBody\";\nimport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n} from \"./utils\";\n\nexport interface ToastrConfig {\n /** Label for an action button inside the toast. */\n buttonLabel?: string;\n /** Callback when the action button is clicked. */\n onClick?: () => void;\n /** Whether to show the type icon in the toast. */\n showIcon?: boolean;\n /** Whether the toast can be dismissed (shows X button + enables swipe). Defaults to true. */\n dismissible?: boolean;\n /** Additional sonner toast options (duration, position, etc.). */\n [key: string]: unknown;\n}\n\nexport type ToastrMessage =\n | ReactNode\n | { noticeCode?: string; customMessage?: string; notice?: string };\n\nexport type ToastrErrorInput =\n | string\n | Error\n | {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n }\n | ToastrMessage;\n\ntype SonnerType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nfunction showToast(\n type: SonnerType,\n message: ReactNode,\n config?: ToastrConfig\n): string | number | undefined {\n const {\n buttonLabel,\n onClick,\n showIcon,\n dismissible = true,\n onDismiss: userOnDismiss,\n onAutoClose: userOnAutoClose,\n ...restConfig\n } = config ?? {};\n\n const key = toastKey(type, message, buttonLabel);\n\n if (key !== null && activeToasts.has(key)) return undefined;\n if (key !== null) activeToasts.add(key);\n\n const options: Record<string, unknown> = {\n ...restConfig,\n position: getContentDir() === \"rtl\" ? \"bottom-right\" : \"bottom-left\",\n dismissible,\n onDismiss: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnDismiss as ((t: unknown) => void) | undefined)?.(t);\n },\n onAutoClose: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnAutoClose as ((t: unknown) => void) | undefined)?.(t);\n },\n };\n\n return toast.custom(\n id => (\n <ToastrBody\n buttonLabel={buttonLabel}\n dismissible={dismissible}\n message={message}\n showIcon={showIcon}\n type={type}\n onAction={() => {\n try {\n onClick?.();\n } finally {\n toast.dismiss(id);\n }\n }}\n onDismiss={() => toast.dismiss(id)}\n />\n ),\n options\n );\n}\n\nconst Toastr = {\n success(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"success\", resolveMessage(message), parseConfig(args));\n },\n\n info(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n show(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n warning(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"warning\", resolveMessage(message), parseConfig(args));\n },\n\n error(errorObject: ToastrErrorInput, ...args: unknown[]) {\n const msg = resolveErrorMessage(errorObject);\n return showToast(\"error\", msg, parseConfig(args));\n },\n};\n\nexport { Toastr };\n"],"names":["CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","jsxs","cn","jsx","XIcon","isValidElement","toast"],"mappings":"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"}