@karakuri-ui/react 0.2.3 → 0.2.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.
Files changed (238) hide show
  1. package/README.md +0 -1
  2. package/dist/components/ui/accordion.d.mts +49 -0
  3. package/dist/components/ui/accordion.d.ts +49 -0
  4. package/dist/components/ui/accordion.js +220 -0
  5. package/dist/components/ui/accordion.js.map +1 -0
  6. package/dist/components/ui/accordion.mjs +181 -0
  7. package/dist/components/ui/accordion.mjs.map +1 -0
  8. package/dist/components/ui/alert.d.mts +47 -0
  9. package/dist/components/ui/alert.d.ts +47 -0
  10. package/dist/components/ui/alert.js +223 -0
  11. package/dist/components/ui/alert.js.map +1 -0
  12. package/dist/components/ui/alert.mjs +185 -0
  13. package/dist/components/ui/alert.mjs.map +1 -0
  14. package/dist/components/ui/avatar.d.mts +232 -0
  15. package/dist/components/ui/avatar.d.ts +232 -0
  16. package/dist/components/ui/avatar.js +250 -0
  17. package/dist/components/ui/avatar.js.map +1 -0
  18. package/dist/components/ui/avatar.mjs +209 -0
  19. package/dist/components/ui/avatar.mjs.map +1 -0
  20. package/dist/components/ui/badge.d.mts +31 -0
  21. package/dist/components/ui/badge.d.ts +31 -0
  22. package/dist/components/ui/badge.js +205 -0
  23. package/dist/components/ui/badge.js.map +1 -0
  24. package/dist/components/ui/badge.mjs +170 -0
  25. package/dist/components/ui/badge.mjs.map +1 -0
  26. package/dist/components/ui/breadcrumb.d.mts +57 -0
  27. package/dist/components/ui/breadcrumb.d.ts +57 -0
  28. package/dist/components/ui/breadcrumb.js +209 -0
  29. package/dist/components/ui/breadcrumb.js.map +1 -0
  30. package/dist/components/ui/breadcrumb.mjs +168 -0
  31. package/dist/components/ui/breadcrumb.mjs.map +1 -0
  32. package/dist/components/ui/button-group.d.mts +22 -0
  33. package/dist/components/ui/button-group.d.ts +22 -0
  34. package/dist/components/ui/button-group.js +107 -0
  35. package/dist/components/ui/button-group.js.map +1 -0
  36. package/dist/components/ui/button-group.mjs +72 -0
  37. package/dist/components/ui/button-group.mjs.map +1 -0
  38. package/dist/components/ui/button.d.mts +31 -0
  39. package/dist/components/ui/button.d.ts +31 -0
  40. package/dist/components/ui/button.js +176 -0
  41. package/dist/components/ui/button.js.map +1 -0
  42. package/dist/components/ui/button.mjs +141 -0
  43. package/dist/components/ui/button.mjs.map +1 -0
  44. package/dist/components/ui/card.d.mts +77 -0
  45. package/dist/components/ui/card.d.ts +77 -0
  46. package/dist/components/ui/card.js +370 -0
  47. package/dist/components/ui/card.js.map +1 -0
  48. package/dist/components/ui/card.mjs +328 -0
  49. package/dist/components/ui/card.mjs.map +1 -0
  50. package/dist/{chart.js → components/ui/chart.js} +29 -39
  51. package/dist/components/ui/chart.js.map +1 -0
  52. package/dist/{chart.mjs → components/ui/chart.mjs} +21 -31
  53. package/dist/components/ui/chart.mjs.map +1 -0
  54. package/dist/components/ui/checkbox.d.mts +24 -0
  55. package/dist/components/ui/checkbox.d.ts +24 -0
  56. package/dist/components/ui/checkbox.js +173 -0
  57. package/dist/components/ui/checkbox.js.map +1 -0
  58. package/dist/components/ui/checkbox.mjs +138 -0
  59. package/dist/components/ui/checkbox.mjs.map +1 -0
  60. package/dist/components/ui/divider.d.mts +27 -0
  61. package/dist/components/ui/divider.d.ts +27 -0
  62. package/dist/components/ui/divider.js +147 -0
  63. package/dist/components/ui/divider.js.map +1 -0
  64. package/dist/components/ui/divider.mjs +112 -0
  65. package/dist/components/ui/divider.mjs.map +1 -0
  66. package/dist/components/ui/drawer.d.mts +51 -0
  67. package/dist/components/ui/drawer.d.ts +51 -0
  68. package/dist/components/ui/drawer.js +225 -0
  69. package/dist/components/ui/drawer.js.map +1 -0
  70. package/dist/components/ui/drawer.mjs +178 -0
  71. package/dist/components/ui/drawer.mjs.map +1 -0
  72. package/dist/components/ui/dropdown.d.mts +59 -0
  73. package/dist/components/ui/dropdown.d.ts +59 -0
  74. package/dist/components/ui/dropdown.js +310 -0
  75. package/dist/components/ui/dropdown.js.map +1 -0
  76. package/dist/components/ui/dropdown.mjs +263 -0
  77. package/dist/components/ui/dropdown.mjs.map +1 -0
  78. package/dist/components/ui/field.d.mts +33 -0
  79. package/dist/components/ui/field.d.ts +33 -0
  80. package/dist/components/ui/field.js +146 -0
  81. package/dist/components/ui/field.js.map +1 -0
  82. package/dist/components/ui/field.mjs +108 -0
  83. package/dist/components/ui/field.mjs.map +1 -0
  84. package/dist/components/ui/icon-button.d.mts +20 -0
  85. package/dist/components/ui/icon-button.d.ts +20 -0
  86. package/dist/components/ui/icon-button.js +147 -0
  87. package/dist/components/ui/icon-button.js.map +1 -0
  88. package/dist/components/ui/icon-button.mjs +112 -0
  89. package/dist/components/ui/icon-button.mjs.map +1 -0
  90. package/dist/components/ui/index.d.mts +55 -0
  91. package/dist/components/ui/index.d.ts +55 -0
  92. package/dist/components/ui/index.js +476 -0
  93. package/dist/components/ui/index.js.map +1 -0
  94. package/dist/components/ui/index.mjs +246 -0
  95. package/dist/components/ui/index.mjs.map +1 -0
  96. package/dist/components/ui/input.d.mts +20 -0
  97. package/dist/components/ui/input.d.ts +20 -0
  98. package/dist/components/ui/input.js +250 -0
  99. package/dist/components/ui/input.js.map +1 -0
  100. package/dist/components/ui/input.mjs +215 -0
  101. package/dist/components/ui/input.mjs.map +1 -0
  102. package/dist/components/ui/metric-card.d.mts +53 -0
  103. package/dist/components/ui/metric-card.d.ts +53 -0
  104. package/dist/components/ui/metric-card.js +258 -0
  105. package/dist/components/ui/metric-card.js.map +1 -0
  106. package/dist/components/ui/metric-card.mjs +217 -0
  107. package/dist/components/ui/metric-card.mjs.map +1 -0
  108. package/dist/components/ui/modal.d.mts +77 -0
  109. package/dist/components/ui/modal.d.ts +77 -0
  110. package/dist/components/ui/modal.js +396 -0
  111. package/dist/components/ui/modal.js.map +1 -0
  112. package/dist/components/ui/modal.mjs +338 -0
  113. package/dist/components/ui/modal.mjs.map +1 -0
  114. package/dist/components/ui/navigation-menu.d.mts +139 -0
  115. package/dist/components/ui/navigation-menu.d.ts +139 -0
  116. package/dist/components/ui/navigation-menu.js +531 -0
  117. package/dist/components/ui/navigation-menu.js.map +1 -0
  118. package/dist/components/ui/navigation-menu.mjs +488 -0
  119. package/dist/components/ui/navigation-menu.mjs.map +1 -0
  120. package/dist/components/ui/pagination.d.mts +130 -0
  121. package/dist/components/ui/pagination.d.ts +130 -0
  122. package/dist/components/ui/pagination.js +495 -0
  123. package/dist/components/ui/pagination.js.map +1 -0
  124. package/dist/components/ui/pagination.mjs +449 -0
  125. package/dist/components/ui/pagination.mjs.map +1 -0
  126. package/dist/components/ui/popover.d.mts +41 -0
  127. package/dist/components/ui/popover.d.ts +41 -0
  128. package/dist/components/ui/popover.js +175 -0
  129. package/dist/components/ui/popover.js.map +1 -0
  130. package/dist/components/ui/popover.mjs +133 -0
  131. package/dist/components/ui/popover.mjs.map +1 -0
  132. package/dist/components/ui/progress.d.mts +35 -0
  133. package/dist/components/ui/progress.d.ts +35 -0
  134. package/dist/components/ui/progress.js +194 -0
  135. package/dist/components/ui/progress.js.map +1 -0
  136. package/dist/components/ui/progress.mjs +159 -0
  137. package/dist/components/ui/progress.mjs.map +1 -0
  138. package/dist/components/ui/radio-group.d.mts +40 -0
  139. package/dist/components/ui/radio-group.d.ts +40 -0
  140. package/dist/components/ui/radio-group.js +177 -0
  141. package/dist/components/ui/radio-group.js.map +1 -0
  142. package/dist/components/ui/radio-group.mjs +140 -0
  143. package/dist/components/ui/radio-group.mjs.map +1 -0
  144. package/dist/components/ui/segmented.d.mts +30 -0
  145. package/dist/components/ui/segmented.d.ts +30 -0
  146. package/dist/components/ui/segmented.js +241 -0
  147. package/dist/components/ui/segmented.js.map +1 -0
  148. package/dist/components/ui/segmented.mjs +204 -0
  149. package/dist/components/ui/segmented.mjs.map +1 -0
  150. package/dist/components/ui/select.d.mts +31 -0
  151. package/dist/components/ui/select.d.ts +31 -0
  152. package/dist/components/ui/select.js +317 -0
  153. package/dist/components/ui/select.js.map +1 -0
  154. package/dist/components/ui/select.mjs +276 -0
  155. package/dist/components/ui/select.mjs.map +1 -0
  156. package/dist/components/ui/skeleton.d.mts +26 -0
  157. package/dist/components/ui/skeleton.d.ts +26 -0
  158. package/dist/components/ui/skeleton.js +144 -0
  159. package/dist/components/ui/skeleton.js.map +1 -0
  160. package/dist/components/ui/skeleton.mjs +109 -0
  161. package/dist/components/ui/skeleton.mjs.map +1 -0
  162. package/dist/components/ui/slider.d.mts +38 -0
  163. package/dist/components/ui/slider.d.ts +38 -0
  164. package/dist/components/ui/slider.js +180 -0
  165. package/dist/components/ui/slider.js.map +1 -0
  166. package/dist/components/ui/slider.mjs +145 -0
  167. package/dist/components/ui/slider.mjs.map +1 -0
  168. package/dist/components/ui/spinner.d.mts +23 -0
  169. package/dist/components/ui/spinner.d.ts +23 -0
  170. package/dist/components/ui/spinner.js +471 -0
  171. package/dist/components/ui/spinner.js.map +1 -0
  172. package/dist/components/ui/spinner.mjs +436 -0
  173. package/dist/components/ui/spinner.mjs.map +1 -0
  174. package/dist/components/ui/switch.d.mts +22 -0
  175. package/dist/components/ui/switch.d.ts +22 -0
  176. package/dist/components/ui/switch.js +173 -0
  177. package/dist/components/ui/switch.js.map +1 -0
  178. package/dist/components/ui/switch.mjs +138 -0
  179. package/dist/components/ui/switch.mjs.map +1 -0
  180. package/dist/components/ui/table.d.mts +74 -0
  181. package/dist/components/ui/table.d.ts +74 -0
  182. package/dist/components/ui/table.js +240 -0
  183. package/dist/components/ui/table.js.map +1 -0
  184. package/dist/components/ui/table.mjs +199 -0
  185. package/dist/components/ui/table.mjs.map +1 -0
  186. package/dist/components/ui/tabs.d.mts +40 -0
  187. package/dist/components/ui/tabs.d.ts +40 -0
  188. package/dist/components/ui/tabs.js +238 -0
  189. package/dist/components/ui/tabs.js.map +1 -0
  190. package/dist/components/ui/tabs.mjs +199 -0
  191. package/dist/components/ui/tabs.mjs.map +1 -0
  192. package/dist/components/ui/textarea.d.mts +19 -0
  193. package/dist/components/ui/textarea.d.ts +19 -0
  194. package/dist/components/ui/textarea.js +181 -0
  195. package/dist/components/ui/textarea.js.map +1 -0
  196. package/dist/components/ui/textarea.mjs +146 -0
  197. package/dist/components/ui/textarea.mjs.map +1 -0
  198. package/dist/components/ui/toast.d.mts +93 -0
  199. package/dist/components/ui/toast.d.ts +93 -0
  200. package/dist/components/ui/toast.js +429 -0
  201. package/dist/components/ui/toast.js.map +1 -0
  202. package/dist/components/ui/toast.mjs +393 -0
  203. package/dist/components/ui/toast.mjs.map +1 -0
  204. package/dist/components/ui/toggle-group.d.mts +47 -0
  205. package/dist/components/ui/toggle-group.d.ts +47 -0
  206. package/dist/components/ui/toggle-group.js +186 -0
  207. package/dist/components/ui/toggle-group.js.map +1 -0
  208. package/dist/components/ui/toggle-group.mjs +149 -0
  209. package/dist/components/ui/toggle-group.mjs.map +1 -0
  210. package/dist/components/ui/toggle.d.mts +19 -0
  211. package/dist/components/ui/toggle.d.ts +19 -0
  212. package/dist/components/ui/toggle.js +194 -0
  213. package/dist/components/ui/toggle.js.map +1 -0
  214. package/dist/components/ui/toggle.mjs +159 -0
  215. package/dist/components/ui/toggle.mjs.map +1 -0
  216. package/dist/components/ui/tooltip.d.mts +37 -0
  217. package/dist/components/ui/tooltip.d.ts +37 -0
  218. package/dist/components/ui/tooltip.js +137 -0
  219. package/dist/components/ui/tooltip.js.map +1 -0
  220. package/dist/components/ui/tooltip.mjs +96 -0
  221. package/dist/components/ui/tooltip.mjs.map +1 -0
  222. package/dist/lib/utils.d.mts +10 -0
  223. package/dist/lib/utils.d.ts +10 -0
  224. package/dist/lib/utils.js +33 -0
  225. package/dist/lib/utils.js.map +1 -0
  226. package/dist/lib/utils.mjs +9 -0
  227. package/dist/lib/utils.mjs.map +1 -0
  228. package/package.json +11 -11
  229. package/dist/chart.js.map +0 -1
  230. package/dist/chart.mjs.map +0 -1
  231. package/dist/index.d.mts +0 -1636
  232. package/dist/index.d.ts +0 -1636
  233. package/dist/index.js +0 -7291
  234. package/dist/index.js.map +0 -1
  235. package/dist/index.mjs +0 -7048
  236. package/dist/index.mjs.map +0 -1
  237. /package/dist/{chart.d.mts → components/ui/chart.d.mts} +0 -0
  238. /package/dist/{chart.d.ts → components/ui/chart.d.ts} +0 -0
@@ -0,0 +1,393 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "../../lib/utils";
5
+ const 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" }));
6
+ const 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" }));
7
+ const 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" }));
8
+ const 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" }));
9
+ const 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" }));
10
+ const 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" }));
11
+ const STATUS_ICONS = {
12
+ default: InfoIcon,
13
+ success: SuccessIcon,
14
+ warning: WarningIcon,
15
+ error: ErrorIcon,
16
+ info: InfoIcon,
17
+ loading: LoadingIcon
18
+ };
19
+ const colorMap = {
20
+ default: "bg-background-paper text-foreground border-border shadow-lg",
21
+ success: "bg-success-tint text-text-success border-success/20 shadow-lg",
22
+ error: "bg-error-tint text-text-error border-error/20 shadow-lg",
23
+ warning: "bg-warning-tint text-text-warning border-warning/20 shadow-lg",
24
+ info: "bg-info-tint text-text-info border-info/20 shadow-lg",
25
+ loading: "bg-background-paper text-foreground border-border shadow-lg"
26
+ };
27
+ const richColorMap = {
28
+ default: "bg-foreground text-background border-transparent shadow-lg",
29
+ success: "bg-success text-success-foreground border-transparent shadow-lg",
30
+ error: "bg-error text-error-foreground border-transparent shadow-lg",
31
+ warning: "bg-warning text-warning-foreground border-transparent shadow-lg",
32
+ info: "bg-info text-info-foreground border-transparent shadow-lg",
33
+ loading: "bg-foreground text-background border-transparent shadow-lg"
34
+ };
35
+ const TOAST_EXIT_DURATION = 200;
36
+ const TOAST_MIN_RESUME_MS = 500;
37
+ const TOAST_WIDTH = 360;
38
+ const TOAST_VIEWPORT_MARGIN = 48;
39
+ const TOAST_STACK_OFFSET = 8;
40
+ const TOAST_STACK_SCALE_STEP = 0.05;
41
+ const TOAST_STACK_OPACITY_STEP = 0.15;
42
+ const TOAST_STACK_VISIBLE_LAYERS = 3;
43
+ const toastVariants = cva(
44
+ "group pointer-events-auto relative flex items-center gap-2.5 border w-full overflow-hidden transition-all",
45
+ {
46
+ variants: {
47
+ size: {
48
+ sm: "p-3 text-sm rounded-md",
49
+ default: "p-4 text-md rounded-lg",
50
+ lg: "p-5 text-md rounded-lg"
51
+ }
52
+ },
53
+ defaultVariants: {
54
+ size: "default"
55
+ }
56
+ }
57
+ );
58
+ function createToastStore() {
59
+ const store = {
60
+ toasts: [],
61
+ listeners: /* @__PURE__ */ new Set(),
62
+ addToast(toast2) {
63
+ store.toasts = [toast2, ...store.toasts];
64
+ store.listeners.forEach((l) => l());
65
+ },
66
+ removeToast(id) {
67
+ store.toasts = store.toasts.filter((t) => t.id !== id);
68
+ store.listeners.forEach((l) => l());
69
+ },
70
+ updateToast(id, updates) {
71
+ store.toasts = store.toasts.map((t) => t.id === id ? { ...t, ...updates } : t);
72
+ store.listeners.forEach((l) => l());
73
+ },
74
+ removeAll() {
75
+ store.toasts = [];
76
+ store.listeners.forEach((l) => l());
77
+ },
78
+ subscribe(listener) {
79
+ store.listeners.add(listener);
80
+ return () => {
81
+ store.listeners.delete(listener);
82
+ };
83
+ }
84
+ };
85
+ return store;
86
+ }
87
+ const globalStore = createToastStore();
88
+ function useToastStore() {
89
+ const [, forceUpdate] = React.useState(0);
90
+ React.useEffect(() => {
91
+ return globalStore.subscribe(() => forceUpdate((n) => n + 1));
92
+ }, []);
93
+ return globalStore.toasts;
94
+ }
95
+ let toastCounter = 0;
96
+ function genId() {
97
+ toastCounter += 1;
98
+ return `toast-${toastCounter}-${Date.now()}`;
99
+ }
100
+ function createToast(message, type, opts) {
101
+ const id = opts?.id ?? genId();
102
+ const existing = globalStore.toasts.find((t) => t.id === id);
103
+ if (existing) {
104
+ globalStore.updateToast(id, { message, type, ...opts });
105
+ return id;
106
+ }
107
+ globalStore.addToast({
108
+ id,
109
+ type,
110
+ message,
111
+ description: opts?.description,
112
+ duration: opts?.duration,
113
+ dismissible: opts?.dismissible,
114
+ closeButton: opts?.closeButton,
115
+ icon: opts?.icon,
116
+ action: opts?.action,
117
+ cancel: opts?.cancel,
118
+ onDismiss: opts?.onDismiss,
119
+ onAutoClose: opts?.onAutoClose,
120
+ className: opts?.className
121
+ });
122
+ return id;
123
+ }
124
+ function toast(message, opts) {
125
+ return createToast(message, "default", opts);
126
+ }
127
+ toast.success = (message, opts) => createToast(message, "success", opts);
128
+ toast.error = (message, opts) => createToast(message, "error", opts);
129
+ toast.warning = (message, opts) => createToast(message, "warning", opts);
130
+ toast.info = (message, opts) => createToast(message, "info", opts);
131
+ toast.loading = (message, opts) => createToast(message, "loading", { ...opts, duration: 0 });
132
+ toast.promise = (promise, opts, toastOpts) => {
133
+ const id = createToast(opts.loading, "loading", {
134
+ ...toastOpts,
135
+ duration: 0
136
+ });
137
+ promise.then((data) => {
138
+ const msg = typeof opts.success === "function" ? opts.success(data) : opts.success;
139
+ const desc = typeof opts.description?.success === "function" ? opts.description.success(data) : opts.description?.success;
140
+ globalStore.updateToast(id, {
141
+ type: "success",
142
+ message: msg,
143
+ description: desc,
144
+ duration: toastOpts?.duration,
145
+ _promiseState: "success"
146
+ });
147
+ }).catch((err) => {
148
+ const msg = typeof opts.error === "function" ? opts.error(err) : opts.error;
149
+ const desc = typeof opts.description?.error === "function" ? opts.description.error(err) : opts.description?.error;
150
+ globalStore.updateToast(id, {
151
+ type: "error",
152
+ message: msg,
153
+ description: desc,
154
+ duration: toastOpts?.duration,
155
+ _promiseState: "error"
156
+ });
157
+ }).finally(() => {
158
+ opts.finally?.();
159
+ });
160
+ return promise;
161
+ };
162
+ toast.dismiss = (id) => {
163
+ if (id) {
164
+ globalStore.removeToast(id);
165
+ } else {
166
+ globalStore.removeAll();
167
+ }
168
+ };
169
+ toast.custom = (render, opts) => {
170
+ const id = opts?.id ?? genId();
171
+ globalStore.addToast({
172
+ id,
173
+ type: "default",
174
+ message: render,
175
+ duration: opts?.duration,
176
+ dismissible: opts?.dismissible,
177
+ className: opts?.className,
178
+ onDismiss: opts?.onDismiss,
179
+ onAutoClose: opts?.onAutoClose,
180
+ _promiseState: void 0
181
+ });
182
+ return id;
183
+ };
184
+ const ToastItem = React.memo(function ToastItem2({
185
+ data,
186
+ position,
187
+ size,
188
+ closeButton: globalCloseButton,
189
+ richColors,
190
+ defaultDuration,
191
+ onRemove
192
+ }) {
193
+ const [isExiting, setIsExiting] = React.useState(false);
194
+ const [isEntered, setIsEntered] = React.useState(false);
195
+ const [isPaused, setIsPaused] = React.useState(false);
196
+ const timerRef = React.useRef(null);
197
+ const remainingRef = React.useRef(0);
198
+ const startTimeRef = React.useRef(0);
199
+ React.useEffect(() => {
200
+ const timer = setTimeout(() => setIsEntered(true), TOAST_EXIT_DURATION);
201
+ return () => clearTimeout(timer);
202
+ }, []);
203
+ const showClose = data.closeButton ?? globalCloseButton;
204
+ const dismissible = data.dismissible !== false;
205
+ const duration = data.type === "loading" ? 0 : data.duration ?? defaultDuration;
206
+ const role = data.type === "error" || data.type === "warning" ? "alert" : "status";
207
+ const ariaLive = data.type === "error" || data.type === "warning" ? "assertive" : "polite";
208
+ const colors = richColors ? richColorMap[data.type] : colorMap[data.type];
209
+ const StatusIcon = STATUS_ICONS[data.type];
210
+ 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";
211
+ 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";
212
+ const handleDismiss = React.useCallback(() => {
213
+ if (!dismissible) return;
214
+ setIsExiting(true);
215
+ data.onDismiss?.(data);
216
+ setTimeout(() => onRemove(data.id), TOAST_EXIT_DURATION);
217
+ }, [data, dismissible, onRemove]);
218
+ const handleAutoClose = React.useCallback(() => {
219
+ setIsExiting(true);
220
+ data.onAutoClose?.(data);
221
+ setTimeout(() => onRemove(data.id), TOAST_EXIT_DURATION);
222
+ }, [data, onRemove]);
223
+ React.useEffect(() => {
224
+ if (duration <= 0) return;
225
+ remainingRef.current = duration;
226
+ startTimeRef.current = Date.now();
227
+ timerRef.current = setTimeout(handleAutoClose, duration);
228
+ return () => {
229
+ if (timerRef.current) clearTimeout(timerRef.current);
230
+ };
231
+ }, [duration, handleAutoClose]);
232
+ const handleMouseEnter = React.useCallback(() => {
233
+ if (duration <= 0) return;
234
+ setIsPaused(true);
235
+ if (timerRef.current) {
236
+ clearTimeout(timerRef.current);
237
+ remainingRef.current -= Date.now() - startTimeRef.current;
238
+ }
239
+ }, [duration]);
240
+ const handleMouseLeave = React.useCallback(() => {
241
+ if (duration <= 0) return;
242
+ setIsPaused(false);
243
+ startTimeRef.current = Date.now();
244
+ timerRef.current = setTimeout(handleAutoClose, Math.max(remainingRef.current, TOAST_MIN_RESUME_MS));
245
+ }, [duration, handleAutoClose]);
246
+ React.useEffect(() => {
247
+ if (data._promiseState === "success" || data._promiseState === "error") {
248
+ const newDuration = data.duration ?? defaultDuration;
249
+ if (newDuration > 0) {
250
+ if (timerRef.current) clearTimeout(timerRef.current);
251
+ remainingRef.current = newDuration;
252
+ startTimeRef.current = Date.now();
253
+ timerRef.current = setTimeout(handleAutoClose, newDuration);
254
+ }
255
+ }
256
+ }, [data._promiseState, data.duration, defaultDuration, handleAutoClose]);
257
+ return /* @__PURE__ */ React.createElement(
258
+ "div",
259
+ {
260
+ role,
261
+ "aria-live": ariaLive,
262
+ "aria-atomic": "true",
263
+ className: cn(
264
+ toastVariants({ size }),
265
+ colors,
266
+ isExiting ? exitAnim : !isEntered ? enterAnim : void 0,
267
+ isExiting && "pointer-events-none",
268
+ data.className
269
+ ),
270
+ onMouseEnter: handleMouseEnter,
271
+ onMouseLeave: handleMouseLeave
272
+ },
273
+ 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" })),
274
+ /* @__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)),
275
+ (data.action || data.cancel) && /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-1.5 shrink-0" }, data.cancel && /* @__PURE__ */ React.createElement(
276
+ "button",
277
+ {
278
+ type: "button",
279
+ className: "px-2.5 py-1.5 text-xs font-semibold rounded-md opacity-70 hover:opacity-100 transition-opacity",
280
+ onClick: () => {
281
+ data.cancel.onClick();
282
+ handleDismiss();
283
+ }
284
+ },
285
+ data.cancel.label
286
+ ), data.action && /* @__PURE__ */ React.createElement(
287
+ "button",
288
+ {
289
+ type: "button",
290
+ className: "px-2.5 py-1.5 text-xs font-semibold rounded-md bg-foreground/5 hover:bg-foreground/15 transition-colors",
291
+ onClick: () => {
292
+ data.action.onClick();
293
+ handleDismiss();
294
+ }
295
+ },
296
+ data.action.label
297
+ )),
298
+ showClose && dismissible && /* @__PURE__ */ React.createElement(
299
+ "button",
300
+ {
301
+ type: "button",
302
+ className: "shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring",
303
+ onClick: handleDismiss,
304
+ "aria-label": "Close"
305
+ },
306
+ /* @__PURE__ */ React.createElement(DefaultCloseIcon, { className: "icon-sm" })
307
+ )
308
+ );
309
+ });
310
+ function Toaster({
311
+ position = "bottom-right",
312
+ duration = 4e3,
313
+ visibleToasts = 5,
314
+ closeButton = false,
315
+ richColors = true,
316
+ expand = false,
317
+ offset = 24,
318
+ gap = 8,
319
+ size = "default",
320
+ className
321
+ }) {
322
+ const toasts = useToastStore();
323
+ const [expanded, setExpanded] = React.useState(false);
324
+ const handleRemove = React.useCallback((id) => {
325
+ globalStore.removeToast(id);
326
+ }, []);
327
+ const visible = toasts.slice(0, visibleToasts);
328
+ const isTop = position.startsWith("top");
329
+ const isCenter = position.includes("center");
330
+ const isRight = position.includes("right");
331
+ const isLeft = position.includes("left");
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
+ export {
389
+ Toaster,
390
+ toast,
391
+ toastVariants
392
+ };
393
+ //# sourceMappingURL=toast.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, type VariantProps } 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 [isPaused, setIsPaused] = 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\n const handleMouseEnter = React.useCallback(() => {\n if (duration <= 0) return\n setIsPaused(true)\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 setIsPaused(false)\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 const isLeft = position.includes('left')\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"]}
@@ -0,0 +1,47 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import * as React from 'react';
3
+ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
4
+ import { VariantProps } from 'class-variance-authority';
5
+
6
+ declare const toggleGroupVariants: (props?: ({
7
+ orientation?: "horizontal" | "vertical" | null | undefined;
8
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
9
+ declare const toggleGroupItemVariants: (props?: ({
10
+ variant?: "default" | "outline" | null | undefined;
11
+ fontWeight?: "normal" | "semibold" | null | undefined;
12
+ size?: "default" | "sm" | "lg" | "md" | "xs" | null | undefined;
13
+ radius?: "default" | "sm" | "lg" | "base" | "none" | "xl" | "2xl" | "3xl" | "full" | null | undefined;
14
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
15
+ type ToggleGroupSingleProps = {
16
+ type: 'single';
17
+ value?: string;
18
+ defaultValue?: string;
19
+ onValueChange?: (value: string) => void;
20
+ };
21
+ type ToggleGroupMultipleProps = {
22
+ type: 'multiple';
23
+ value?: string[];
24
+ defaultValue?: string[];
25
+ onValueChange?: (value: string[]) => void;
26
+ };
27
+ type ToggleGroupBaseProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'defaultValue' | 'dir'> & {
28
+ disabled?: boolean;
29
+ rovingFocus?: boolean;
30
+ orientation?: 'horizontal' | 'vertical';
31
+ dir?: 'ltr' | 'rtl';
32
+ loop?: boolean;
33
+ children?: React.ReactNode;
34
+ };
35
+ type ToggleGroupProps = ToggleGroupBaseProps & VariantProps<typeof toggleGroupVariants> & VariantProps<typeof toggleGroupItemVariants> & (ToggleGroupSingleProps | ToggleGroupMultipleProps);
36
+ interface ToggleGroupItemProps extends React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>, Omit<VariantProps<typeof toggleGroupItemVariants>, 'fontWeight'> {
37
+ fontWeight?: 'normal' | 'semibold';
38
+ }
39
+ declare const ToggleGroupItem: React.ForwardRefExoticComponent<ToggleGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
40
+ declare const ToggleGroup: React.ForwardRefExoticComponent<ToggleGroupProps & React.RefAttributes<HTMLDivElement>> & {
41
+ Item: React.ForwardRefExoticComponent<ToggleGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
42
+ };
43
+ declare namespace ToggleGroup {
44
+ type ItemProps = ToggleGroupItemProps;
45
+ }
46
+
47
+ export { ToggleGroup, ToggleGroupItem, type ToggleGroupItemProps, type ToggleGroupProps, toggleGroupItemVariants, toggleGroupVariants };
@@ -0,0 +1,47 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import * as React from 'react';
3
+ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
4
+ import { VariantProps } from 'class-variance-authority';
5
+
6
+ declare const toggleGroupVariants: (props?: ({
7
+ orientation?: "horizontal" | "vertical" | null | undefined;
8
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
9
+ declare const toggleGroupItemVariants: (props?: ({
10
+ variant?: "default" | "outline" | null | undefined;
11
+ fontWeight?: "normal" | "semibold" | null | undefined;
12
+ size?: "default" | "sm" | "lg" | "md" | "xs" | null | undefined;
13
+ radius?: "default" | "sm" | "lg" | "base" | "none" | "xl" | "2xl" | "3xl" | "full" | null | undefined;
14
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
15
+ type ToggleGroupSingleProps = {
16
+ type: 'single';
17
+ value?: string;
18
+ defaultValue?: string;
19
+ onValueChange?: (value: string) => void;
20
+ };
21
+ type ToggleGroupMultipleProps = {
22
+ type: 'multiple';
23
+ value?: string[];
24
+ defaultValue?: string[];
25
+ onValueChange?: (value: string[]) => void;
26
+ };
27
+ type ToggleGroupBaseProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'defaultValue' | 'dir'> & {
28
+ disabled?: boolean;
29
+ rovingFocus?: boolean;
30
+ orientation?: 'horizontal' | 'vertical';
31
+ dir?: 'ltr' | 'rtl';
32
+ loop?: boolean;
33
+ children?: React.ReactNode;
34
+ };
35
+ type ToggleGroupProps = ToggleGroupBaseProps & VariantProps<typeof toggleGroupVariants> & VariantProps<typeof toggleGroupItemVariants> & (ToggleGroupSingleProps | ToggleGroupMultipleProps);
36
+ interface ToggleGroupItemProps extends React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>, Omit<VariantProps<typeof toggleGroupItemVariants>, 'fontWeight'> {
37
+ fontWeight?: 'normal' | 'semibold';
38
+ }
39
+ declare const ToggleGroupItem: React.ForwardRefExoticComponent<ToggleGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
40
+ declare const ToggleGroup: React.ForwardRefExoticComponent<ToggleGroupProps & React.RefAttributes<HTMLDivElement>> & {
41
+ Item: React.ForwardRefExoticComponent<ToggleGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
42
+ };
43
+ declare namespace ToggleGroup {
44
+ type ItemProps = ToggleGroupItemProps;
45
+ }
46
+
47
+ export { ToggleGroup, ToggleGroupItem, type ToggleGroupItemProps, type ToggleGroupProps, toggleGroupItemVariants, toggleGroupVariants };