robot-toast 2.0.0-beta.2 → 2.0.0-beta.4
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/README.md +34 -4
- package/dist/index.d.mts +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +69 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +69 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/MIGRATION.md +0 -192
package/README.md
CHANGED
|
@@ -39,7 +39,7 @@ A lightweight, zero-dependency, framework-agnostic toast notification library fe
|
|
|
39
39
|
|
|
40
40
|
- **36% smaller core bundle** (61 KB → 39 KB). Robots moved to a tree-shakeable subpath — only the ones you import end up in your bundle.
|
|
41
41
|
- **Opt-in robots.** Omitting `robotVariant` renders *no robot* now. Pass `'default'` or import from `robot-toast/robots` to bring one back.
|
|
42
|
-
- **
|
|
42
|
+
- **Inline buttons.** Pass a `buttons` array for Undo / Retry / Cancel-style inline CTAs — rendered in array order, optional `className` per button for custom visual hierarchy.
|
|
43
43
|
- **`toast.promise()`** — attach loading/success/error toasts to any promise.
|
|
44
44
|
- **React subpath.** `useRobotToast()` + `useToastOnMount()` as optional ergonomic bindings.
|
|
45
45
|
- **ARIA roles.** `role="alert"` for `error`/`warning`, `role="status"` elsewhere, plus `aria-atomic` and a labeled close button.
|
|
@@ -117,6 +117,33 @@ Prefer the built-in inline SVG with no extra import?
|
|
|
117
117
|
toast({ message: 'Hello', robotVariant: 'default' });
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
+
## Inline buttons
|
|
121
|
+
|
|
122
|
+
Add inline buttons for patterns like Undo, Retry, or Confirm / Cancel. They render in array order — the caller controls the visual hierarchy:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
// Undo pattern — one button
|
|
126
|
+
toast({
|
|
127
|
+
message: 'File deleted',
|
|
128
|
+
buttons: [
|
|
129
|
+
{ label: 'Undo', onClick: () => restoreFile() },
|
|
130
|
+
],
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Confirm + cancel — cancel on the left, primary CTA on the right
|
|
134
|
+
toast({
|
|
135
|
+
message: 'Send this email to 1,200 people?',
|
|
136
|
+
buttons: [
|
|
137
|
+
{ label: 'Cancel', onClick: () => abort() },
|
|
138
|
+
{ label: 'Send', onClick: () => send(), className: 'my-primary' },
|
|
139
|
+
],
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Clicking any button fires its `onClick` and then closes the toast automatically. A callback that throws is logged and the toast still closes, so a bad handler can't strand the toast on screen.
|
|
144
|
+
|
|
145
|
+
All buttons get a neutral outline style by default. Pass a custom `className` on any button to override — e.g. mark one as a filled CTA via your own CSS, or use Tailwind utility classes directly.
|
|
146
|
+
|
|
120
147
|
## Promise lifecycle
|
|
121
148
|
|
|
122
149
|
```ts
|
|
@@ -251,6 +278,7 @@ toast.success({ message: 'Deployed!', theme: 'colored', position: 'top-center',
|
|
|
251
278
|
| `rtl` | `boolean` | `false` | Right-to-left layout |
|
|
252
279
|
| `limit` | `number` | `0` | Max toasts visible at once. `0` = unlimited. Excess is queued |
|
|
253
280
|
| `newestOnTop` | `boolean` | `false` | Stack newest toasts above older ones |
|
|
281
|
+
| `buttons` | `Array<{ label: string; onClick: (e: MouseEvent) => void; className?: string }>` | — | Inline buttons rendered in array order. Each click fires `onClick` then closes the toast. |
|
|
254
282
|
| `onOpen` | `() => void` | — | Callback fired when the toast finishes its entrance |
|
|
255
283
|
| `onClose` | `() => void` | — | Callback fired after the toast fully exits |
|
|
256
284
|
|
|
@@ -331,13 +359,15 @@ toast({ message: 'Slide!', transition: 'slide' });
|
|
|
331
359
|
|
|
332
360
|
---
|
|
333
361
|
|
|
334
|
-
## Drag
|
|
362
|
+
## Drag & responsive layout
|
|
335
363
|
|
|
336
364
|
When `draggable` is on (default):
|
|
337
365
|
|
|
338
366
|
- **Drag anywhere** on the toast to move it. On release it snaps to the nearest horizontal edge — including when you drag all the way across the screen.
|
|
339
|
-
-
|
|
340
|
-
- Use the **close button** or `toast.closeById()` / `toast.closeAll()` to dismiss programmatically.
|
|
367
|
+
- `touch-action: none` prevents the browser from fighting the drag, and rect dimensions are cached on pointerdown to eliminate layout-thrash jank on low-end devices.
|
|
368
|
+
- Use the **close button**, an **action button**, or `toast.closeById()` / `toast.closeAll()` to dismiss programmatically.
|
|
369
|
+
|
|
370
|
+
**On viewports ≤ 600 px** the toast shrinks slightly (tighter gutters, smaller robot, smaller font) but keeps its configured position preset. Drag still works everywhere.
|
|
341
371
|
|
|
342
372
|
---
|
|
343
373
|
|
package/dist/index.d.mts
CHANGED
|
@@ -18,6 +18,30 @@ type ToastType = typeof TOAST_TYPES[number];
|
|
|
18
18
|
type ToastTheme = typeof TOAST_THEMES[number];
|
|
19
19
|
/** Type derived from TOAST_TRANSITIONS constant */
|
|
20
20
|
type TransitionType = typeof TOAST_TRANSITIONS[number];
|
|
21
|
+
/**
|
|
22
|
+
* A button rendered inside the toast. Pass an array of these as `buttons`
|
|
23
|
+
* to add inline CTAs like "Undo" / "Retry" / "Cancel":
|
|
24
|
+
*
|
|
25
|
+
* toast({
|
|
26
|
+
* message: 'File deleted',
|
|
27
|
+
* buttons: [
|
|
28
|
+
* { label: 'Undo', onClick: () => restore() },
|
|
29
|
+
* ],
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* Buttons render in array order. Clicking any of them fires its `onClick`
|
|
33
|
+
* and then closes the toast. Visual hierarchy is up to you — pass a custom
|
|
34
|
+
* `className` to override the default neutral style (e.g. to mark the
|
|
35
|
+
* primary CTA as filled/bold and a secondary as muted).
|
|
36
|
+
*/
|
|
37
|
+
interface ToastButton {
|
|
38
|
+
/** Visible button text. Keep it short (1–2 words). */
|
|
39
|
+
label: string;
|
|
40
|
+
/** Fired before the toast closes. Receives the click event. */
|
|
41
|
+
onClick: (event: MouseEvent) => void;
|
|
42
|
+
/** Optional extra class appended to the button element for custom styling. */
|
|
43
|
+
className?: string;
|
|
44
|
+
}
|
|
21
45
|
interface RobotToastOptions {
|
|
22
46
|
/** The message text to display in the toast */
|
|
23
47
|
message: string;
|
|
@@ -78,6 +102,12 @@ interface RobotToastOptions {
|
|
|
78
102
|
rtl?: boolean;
|
|
79
103
|
/** Entry / exit transition style. Default: 'bounce' */
|
|
80
104
|
transition?: TransitionType;
|
|
105
|
+
/**
|
|
106
|
+
* Inline buttons to render inside the toast (e.g. Undo, Retry, Cancel).
|
|
107
|
+
* Rendered in array order. Each click fires the button's `onClick` and
|
|
108
|
+
* then closes the toast automatically.
|
|
109
|
+
*/
|
|
110
|
+
buttons?: ToastButton[];
|
|
81
111
|
/** Called when the toast finishes its enter animation and is fully visible. */
|
|
82
112
|
onOpen?: () => void;
|
|
83
113
|
/** Called after the toast has fully exited the screen. */
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,30 @@ type ToastType = typeof TOAST_TYPES[number];
|
|
|
18
18
|
type ToastTheme = typeof TOAST_THEMES[number];
|
|
19
19
|
/** Type derived from TOAST_TRANSITIONS constant */
|
|
20
20
|
type TransitionType = typeof TOAST_TRANSITIONS[number];
|
|
21
|
+
/**
|
|
22
|
+
* A button rendered inside the toast. Pass an array of these as `buttons`
|
|
23
|
+
* to add inline CTAs like "Undo" / "Retry" / "Cancel":
|
|
24
|
+
*
|
|
25
|
+
* toast({
|
|
26
|
+
* message: 'File deleted',
|
|
27
|
+
* buttons: [
|
|
28
|
+
* { label: 'Undo', onClick: () => restore() },
|
|
29
|
+
* ],
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* Buttons render in array order. Clicking any of them fires its `onClick`
|
|
33
|
+
* and then closes the toast. Visual hierarchy is up to you — pass a custom
|
|
34
|
+
* `className` to override the default neutral style (e.g. to mark the
|
|
35
|
+
* primary CTA as filled/bold and a secondary as muted).
|
|
36
|
+
*/
|
|
37
|
+
interface ToastButton {
|
|
38
|
+
/** Visible button text. Keep it short (1–2 words). */
|
|
39
|
+
label: string;
|
|
40
|
+
/** Fired before the toast closes. Receives the click event. */
|
|
41
|
+
onClick: (event: MouseEvent) => void;
|
|
42
|
+
/** Optional extra class appended to the button element for custom styling. */
|
|
43
|
+
className?: string;
|
|
44
|
+
}
|
|
21
45
|
interface RobotToastOptions {
|
|
22
46
|
/** The message text to display in the toast */
|
|
23
47
|
message: string;
|
|
@@ -78,6 +102,12 @@ interface RobotToastOptions {
|
|
|
78
102
|
rtl?: boolean;
|
|
79
103
|
/** Entry / exit transition style. Default: 'bounce' */
|
|
80
104
|
transition?: TransitionType;
|
|
105
|
+
/**
|
|
106
|
+
* Inline buttons to render inside the toast (e.g. Undo, Retry, Cancel).
|
|
107
|
+
* Rendered in array order. Each click fires the button's `onClick` and
|
|
108
|
+
* then closes the toast automatically.
|
|
109
|
+
*/
|
|
110
|
+
buttons?: ToastButton[];
|
|
81
111
|
/** Called when the toast finishes its enter animation and is fully visible. */
|
|
82
112
|
onOpen?: () => void;
|
|
83
113
|
/** Called after the toast has fully exited the screen. */
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var m=class m{constructor(){typeof document>"u"||m.injected||(m.injected=true,this.injectCSS());}injectCSS(){let t="robot-toast-styles";if(document.getElementById(t))return;let o=`
|
|
2
2
|
/* RobotToast v2 - CSS Styles */
|
|
3
3
|
|
|
4
4
|
/* \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 */
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
width: fit-content;
|
|
130
130
|
min-width: 120px;
|
|
131
131
|
max-width: min(400px, calc(100vw - 120px));
|
|
132
|
-
padding:
|
|
132
|
+
padding: 10px 40px 0 14px;
|
|
133
133
|
border-radius: 8px;
|
|
134
134
|
margin: 0;
|
|
135
135
|
opacity: 0;
|
|
@@ -289,6 +289,60 @@
|
|
|
289
289
|
min-height: 1.5em;
|
|
290
290
|
}
|
|
291
291
|
|
|
292
|
+
/* \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 */
|
|
293
|
+
/* INLINE BUTTONS \u2014 render via buttons: [{label, onClick, className?}, ...] */
|
|
294
|
+
/* Buttons render in array order. Default style is neutral; consumers layer */
|
|
295
|
+
/* their own visual hierarchy by passing a className. */
|
|
296
|
+
/* \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 */
|
|
297
|
+
|
|
298
|
+
.robot-toast-actions {
|
|
299
|
+
display: flex;
|
|
300
|
+
gap: 8px;
|
|
301
|
+
justify-content: flex-end;
|
|
302
|
+
align-items: center;
|
|
303
|
+
margin-top: 8px;
|
|
304
|
+
padding-bottom: 10px;
|
|
305
|
+
flex-wrap: wrap;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.robot-toast-btn {
|
|
309
|
+
appearance: none;
|
|
310
|
+
font: inherit;
|
|
311
|
+
font-size: 13px;
|
|
312
|
+
font-weight: 600;
|
|
313
|
+
line-height: 1;
|
|
314
|
+
padding: 6px 12px;
|
|
315
|
+
border-radius: 6px;
|
|
316
|
+
cursor: pointer;
|
|
317
|
+
transition: background 0.15s ease, color 0.15s ease, transform 0.05s ease;
|
|
318
|
+
white-space: nowrap;
|
|
319
|
+
background: #fff;
|
|
320
|
+
color: #18181b;
|
|
321
|
+
border: 1px solid #e4e4e7;
|
|
322
|
+
}
|
|
323
|
+
.robot-toast-btn:hover { background: #f4f4f5; }
|
|
324
|
+
.robot-toast-btn:active { transform: scale(0.97); }
|
|
325
|
+
|
|
326
|
+
/* Dark theme \u2014 inverted neutral */
|
|
327
|
+
.robot-toast-message.robot-toast-theme-dark .robot-toast-btn {
|
|
328
|
+
background: #18181b;
|
|
329
|
+
color: #fafafa;
|
|
330
|
+
border-color: #3f3f46;
|
|
331
|
+
}
|
|
332
|
+
.robot-toast-message.robot-toast-theme-dark .robot-toast-btn:hover {
|
|
333
|
+
background: #27272a;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Colored theme \u2014 translucent whites keep contrast on any gradient */
|
|
337
|
+
.robot-toast-message.robot-toast-theme-colored .robot-toast-btn {
|
|
338
|
+
background: rgba(255, 255, 255, 0.95);
|
|
339
|
+
color: #18181b;
|
|
340
|
+
border-color: transparent;
|
|
341
|
+
}
|
|
342
|
+
.robot-toast-message.robot-toast-theme-colored .robot-toast-btn:hover {
|
|
343
|
+
background: #fff;
|
|
344
|
+
}
|
|
345
|
+
|
|
292
346
|
/* \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 */
|
|
293
347
|
/* PROGRESS BAR */
|
|
294
348
|
/* \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 */
|
|
@@ -543,6 +597,13 @@
|
|
|
543
597
|
/* RESPONSIVE - Mobile / small-screen tweaks */
|
|
544
598
|
/* \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 */
|
|
545
599
|
|
|
600
|
+
/*
|
|
601
|
+
* Small-viewport tweaks. No !important / edge-to-edge override here \u2014 the
|
|
602
|
+
* wrapper keeps its configured position preset and the message box stays
|
|
603
|
+
* content-sized (just capped by max-width so it doesn't overflow). Drag
|
|
604
|
+
* still works everywhere because no stylesheet rule competes with the
|
|
605
|
+
* inline position the drag handler writes.
|
|
606
|
+
*/
|
|
546
607
|
@media (max-width: 600px) {
|
|
547
608
|
.robot-toast-wrapper {
|
|
548
609
|
gap: 8px;
|
|
@@ -550,16 +611,12 @@
|
|
|
550
611
|
}
|
|
551
612
|
|
|
552
613
|
.robot-toast-wrapper.robot-toast-top-right,
|
|
553
|
-
.robot-toast-wrapper.robot-toast-bottom-right {
|
|
554
|
-
right: 12px;
|
|
555
|
-
}
|
|
614
|
+
.robot-toast-wrapper.robot-toast-bottom-right { right: 12px; }
|
|
556
615
|
.robot-toast-wrapper.robot-toast-top-left,
|
|
557
|
-
.robot-toast-wrapper.robot-toast-bottom-left
|
|
558
|
-
left: 12px;
|
|
559
|
-
}
|
|
616
|
+
.robot-toast-wrapper.robot-toast-bottom-left { left: 12px; }
|
|
560
617
|
.robot-toast-wrapper.robot-toast-top-right,
|
|
561
618
|
.robot-toast-wrapper.robot-toast-top-left,
|
|
562
|
-
.robot-toast-wrapper.robot-toast-top-center
|
|
619
|
+
.robot-toast-wrapper.robot-toast-top-center { top: 12px; }
|
|
563
620
|
.robot-toast-wrapper.robot-toast-bottom-right,
|
|
564
621
|
.robot-toast-wrapper.robot-toast-bottom-left,
|
|
565
622
|
.robot-toast-wrapper.robot-toast-bottom-center { bottom: 12px; }
|
|
@@ -579,7 +636,7 @@
|
|
|
579
636
|
min-width: 100px;
|
|
580
637
|
max-width: calc(100vw - 48px - 24px - 8px);
|
|
581
638
|
font-size: 13px;
|
|
582
|
-
padding:
|
|
639
|
+
padding: 10px 36px 0 12px;
|
|
583
640
|
}
|
|
584
641
|
|
|
585
642
|
.robot-toast-text {
|
|
@@ -603,7 +660,7 @@
|
|
|
603
660
|
max-width: calc(100vw - 40px - 20px - 8px);
|
|
604
661
|
}
|
|
605
662
|
}
|
|
606
|
-
`,e=document.createElement("style");e.id=t,e.textContent=o,document.head.appendChild(e);}};h.injected=false;var g=h,T=g;var R=1;function k(){return R++}var L=16,y=class{constructor(t,o,e){this.progressBar=null;this.timerStart=null;this.closeTimeout=null;this.isDragging=false;this.dragOffsetX=0;this.dragOffsetY=0;this.dragWidth=0;this.dragHeight=0;this.isHovered=false;this.isFocusLost=false;this.isClosed=false;this.cleanupFns=[];this.id=t,this.onRemove=e;let s={message:o.message,autoClose:o.autoClose??5e3,position:o.position??"bottom-right",type:o.type??"default",theme:o.theme??"light",style:o.style,typeSpeed:o.typeSpeed??30,robotVariant:o.robotVariant??"",hideProgressBar:o.hideProgressBar??false,pauseOnFocusLoss:o.pauseOnFocusLoss??true,draggable:o.draggable??true,nearScreen:o.nearScreen??true,pauseOnHover:o.pauseOnHover??true,rtl:o.rtl??false,transition:o.transition??"bounce",onOpen:o.onOpen,onClose:o.onClose};this.options=s;let r=s.position.includes("left"),i;s.nearScreen?i=r?"left":"right":i=r?"right":"left",this.currentRobotSide=i,this.autoCloseDuration=typeof s.autoClose=="number"?s.autoClose:s.autoClose?5e3:0,this.remainingTime=this.autoCloseDuration,this.wrapper=this.buildWrapper(),this.robotEl=this.buildRobot(),this.messageBox=this.buildMessageBox(),this.messageText=this.messageBox.querySelector(".robot-toast-text"),this.progressBar=this.messageBox.querySelector(".robot-toast-progress-bar"),s.message===""&&this.messageBox.classList.add("robot-toast-empty"),this.assembleLayout(),document.body.appendChild(this.wrapper),s.draggable&&this.initDrag(),s.pauseOnFocusLoss&&this.initFocusWatcher(),s.pauseOnHover&&this.initHoverWatcher(),requestAnimationFrame(()=>this.playEntrance());}close(){this.isClosed||(this.isClosed=true,this.cancelTimer(),this.cleanupFns.forEach(t=>t()),this.cleanupFns=[],this.playExit(()=>{this.wrapper.parentNode&&this.wrapper.parentNode.removeChild(this.wrapper),this.options.onClose?.(),this.onRemove(this.id);}));}shiftVertical(t){this.options.position.startsWith("bottom")?this.wrapper.style.bottom=`${t}px`:this.wrapper.style.top=`${t}px`;}getWrapperHeight(){return this.wrapper.getBoundingClientRect().height||90}buildWrapper(){let t=document.createElement("div"),o=["robot-toast-wrapper",`robot-toast-${this.options.position}`];this.options.rtl&&o.push("robot-toast-rtl"),t.className=o.join(" ");let e=this.options.type==="error"||this.options.type==="warning";return t.setAttribute("role",e?"alert":"status"),t.setAttribute("aria-live",e?"assertive":"polite"),t.setAttribute("aria-atomic","true"),t}resolveVariant(){let t=this.options.robotVariant;if(!t||t==="none")return "hidden";if(t==="default")return "default";let o=[".svg",".png",".jpg",".jpeg",".gif",".webp"];return t.startsWith("data:")||o.some(r=>t.toLowerCase().endsWith(r))?"image":"hidden"}buildRobot(){let t=document.createElement("div");t.className="robot-toast-robot";let o=this.resolveVariant();if(o==="hidden")return t.style.display="none",t;if(o==="default")return t.innerHTML=this.getBuiltinSVG(),t;let e=document.createElement("img");return e.src=this.options.robotVariant,e.alt="Robot",e.setAttribute("width","65"),e.setAttribute("height","70"),e.style.cssText="width:100%;height:100%;object-fit:contain;display:block;",e.onerror=()=>{t.innerHTML=this.getBuiltinSVG();},t.appendChild(e),t}buildMessageBox(){let t=document.createElement("div"),o=["robot-toast-message",`robot-toast-type-${this.options.type}`,`robot-toast-theme-${this.options.theme}`].filter(Boolean);t.className=o.join(" "),t.style.cursor=this.options.draggable?"grab":"default",this.options.style&&Object.entries(this.options.style).forEach(([p,c])=>{let m=p.replace(/-([a-z])/g,b=>b[1].toUpperCase());t.style[m]=c;});let e=document.createElement("button");e.className="robot-toast-close",e.innerHTML="×",e.title="Dismiss",e.type="button",e.setAttribute("aria-label","Dismiss notification"),e.addEventListener("click",p=>{p.stopPropagation(),this.close();}),t.appendChild(e);let s=document.createElement("div");s.className="robot-toast-text",t.appendChild(s);let r=document.createElement("div");r.className="robot-toast-progress-container",this.options.hideProgressBar&&(r.style.display="none");let i=document.createElement("div");return i.className="robot-toast-progress-bar",r.appendChild(i),t.appendChild(r),t}assembleLayout(){let{rtl:t}=this.options;this.wrapper.innerHTML="",(t?this.currentRobotSide==="right":this.currentRobotSide==="left")?(this.wrapper.appendChild(this.robotEl),this.wrapper.appendChild(this.messageBox)):(this.wrapper.appendChild(this.messageBox),this.wrapper.appendChild(this.robotEl));}playEntrance(){this.wrapper.classList.add("robot-toast-visible");let t=this.resolveVariant()==="hidden",o=this.options.message==="",e=()=>{if(o){this.options.onOpen?.(),this.afterTypingComplete();return}let s=this.options.transition==="bounce"?"message-enter":`message-enter-${this.options.transition}`;this.messageBox.classList.add(s);let r=()=>{this.messageBox.removeEventListener("animationend",r),this.messageBox.classList.remove(s),this.messageBox.style.opacity="1",this.messageBox.style.transform="none",this.options.onOpen?.(),this.startTyping();};this.messageBox.addEventListener("animationend",r,{once:true});};if(t)e();else {let s=this.currentRobotSide==="left"?"left":"right",r=this.options.transition!=="bounce"?`-${this.options.transition}`:"",i=`robot-enter-${s}${r}`;this.robotEl.classList.add(i);let p=()=>{this.robotEl.removeEventListener("animationend",p),this.robotEl.style.opacity="1",this.robotEl.classList.remove(i),this.robotEl.classList.add("robot-idle"),e();};this.robotEl.addEventListener("animationend",p,{once:true});}}playExit(t){let o=this.resolveVariant()==="hidden",e=this.options.message==="",s=()=>{if(this.messageBox.removeEventListener("animationend",s),o)this.wrapper.classList.remove("robot-toast-visible"),setTimeout(t,260);else {this.robotEl.classList.remove("robot-idle","robot-snap-left","robot-snap-right");let r=this.currentRobotSide==="left"?"left":"right",i=this.options.transition!=="bounce"?`-${this.options.transition}`:"",p=`robot-exit-${r}${i}`;this.robotEl.classList.add(p);let c=()=>{this.robotEl.removeEventListener("animationend",c),this.wrapper.classList.remove("robot-toast-visible"),setTimeout(t,260);};this.robotEl.addEventListener("animationend",c,{once:true});}};e?s():(this.messageBox.classList.add("message-exit"),this.messageBox.addEventListener("animationend",s,{once:true}));}startTyping(){let{message:t,typeSpeed:o}=this.options,e=this.messageText;if(o===0){e.textContent=t,this.afterTypingComplete();return}let s=0,r=true;this.cleanupFns.push(()=>{r=false;});let i=()=>{r&&(s<t.length?(e.textContent+=t.charAt(s++),setTimeout(i,o)):this.afterTypingComplete());};i();}afterTypingComplete(){this.autoCloseDuration>0&&!this.options.hideProgressBar&&this.progressBar&&(this.progressBar.style.animationDuration=`${this.autoCloseDuration}ms`,this.progressBar.offsetWidth,this.progressBar.classList.add("robot-toast-progress-auto"),(this.isHovered||this.isFocusLost)&&this.progressBar.classList.add("robot-toast-progress-paused")),!this.isHovered&&!this.isFocusLost&&this.startTimer();}startTimer(){this.autoCloseDuration<=0||this.remainingTime<=0||(this.timerStart=Date.now(),this.closeTimeout=setTimeout(()=>this.close(),this.remainingTime));}pauseTimer(){if(this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null,this.timerStart!==null)){let t=Date.now()-this.timerStart;this.remainingTime=Math.max(0,this.remainingTime-t),this.timerStart=null;}this.progressBar?.classList.add("robot-toast-progress-paused");}resumeTimer(){this.isHovered||this.isFocusLost||this.isDragging||(this.progressBar?.classList.remove("robot-toast-progress-paused"),this.startTimer());}cancelTimer(){this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null);}initHoverWatcher(){let t=()=>{this.isHovered=true,this.pauseTimer();},o=()=>{this.isHovered=false,this.resumeTimer();};this.wrapper.addEventListener("mouseenter",t),this.wrapper.addEventListener("mouseleave",o),this.cleanupFns.push(()=>{this.wrapper.removeEventListener("mouseenter",t),this.wrapper.removeEventListener("mouseleave",o);});}initFocusWatcher(){let t=()=>{this.isFocusLost=true,this.pauseTimer();},o=()=>{this.isFocusLost=false,this.resumeTimer();};window.addEventListener("blur",t),window.addEventListener("focus",o),this.cleanupFns.push(()=>{window.removeEventListener("blur",t),window.removeEventListener("focus",o);});}initDrag(){this.messageBox.style.cursor="grab";let t=s=>{if(s.target.closest(".robot-toast-close")||s.button!==void 0&&s.button!==0)return;s.preventDefault(),this.isDragging=true,this.pauseTimer();let r=this.wrapper.getBoundingClientRect();this.wrapper.classList.add("robot-toast-dragging"),this.wrapper.style.top=`${r.top}px`,this.wrapper.style.left=`${r.left}px`,this.wrapper.style.right="auto",this.wrapper.style.bottom="auto",this.wrapper.style.transform="none",this.dragWidth=r.width,this.dragHeight=r.height,this.dragOffsetX=s.clientX-r.left,this.dragOffsetY=s.clientY-r.top,this.messageBox.style.cursor="grabbing",this.wrapper.setPointerCapture(s.pointerId);},o=s=>{if(!this.isDragging)return;s.preventDefault();let r=window.innerWidth-this.dragWidth,i=window.innerHeight-this.dragHeight,p=Math.max(0,Math.min(s.clientX-this.dragOffsetX,r)),c=Math.max(0,Math.min(s.clientY-this.dragOffsetY,i));this.wrapper.style.left=`${p}px`,this.wrapper.style.top=`${c}px`;},e=s=>{if(!this.isDragging)return;this.isDragging=false,this.wrapper.classList.remove("robot-toast-dragging"),this.messageBox.style.cursor="grab";let r=parseFloat(this.wrapper.style.left)||0,i=parseFloat(this.wrapper.style.top)||0,p=r+this.dragWidth/2,c=window.innerWidth/2,m=p<c,b=this.options.nearScreen?m?"left":"right":m?"right":"left",v=m?20:window.innerWidth-this.dragWidth-20,E=Math.max(20,Math.min(i,window.innerHeight-this.dragHeight-20));if(this.wrapper.style.transition="left 0.45s cubic-bezier(0.34,1.56,0.64,1), top 0.4s cubic-bezier(0.34,1.56,0.64,1)",this.wrapper.style.left=`${v}px`,this.wrapper.style.top=`${E}px`,b!==this.currentRobotSide){this.currentRobotSide=b;let x=b==="left";this.robotEl.style.order=x?"0":"1",this.messageBox.style.order=x?"1":"0";let w=b==="left"?"robot-snap-left":"robot-snap-right";this.robotEl.classList.remove("robot-idle","robot-snap-left","robot-snap-right"),this.robotEl.classList.add(w),this.robotEl.addEventListener("animationend",()=>{this.robotEl.style.opacity="1",this.robotEl.classList.remove(w),this.robotEl.classList.add("robot-idle");},{once:true});}setTimeout(()=>{this.wrapper.style.transition="";},500),this.resumeTimer();};this.wrapper.addEventListener("pointerdown",t),this.wrapper.addEventListener("pointermove",o),this.wrapper.addEventListener("pointerup",e),this.wrapper.addEventListener("pointercancel",e),this.cleanupFns.push(()=>{this.wrapper.removeEventListener("pointerdown",t),this.wrapper.removeEventListener("pointermove",o),this.wrapper.removeEventListener("pointerup",e),this.wrapper.removeEventListener("pointercancel",e);});}getBuiltinSVG(){return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 120"
|
|
663
|
+
`,e=document.createElement("style");e.id=t,e.textContent=o,document.head.appendChild(e);}};m.injected=false;var g=m,T=g;var k=1;function R(){return k++}var B=16,y=class{constructor(t,o,e){this.progressBar=null;this.timerStart=null;this.closeTimeout=null;this.isDragging=false;this.dragOffsetX=0;this.dragOffsetY=0;this.dragWidth=0;this.dragHeight=0;this.isHovered=false;this.isFocusLost=false;this.isClosed=false;this.cleanupFns=[];this.id=t,this.onRemove=e;let s={message:o.message,autoClose:o.autoClose??5e3,position:o.position??"bottom-right",type:o.type??"default",theme:o.theme??"light",style:o.style,typeSpeed:o.typeSpeed??30,robotVariant:o.robotVariant??"",hideProgressBar:o.hideProgressBar??false,pauseOnFocusLoss:o.pauseOnFocusLoss??true,draggable:o.draggable??true,nearScreen:o.nearScreen??true,pauseOnHover:o.pauseOnHover??true,rtl:o.rtl??false,transition:o.transition??"bounce",buttons:o.buttons,onOpen:o.onOpen,onClose:o.onClose};this.options=s;let r=s.position.includes("left"),i;s.nearScreen?i=r?"left":"right":i=r?"right":"left",this.currentRobotSide=i,this.autoCloseDuration=typeof s.autoClose=="number"?s.autoClose:s.autoClose?5e3:0,this.remainingTime=this.autoCloseDuration,this.wrapper=this.buildWrapper(),this.robotEl=this.buildRobot(),this.messageBox=this.buildMessageBox(),this.messageText=this.messageBox.querySelector(".robot-toast-text"),this.progressBar=this.messageBox.querySelector(".robot-toast-progress-bar"),s.message===""&&this.messageBox.classList.add("robot-toast-empty"),this.assembleLayout(),document.body.appendChild(this.wrapper),s.draggable&&this.initDrag(),s.pauseOnFocusLoss&&this.initFocusWatcher(),s.pauseOnHover&&this.initHoverWatcher(),requestAnimationFrame(()=>this.playEntrance());}close(){this.isClosed||(this.isClosed=true,this.cancelTimer(),this.cleanupFns.forEach(t=>t()),this.cleanupFns=[],this.playExit(()=>{this.wrapper.parentNode&&this.wrapper.parentNode.removeChild(this.wrapper),this.options.onClose?.(),this.onRemove(this.id);}));}shiftVertical(t){this.options.position.startsWith("bottom")?this.wrapper.style.bottom=`${t}px`:this.wrapper.style.top=`${t}px`;}getWrapperHeight(){return this.wrapper.getBoundingClientRect().height||90}buildWrapper(){let t=document.createElement("div"),o=["robot-toast-wrapper",`robot-toast-${this.options.position}`];this.options.rtl&&o.push("robot-toast-rtl"),t.className=o.join(" ");let e=this.options.type==="error"||this.options.type==="warning";return t.setAttribute("role",e?"alert":"status"),t.setAttribute("aria-live",e?"assertive":"polite"),t.setAttribute("aria-atomic","true"),t}resolveVariant(){let t=this.options.robotVariant;if(!t||t==="none")return "hidden";if(t==="default")return "default";let o=[".svg",".png",".jpg",".jpeg",".gif",".webp"];return t.startsWith("data:")||o.some(r=>t.toLowerCase().endsWith(r))?"image":"hidden"}buildRobot(){let t=document.createElement("div");t.className="robot-toast-robot";let o=this.resolveVariant();if(o==="hidden")return t.style.display="none",t;if(o==="default")return t.innerHTML=this.getBuiltinSVG(),t;let e=document.createElement("img");return e.src=this.options.robotVariant,e.alt="Robot",e.setAttribute("width","65"),e.setAttribute("height","70"),e.style.cssText="width:100%;height:100%;object-fit:contain;display:block;",e.onerror=()=>{t.innerHTML=this.getBuiltinSVG();},t.appendChild(e),t}buildMessageBox(){let t=document.createElement("div"),o=["robot-toast-message",`robot-toast-type-${this.options.type}`,`robot-toast-theme-${this.options.theme}`].filter(Boolean);t.className=o.join(" "),t.style.cursor=this.options.draggable?"grab":"default",this.options.style&&Object.entries(this.options.style).forEach(([n,c])=>{let h=n.replace(/-([a-z])/g,b=>b[1].toUpperCase());t.style[h]=c;});let e=document.createElement("button");e.className="robot-toast-close",e.innerHTML="×",e.title="Dismiss",e.type="button",e.setAttribute("aria-label","Dismiss notification"),e.addEventListener("click",n=>{n.stopPropagation(),this.close();}),t.appendChild(e);let s=document.createElement("div");if(s.className="robot-toast-text",t.appendChild(s),this.options.buttons&&this.options.buttons.length>0){let n=document.createElement("div");n.className="robot-toast-actions",this.options.buttons.forEach(c=>n.appendChild(this.buildButton(c))),t.appendChild(n);}let r=document.createElement("div");r.className="robot-toast-progress-container",this.options.hideProgressBar&&(r.style.display="none");let i=document.createElement("div");return i.className="robot-toast-progress-bar",r.appendChild(i),t.appendChild(r),t}buildButton(t){let o=document.createElement("button");return o.type="button",o.className=t.className?`robot-toast-btn ${t.className}`:"robot-toast-btn",o.textContent=t.label,o.addEventListener("click",e=>{e.stopPropagation();try{t.onClick(e);}catch(s){console.error("[robot-toast] button onClick threw:",s);}this.close();}),o}assembleLayout(){let{rtl:t}=this.options;this.wrapper.innerHTML="",(t?this.currentRobotSide==="right":this.currentRobotSide==="left")?(this.wrapper.appendChild(this.robotEl),this.wrapper.appendChild(this.messageBox)):(this.wrapper.appendChild(this.messageBox),this.wrapper.appendChild(this.robotEl));}playEntrance(){this.wrapper.classList.add("robot-toast-visible");let t=this.resolveVariant()==="hidden",o=this.options.message==="",e=()=>{if(o){this.options.onOpen?.(),this.afterTypingComplete();return}let s=this.options.transition==="bounce"?"message-enter":`message-enter-${this.options.transition}`;this.messageBox.classList.add(s);let r=()=>{this.messageBox.removeEventListener("animationend",r),this.messageBox.classList.remove(s),this.messageBox.style.opacity="1",this.messageBox.style.transform="none",this.options.onOpen?.(),this.startTyping();};this.messageBox.addEventListener("animationend",r,{once:true});};if(t)e();else {let s=this.currentRobotSide==="left"?"left":"right",r=this.options.transition!=="bounce"?`-${this.options.transition}`:"",i=`robot-enter-${s}${r}`;this.robotEl.classList.add(i);let n=()=>{this.robotEl.removeEventListener("animationend",n),this.robotEl.style.opacity="1",this.robotEl.classList.remove(i),this.robotEl.classList.add("robot-idle"),e();};this.robotEl.addEventListener("animationend",n,{once:true});}}playExit(t){let o=this.resolveVariant()==="hidden",e=this.options.message==="",s=()=>{if(this.messageBox.removeEventListener("animationend",s),o)this.wrapper.classList.remove("robot-toast-visible"),setTimeout(t,260);else {this.robotEl.classList.remove("robot-idle","robot-snap-left","robot-snap-right");let r=this.currentRobotSide==="left"?"left":"right",i=this.options.transition!=="bounce"?`-${this.options.transition}`:"",n=`robot-exit-${r}${i}`;this.robotEl.classList.add(n);let c=()=>{this.robotEl.removeEventListener("animationend",c),this.wrapper.classList.remove("robot-toast-visible"),setTimeout(t,260);};this.robotEl.addEventListener("animationend",c,{once:true});}};e?s():(this.messageBox.classList.add("message-exit"),this.messageBox.addEventListener("animationend",s,{once:true}));}startTyping(){let{message:t,typeSpeed:o}=this.options,e=this.messageText;if(o===0){e.textContent=t,this.afterTypingComplete();return}let s=0,r=true;this.cleanupFns.push(()=>{r=false;});let i=()=>{r&&(s<t.length?(e.textContent+=t.charAt(s++),setTimeout(i,o)):this.afterTypingComplete());};i();}afterTypingComplete(){this.autoCloseDuration>0&&!this.options.hideProgressBar&&this.progressBar&&(this.progressBar.style.animationDuration=`${this.autoCloseDuration}ms`,this.progressBar.offsetWidth,this.progressBar.classList.add("robot-toast-progress-auto"),(this.isHovered||this.isFocusLost)&&this.progressBar.classList.add("robot-toast-progress-paused")),!this.isHovered&&!this.isFocusLost&&this.startTimer();}startTimer(){this.autoCloseDuration<=0||this.remainingTime<=0||(this.timerStart=Date.now(),this.closeTimeout=setTimeout(()=>this.close(),this.remainingTime));}pauseTimer(){if(this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null,this.timerStart!==null)){let t=Date.now()-this.timerStart;this.remainingTime=Math.max(0,this.remainingTime-t),this.timerStart=null;}this.progressBar?.classList.add("robot-toast-progress-paused");}resumeTimer(){this.isHovered||this.isFocusLost||this.isDragging||(this.progressBar?.classList.remove("robot-toast-progress-paused"),this.startTimer());}cancelTimer(){this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null);}initHoverWatcher(){let t=()=>{this.isHovered=true,this.pauseTimer();},o=()=>{this.isHovered=false,this.resumeTimer();};this.wrapper.addEventListener("mouseenter",t),this.wrapper.addEventListener("mouseleave",o),this.cleanupFns.push(()=>{this.wrapper.removeEventListener("mouseenter",t),this.wrapper.removeEventListener("mouseleave",o);});}initFocusWatcher(){let t=()=>{this.isFocusLost=true,this.pauseTimer();},o=()=>{this.isFocusLost=false,this.resumeTimer();};window.addEventListener("blur",t),window.addEventListener("focus",o),this.cleanupFns.push(()=>{window.removeEventListener("blur",t),window.removeEventListener("focus",o);});}initDrag(){this.messageBox.style.cursor="grab";let t=s=>{if(s.target.closest(".robot-toast-close, .robot-toast-btn")||s.button!==void 0&&s.button!==0)return;s.preventDefault(),this.isDragging=true,this.pauseTimer();let r=this.wrapper.getBoundingClientRect();this.wrapper.classList.add("robot-toast-dragging"),this.wrapper.style.top=`${r.top}px`,this.wrapper.style.left=`${r.left}px`,this.wrapper.style.right="auto",this.wrapper.style.bottom="auto",this.wrapper.style.transform="none",this.dragWidth=r.width,this.dragHeight=r.height,this.dragOffsetX=s.clientX-r.left,this.dragOffsetY=s.clientY-r.top,this.messageBox.style.cursor="grabbing",this.wrapper.setPointerCapture(s.pointerId);},o=s=>{if(!this.isDragging)return;s.preventDefault();let r=window.innerWidth-this.dragWidth,i=window.innerHeight-this.dragHeight,n=Math.max(0,Math.min(s.clientX-this.dragOffsetX,r)),c=Math.max(0,Math.min(s.clientY-this.dragOffsetY,i));this.wrapper.style.left=`${n}px`,this.wrapper.style.top=`${c}px`;},e=s=>{if(!this.isDragging)return;this.isDragging=false,this.wrapper.classList.remove("robot-toast-dragging"),this.messageBox.style.cursor="grab";let r=this.wrapper.getBoundingClientRect(),i=r.top,n=r.left+r.width/2,c=window.innerWidth/2,h=n<c,b=this.options.nearScreen?h?"left":"right":h?"right":"left",v=h?20:window.innerWidth-this.dragWidth-20,E=Math.max(20,Math.min(i,window.innerHeight-this.dragHeight-20));if(this.wrapper.style.transition="left 0.45s cubic-bezier(0.34,1.56,0.64,1), top 0.4s cubic-bezier(0.34,1.56,0.64,1)",this.wrapper.style.left=`${v}px`,this.wrapper.style.top=`${E}px`,b!==this.currentRobotSide){this.currentRobotSide=b;let x=b==="left";this.robotEl.style.order=x?"0":"1",this.messageBox.style.order=x?"1":"0";let w=b==="left"?"robot-snap-left":"robot-snap-right";this.robotEl.classList.remove("robot-idle","robot-snap-left","robot-snap-right"),this.robotEl.classList.add(w),this.robotEl.addEventListener("animationend",()=>{this.robotEl.style.opacity="1",this.robotEl.classList.remove(w),this.robotEl.classList.add("robot-idle");},{once:true});}setTimeout(()=>{this.wrapper.style.transition="";},500),this.resumeTimer();};this.wrapper.addEventListener("pointerdown",t),this.wrapper.addEventListener("pointermove",o),this.wrapper.addEventListener("pointerup",e),this.wrapper.addEventListener("pointercancel",e),this.cleanupFns.push(()=>{this.wrapper.removeEventListener("pointerdown",t),this.wrapper.removeEventListener("pointermove",o),this.wrapper.removeEventListener("pointerup",e),this.wrapper.removeEventListener("pointercancel",e);});}getBuiltinSVG(){return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 120"
|
|
607
664
|
width="100%" height="100%" role="img" aria-label="Robot">
|
|
608
665
|
<defs>
|
|
609
666
|
<linearGradient id="rtGrad${this.id}" x1="0" y1="0" x2="1" y2="1">
|
|
@@ -651,5 +708,5 @@
|
|
|
651
708
|
fill="url(#rtAccent${this.id})" stroke="#2B3A55" stroke-width="1.5"/>
|
|
652
709
|
<rect x="54" y="110" width="16" height="10" rx="5"
|
|
653
710
|
fill="url(#rtAccent${this.id})" stroke="#2B3A55" stroke-width="1.5"/>
|
|
654
|
-
</svg>`}},d=class d{constructor(){this.activeToasts=[];this.queue=[];this.globalLimit=0;new T;}static getInstance(){return d._instance||(d._instance=new d),d._instance}show(t){if(typeof document>"u")return -1;let o=
|
|
711
|
+
</svg>`}},d=class d{constructor(){this.activeToasts=[];this.queue=[];this.globalLimit=0;new T;}static getInstance(){return d._instance||(d._instance=new d),d._instance}show(t){if(typeof document>"u")return -1;let o=R(),e=t.limit??this.globalLimit;return e>0&&this.activeToasts.length>=e?(this.queue.push({options:t,id:o}),o):(this.spawnToast(t,o),o)}closeAll(){this.queue=[],[...this.activeToasts].forEach(t=>t.close());}closeById(t){let o=this.activeToasts.find(e=>e.id===t);o&&o.close(),this.queue=this.queue.filter(e=>e.id!==t);}spawnToast(t,o){let e=new y(o,t,r=>this.handleRemoved(r));t.newestOnTop??false?this.activeToasts.unshift(e):this.activeToasts.push(e),this.restack();}handleRemoved(t){if(this.activeToasts=this.activeToasts.filter(o=>o.id!==t),this.restack(),this.queue.length>0){let o=this.queue.shift();setTimeout(()=>this.spawnToast(o.options,o.id),120);}}restack(){let t={};this.activeToasts.forEach(o=>{let e=o.options.position;t[e]||(t[e]=[]),t[e].push(o);}),Object.keys(t).forEach(o=>{let e=t[o],s=20;e.forEach(r=>{r.shiftVertical(s),s+=r.getWrapperHeight()+B;});});}};d._instance=null;var l=d;function u(a=5e3){return new Promise((t,o)=>{if(typeof window>"u"){o(new Error("[RobotToast] Cannot run outside of a browser environment."));return}if(window.RobotToast){t(window.RobotToast);return}let e=Date.now(),s=setInterval(()=>{if(window.RobotToast){clearInterval(s),t(window.RobotToast);return}Date.now()-e>=a&&(clearInterval(s),o(new Error(`[RobotToast] Failed to load within ${a}ms.`)));},80);})}async function L(a){try{return (await u()).show(a)}catch(t){return console.error("[RobotToast] showRobotToast failed:",t),-1}}async function O(){try{(await u()).closeAll();}catch(a){console.error("[RobotToast] closeAllRobotToasts failed:",a);}}async function S(){return u()}var A=["top-right","top-left","top-center","bottom-right","bottom-left","bottom-center"],I=["default","info","success","warning","error"],C=["light","dark","colored"],P=["bounce","slide","zoom","flip"];function f(a){return typeof a=="string"?{message:a}:a}function p(a){return typeof window>"u"?-1:l.getInstance().show(f(a))}p.success=a=>p({...f(a),type:"success"});p.error=a=>p({...f(a),type:"error"});p.info=a=>p({...f(a),type:"info"});p.warning=a=>p({...f(a),type:"warning"});p.closeAll=()=>{typeof window>"u"||l.getInstance().closeAll();};p.closeById=a=>{typeof window>"u"||l.getInstance().closeById(a);};p.promise=(a,t)=>{if(typeof window>"u")return a;let o=typeof t.loading=="string"?{message:t.loading}:{message:"",...t.loading},e=p({autoClose:false,hideProgressBar:true,...o,typeSpeed:o.typeSpeed??0}),s=(r,i)=>{let n=typeof r=="string"?{message:r}:{message:"",...r};return {type:i,...n}};return a.then(r=>{p.closeById(e);let i=typeof t.success=="function"?t.success(r):t.success;return p(s(i,"success")),r},r=>{p.closeById(e);let i=typeof t.error=="function"?t.error(r):t.error;throw p(s(i,"error")),r})};function Y(){if(typeof window>"u"||window.__robotToastLoaded)return;window.__robotToastLoaded=true;let a={show:t=>l.getInstance().show(t),closeAll:()=>l.getInstance().closeAll(),closeById:t=>l.getInstance().closeById(t),getInstance:()=>l.getInstance()};window.RobotToast=a;}Y();exports.RobotToast=l;exports.RobotToastManager=l;exports.TOAST_POSITIONS=A;exports.TOAST_THEMES=C;exports.TOAST_TRANSITIONS=P;exports.TOAST_TYPES=I;exports.closeAllRobotToasts=O;exports.ensureRobotToastReady=u;exports.getRobotToastInstance=S;exports.showRobotToast=L;exports.toast=p;//# sourceMappingURL=index.js.map
|
|
655
712
|
//# sourceMappingURL=index.js.map
|