@7onic-ui/react 0.3.8 → 0.3.10

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.
Files changed (171) hide show
  1. package/README.md +2 -2
  2. package/dist/chart.js +1 -1
  3. package/dist/chart.js.map +1 -1
  4. package/dist/chart.mjs +4 -10
  5. package/dist/chart.mjs.map +1 -1
  6. package/dist/chunk-234NAXGV.mjs +252 -0
  7. package/dist/chunk-234NAXGV.mjs.map +1 -0
  8. package/dist/chunk-53MIUPSY.mjs +13 -0
  9. package/dist/chunk-53MIUPSY.mjs.map +1 -0
  10. package/dist/chunk-BN5BEA3V.mjs +195 -0
  11. package/dist/chunk-BN5BEA3V.mjs.map +1 -0
  12. package/dist/chunk-COW3B62M.mjs +214 -0
  13. package/dist/chunk-COW3B62M.mjs.map +1 -0
  14. package/dist/chunk-CTH6SN5Y.mjs +114 -0
  15. package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
  16. package/dist/chunk-D3NTQNDW.mjs +440 -0
  17. package/dist/chunk-D3NTQNDW.mjs.map +1 -0
  18. package/dist/chunk-DDRYEJBJ.mjs +164 -0
  19. package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
  20. package/dist/chunk-DJAEXCRU.mjs +190 -0
  21. package/dist/chunk-DJAEXCRU.mjs.map +1 -0
  22. package/dist/chunk-DRVHHEAY.mjs +145 -0
  23. package/dist/chunk-DRVHHEAY.mjs.map +1 -0
  24. package/dist/chunk-DTLNWOTR.mjs +482 -0
  25. package/dist/chunk-DTLNWOTR.mjs.map +1 -0
  26. package/dist/chunk-DYYQOHQR.mjs +214 -0
  27. package/dist/chunk-DYYQOHQR.mjs.map +1 -0
  28. package/dist/chunk-FHUAH6AJ.mjs +93 -0
  29. package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
  30. package/dist/chunk-GD4YE5AE.mjs +209 -0
  31. package/dist/chunk-GD4YE5AE.mjs.map +1 -0
  32. package/dist/chunk-GRCJ35DX.mjs +144 -0
  33. package/dist/chunk-GRCJ35DX.mjs.map +1 -0
  34. package/dist/chunk-HHX4GABH.mjs +129 -0
  35. package/dist/chunk-HHX4GABH.mjs.map +1 -0
  36. package/dist/chunk-IPCIC2BI.mjs +148 -0
  37. package/dist/chunk-IPCIC2BI.mjs.map +1 -0
  38. package/dist/chunk-IY3R2VGB.mjs +272 -0
  39. package/dist/chunk-IY3R2VGB.mjs.map +1 -0
  40. package/dist/chunk-JCJEVXER.mjs +170 -0
  41. package/dist/chunk-JCJEVXER.mjs.map +1 -0
  42. package/dist/chunk-KBPYAMGS.mjs +157 -0
  43. package/dist/chunk-KBPYAMGS.mjs.map +1 -0
  44. package/dist/chunk-LJJ6K4IU.mjs +318 -0
  45. package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
  46. package/dist/chunk-MRUVGHGP.mjs +375 -0
  47. package/dist/chunk-MRUVGHGP.mjs.map +1 -0
  48. package/dist/chunk-N4K2BDGM.mjs +153 -0
  49. package/dist/chunk-N4K2BDGM.mjs.map +1 -0
  50. package/dist/chunk-NWFMJWGX.mjs +165 -0
  51. package/dist/chunk-NWFMJWGX.mjs.map +1 -0
  52. package/dist/chunk-PTAPPOKU.mjs +117 -0
  53. package/dist/chunk-PTAPPOKU.mjs.map +1 -0
  54. package/dist/chunk-PVTBM7V7.mjs +316 -0
  55. package/dist/chunk-PVTBM7V7.mjs.map +1 -0
  56. package/dist/chunk-Q5WVLK2L.mjs +77 -0
  57. package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
  58. package/dist/chunk-RKSB2N5L.mjs +206 -0
  59. package/dist/chunk-RKSB2N5L.mjs.map +1 -0
  60. package/dist/chunk-S4DGVKBK.mjs +151 -0
  61. package/dist/chunk-S4DGVKBK.mjs.map +1 -0
  62. package/dist/chunk-S4T4PU7F.mjs +114 -0
  63. package/dist/chunk-S4T4PU7F.mjs.map +1 -0
  64. package/dist/chunk-SZPZOGPC.mjs +394 -0
  65. package/dist/chunk-SZPZOGPC.mjs.map +1 -0
  66. package/dist/chunk-T546XBQG.mjs +443 -0
  67. package/dist/chunk-T546XBQG.mjs.map +1 -0
  68. package/dist/chunk-UWTT5AE6.mjs +145 -0
  69. package/dist/chunk-UWTT5AE6.mjs.map +1 -0
  70. package/dist/chunk-V5UFWYFI.mjs +255 -0
  71. package/dist/chunk-V5UFWYFI.mjs.map +1 -0
  72. package/dist/chunk-VUPGBB5X.mjs +150 -0
  73. package/dist/chunk-VUPGBB5X.mjs.map +1 -0
  74. package/dist/chunk-W6YNEU53.mjs +175 -0
  75. package/dist/chunk-W6YNEU53.mjs.map +1 -0
  76. package/dist/chunk-WWSN5YME.mjs +222 -0
  77. package/dist/chunk-WWSN5YME.mjs.map +1 -0
  78. package/dist/chunk-XK52LYR4.mjs +182 -0
  79. package/dist/chunk-XK52LYR4.mjs.map +1 -0
  80. package/dist/chunk-YIAH6KHV.mjs +164 -0
  81. package/dist/chunk-YIAH6KHV.mjs.map +1 -0
  82. package/dist/chunk-Z6JWWCNL.mjs +108 -0
  83. package/dist/chunk-Z6JWWCNL.mjs.map +1 -0
  84. package/dist/chunk-ZDRUTJ4T.mjs +119 -0
  85. package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
  86. package/dist/components/accordion.mjs +19 -0
  87. package/dist/components/accordion.mjs.map +1 -0
  88. package/dist/components/alert.mjs +15 -0
  89. package/dist/components/alert.mjs.map +1 -0
  90. package/dist/components/avatar.mjs +23 -0
  91. package/dist/components/avatar.mjs.map +1 -0
  92. package/dist/components/badge.mjs +11 -0
  93. package/dist/components/badge.mjs.map +1 -0
  94. package/dist/components/breadcrumb.mjs +23 -0
  95. package/dist/components/breadcrumb.mjs.map +1 -0
  96. package/dist/components/button-group.mjs +11 -0
  97. package/dist/components/button-group.mjs.map +1 -0
  98. package/dist/components/button.mjs +12 -0
  99. package/dist/components/button.mjs.map +1 -0
  100. package/dist/components/card.mjs +25 -0
  101. package/dist/components/card.mjs.map +1 -0
  102. package/dist/components/chat-input.mjs +15 -0
  103. package/dist/components/chat-input.mjs.map +1 -0
  104. package/dist/components/chat-message.mjs +17 -0
  105. package/dist/components/chat-message.mjs.map +1 -0
  106. package/dist/components/checkbox.mjs +12 -0
  107. package/dist/components/checkbox.mjs.map +1 -0
  108. package/dist/components/divider.mjs +11 -0
  109. package/dist/components/divider.mjs.map +1 -0
  110. package/dist/components/drawer.mjs +33 -0
  111. package/dist/components/drawer.mjs.map +1 -0
  112. package/dist/components/dropdown.mjs +35 -0
  113. package/dist/components/dropdown.mjs.map +1 -0
  114. package/dist/components/field.mjs +17 -0
  115. package/dist/components/field.mjs.map +1 -0
  116. package/dist/components/icon-button.mjs +12 -0
  117. package/dist/components/icon-button.mjs.map +1 -0
  118. package/dist/components/input.mjs +12 -0
  119. package/dist/components/input.mjs.map +1 -0
  120. package/dist/components/metric-card.mjs +23 -0
  121. package/dist/components/metric-card.mjs.map +1 -0
  122. package/dist/components/modal.mjs +57 -0
  123. package/dist/components/modal.mjs.map +1 -0
  124. package/dist/components/navigation-menu.mjs +27 -0
  125. package/dist/components/navigation-menu.mjs.map +1 -0
  126. package/dist/components/pagination.mjs +33 -0
  127. package/dist/components/pagination.mjs.map +1 -0
  128. package/dist/components/popover.mjs +23 -0
  129. package/dist/components/popover.mjs.map +1 -0
  130. package/dist/components/progress.mjs +11 -0
  131. package/dist/components/progress.mjs.map +1 -0
  132. package/dist/components/quick-reply.mjs +15 -0
  133. package/dist/components/quick-reply.mjs.map +1 -0
  134. package/dist/components/radio-group.mjs +16 -0
  135. package/dist/components/radio-group.mjs.map +1 -0
  136. package/dist/components/segmented.mjs +15 -0
  137. package/dist/components/segmented.mjs.map +1 -0
  138. package/dist/components/select.mjs +23 -0
  139. package/dist/components/select.mjs.map +1 -0
  140. package/dist/components/skeleton.mjs +11 -0
  141. package/dist/components/skeleton.mjs.map +1 -0
  142. package/dist/components/slider.mjs +11 -0
  143. package/dist/components/slider.mjs.map +1 -0
  144. package/dist/components/spinner.mjs +11 -0
  145. package/dist/components/spinner.mjs.map +1 -0
  146. package/dist/components/switch.mjs +12 -0
  147. package/dist/components/switch.mjs.map +1 -0
  148. package/dist/components/table.mjs +23 -0
  149. package/dist/components/table.mjs.map +1 -0
  150. package/dist/components/tabs.mjs +19 -0
  151. package/dist/components/tabs.mjs.map +1 -0
  152. package/dist/components/textarea.mjs +12 -0
  153. package/dist/components/textarea.mjs.map +1 -0
  154. package/dist/components/toast.mjs +13 -0
  155. package/dist/components/toast.mjs.map +1 -0
  156. package/dist/components/toggle-group.mjs +15 -0
  157. package/dist/components/toggle-group.mjs.map +1 -0
  158. package/dist/components/toggle.mjs +11 -0
  159. package/dist/components/toggle.mjs.map +1 -0
  160. package/dist/components/tooltip.mjs +21 -0
  161. package/dist/components/tooltip.mjs.map +1 -0
  162. package/dist/components/typing-indicator.mjs +11 -0
  163. package/dist/components/typing-indicator.mjs.map +1 -0
  164. package/dist/index.js +22 -7
  165. package/dist/index.js.map +1 -1
  166. package/dist/index.mjs +296 -7521
  167. package/dist/index.mjs.map +1 -1
  168. package/llms.txt +29 -25
  169. package/package.json +4 -3
  170. package/dist/chart.d.mts +0 -147
  171. package/dist/index.d.mts +0 -1535
@@ -0,0 +1,394 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-53MIUPSY.mjs";
5
+
6
+ // src/components/ui/toast.tsx
7
+ import * as React from "react";
8
+ import { cva } from "class-variance-authority";
9
+ var InfoIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M12 16v-4" }), /* @__PURE__ */ React.createElement("path", { d: "M12 8h.01" }));
10
+ var SuccessIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "m9 12 2 2 4-4" }));
11
+ var WarningIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }), /* @__PURE__ */ React.createElement("path", { d: "M12 9v4" }), /* @__PURE__ */ React.createElement("path", { d: "M12 17h.01" }));
12
+ var ErrorIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M12 8v5" }), /* @__PURE__ */ React.createElement("path", { d: "M12 16h.01" }));
13
+ var DefaultCloseIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }));
14
+ var LoadingIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className: cn("animate-spin", className), viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { d: "M21 12a9 9 0 1 1-6.219-8.56", strokeLinecap: "round" }));
15
+ var STATUS_ICONS = {
16
+ default: InfoIcon,
17
+ success: SuccessIcon,
18
+ warning: WarningIcon,
19
+ error: ErrorIcon,
20
+ info: InfoIcon,
21
+ loading: LoadingIcon
22
+ };
23
+ var colorMap = {
24
+ default: "bg-background-paper text-foreground border-border shadow-lg",
25
+ success: "bg-success-tint text-text-success border-success/20 shadow-lg",
26
+ error: "bg-error-tint text-text-error border-error/20 shadow-lg",
27
+ warning: "bg-warning-tint text-text-warning border-warning/20 shadow-lg",
28
+ info: "bg-info-tint text-text-info border-info/20 shadow-lg",
29
+ loading: "bg-background-paper text-foreground border-border shadow-lg"
30
+ };
31
+ var richColorMap = {
32
+ default: "bg-foreground text-background border-transparent shadow-lg",
33
+ success: "bg-success text-success-foreground border-transparent shadow-lg",
34
+ error: "bg-error text-error-foreground border-transparent shadow-lg",
35
+ warning: "bg-warning text-warning-foreground border-transparent shadow-lg",
36
+ info: "bg-info text-info-foreground border-transparent shadow-lg",
37
+ loading: "bg-foreground text-background border-transparent shadow-lg"
38
+ };
39
+ var TOAST_EXIT_DURATION = 200;
40
+ var TOAST_MIN_RESUME_MS = 500;
41
+ var TOAST_WIDTH = 360;
42
+ var TOAST_VIEWPORT_MARGIN = 48;
43
+ var TOAST_STACK_OFFSET = 8;
44
+ var TOAST_STACK_SCALE_STEP = 0.05;
45
+ var TOAST_STACK_OPACITY_STEP = 0.15;
46
+ var TOAST_STACK_VISIBLE_LAYERS = 3;
47
+ var toastVariants = cva(
48
+ "group pointer-events-auto relative flex items-center gap-2.5 border w-full overflow-hidden transition-all",
49
+ {
50
+ variants: {
51
+ size: {
52
+ sm: "p-3 text-sm rounded-md",
53
+ default: "p-4 text-md rounded-lg",
54
+ lg: "p-5 text-md rounded-lg"
55
+ }
56
+ },
57
+ defaultVariants: {
58
+ size: "default"
59
+ }
60
+ }
61
+ );
62
+ function createToastStore() {
63
+ const store = {
64
+ toasts: [],
65
+ listeners: /* @__PURE__ */ new Set(),
66
+ addToast(toast2) {
67
+ store.toasts = [toast2, ...store.toasts];
68
+ store.listeners.forEach((l) => l());
69
+ },
70
+ removeToast(id) {
71
+ store.toasts = store.toasts.filter((t) => t.id !== id);
72
+ store.listeners.forEach((l) => l());
73
+ },
74
+ updateToast(id, updates) {
75
+ store.toasts = store.toasts.map((t) => t.id === id ? { ...t, ...updates } : t);
76
+ store.listeners.forEach((l) => l());
77
+ },
78
+ removeAll() {
79
+ store.toasts = [];
80
+ store.listeners.forEach((l) => l());
81
+ },
82
+ subscribe(listener) {
83
+ store.listeners.add(listener);
84
+ return () => {
85
+ store.listeners.delete(listener);
86
+ };
87
+ }
88
+ };
89
+ return store;
90
+ }
91
+ var globalStore = createToastStore();
92
+ function useToastStore() {
93
+ const [, forceUpdate] = React.useState(0);
94
+ React.useEffect(() => {
95
+ return globalStore.subscribe(() => forceUpdate((n) => n + 1));
96
+ }, []);
97
+ return globalStore.toasts;
98
+ }
99
+ var toastCounter = 0;
100
+ function genId() {
101
+ toastCounter += 1;
102
+ return `toast-${toastCounter}-${Date.now()}`;
103
+ }
104
+ function createToast(message, type, opts) {
105
+ const id = opts?.id ?? genId();
106
+ const existing = globalStore.toasts.find((t) => t.id === id);
107
+ if (existing) {
108
+ globalStore.updateToast(id, { message, type, ...opts });
109
+ return id;
110
+ }
111
+ globalStore.addToast({
112
+ id,
113
+ type,
114
+ message,
115
+ description: opts?.description,
116
+ duration: opts?.duration,
117
+ dismissible: opts?.dismissible,
118
+ closeButton: opts?.closeButton,
119
+ icon: opts?.icon,
120
+ action: opts?.action,
121
+ cancel: opts?.cancel,
122
+ onDismiss: opts?.onDismiss,
123
+ onAutoClose: opts?.onAutoClose,
124
+ className: opts?.className
125
+ });
126
+ return id;
127
+ }
128
+ function toast(message, opts) {
129
+ return createToast(message, "default", opts);
130
+ }
131
+ toast.success = (message, opts) => createToast(message, "success", opts);
132
+ toast.error = (message, opts) => createToast(message, "error", opts);
133
+ toast.warning = (message, opts) => createToast(message, "warning", opts);
134
+ toast.info = (message, opts) => createToast(message, "info", opts);
135
+ toast.loading = (message, opts) => createToast(message, "loading", { ...opts, duration: 0 });
136
+ toast.promise = (promise, opts, toastOpts) => {
137
+ const id = createToast(opts.loading, "loading", {
138
+ ...toastOpts,
139
+ duration: 0
140
+ });
141
+ promise.then((data) => {
142
+ const msg = typeof opts.success === "function" ? opts.success(data) : opts.success;
143
+ const desc = typeof opts.description?.success === "function" ? opts.description.success(data) : opts.description?.success;
144
+ globalStore.updateToast(id, {
145
+ type: "success",
146
+ message: msg,
147
+ description: desc,
148
+ duration: toastOpts?.duration,
149
+ _promiseState: "success"
150
+ });
151
+ }).catch((err) => {
152
+ const msg = typeof opts.error === "function" ? opts.error(err) : opts.error;
153
+ const desc = typeof opts.description?.error === "function" ? opts.description.error(err) : opts.description?.error;
154
+ globalStore.updateToast(id, {
155
+ type: "error",
156
+ message: msg,
157
+ description: desc,
158
+ duration: toastOpts?.duration,
159
+ _promiseState: "error"
160
+ });
161
+ }).finally(() => {
162
+ opts.finally?.();
163
+ });
164
+ return promise;
165
+ };
166
+ toast.dismiss = (id) => {
167
+ if (id) {
168
+ globalStore.removeToast(id);
169
+ } else {
170
+ globalStore.removeAll();
171
+ }
172
+ };
173
+ toast.custom = (render, opts) => {
174
+ const id = opts?.id ?? genId();
175
+ globalStore.addToast({
176
+ id,
177
+ type: "default",
178
+ message: render,
179
+ duration: opts?.duration,
180
+ dismissible: opts?.dismissible,
181
+ className: opts?.className,
182
+ onDismiss: opts?.onDismiss,
183
+ onAutoClose: opts?.onAutoClose,
184
+ _promiseState: void 0
185
+ });
186
+ return id;
187
+ };
188
+ var ToastItem = React.memo(function ToastItem2({
189
+ data,
190
+ position,
191
+ size,
192
+ closeButton: globalCloseButton,
193
+ richColors,
194
+ defaultDuration,
195
+ onRemove
196
+ }) {
197
+ const [isExiting, setIsExiting] = React.useState(false);
198
+ const [isEntered, setIsEntered] = React.useState(false);
199
+ const timerRef = React.useRef(null);
200
+ const remainingRef = React.useRef(0);
201
+ const startTimeRef = React.useRef(0);
202
+ React.useEffect(() => {
203
+ const timer = setTimeout(() => setIsEntered(true), TOAST_EXIT_DURATION);
204
+ return () => clearTimeout(timer);
205
+ }, []);
206
+ const showClose = data.closeButton ?? globalCloseButton;
207
+ const dismissible = data.dismissible !== false;
208
+ const duration = data.type === "loading" ? 0 : data.duration ?? defaultDuration;
209
+ const role = data.type === "error" || data.type === "warning" ? "alert" : "status";
210
+ const ariaLive = data.type === "error" || data.type === "warning" ? "assertive" : "polite";
211
+ const colors = richColors ? richColorMap[data.type] : colorMap[data.type];
212
+ const StatusIcon = STATUS_ICONS[data.type];
213
+ const enterAnim = position.includes("right") ? "animate-toast-slide-in-right" : position.includes("left") ? "animate-toast-slide-in-left" : position.includes("top") ? "animate-toast-slide-in-top" : "animate-toast-slide-in-bottom";
214
+ const exitAnim = position.includes("right") ? "animate-toast-slide-out-right" : position.includes("left") ? "animate-toast-slide-out-left" : position.includes("top") ? "animate-toast-slide-out-top" : "animate-toast-slide-out-bottom";
215
+ const handleDismiss = React.useCallback(() => {
216
+ if (!dismissible) return;
217
+ setIsExiting(true);
218
+ data.onDismiss?.(data);
219
+ setTimeout(() => onRemove(data.id), TOAST_EXIT_DURATION);
220
+ }, [data, dismissible, onRemove]);
221
+ const handleAutoClose = React.useCallback(() => {
222
+ setIsExiting(true);
223
+ data.onAutoClose?.(data);
224
+ setTimeout(() => onRemove(data.id), TOAST_EXIT_DURATION);
225
+ }, [data, onRemove]);
226
+ React.useEffect(() => {
227
+ if (duration <= 0) return;
228
+ remainingRef.current = duration;
229
+ startTimeRef.current = Date.now();
230
+ timerRef.current = setTimeout(handleAutoClose, duration);
231
+ return () => {
232
+ if (timerRef.current) clearTimeout(timerRef.current);
233
+ };
234
+ }, [duration, handleAutoClose]);
235
+ const handleMouseEnter = React.useCallback(() => {
236
+ if (duration <= 0) return;
237
+ if (timerRef.current) {
238
+ clearTimeout(timerRef.current);
239
+ remainingRef.current -= Date.now() - startTimeRef.current;
240
+ }
241
+ }, [duration]);
242
+ const handleMouseLeave = React.useCallback(() => {
243
+ if (duration <= 0) return;
244
+ startTimeRef.current = Date.now();
245
+ timerRef.current = setTimeout(handleAutoClose, Math.max(remainingRef.current, TOAST_MIN_RESUME_MS));
246
+ }, [duration, handleAutoClose]);
247
+ React.useEffect(() => {
248
+ if (data._promiseState === "success" || data._promiseState === "error") {
249
+ const newDuration = data.duration ?? defaultDuration;
250
+ if (newDuration > 0) {
251
+ if (timerRef.current) clearTimeout(timerRef.current);
252
+ remainingRef.current = newDuration;
253
+ startTimeRef.current = Date.now();
254
+ timerRef.current = setTimeout(handleAutoClose, newDuration);
255
+ }
256
+ }
257
+ }, [data._promiseState, data.duration, defaultDuration, handleAutoClose]);
258
+ return /* @__PURE__ */ React.createElement(
259
+ "div",
260
+ {
261
+ role,
262
+ "aria-live": ariaLive,
263
+ "aria-atomic": "true",
264
+ className: cn(
265
+ toastVariants({ size }),
266
+ colors,
267
+ isExiting ? exitAnim : !isEntered ? enterAnim : void 0,
268
+ isExiting && "pointer-events-none",
269
+ data.className
270
+ ),
271
+ onMouseEnter: handleMouseEnter,
272
+ onMouseLeave: handleMouseLeave
273
+ },
274
+ data.icon !== void 0 ? data.icon && /* @__PURE__ */ React.createElement("span", { className: "shrink-0" }, data.icon) : data.type !== "default" && /* @__PURE__ */ React.createElement("span", { className: "shrink-0" }, /* @__PURE__ */ React.createElement(StatusIcon, { className: "icon-sm" })),
275
+ /* @__PURE__ */ React.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React.createElement("div", { className: "font-semibold" }, data.message), data.description && /* @__PURE__ */ React.createElement("div", { className: cn("mt-1 opacity-80", size === "sm" ? "text-xs" : "text-sm") }, data.description)),
276
+ (data.action || data.cancel) && /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-1.5 shrink-0" }, data.cancel && /* @__PURE__ */ React.createElement(
277
+ "button",
278
+ {
279
+ type: "button",
280
+ className: "px-2.5 py-1.5 text-xs font-semibold rounded-md opacity-70 hover:opacity-100 transition-opacity",
281
+ onClick: () => {
282
+ data.cancel.onClick();
283
+ handleDismiss();
284
+ }
285
+ },
286
+ data.cancel.label
287
+ ), data.action && /* @__PURE__ */ React.createElement(
288
+ "button",
289
+ {
290
+ type: "button",
291
+ className: "px-2.5 py-1.5 text-xs font-semibold rounded-md bg-foreground/5 hover:bg-foreground/15 transition-colors",
292
+ onClick: () => {
293
+ data.action.onClick();
294
+ handleDismiss();
295
+ }
296
+ },
297
+ data.action.label
298
+ )),
299
+ showClose && dismissible && /* @__PURE__ */ React.createElement(
300
+ "button",
301
+ {
302
+ type: "button",
303
+ className: "shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring",
304
+ onClick: handleDismiss,
305
+ "aria-label": "Close"
306
+ },
307
+ /* @__PURE__ */ React.createElement(DefaultCloseIcon, { className: "icon-sm" })
308
+ )
309
+ );
310
+ });
311
+ function Toaster({
312
+ position = "bottom-right",
313
+ duration = 4e3,
314
+ visibleToasts = 5,
315
+ closeButton = false,
316
+ richColors = true,
317
+ expand = false,
318
+ offset = 24,
319
+ gap = 8,
320
+ size = "default",
321
+ className
322
+ }) {
323
+ const toasts = useToastStore();
324
+ const [expanded, setExpanded] = React.useState(false);
325
+ const handleRemove = React.useCallback((id) => {
326
+ globalStore.removeToast(id);
327
+ }, []);
328
+ const visible = toasts.slice(0, visibleToasts);
329
+ const isTop = position.startsWith("top");
330
+ const isCenter = position.includes("center");
331
+ const isRight = position.includes("right");
332
+ const positionClasses = cn(
333
+ "fixed z-toast flex flex-col pointer-events-none",
334
+ isTop ? "top-0" : "bottom-0",
335
+ isCenter ? "left-1/2 -translate-x-1/2" : isRight ? "right-0" : "left-0"
336
+ );
337
+ return /* @__PURE__ */ React.createElement(
338
+ "section",
339
+ {
340
+ "aria-label": "Notifications",
341
+ className: cn(positionClasses, className),
342
+ style: {
343
+ padding: offset,
344
+ gap,
345
+ width: isCenter ? "auto" : void 0,
346
+ maxWidth: isCenter ? `calc(100vw - ${TOAST_VIEWPORT_MARGIN}px)` : void 0
347
+ },
348
+ onMouseEnter: () => setExpanded(true),
349
+ onMouseLeave: () => setExpanded(false)
350
+ },
351
+ visible.map((t, index) => {
352
+ const isStacked = !expand && !expanded && index > 0;
353
+ return /* @__PURE__ */ React.createElement(
354
+ "div",
355
+ {
356
+ key: t.id,
357
+ className: "transition-[transform,opacity] duration-normal ease-out",
358
+ style: {
359
+ width: TOAST_WIDTH,
360
+ maxWidth: `calc(100vw - ${TOAST_VIEWPORT_MARGIN}px)`,
361
+ ...isStacked ? {
362
+ position: "absolute",
363
+ ...isTop ? { top: offset + index * TOAST_STACK_OFFSET } : { bottom: offset + index * TOAST_STACK_OFFSET },
364
+ ...isCenter ? { left: "50%", transform: `translateX(-50%) scale(${1 - index * TOAST_STACK_SCALE_STEP})` } : isRight ? { right: offset, transform: `scale(${1 - index * TOAST_STACK_SCALE_STEP})` } : { left: offset, transform: `scale(${1 - index * TOAST_STACK_SCALE_STEP})` },
365
+ opacity: index < TOAST_STACK_VISIBLE_LAYERS ? 1 - index * TOAST_STACK_OPACITY_STEP : 0,
366
+ zIndex: visibleToasts - index,
367
+ pointerEvents: "none"
368
+ } : { zIndex: visibleToasts - index }
369
+ }
370
+ },
371
+ /* @__PURE__ */ React.createElement(
372
+ ToastItem,
373
+ {
374
+ data: t,
375
+ position,
376
+ size,
377
+ closeButton,
378
+ richColors,
379
+ defaultDuration: duration,
380
+ onRemove: handleRemove
381
+ }
382
+ )
383
+ );
384
+ })
385
+ );
386
+ }
387
+ Toaster.displayName = "Toaster";
388
+
389
+ export {
390
+ toastVariants,
391
+ toast,
392
+ Toaster
393
+ };
394
+ //# sourceMappingURL=chunk-SZPZOGPC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/toast.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ─── Built-in status icons (shared with Alert — no external dependency) ──────\n// All icons: Lucide-compatible 24×24 viewBox, strokeWidth=2, rounded caps/joins\nconst InfoIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n)\n\nconst SuccessIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n)\n\nconst WarningIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n)\n\nconst ErrorIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v5\" />\n <path d=\"M12 16h.01\" />\n </svg>\n)\n\nconst DefaultCloseIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nconst LoadingIcon = ({ className }: { className?: string }) => (\n <svg className={cn('animate-spin', className)} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" strokeLinecap=\"round\" />\n </svg>\n)\n\n// ─── Status icon mapping ─────────────────────────────────────────\nconst STATUS_ICONS: Record<ToastType, React.FC<{ className?: string }>> = {\n default: InfoIcon,\n success: SuccessIcon,\n warning: WarningIcon,\n error: ErrorIcon,\n info: InfoIcon,\n loading: LoadingIcon,\n}\n\n// ─── Color × Type class mapping ─────────────────────────────────\nconst colorMap: Record<ToastType, string> = {\n default: 'bg-background-paper text-foreground border-border shadow-lg',\n success: 'bg-success-tint text-text-success border-success/20 shadow-lg',\n error: 'bg-error-tint text-text-error border-error/20 shadow-lg',\n warning: 'bg-warning-tint text-text-warning border-warning/20 shadow-lg',\n info: 'bg-info-tint text-text-info border-info/20 shadow-lg',\n loading: 'bg-background-paper text-foreground border-border shadow-lg',\n}\n\nconst richColorMap: Record<ToastType, string> = {\n default: 'bg-foreground text-background border-transparent shadow-lg',\n success: 'bg-success text-success-foreground border-transparent shadow-lg',\n error: 'bg-error text-error-foreground border-transparent shadow-lg',\n warning: 'bg-warning text-warning-foreground border-transparent shadow-lg',\n info: 'bg-info text-info-foreground border-transparent shadow-lg',\n loading: 'bg-foreground text-background border-transparent shadow-lg',\n}\n\n// ─── Constants (JS cannot read CSS variables at runtime) ─────────\nconst TOAST_EXIT_DURATION = 200 // --duration-normal (200ms)\nconst TOAST_MIN_RESUME_MS = 500 // --duration-slowest (500ms) — minimum time after hover resume\nconst TOAST_WIDTH = 360 // fixed toast width — smallest mobile viewport baseline\nconst TOAST_VIEWPORT_MARGIN = 48 // 2 × offset default (24px) — viewport safe area\nconst TOAST_STACK_OFFSET = 8 // --spacing-2 (8px) — vertical gap between stacked toasts\nconst TOAST_STACK_SCALE_STEP = 0.05 // scale reduction per stack level (0.95, 0.90, ...)\nconst TOAST_STACK_OPACITY_STEP = 0.15 // opacity reduction per stack level (0.85, 0.70, ...)\nconst TOAST_STACK_VISIBLE_LAYERS = 3 // max visible stacked layers before hidden\n\n// ─── Toast variants (CVA) ────────────────────────────────────────\nconst toastVariants = cva(\n 'group pointer-events-auto relative flex items-center gap-2.5 border w-full overflow-hidden transition-all',\n {\n variants: {\n size: {\n sm: 'p-3 text-sm rounded-md',\n default: 'p-4 text-md rounded-lg',\n lg: 'p-5 text-md rounded-lg',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n)\n\n// ─── Types ───────────────────────────────────────────────────────\nexport type ToastType = 'default' | 'success' | 'error' | 'warning' | 'info' | 'loading'\nexport type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'\nexport type ToastSize = 'sm' | 'default' | 'lg'\n\nexport interface ToastAction {\n label: string\n onClick: () => void\n}\n\nexport interface ToastData {\n id: string\n type: ToastType\n message: React.ReactNode\n description?: React.ReactNode\n duration?: number\n dismissible?: boolean\n closeButton?: boolean\n icon?: React.ReactNode\n action?: ToastAction\n cancel?: ToastAction\n onDismiss?: (toast: ToastData) => void\n onAutoClose?: (toast: ToastData) => void\n className?: string\n /** Promise state — managed internally */\n _promiseState?: 'loading' | 'success' | 'error'\n}\n\n// ─── Global toast store ──────────────────────────────────────────\ntype ToastListener = () => void\n\ninterface ToastStore {\n toasts: ToastData[]\n listeners: Set<ToastListener>\n addToast: (toast: ToastData) => void\n removeToast: (id: string) => void\n updateToast: (id: string, updates: Partial<ToastData>) => void\n removeAll: () => void\n subscribe: (listener: ToastListener) => () => void\n}\n\nfunction createToastStore(): ToastStore {\n const store: ToastStore = {\n toasts: [],\n listeners: new Set(),\n addToast(toast) {\n store.toasts = [toast, ...store.toasts]\n store.listeners.forEach((l) => l())\n },\n removeToast(id) {\n store.toasts = store.toasts.filter((t) => t.id !== id)\n store.listeners.forEach((l) => l())\n },\n updateToast(id, updates) {\n store.toasts = store.toasts.map((t) => (t.id === id ? { ...t, ...updates } : t))\n store.listeners.forEach((l) => l())\n },\n removeAll() {\n store.toasts = []\n store.listeners.forEach((l) => l())\n },\n subscribe(listener) {\n store.listeners.add(listener)\n return () => { store.listeners.delete(listener) }\n },\n }\n return store\n}\n\nconst globalStore = createToastStore()\n\nfunction useToastStore() {\n const [, forceUpdate] = React.useState(0)\n React.useEffect(() => {\n return globalStore.subscribe(() => forceUpdate((n) => n + 1))\n }, [])\n return globalStore.toasts\n}\n\n// ─── Toast ID generator ─────────────────────────────────────────\nlet toastCounter = 0\nfunction genId() {\n toastCounter += 1\n return `toast-${toastCounter}-${Date.now()}`\n}\n\n// ═══════════════════════════════════════════════════════════════════\n// Imperative API: toast()\n// ═══════════════════════════════════════════════════════════════════\n\ninterface ToastOptions {\n id?: string\n description?: React.ReactNode\n duration?: number\n dismissible?: boolean\n closeButton?: boolean\n icon?: React.ReactNode\n action?: ToastAction\n cancel?: ToastAction\n onDismiss?: (toast: ToastData) => void\n onAutoClose?: (toast: ToastData) => void\n className?: string\n}\n\ninterface PromiseOptions<T> {\n loading: React.ReactNode\n success: React.ReactNode | ((data: T) => React.ReactNode)\n error: React.ReactNode | ((err: unknown) => React.ReactNode)\n finally?: () => void\n description?: {\n loading?: React.ReactNode\n success?: React.ReactNode | ((data: T) => React.ReactNode)\n error?: React.ReactNode | ((err: unknown) => React.ReactNode)\n }\n}\n\nfunction createToast(message: React.ReactNode, type: ToastType, opts?: ToastOptions): string {\n const id = opts?.id ?? genId()\n\n // If updating existing toast, just update\n const existing = globalStore.toasts.find((t) => t.id === id)\n if (existing) {\n globalStore.updateToast(id, { message, type, ...opts })\n return id\n }\n\n globalStore.addToast({\n id,\n type,\n message,\n description: opts?.description,\n duration: opts?.duration,\n dismissible: opts?.dismissible,\n closeButton: opts?.closeButton,\n icon: opts?.icon,\n action: opts?.action,\n cancel: opts?.cancel,\n onDismiss: opts?.onDismiss,\n onAutoClose: opts?.onAutoClose,\n className: opts?.className,\n })\n return id\n}\n\nfunction toast(message: React.ReactNode, opts?: ToastOptions): string {\n return createToast(message, 'default', opts)\n}\n\ntoast.success = (message: React.ReactNode, opts?: ToastOptions) =>\n createToast(message, 'success', opts)\n\ntoast.error = (message: React.ReactNode, opts?: ToastOptions) =>\n createToast(message, 'error', opts)\n\ntoast.warning = (message: React.ReactNode, opts?: ToastOptions) =>\n createToast(message, 'warning', opts)\n\ntoast.info = (message: React.ReactNode, opts?: ToastOptions) =>\n createToast(message, 'info', opts)\n\ntoast.loading = (message: React.ReactNode, opts?: ToastOptions) =>\n createToast(message, 'loading', { ...opts, duration: 0 })\n\ntoast.promise = <T,>(\n promise: Promise<T>,\n opts: PromiseOptions<T>,\n toastOpts?: ToastOptions\n): Promise<T> => {\n const id = createToast(opts.loading, 'loading', {\n ...toastOpts,\n duration: 0,\n })\n\n promise\n .then((data) => {\n const msg = typeof opts.success === 'function' ? opts.success(data) : opts.success\n const desc = typeof opts.description?.success === 'function'\n ? opts.description.success(data)\n : opts.description?.success\n globalStore.updateToast(id, {\n type: 'success',\n message: msg,\n description: desc,\n duration: toastOpts?.duration,\n _promiseState: 'success',\n })\n })\n .catch((err) => {\n const msg = typeof opts.error === 'function' ? opts.error(err) : opts.error\n const desc = typeof opts.description?.error === 'function'\n ? opts.description.error(err)\n : opts.description?.error\n globalStore.updateToast(id, {\n type: 'error',\n message: msg,\n description: desc,\n duration: toastOpts?.duration,\n _promiseState: 'error',\n })\n })\n .finally(() => {\n opts.finally?.()\n })\n\n return promise\n}\n\ntoast.dismiss = (id?: string) => {\n if (id) {\n globalStore.removeToast(id)\n } else {\n globalStore.removeAll()\n }\n}\n\ntoast.custom = (render: (t: ToastData) => React.ReactNode, opts?: ToastOptions): string => {\n const id = opts?.id ?? genId()\n globalStore.addToast({\n id,\n type: 'default',\n message: render as unknown as React.ReactNode,\n duration: opts?.duration,\n dismissible: opts?.dismissible,\n className: opts?.className,\n onDismiss: opts?.onDismiss,\n onAutoClose: opts?.onAutoClose,\n _promiseState: undefined,\n })\n return id\n}\n\n// ═══════════════════════════════════════════════════════════════════\n// ToastItem — individual toast renderer\n// ═══════════════════════════════════════════════════════════════════\n\ninterface ToastItemProps {\n data: ToastData\n position: ToastPosition\n size: ToastSize\n closeButton: boolean\n richColors: boolean\n defaultDuration: number\n onRemove: (id: string) => void\n}\n\nconst ToastItem = React.memo(function ToastItem({\n data,\n position,\n size,\n closeButton: globalCloseButton,\n richColors,\n defaultDuration,\n onRemove,\n}: ToastItemProps) {\n const [isExiting, setIsExiting] = React.useState(false)\n const [isEntered, setIsEntered] = React.useState(false)\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const remainingRef = React.useRef<number>(0)\n const startTimeRef = React.useRef<number>(0)\n\n // Enter animation — play once on mount, then remove class\n React.useEffect(() => {\n const timer = setTimeout(() => setIsEntered(true), TOAST_EXIT_DURATION)\n return () => clearTimeout(timer)\n }, [])\n\n const showClose = data.closeButton ?? globalCloseButton\n const dismissible = data.dismissible !== false\n const duration = data.type === 'loading' ? 0 : (data.duration ?? defaultDuration)\n\n // ARIA — error/warning use assertive, others polite\n const role = data.type === 'error' || data.type === 'warning' ? 'alert' : 'status'\n const ariaLive = data.type === 'error' || data.type === 'warning' ? 'assertive' : 'polite'\n\n const colors = richColors ? richColorMap[data.type] : colorMap[data.type]\n const StatusIcon = STATUS_ICONS[data.type]\n\n // Animation classes based on position\n const enterAnim = position.includes('right')\n ? 'animate-toast-slide-in-right'\n : position.includes('left')\n ? 'animate-toast-slide-in-left'\n : position.includes('top')\n ? 'animate-toast-slide-in-top'\n : 'animate-toast-slide-in-bottom'\n\n const exitAnim = position.includes('right')\n ? 'animate-toast-slide-out-right'\n : position.includes('left')\n ? 'animate-toast-slide-out-left'\n : position.includes('top')\n ? 'animate-toast-slide-out-top'\n : 'animate-toast-slide-out-bottom'\n\n const handleDismiss = React.useCallback(() => {\n if (!dismissible) return\n setIsExiting(true)\n data.onDismiss?.(data)\n // Wait for exit animation then remove\n setTimeout(() => onRemove(data.id), TOAST_EXIT_DURATION)\n }, [data, dismissible, onRemove])\n\n const handleAutoClose = React.useCallback(() => {\n setIsExiting(true)\n data.onAutoClose?.(data)\n setTimeout(() => onRemove(data.id), TOAST_EXIT_DURATION)\n }, [data, onRemove])\n\n // Auto-dismiss timer with pause support\n React.useEffect(() => {\n if (duration <= 0) return\n\n remainingRef.current = duration\n startTimeRef.current = Date.now()\n\n timerRef.current = setTimeout(handleAutoClose, duration)\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [duration, handleAutoClose])\n\n // Pause/resume on hover (ref-only — no state update needed, avoids unnecessary re-renders)\n const handleMouseEnter = React.useCallback(() => {\n if (duration <= 0) return\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n remainingRef.current -= Date.now() - startTimeRef.current\n }\n }, [duration])\n\n const handleMouseLeave = React.useCallback(() => {\n if (duration <= 0) return\n startTimeRef.current = Date.now()\n timerRef.current = setTimeout(handleAutoClose, Math.max(remainingRef.current, TOAST_MIN_RESUME_MS))\n }, [duration, handleAutoClose])\n\n // Reset timer when toast updates (promise resolve)\n React.useEffect(() => {\n if (data._promiseState === 'success' || data._promiseState === 'error') {\n const newDuration = data.duration ?? defaultDuration\n if (newDuration > 0) {\n if (timerRef.current) clearTimeout(timerRef.current)\n remainingRef.current = newDuration\n startTimeRef.current = Date.now()\n timerRef.current = setTimeout(handleAutoClose, newDuration)\n }\n }\n }, [data._promiseState, data.duration, defaultDuration, handleAutoClose])\n\n return (\n <div\n role={role}\n aria-live={ariaLive}\n aria-atomic=\"true\"\n className={cn(\n toastVariants({ size }),\n colors,\n isExiting ? exitAnim : !isEntered ? enterAnim : undefined,\n isExiting && 'pointer-events-none',\n data.className,\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* Icon */}\n {data.icon !== undefined ? (\n data.icon && <span className=\"shrink-0\">{data.icon}</span>\n ) : (\n data.type !== 'default' && (\n <span className=\"shrink-0\">\n <StatusIcon className=\"icon-sm\" />\n </span>\n )\n )}\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-semibold\">{data.message}</div>\n {data.description && (\n <div className={cn('mt-1 opacity-80', size === 'sm' ? 'text-xs' : 'text-sm')}>\n {data.description}\n </div>\n )}\n </div>\n\n {/* Actions */}\n {(data.action || data.cancel) && (\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {data.cancel && (\n <button\n type=\"button\"\n className=\"px-2.5 py-1.5 text-xs font-semibold rounded-md opacity-70 hover:opacity-100 transition-opacity\"\n onClick={() => {\n data.cancel!.onClick()\n handleDismiss()\n }}\n >\n {data.cancel.label}\n </button>\n )}\n {data.action && (\n <button\n type=\"button\"\n className=\"px-2.5 py-1.5 text-xs font-semibold rounded-md bg-foreground/5 hover:bg-foreground/15 transition-colors\"\n onClick={() => {\n data.action!.onClick()\n handleDismiss()\n }}\n >\n {data.action.label}\n </button>\n )}\n </div>\n )}\n\n {/* Close button */}\n {showClose && dismissible && (\n <button\n type=\"button\"\n className=\"shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring\"\n onClick={handleDismiss}\n aria-label=\"Close\"\n >\n <DefaultCloseIcon className=\"icon-sm\" />\n </button>\n )}\n\n </div>\n )\n})\n\n// ═══════════════════════════════════════════════════════════════════\n// Toaster — renders all toasts\n// ═══════════════════════════════════════════════════════════════════\n\nexport interface ToasterProps {\n /** Position on screen */\n position?: ToastPosition\n /** Default auto-dismiss duration in ms (0 = persistent) */\n duration?: number\n /** Max visible toasts */\n visibleToasts?: number\n /** Show close button on all toasts */\n closeButton?: boolean\n /** Use rich (filled) colors for status toasts — default: true */\n richColors?: boolean\n /** Expand all toasts (no stacking) */\n expand?: boolean\n /** Offset from screen edge in px */\n offset?: number\n /** Gap between toasts in px */\n gap?: number\n /** Toast size */\n size?: ToastSize\n /** Additional className for container */\n className?: string\n}\n\nfunction Toaster({\n position = 'bottom-right',\n duration = 4000,\n visibleToasts = 5,\n closeButton = false,\n richColors = true,\n expand = false,\n offset = 24,\n gap = 8,\n size = 'default',\n className,\n}: ToasterProps) {\n const toasts = useToastStore()\n const [expanded, setExpanded] = React.useState(false)\n\n const handleRemove = React.useCallback((id: string) => {\n globalStore.removeToast(id)\n }, [])\n\n const visible = toasts.slice(0, visibleToasts)\n\n const isTop = position.startsWith('top')\n const isCenter = position.includes('center')\n const isRight = position.includes('right')\n\n // Position styles\n const positionClasses = cn(\n 'fixed z-toast flex flex-col pointer-events-none',\n isTop ? 'top-0' : 'bottom-0',\n isCenter ? 'left-1/2 -translate-x-1/2' : isRight ? 'right-0' : 'left-0',\n )\n\n return (\n <section\n aria-label=\"Notifications\"\n className={cn(positionClasses, className)}\n style={{\n padding: offset,\n gap,\n width: isCenter ? 'auto' : undefined,\n maxWidth: isCenter ? `calc(100vw - ${TOAST_VIEWPORT_MARGIN}px)` : undefined,\n }}\n onMouseEnter={() => setExpanded(true)}\n onMouseLeave={() => setExpanded(false)}\n >\n {visible.map((t, index) => {\n const isStacked = !expand && !expanded && index > 0\n return (\n <div\n key={t.id}\n className=\"transition-[transform,opacity] duration-normal ease-out\"\n style={{\n width: TOAST_WIDTH,\n maxWidth: `calc(100vw - ${TOAST_VIEWPORT_MARGIN}px)`,\n ...(isStacked\n ? {\n position: 'absolute' as const,\n ...(isTop ? { top: offset + index * TOAST_STACK_OFFSET } : { bottom: offset + index * TOAST_STACK_OFFSET }),\n ...(isCenter\n ? { left: '50%', transform: `translateX(-50%) scale(${1 - index * TOAST_STACK_SCALE_STEP})` }\n : isRight\n ? { right: offset, transform: `scale(${1 - index * TOAST_STACK_SCALE_STEP})` }\n : { left: offset, transform: `scale(${1 - index * TOAST_STACK_SCALE_STEP})` }),\n opacity: index < TOAST_STACK_VISIBLE_LAYERS ? 1 - index * TOAST_STACK_OPACITY_STEP : 0,\n zIndex: visibleToasts - index,\n pointerEvents: 'none' as const,\n }\n : { zIndex: visibleToasts - index }),\n }}\n >\n <ToastItem\n data={t}\n position={position}\n size={size}\n closeButton={closeButton}\n richColors={richColors}\n defaultDuration={duration}\n onRemove={handleRemove}\n />\n </div>\n )\n })}\n </section>\n )\n}\nToaster.displayName = 'Toaster'\n\n// ─── Exports ─────────────────────────────────────────────────────\nexport {\n toast,\n Toaster,\n toastVariants,\n}\n\nexport type {\n ToastOptions,\n PromiseOptions,\n}\n"],"mappings":"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","names":["toast","ToastItem"]}