@px-ui/ui 0.1.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/dist/avatar-BAkmIOVe.d.ts +41 -0
  2. package/dist/avatar-BAkmIOVe.d.ts.map +1 -0
  3. package/dist/avatar-DDdL9xDH.js +119 -0
  4. package/dist/avatar-DDdL9xDH.js.map +1 -0
  5. package/dist/button-BiiFfKiR.d.ts +19 -0
  6. package/dist/button-BiiFfKiR.d.ts.map +1 -0
  7. package/dist/button-hBUFMmsZ.js +47 -0
  8. package/dist/button-hBUFMmsZ.js.map +1 -0
  9. package/dist/combobox-CnpyzZ7B.js +334 -0
  10. package/dist/combobox-CnpyzZ7B.js.map +1 -0
  11. package/dist/combobox-JXY6PiDq.d.ts +109 -0
  12. package/dist/combobox-JXY6PiDq.d.ts.map +1 -0
  13. package/dist/components/accordion.d.ts +25 -0
  14. package/dist/components/accordion.d.ts.map +1 -0
  15. package/dist/components/accordion.js +56 -0
  16. package/dist/components/accordion.js.map +1 -0
  17. package/dist/components/alert-dialog.d.ts +59 -0
  18. package/dist/components/alert-dialog.d.ts.map +1 -0
  19. package/dist/components/alert-dialog.js +99 -0
  20. package/dist/components/alert-dialog.js.map +1 -0
  21. package/dist/components/alert.d.ts +29 -0
  22. package/dist/components/alert.d.ts.map +1 -0
  23. package/dist/components/alert.js +47 -0
  24. package/dist/components/alert.js.map +1 -0
  25. package/dist/components/aspect-ratio.d.ts +13 -0
  26. package/dist/components/aspect-ratio.d.ts.map +1 -0
  27. package/dist/components/aspect-ratio.js +16 -0
  28. package/dist/components/aspect-ratio.js.map +1 -0
  29. package/dist/components/avatar-group.d.ts +30 -0
  30. package/dist/components/avatar-group.d.ts.map +1 -0
  31. package/dist/components/avatar-group.js +69 -0
  32. package/dist/components/avatar-group.js.map +1 -0
  33. package/dist/components/avatar.d.ts +2 -0
  34. package/dist/components/avatar.js +5 -0
  35. package/dist/components/badge.d.ts +18 -0
  36. package/dist/components/badge.d.ts.map +1 -0
  37. package/dist/components/badge.js +31 -0
  38. package/dist/components/badge.js.map +1 -0
  39. package/dist/components/breadcrumb.d.ts +38 -0
  40. package/dist/components/breadcrumb.d.ts.map +1 -0
  41. package/dist/components/breadcrumb.js +75 -0
  42. package/dist/components/breadcrumb.js.map +1 -0
  43. package/dist/components/button-group.d.ts +29 -0
  44. package/dist/components/button-group.d.ts.map +1 -0
  45. package/dist/components/button-group.js +44 -0
  46. package/dist/components/button-group.js.map +1 -0
  47. package/dist/components/button.d.ts +2 -0
  48. package/dist/components/button.js +4 -0
  49. package/dist/components/calendar.d.ts +32 -0
  50. package/dist/components/calendar.d.ts.map +1 -0
  51. package/dist/components/calendar.js +119 -0
  52. package/dist/components/calendar.js.map +1 -0
  53. package/dist/components/card.d.ts +38 -0
  54. package/dist/components/card.d.ts.map +1 -0
  55. package/dist/components/card.js +59 -0
  56. package/dist/components/card.js.map +1 -0
  57. package/dist/components/carousel.d.ts +57 -0
  58. package/dist/components/carousel.d.ts.map +1 -0
  59. package/dist/components/carousel.js +136 -0
  60. package/dist/components/carousel.js.map +1 -0
  61. package/dist/components/chart.d.ts +79 -0
  62. package/dist/components/chart.d.ts.map +1 -0
  63. package/dist/components/chart.js +148 -0
  64. package/dist/components/chart.js.map +1 -0
  65. package/dist/components/checkbox.d.ts +11 -0
  66. package/dist/components/checkbox.d.ts.map +1 -0
  67. package/dist/components/checkbox.js +24 -0
  68. package/dist/components/checkbox.js.map +1 -0
  69. package/dist/components/collapsible.d.ts +25 -0
  70. package/dist/components/collapsible.d.ts.map +1 -0
  71. package/dist/components/collapsible.js +28 -0
  72. package/dist/components/collapsible.js.map +1 -0
  73. package/dist/components/combobox.d.ts +3 -0
  74. package/dist/components/combobox.js +13 -0
  75. package/dist/components/command.d.ts +78 -0
  76. package/dist/components/command.d.ts.map +1 -0
  77. package/dist/components/command.js +125 -0
  78. package/dist/components/command.js.map +1 -0
  79. package/dist/components/context-menu.d.ts +87 -0
  80. package/dist/components/context-menu.d.ts.map +1 -0
  81. package/dist/components/context-menu.js +137 -0
  82. package/dist/components/context-menu.js.map +1 -0
  83. package/dist/components/currency-select-field.d.ts +105 -0
  84. package/dist/components/currency-select-field.d.ts.map +1 -0
  85. package/dist/components/currency-select-field.js +266 -0
  86. package/dist/components/currency-select-field.js.map +1 -0
  87. package/dist/components/dialog.d.ts +61 -0
  88. package/dist/components/dialog.d.ts.map +1 -0
  89. package/dist/components/dialog.js +5 -0
  90. package/dist/components/direction.d.ts +2 -0
  91. package/dist/components/direction.js +3 -0
  92. package/dist/components/drawer.d.ts +45 -0
  93. package/dist/components/drawer.d.ts.map +1 -0
  94. package/dist/components/drawer.js +86 -0
  95. package/dist/components/drawer.js.map +1 -0
  96. package/dist/components/dropdown-menu.d.ts +2 -0
  97. package/dist/components/dropdown-menu.js +4 -0
  98. package/dist/components/empty.d.ts +36 -0
  99. package/dist/components/empty.d.ts.map +1 -0
  100. package/dist/components/empty.js +62 -0
  101. package/dist/components/empty.js.map +1 -0
  102. package/dist/components/field.d.ts +72 -0
  103. package/dist/components/field.d.ts.map +1 -0
  104. package/dist/components/field.js +122 -0
  105. package/dist/components/field.js.map +1 -0
  106. package/dist/components/file-upload-field.d.ts +58 -0
  107. package/dist/components/file-upload-field.d.ts.map +1 -0
  108. package/dist/components/file-upload-field.js +90 -0
  109. package/dist/components/file-upload-field.js.map +1 -0
  110. package/dist/components/file-upload.d.ts +4 -0
  111. package/dist/components/file-upload.js +6 -0
  112. package/dist/components/hover-card.d.ts +21 -0
  113. package/dist/components/hover-card.d.ts.map +1 -0
  114. package/dist/components/hover-card.js +40 -0
  115. package/dist/components/hover-card.js.map +1 -0
  116. package/dist/components/input-group.d.ts +46 -0
  117. package/dist/components/input-group.d.ts.map +1 -0
  118. package/dist/components/input-group.js +9 -0
  119. package/dist/components/input-otp.d.ts +24 -0
  120. package/dist/components/input-otp.d.ts.map +1 -0
  121. package/dist/components/input-otp.js +40 -0
  122. package/dist/components/input-otp.js.map +1 -0
  123. package/dist/components/input.d.ts +2 -0
  124. package/dist/components/input.js +4 -0
  125. package/dist/components/item.d.ts +62 -0
  126. package/dist/components/item.d.ts.map +1 -0
  127. package/dist/components/item.js +124 -0
  128. package/dist/components/item.js.map +1 -0
  129. package/dist/components/kbd.d.ts +14 -0
  130. package/dist/components/kbd.d.ts.map +1 -0
  131. package/dist/components/kbd.js +22 -0
  132. package/dist/components/kbd.js.map +1 -0
  133. package/dist/components/label.d.ts +2 -0
  134. package/dist/components/label.js +6 -0
  135. package/dist/components/menubar.d.ts +89 -0
  136. package/dist/components/menubar.d.ts.map +1 -0
  137. package/dist/components/menubar.js +140 -0
  138. package/dist/components/menubar.js.map +1 -0
  139. package/dist/components/native-select.d.ts +23 -0
  140. package/dist/components/native-select.d.ts.map +1 -0
  141. package/dist/components/native-select.js +41 -0
  142. package/dist/components/native-select.js.map +1 -0
  143. package/dist/components/navigation-menu.d.ts +48 -0
  144. package/dist/components/navigation-menu.d.ts.map +1 -0
  145. package/dist/components/navigation-menu.js +85 -0
  146. package/dist/components/navigation-menu.js.map +1 -0
  147. package/dist/components/pagination.d.ts +46 -0
  148. package/dist/components/pagination.d.ts.map +1 -0
  149. package/dist/components/pagination.js +89 -0
  150. package/dist/components/pagination.js.map +1 -0
  151. package/dist/components/phone-input.d.ts +28 -0
  152. package/dist/components/phone-input.d.ts.map +1 -0
  153. package/dist/components/phone-input.js +60 -0
  154. package/dist/components/phone-input.js.map +1 -0
  155. package/dist/components/popover.d.ts +34 -0
  156. package/dist/components/popover.d.ts.map +1 -0
  157. package/dist/components/popover.js +4 -0
  158. package/dist/components/progress.d.ts +29 -0
  159. package/dist/components/progress.d.ts.map +1 -0
  160. package/dist/components/progress.js +48 -0
  161. package/dist/components/progress.js.map +1 -0
  162. package/dist/components/radio-group.d.ts +16 -0
  163. package/dist/components/radio-group.d.ts.map +1 -0
  164. package/dist/components/radio-group.js +29 -0
  165. package/dist/components/radio-group.js.map +1 -0
  166. package/dist/components/resizable.d.ts +21 -0
  167. package/dist/components/resizable.d.ts.map +1 -0
  168. package/dist/components/resizable.js +32 -0
  169. package/dist/components/resizable.js.map +1 -0
  170. package/dist/components/scroll-area.d.ts +17 -0
  171. package/dist/components/scroll-area.d.ts.map +1 -0
  172. package/dist/components/scroll-area.js +39 -0
  173. package/dist/components/scroll-area.js.map +1 -0
  174. package/dist/components/select.d.ts +56 -0
  175. package/dist/components/select.d.ts.map +1 -0
  176. package/dist/components/select.js +102 -0
  177. package/dist/components/select.js.map +1 -0
  178. package/dist/components/separator.d.ts +2 -0
  179. package/dist/components/separator.js +4 -0
  180. package/dist/components/sheet.d.ts +43 -0
  181. package/dist/components/sheet.d.ts.map +1 -0
  182. package/dist/components/sheet.js +7 -0
  183. package/dist/components/sidebar.d.ts +162 -0
  184. package/dist/components/sidebar.d.ts.map +1 -0
  185. package/dist/components/sidebar.js +390 -0
  186. package/dist/components/sidebar.js.map +1 -0
  187. package/dist/components/skeleton.d.ts +10 -0
  188. package/dist/components/skeleton.d.ts.map +1 -0
  189. package/dist/components/skeleton.js +4 -0
  190. package/dist/components/slider.d.ts +15 -0
  191. package/dist/components/slider.d.ts.map +1 -0
  192. package/dist/components/slider.js +36 -0
  193. package/dist/components/slider.js.map +1 -0
  194. package/dist/components/spinner.d.ts +11 -0
  195. package/dist/components/spinner.d.ts.map +1 -0
  196. package/dist/components/spinner.js +4 -0
  197. package/dist/components/switch.d.ts +14 -0
  198. package/dist/components/switch.d.ts.map +1 -0
  199. package/dist/components/switch.js +21 -0
  200. package/dist/components/switch.js.map +1 -0
  201. package/dist/components/table.d.ts +39 -0
  202. package/dist/components/table.d.ts.map +1 -0
  203. package/dist/components/table.js +71 -0
  204. package/dist/components/table.js.map +1 -0
  205. package/dist/components/tabs.d.ts +31 -0
  206. package/dist/components/tabs.d.ts.map +1 -0
  207. package/dist/components/tabs.js +55 -0
  208. package/dist/components/tabs.js.map +1 -0
  209. package/dist/components/textarea.d.ts +11 -0
  210. package/dist/components/textarea.d.ts.map +1 -0
  211. package/dist/components/textarea.js +4 -0
  212. package/dist/components/toast.d.ts +2 -0
  213. package/dist/components/toast.js +6 -0
  214. package/dist/components/toggle-group.d.ts +29 -0
  215. package/dist/components/toggle-group.d.ts.map +1 -0
  216. package/dist/components/toggle-group.js +55 -0
  217. package/dist/components/toggle-group.js.map +1 -0
  218. package/dist/components/toggle.d.ts +2 -0
  219. package/dist/components/toggle.js +6 -0
  220. package/dist/components/tooltip.d.ts +2 -0
  221. package/dist/components/tooltip.js +4 -0
  222. package/dist/dialog-CTqRrytc.js +103 -0
  223. package/dist/dialog-CTqRrytc.js.map +1 -0
  224. package/dist/direction-BKSh6e6q.js +3 -0
  225. package/dist/dropdown-menu-BEARLcDj.d.ts +91 -0
  226. package/dist/dropdown-menu-BEARLcDj.d.ts.map +1 -0
  227. package/dist/dropdown-menu-CcumvwhM.js +139 -0
  228. package/dist/dropdown-menu-CcumvwhM.js.map +1 -0
  229. package/dist/file-upload-D8hgfjvA.d.ts +145 -0
  230. package/dist/file-upload-D8hgfjvA.d.ts.map +1 -0
  231. package/dist/file-upload-DeCIv13t.js +434 -0
  232. package/dist/file-upload-DeCIv13t.js.map +1 -0
  233. package/dist/hooks/use-async-options.d.ts +2 -0
  234. package/dist/hooks/use-async-options.js +3 -0
  235. package/dist/hooks/use-debounce.d.ts +5 -0
  236. package/dist/hooks/use-debounce.d.ts.map +1 -0
  237. package/dist/hooks/use-debounce.js +3 -0
  238. package/dist/hooks/use-file-upload.d.ts +2 -0
  239. package/dist/hooks/use-file-upload.js +3 -0
  240. package/dist/hooks/use-infinite-scroll.d.ts +21 -0
  241. package/dist/hooks/use-infinite-scroll.d.ts.map +1 -0
  242. package/dist/hooks/use-infinite-scroll.js +4 -0
  243. package/dist/hooks/use-intersection-observer.d.ts +2 -0
  244. package/dist/hooks/use-intersection-observer.js +3 -0
  245. package/dist/hooks/use-mobile.d.ts +5 -0
  246. package/dist/hooks/use-mobile.d.ts.map +1 -0
  247. package/dist/hooks/use-mobile.js +3 -0
  248. package/dist/input-8jqdnUZl.js +18 -0
  249. package/dist/input-8jqdnUZl.js.map +1 -0
  250. package/dist/input-DwxhsFRP.d.ts +12 -0
  251. package/dist/input-DwxhsFRP.d.ts.map +1 -0
  252. package/dist/input-group-DqEkmpXW.js +81 -0
  253. package/dist/input-group-DqEkmpXW.js.map +1 -0
  254. package/dist/label-AaH9ZYCZ.js +16 -0
  255. package/dist/label-AaH9ZYCZ.js.map +1 -0
  256. package/dist/label-D5SCGMZl.d.ts +11 -0
  257. package/dist/label-D5SCGMZl.d.ts.map +1 -0
  258. package/dist/lib/utils.d.ts +7 -0
  259. package/dist/lib/utils.d.ts.map +1 -0
  260. package/dist/lib/utils.js +3 -0
  261. package/dist/popover-C9D43EuT.js +57 -0
  262. package/dist/popover-C9D43EuT.js.map +1 -0
  263. package/dist/providers/px-ui-provider.d.ts +36 -0
  264. package/dist/providers/px-ui-provider.d.ts.map +1 -0
  265. package/dist/providers/px-ui-provider.js +26 -0
  266. package/dist/providers/px-ui-provider.js.map +1 -0
  267. package/dist/separator-BS3ilczC.js +17 -0
  268. package/dist/separator-BS3ilczC.js.map +1 -0
  269. package/dist/separator-ct9ZvuTk.d.ts +12 -0
  270. package/dist/separator-ct9ZvuTk.d.ts.map +1 -0
  271. package/dist/sheet-CLjNDrfL.js +91 -0
  272. package/dist/sheet-CLjNDrfL.js.map +1 -0
  273. package/dist/skeleton-BcIxI5Wq.js +15 -0
  274. package/dist/skeleton-BcIxI5Wq.js.map +1 -0
  275. package/dist/spinner-Bo0sUZEg.js +17 -0
  276. package/dist/spinner-Bo0sUZEg.js.map +1 -0
  277. package/dist/styles.css +196 -0
  278. package/dist/textarea-Cq0o323P.js +16 -0
  279. package/dist/textarea-Cq0o323P.js.map +1 -0
  280. package/dist/toast-COWAQbIk.js +211 -0
  281. package/dist/toast-COWAQbIk.js.map +1 -0
  282. package/dist/toast-CXkP5Jwp.d.ts +74 -0
  283. package/dist/toast-CXkP5Jwp.d.ts.map +1 -0
  284. package/dist/toggle-BXBPgIQh.d.ts +19 -0
  285. package/dist/toggle-BXBPgIQh.d.ts.map +1 -0
  286. package/dist/toggle-DhJ_qwgw.js +38 -0
  287. package/dist/toggle-DhJ_qwgw.js.map +1 -0
  288. package/dist/tooltip-BWjVzK67.d.ts +26 -0
  289. package/dist/tooltip-BWjVzK67.d.ts.map +1 -0
  290. package/dist/tooltip-DkPxCJIL.js +43 -0
  291. package/dist/tooltip-DkPxCJIL.js.map +1 -0
  292. package/dist/use-async-options-DHR8q5qX.d.ts +45 -0
  293. package/dist/use-async-options-DHR8q5qX.d.ts.map +1 -0
  294. package/dist/use-async-options-wZ9LJ2BJ.js +46 -0
  295. package/dist/use-async-options-wZ9LJ2BJ.js.map +1 -0
  296. package/dist/use-debounce-_qaEZqtt.js +24 -0
  297. package/dist/use-debounce-_qaEZqtt.js.map +1 -0
  298. package/dist/{index.js → use-file-upload-Dxrej28u.js} +3 -204
  299. package/dist/use-file-upload-Dxrej28u.js.map +1 -0
  300. package/dist/use-file-upload-yy-xLBtn.d.ts +133 -0
  301. package/dist/use-file-upload-yy-xLBtn.d.ts.map +1 -0
  302. package/dist/use-infinite-scroll-CpbhGGT5.js +38 -0
  303. package/dist/use-infinite-scroll-CpbhGGT5.js.map +1 -0
  304. package/dist/use-intersection-observer-C2xDq2SW.d.ts +11 -0
  305. package/dist/use-intersection-observer-C2xDq2SW.d.ts.map +1 -0
  306. package/dist/use-intersection-observer-CZfnep4z.js +33 -0
  307. package/dist/use-intersection-observer-CZfnep4z.js.map +1 -0
  308. package/dist/use-mobile-l5ebOdQl.js +21 -0
  309. package/dist/use-mobile-l5ebOdQl.js.map +1 -0
  310. package/dist/utils-mWJR2N24.js +28 -0
  311. package/dist/utils-mWJR2N24.js.map +1 -0
  312. package/package.json +289 -26
  313. package/dist/index.css +0 -143
  314. package/dist/index.d.ts +0 -229
  315. package/dist/index.d.ts.map +0 -1
  316. package/dist/index.js.map +0 -1
package/dist/index.d.ts DELETED
@@ -1,229 +0,0 @@
1
- import { Button as Button$1 } from "@base-ui/react/button";
2
- import { VariantProps } from "class-variance-authority";
3
- import { ClassValue } from "clsx";
4
- import * as react_jsx_runtime0 from "react/jsx-runtime";
5
- import { ChangeEvent, DragEvent, InputHTMLAttributes } from "react";
6
- import * as _tanstack_react_query0 from "@tanstack/react-query";
7
- import { QueryKey } from "@tanstack/react-query";
8
- import * as class_variance_authority_types0 from "class-variance-authority/types";
9
-
10
- //#region src/components/button.d.ts
11
- declare const buttonVariants: (props?: ({
12
- variant?: "default" | "outline" | "secondary" | "ghost" | "destructive" | "link" | null | undefined;
13
- size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
14
- } & class_variance_authority_types0.ClassProp) | undefined) => string;
15
- declare function Button({
16
- className,
17
- variant,
18
- size,
19
- ...props
20
- }: Button$1.Props & VariantProps<typeof buttonVariants>): react_jsx_runtime0.JSX.Element;
21
- //#endregion
22
- //#region src/lib/utils.d.ts
23
- declare function cn(...inputs: ClassValue[]): string;
24
- //#endregion
25
- //#region src/providers/px-ui-provider.d.ts
26
- declare function PXUIProvider(props: React.PropsWithChildren): react_jsx_runtime0.JSX.Element;
27
- //#endregion
28
- //#region src/hooks/use-debounce.d.ts
29
- declare function useDebounce<T>(callback: () => void, delay: number, deps: React.DependencyList): void;
30
- //#endregion
31
- //#region src/hooks/use-intersection-observer.d.ts
32
- interface UseIntersectionObserverOptions {
33
- threshold?: number | number[];
34
- root?: Element | Document | null;
35
- rootMargin?: string;
36
- }
37
- type UseIntersectionObserverReturn = [(node: Element | null) => void, IntersectionObserverEntry | null];
38
- declare function useIntersectionObserver(options?: UseIntersectionObserverOptions): UseIntersectionObserverReturn;
39
- //#endregion
40
- //#region src/hooks/use-infinite-scroll.d.ts
41
- type UseInfiniteScrollHookArgs = Pick<UseIntersectionObserverOptions, "rootMargin" | "threshold"> & {
42
- isLoadingMore: boolean;
43
- hasMore: boolean;
44
- onLoadMore: () => unknown;
45
- disabled?: boolean;
46
- };
47
- declare function useInfiniteScroll({
48
- isLoadingMore,
49
- hasMore,
50
- onLoadMore,
51
- rootMargin,
52
- disabled,
53
- threshold
54
- }: UseInfiniteScrollHookArgs): readonly [(node: Element | null) => void];
55
- //#endregion
56
- //#region src/hooks/use-async-options.d.ts
57
- type LoadOptionsData<TData$1> = {
58
- options: TData$1[];
59
- hasMore: boolean;
60
- };
61
- type LoadOptionsReturn<TData$1> = {
62
- data: LoadOptionsData<TData$1>;
63
- error: any;
64
- };
65
- type LoadOptionsFn<TData$1> = (params: {
66
- search: string;
67
- page: number;
68
- signal: AbortSignal;
69
- }) => Promise<LoadOptionsReturn<TData$1>>;
70
- declare function useAsyncOptions<TData$1 = any>(params: {
71
- cacheKey: QueryKey;
72
- loader: LoadOptionsFn<TData$1>;
73
- }, {
74
- isOpen,
75
- inputValue
76
- }: {
77
- isOpen: boolean;
78
- inputValue: string;
79
- }): {
80
- items: TData$1[] | undefined;
81
- isLoading: boolean;
82
- isLoadingMore: boolean;
83
- hasMore: boolean;
84
- isError: boolean;
85
- onLoadMore: () => void;
86
- _query: _tanstack_react_query0.UseInfiniteQueryResult<_tanstack_react_query0.InfiniteData<LoadOptionsData<TData$1>, unknown>, Error>;
87
- };
88
- type LoadOptionsConfig<TData$1> = {
89
- cacheKey: QueryKey;
90
- loader: LoadOptionsFn<TData$1>;
91
- };
92
- declare function defineLoadOptions<TData$1 = any>(loadOptions: LoadOptionsConfig<TData$1>): LoadOptionsConfig<TData$1>;
93
- type InferOption<T> = T extends LoadOptionsConfig<infer TData> ? TData : never;
94
- type InferOptions<T> = T extends LoadOptionsConfig<infer TData> ? TData[] : never;
95
- //#endregion
96
- //#region src/hooks/use-file-upload.d.ts
97
- type FileMetadata = {
98
- name: string;
99
- size: number;
100
- type: string;
101
- url: string;
102
- id: string;
103
- };
104
- type UploadStatus = "idle" | "uploading" | "complete" | "error";
105
- type FileUploadItem = {
106
- file: File | FileMetadata;
107
- id: string;
108
- preview?: string;
109
- progress: number;
110
- status: UploadStatus;
111
- error?: string;
112
- uploadedUrl?: string;
113
- };
114
- type PresignedUrlResponse = {
115
- /** The S3 bucket URL to POST to */
116
- url: string;
117
- /** The full accessible path after upload (may include signed query params) */
118
- full_path: string;
119
- /** The S3 object key (e.g., "uuid/filename.pdf") */
120
- key?: string;
121
- /** Access control level */
122
- acl?: string;
123
- /** Expected response status from S3 */
124
- success_action_status?: string;
125
- /** Content-Type for the upload */
126
- "Content-Type"?: string;
127
- /** Base64-encoded policy document */
128
- policy?: string;
129
- /** AWS credential string */
130
- "x-amz-credential"?: string;
131
- /** AWS signing algorithm */
132
- "x-amz-algorithm"?: string;
133
- /** AWS request date */
134
- "x-amz-date"?: string;
135
- /** AWS request signature */
136
- "x-amz-signature"?: string;
137
- /** Additional fields */
138
- [key: string]: unknown;
139
- };
140
- type UploadConfig = {
141
- /**
142
- * Function to get a presigned URL for uploading
143
- */
144
- getPresignedUrl: (params: {
145
- filename: string;
146
- contentType: string;
147
- size: number;
148
- signal?: AbortSignal;
149
- }) => Promise<{
150
- result?: PresignedUrlResponse | null;
151
- error?: unknown;
152
- }>;
153
- /**
154
- * Function to upload the file to the storage
155
- */
156
- uploadFile: (url: string, file: File, presignedData: PresignedUrlResponse, onProgress?: (progress: number) => void, signal?: AbortSignal) => Promise<{
157
- result?: {
158
- url: string;
159
- [key: string]: unknown;
160
- };
161
- error?: unknown;
162
- }>;
163
- /**
164
- * Whether to auto-upload files when they are added
165
- * @default true
166
- */
167
- autoUpload?: boolean;
168
- /**
169
- * Called when a single file upload completes
170
- */
171
- onUploadComplete?: (file: FileUploadItem) => void;
172
- /**
173
- * Called when a single file upload fails
174
- */
175
- onUploadError?: (file: FileUploadItem, error: unknown) => void;
176
- /**
177
- * Called when all files finish uploading
178
- */
179
- onAllUploadsComplete?: (files: FileUploadItem[]) => void;
180
- };
181
- type UseFileUploadOptions = {
182
- maxFiles?: number;
183
- maxSize?: number;
184
- minSize?: number;
185
- accept?: string;
186
- multiple?: boolean;
187
- initialFiles?: FileMetadata[];
188
- onFilesChange?: (files: FileUploadItem[]) => void;
189
- onFileAdd?: (addedFile: FileUploadItem) => void;
190
- onFileRemove?: (removedFile: FileUploadItem) => void;
191
- upload?: UploadConfig;
192
- };
193
- type UseFileUploadReturn = {
194
- files: FileUploadItem[];
195
- isDragging: boolean;
196
- isUploading: boolean;
197
- errors: string[];
198
- addFiles: (files: FileList | File[]) => void;
199
- removeFile: (id: string) => void;
200
- clearFiles: () => void;
201
- clearErrors: () => void;
202
- reset: (newFiles?: FileMetadata[]) => void;
203
- setFiles: (files: FileUploadItem[] | ((prev: FileUploadItem[]) => FileUploadItem[])) => void;
204
- instanceKey: number;
205
- uploadFiles: (files?: FileUploadItem[]) => Promise<FileUploadItem[]>;
206
- retryUpload: (id: string) => Promise<void>;
207
- cancelUpload: (id: string) => void;
208
- handleDragEnter: (e: DragEvent<HTMLElement>) => void;
209
- handleDragLeave: (e: DragEvent<HTMLElement>) => void;
210
- handleDragOver: (e: DragEvent<HTMLElement>) => void;
211
- handleDrop: (e: DragEvent<HTMLElement>) => void;
212
- handleFileChange: (e: ChangeEvent<HTMLInputElement>) => void;
213
- openFileDialog: () => void;
214
- getInputProps: (props?: InputHTMLAttributes<HTMLInputElement>) => InputHTMLAttributes<HTMLInputElement> & {
215
- ref: any;
216
- };
217
- };
218
- declare const formatBytes: (bytes: number, decimals?: number) => string;
219
- declare const useFileUpload: (options?: UseFileUploadOptions) => UseFileUploadReturn;
220
- type FileWithPreview = FileUploadItem;
221
- type FileWithUploadStatus = FileUploadItem;
222
- type FileUploadOptions = UseFileUploadOptions;
223
- type FileUploadWithUploaderOptions = UseFileUploadOptions;
224
- //#endregion
225
- //#region src/hooks/use-mobile.d.ts
226
- declare function useIsMobile(): boolean;
227
- //#endregion
228
- export { Button, FileMetadata, FileUploadItem, FileUploadOptions, FileUploadWithUploaderOptions, FileWithPreview, FileWithUploadStatus, InferOption, InferOptions, LoadOptionsConfig, PXUIProvider, PresignedUrlResponse, UploadConfig, UploadStatus, UseFileUploadOptions, UseFileUploadReturn, UseIntersectionObserverOptions, UseIntersectionObserverReturn, buttonVariants, cn, defineLoadOptions, formatBytes, useAsyncOptions, useDebounce, useFileUpload, useInfiniteScroll, useIntersectionObserver, useIsMobile };
229
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/components/button.tsx","../src/lib/utils.ts","../src/providers/px-ui-provider.tsx","../src/hooks/use-debounce.ts","../src/hooks/use-intersection-observer.ts","../src/hooks/use-infinite-scroll.ts","../src/hooks/use-async-options.ts","../src/hooks/use-file-upload.ts","../src/hooks/use-mobile.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["ButtonPrimitive","entry","uploadedFile: FileUploadItem","failedFile: FileUploadItem","results: FileUploadItem[]","newErrors: string[]","validFiles: FileUploadItem[]","initializedFiles: FileUploadItem[]","React"],"sources":["../src/lib/utils.ts","../src/components/button.tsx","../src/providers/px-ui-provider.tsx","../src/hooks/use-debounce.ts","../src/hooks/use-intersection-observer.ts","../src/hooks/use-infinite-scroll.ts","../src/hooks/use-async-options.ts","../src/hooks/use-file-upload.ts","../src/hooks/use-mobile.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@px-ui/ui/lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5\",\n lg: \"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { createContext } from \"react\";\n\nconst PXUIContext = createContext(null);\n\nexport function PXUIProvider(props: React.PropsWithChildren) {\n return <PXUIContext.Provider value={null}>{props.children}</PXUIContext.Provider>;\n}\n","import { useEffect, useEffectEvent, useRef } from \"react\";\n\nexport default function useDebounce<T>(\n callback: () => void,\n delay: number,\n deps: React.DependencyList,\n) {\n const timeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cb = useEffectEvent(callback);\n\n useEffect(() => {\n if (timeout.current) {\n clearTimeout(timeout.current);\n }\n\n timeout.current = setTimeout(() => {\n cb();\n timeout.current = null;\n }, delay);\n\n return () => {\n if (timeout.current) {\n clearTimeout(timeout.current);\n timeout.current = null;\n }\n };\n }, [...deps, delay]);\n}\n","import React from \"react\";\n\nexport interface UseIntersectionObserverOptions {\n threshold?: number | number[];\n root?: Element | Document | null;\n rootMargin?: string;\n}\n\nexport type UseIntersectionObserverReturn = [\n (node: Element | null) => void,\n IntersectionObserverEntry | null,\n];\n\nexport function useIntersectionObserver(\n options: UseIntersectionObserverOptions = {},\n): UseIntersectionObserverReturn {\n const { threshold = 1, root = null, rootMargin = \"0px\" } = options;\n const [entry, setEntry] = React.useState<IntersectionObserverEntry | null>(\n null,\n );\n\n const previousObserver = React.useRef<IntersectionObserver | null>(null);\n\n const customRef = React.useCallback(\n (node: Element | null) => {\n if (previousObserver.current) {\n previousObserver.current.disconnect();\n previousObserver.current = null;\n }\n\n if (node?.nodeType === Node.ELEMENT_NODE) {\n const observer = new IntersectionObserver(\n ([entry]: IntersectionObserverEntry[]) => {\n setEntry(entry ?? null);\n },\n { threshold, root, rootMargin },\n );\n\n observer.observe(node);\n previousObserver.current = observer;\n }\n },\n [threshold, root, rootMargin],\n );\n\n return [customRef, entry] as const;\n}\n","import { useEffect, useEffectEvent } from \"react\";\nimport {\n useIntersectionObserver,\n type UseIntersectionObserverOptions,\n} from \"./use-intersection-observer\";\n\nconst DEFAULT_DELAY_IN_MS = 100;\n\nexport type UseInfiniteScrollHookArgs = Pick<\n UseIntersectionObserverOptions,\n \"rootMargin\" | \"threshold\"\n> & {\n isLoadingMore: boolean;\n hasMore: boolean;\n onLoadMore: () => unknown;\n disabled?: boolean;\n};\n\nfunction useInfiniteScroll({\n isLoadingMore,\n hasMore,\n onLoadMore,\n rootMargin,\n disabled,\n threshold = 0,\n}: UseInfiniteScrollHookArgs) {\n const [ref, entry] = useIntersectionObserver({\n rootMargin,\n threshold,\n });\n const isVisible = Boolean(entry?.isIntersecting);\n\n const onLoadMoreEvent = useEffectEvent(() => {\n onLoadMore();\n });\n\n useEffect(() => {\n if (disabled) return;\n\n if (isVisible && hasMore && !isLoadingMore && !disabled) {\n const timer = setTimeout(() => {\n onLoadMoreEvent();\n }, DEFAULT_DELAY_IN_MS);\n\n return () => {\n clearTimeout(timer);\n };\n }\n }, [isVisible, isLoadingMore, hasMore, disabled]);\n\n return [ref] as const;\n}\n\nexport default useInfiniteScroll;\n","import { useRef } from \"react\";\nimport { useInfiniteQuery, type QueryKey } from \"@tanstack/react-query\";\n\ntype LoadOptionsData<TData> = {\n options: TData[];\n hasMore: boolean;\n};\n\ntype LoadOptionsReturn<TData> = {\n data: LoadOptionsData<TData>;\n error: any;\n};\n\ntype LoadOptionsFn<TData> = (params: {\n search: string;\n page: number;\n signal: AbortSignal;\n}) => Promise<LoadOptionsReturn<TData>>;\n\nexport function useAsyncOptions<TData = any>(\n params: {\n cacheKey: QueryKey;\n loader: LoadOptionsFn<TData>;\n },\n {\n isOpen,\n inputValue,\n }: {\n isOpen: boolean;\n inputValue: string;\n },\n) {\n const isFetchedAfterMount = useRef(false);\n\n const query = useInfiniteQuery({\n queryKey: [...params.cacheKey, inputValue],\n queryFn: async ({ pageParam, signal }) => {\n const { error, data } = await params.loader({\n search: inputValue,\n page: pageParam,\n signal,\n });\n\n if (error) {\n throw new Error(error);\n }\n\n return data;\n },\n enabled: isOpen,\n initialPageParam: 1,\n staleTime: () => (isFetchedAfterMount.current ? Infinity : 0),\n getNextPageParam: (lastPage, allPages) =>\n lastPage.hasMore ? allPages.length + 1 : undefined,\n retry: false,\n });\n\n if (query.isFetchedAfterMount && !isFetchedAfterMount.current) {\n isFetchedAfterMount.current = true;\n }\n\n const items = query.data?.pages.flatMap((page) => page.options);\n\n const handleLoadMore = () => {\n query.fetchNextPage();\n };\n\n return {\n items,\n isLoading: query.isLoading,\n isLoadingMore: query.isFetchingNextPage,\n hasMore: query.hasNextPage,\n isError: query.isError,\n onLoadMore: handleLoadMore,\n _query: query,\n };\n}\n\nexport type LoadOptionsConfig<TData> = {\n cacheKey: QueryKey;\n loader: LoadOptionsFn<TData>;\n};\n\nexport function defineLoadOptions<TData = any>(\n loadOptions: LoadOptionsConfig<TData>,\n) {\n return loadOptions;\n}\n\nexport type InferOption<T> =\n T extends LoadOptionsConfig<infer TData> ? TData : never;\nexport type InferOptions<T> =\n T extends LoadOptionsConfig<infer TData> ? TData[] : never;\n","import {\n type ChangeEvent,\n type DragEvent,\n type InputHTMLAttributes,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type FileMetadata = {\n name: string;\n size: number;\n type: string;\n url: string;\n id: string;\n};\n\nexport type UploadStatus = \"idle\" | \"uploading\" | \"complete\" | \"error\";\n\nexport type FileUploadItem = {\n file: File | FileMetadata;\n id: string;\n preview?: string;\n progress: number;\n status: UploadStatus;\n error?: string;\n uploadedUrl?: string;\n};\n\nexport type PresignedUrlResponse = {\n /** The S3 bucket URL to POST to */\n url: string;\n /** The full accessible path after upload (may include signed query params) */\n full_path: string;\n /** The S3 object key (e.g., \"uuid/filename.pdf\") */\n key?: string;\n /** Access control level */\n acl?: string;\n /** Expected response status from S3 */\n success_action_status?: string;\n /** Content-Type for the upload */\n \"Content-Type\"?: string;\n /** Base64-encoded policy document */\n policy?: string;\n /** AWS credential string */\n \"x-amz-credential\"?: string;\n /** AWS signing algorithm */\n \"x-amz-algorithm\"?: string;\n /** AWS request date */\n \"x-amz-date\"?: string;\n /** AWS request signature */\n \"x-amz-signature\"?: string;\n /** Additional fields */\n [key: string]: unknown;\n};\n\nexport type UploadConfig = {\n /**\n * Function to get a presigned URL for uploading\n */\n getPresignedUrl: (params: {\n filename: string;\n contentType: string;\n size: number;\n signal?: AbortSignal;\n }) => Promise<{\n result?: PresignedUrlResponse | null;\n error?: unknown;\n }>;\n\n /**\n * Function to upload the file to the storage\n */\n uploadFile: (\n url: string,\n file: File,\n presignedData: PresignedUrlResponse,\n onProgress?: (progress: number) => void,\n signal?: AbortSignal,\n ) => Promise<{\n result?: { url: string; [key: string]: unknown };\n error?: unknown;\n }>;\n\n /**\n * Whether to auto-upload files when they are added\n * @default true\n */\n autoUpload?: boolean;\n\n /**\n * Called when a single file upload completes\n */\n onUploadComplete?: (file: FileUploadItem) => void;\n\n /**\n * Called when a single file upload fails\n */\n onUploadError?: (file: FileUploadItem, error: unknown) => void;\n\n /**\n * Called when all files finish uploading\n */\n onAllUploadsComplete?: (files: FileUploadItem[]) => void;\n};\n\nexport type UseFileUploadOptions = {\n maxFiles?: number;\n maxSize?: number;\n minSize?: number;\n accept?: string;\n multiple?: boolean;\n initialFiles?: FileMetadata[];\n onFilesChange?: (files: FileUploadItem[]) => void;\n onFileAdd?: (addedFile: FileUploadItem) => void;\n onFileRemove?: (removedFile: FileUploadItem) => void;\n upload?: UploadConfig;\n};\n\nexport type UseFileUploadReturn = {\n // State\n files: FileUploadItem[];\n isDragging: boolean;\n isUploading: boolean;\n errors: string[];\n\n // Core Actions\n addFiles: (files: FileList | File[]) => void;\n removeFile: (id: string) => void;\n clearFiles: () => void;\n clearErrors: () => void;\n\n // Form integration\n reset: (newFiles?: FileMetadata[]) => void;\n setFiles: (\n files: FileUploadItem[] | ((prev: FileUploadItem[]) => FileUploadItem[]),\n ) => void;\n instanceKey: number;\n\n // Upload Actions\n uploadFiles: (files?: FileUploadItem[]) => Promise<FileUploadItem[]>;\n retryUpload: (id: string) => Promise<void>;\n cancelUpload: (id: string) => void;\n\n // Drag/Drop + Input\n handleDragEnter: (e: DragEvent<HTMLElement>) => void;\n handleDragLeave: (e: DragEvent<HTMLElement>) => void;\n handleDragOver: (e: DragEvent<HTMLElement>) => void;\n handleDrop: (e: DragEvent<HTMLElement>) => void;\n handleFileChange: (e: ChangeEvent<HTMLInputElement>) => void;\n openFileDialog: () => void;\n getInputProps: (\n props?: InputHTMLAttributes<HTMLInputElement>,\n ) => InputHTMLAttributes<HTMLInputElement> & {\n // biome-ignore lint/suspicious/noExplicitAny: intentional for cross-React ref compatibility\n ref: any;\n };\n};\n\n// Helper function to format bytes to human-readable format\nexport const formatBytes = (bytes: number, decimals = 2): string => {\n if (bytes === 0) return \"0 Bytes\";\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Number.parseFloat((bytes / k ** i).toFixed(dm)) + sizes[i];\n};\n\n/**\n * Extract error message from various error formats, including S3 XML errors\n */\nfunction extractErrorMessage(error: unknown): string {\n if (typeof error === \"string\") {\n return error;\n }\n\n if (error instanceof Error) {\n // Check if it's an S3 XML error in the message\n const xmlMatch = error.message.match(/<Message>(.*?)<\\/Message>/);\n if (xmlMatch) {\n return xmlMatch[1];\n }\n return error.message;\n }\n\n // Handle objects with message property\n if (error && typeof error === \"object\") {\n // Check for responseText with XML\n if (\"responseText\" in error && typeof error.responseText === \"string\") {\n const xmlMatch = error.responseText.match(/<Message>(.*?)<\\/Message>/);\n if (xmlMatch) {\n return xmlMatch[1];\n }\n }\n\n // Check for body with XML\n if (\"body\" in error && typeof error.body === \"string\") {\n const xmlMatch = error.body.match(/<Message>(.*?)<\\/Message>/);\n if (xmlMatch) {\n return xmlMatch[1];\n }\n }\n\n // Standard message property\n if (\"message\" in error && typeof error.message === \"string\") {\n return error.message;\n }\n\n // Check for error property\n if (\"error\" in error) {\n return extractErrorMessage(error.error);\n }\n }\n\n return \"Upload failed\";\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport const useFileUpload = (\n options: UseFileUploadOptions = {},\n): UseFileUploadReturn => {\n const { upload, ...baseOptions } = options;\n const autoUpload = upload?.autoUpload ?? true;\n\n const [files, setFilesState] = useState<FileUploadItem[]>(\n (baseOptions.initialFiles ?? []).map((file) => ({\n file,\n id: file.id,\n preview: file.url,\n progress: 100,\n status: \"complete\" as const,\n uploadedUrl: file.url,\n })),\n );\n const [isUploading, setIsUploading] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [errors, setErrors] = useState<string[]>([]);\n const [instanceKey, setInstanceKey] = useState(0);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const abortControllersRef = useRef<Map<string, AbortController>>(new Map());\n\n // Helper to cancel all ongoing uploads\n const cancelAllUploads = useCallback(() => {\n for (const controller of abortControllersRef.current.values()) {\n controller.abort();\n }\n abortControllersRef.current.clear();\n }, []);\n\n const {\n maxFiles = Number.POSITIVE_INFINITY,\n maxSize = Number.POSITIVE_INFINITY,\n minSize = 4 * 1024,\n accept = \"*\",\n multiple = false,\n onFilesChange,\n onFileAdd,\n onFileRemove,\n } = baseOptions;\n\n const validateFile = useCallback(\n (file: File): string | null => {\n if (file.size > maxSize) {\n return `File \"${file.name}\" exceeds the maximum size of ${formatBytes(maxSize)}.`;\n }\n\n if (file.size < minSize) {\n return `File \"${file.name}\" is below the minimum size of ${formatBytes(minSize)}.`;\n }\n\n if (accept !== \"*\") {\n const acceptedTypes = accept.split(\",\").map((type) => type.trim());\n const fileType = file.type || \"\";\n const fileExtension = `.${file.name.split(\".\").pop()}`;\n\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith(\".\")) {\n return fileExtension.toLowerCase() === type.toLowerCase();\n }\n if (type.endsWith(\"/*\")) {\n const baseType = type.split(\"/\")[0];\n return fileType.startsWith(`${baseType}/`);\n }\n return fileType === type;\n });\n\n if (!isAccepted) {\n return `File \"${file.name}\" is not an accepted file type.`;\n }\n }\n\n return null;\n },\n [accept, maxSize, minSize],\n );\n\n const createPreview = useCallback((file: File): string | undefined => {\n if (file.type.startsWith(\"image/\")) {\n return URL.createObjectURL(file);\n }\n return undefined;\n }, []);\n\n const generateUniqueId = useCallback((file: File): string => {\n return `${file.name}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }, []);\n\n const uploadSingleFile = useCallback(\n async (fileWithStatus: FileUploadItem): Promise<FileUploadItem> => {\n if (!upload) {\n return {\n ...fileWithStatus,\n status: \"error\",\n error: \"No upload config provided\",\n };\n }\n\n const file = fileWithStatus.file as File;\n if (!(file instanceof File)) {\n // Already uploaded file (FileMetadata)\n return { ...fileWithStatus, status: \"complete\", progress: 100 };\n }\n\n const abortController = new AbortController();\n abortControllersRef.current.set(fileWithStatus.id, abortController);\n\n try {\n // Update status to uploading\n setFilesState((prev) =>\n prev.map((f) =>\n f.id === fileWithStatus.id\n ? { ...f, status: \"uploading\" as const, progress: 0 }\n : f,\n ),\n );\n\n // Step 1: Get presigned URL\n const { result: presignedResult, error: presignedError } =\n await upload.getPresignedUrl({\n filename: file.name,\n contentType: file.type,\n size: file.size,\n signal: abortController.signal,\n });\n\n if (presignedError || !presignedResult) {\n throw presignedError || new Error(\"Failed to get presigned URL\");\n }\n\n // Update progress after getting presigned URL\n setFilesState((prev) =>\n prev.map((f) =>\n f.id === fileWithStatus.id ? { ...f, progress: 10 } : f,\n ),\n );\n\n // Step 2: Upload file\n const { result: uploadResult, error: uploadError } =\n await upload.uploadFile(\n presignedResult.url,\n file,\n presignedResult,\n (progress) => {\n // Scale progress from 10-99 (leave room for final 100%)\n const scaledProgress = Math.min(10 + progress * 0.89, 99);\n setFilesState((prev) =>\n prev.map((f) =>\n f.id === fileWithStatus.id\n ? { ...f, progress: Math.round(scaledProgress) }\n : f,\n ),\n );\n },\n abortController.signal,\n );\n\n if (uploadError) {\n throw uploadError;\n }\n\n if (!uploadResult?.url) {\n throw new Error(\"Upload failed, no URL was returned\");\n }\n\n // Ensure progress hits 100% before changing status\n setFilesState((prev) =>\n prev.map((f) =>\n f.id === fileWithStatus.id ? { ...f, progress: 100 } : f,\n ),\n );\n\n // Small delay to show 100% before marking complete\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n const uploadedFile: FileUploadItem = {\n ...fileWithStatus,\n status: \"complete\",\n progress: 100,\n uploadedUrl: uploadResult.url,\n };\n\n setFilesState((prev) =>\n prev.map((f) => (f.id === fileWithStatus.id ? uploadedFile : f)),\n );\n\n upload.onUploadComplete?.(uploadedFile);\n\n return uploadedFile;\n } catch (error) {\n // Check if the upload was cancelled via AbortController\n const isAborted =\n error instanceof Error &&\n (error.name === \"AbortError\" || abortController.signal.aborted);\n\n if (isAborted) {\n // Upload was cancelled - return idle state\n const cancelledFile: FileUploadItem = {\n ...fileWithStatus,\n status: \"idle\",\n progress: 0,\n };\n return cancelledFile;\n }\n\n const errorMessage = extractErrorMessage(error);\n const failedFile: FileUploadItem = {\n ...fileWithStatus,\n status: \"error\",\n error: errorMessage,\n };\n\n setFilesState((prev) =>\n prev.map((f) => (f.id === fileWithStatus.id ? failedFile : f)),\n );\n\n upload.onUploadError?.(failedFile, error);\n\n return failedFile;\n } finally {\n abortControllersRef.current.delete(fileWithStatus.id);\n }\n },\n [upload],\n );\n\n const uploadFiles = useCallback(\n async (filesToUpload?: FileUploadItem[]): Promise<FileUploadItem[]> => {\n const targetFiles =\n filesToUpload ?? files.filter((f) => f.status === \"idle\");\n\n if (targetFiles.length === 0) return [];\n\n setIsUploading(true);\n const results: FileUploadItem[] = [];\n\n for (const file of targetFiles) {\n const result = await uploadSingleFile(file);\n results.push(result);\n }\n\n setIsUploading(false);\n upload?.onAllUploadsComplete?.(results);\n\n return results;\n },\n [files, uploadSingleFile, upload],\n );\n\n const addFiles = useCallback(\n (newFiles: FileList | File[]) => {\n if (!newFiles || newFiles.length === 0) return;\n\n const newFilesArray = Array.from(newFiles);\n const newErrors: string[] = [];\n\n // Clear existing errors\n setErrors([]);\n\n // In single file mode, clear existing files first\n if (!multiple) {\n setFilesState((prev) => {\n for (const file of prev) {\n if (file.preview && file.file instanceof File) {\n URL.revokeObjectURL(file.preview);\n }\n }\n return [];\n });\n }\n\n // Check if adding these files would exceed maxFiles\n if (\n multiple &&\n maxFiles !== Number.POSITIVE_INFINITY &&\n files.length + newFilesArray.length > maxFiles\n ) {\n newErrors.push(`You can only upload a maximum of ${maxFiles} files.`);\n setErrors(newErrors);\n return;\n }\n\n const validFiles: FileUploadItem[] = [];\n\n for (const file of newFilesArray) {\n // Check for duplicates in multiple mode\n if (multiple) {\n const isDuplicate = files.some(\n (existingFile) =>\n existingFile.file.name === file.name &&\n existingFile.file.size === file.size,\n );\n if (isDuplicate) continue;\n }\n\n const error = validateFile(file);\n if (error) {\n newErrors.push(error);\n continue;\n }\n\n validFiles.push({\n file,\n id: generateUniqueId(file),\n preview: createPreview(file),\n progress: 0,\n status: \"idle\",\n });\n }\n\n if (validFiles.length > 0) {\n // Call onFileAdd callback for each file\n if (onFileAdd) {\n for (const file of validFiles) {\n onFileAdd(file);\n }\n }\n\n setFilesState((prev) => {\n const updatedFiles = !multiple ? validFiles : [...prev, ...validFiles];\n onFilesChange?.(updatedFiles);\n return updatedFiles;\n });\n\n // Auto-upload if configured\n if (autoUpload && upload) {\n // Use setTimeout to ensure state is updated before uploading\n setTimeout(() => {\n uploadFiles(validFiles);\n }, 0);\n }\n }\n\n if (newErrors.length > 0) {\n setErrors(newErrors);\n }\n\n // Reset input value\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n },\n [\n files,\n maxFiles,\n multiple,\n validateFile,\n createPreview,\n generateUniqueId,\n onFilesChange,\n onFileAdd,\n autoUpload,\n upload,\n uploadFiles,\n ],\n );\n\n const removeFile = useCallback(\n (id: string) => {\n // Cancel any ongoing upload\n const controller = abortControllersRef.current.get(id);\n if (controller) {\n controller.abort();\n abortControllersRef.current.delete(id);\n }\n\n setFilesState((prev) => {\n const fileToRemove = prev.find((file) => file.id === id);\n if (fileToRemove) {\n // Call onFileRemove callback before removing\n onFileRemove?.(fileToRemove);\n\n if (fileToRemove.preview && fileToRemove.file instanceof File) {\n URL.revokeObjectURL(fileToRemove.preview);\n }\n }\n\n const newFiles = prev.filter((file) => file.id !== id);\n onFilesChange?.(newFiles);\n return newFiles;\n });\n },\n [onFilesChange, onFileRemove],\n );\n\n const clearFiles = useCallback(() => {\n cancelAllUploads();\n\n setFilesState((prev) => {\n for (const file of prev) {\n // Call onFileRemove for each file\n onFileRemove?.(file);\n\n if (file.preview && file.file instanceof File) {\n URL.revokeObjectURL(file.preview);\n }\n }\n return [];\n });\n\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n\n setErrors([]);\n onFilesChange?.([]);\n }, [cancelAllUploads, onFilesChange, onFileRemove]);\n\n const clearErrors = useCallback(() => {\n setErrors([]);\n }, []);\n\n const reset = useCallback(\n (newFiles?: FileMetadata[]) => {\n cancelAllUploads();\n\n // Revoke all previews\n for (const file of files) {\n if (file.preview && file.file instanceof File) {\n URL.revokeObjectURL(file.preview);\n }\n }\n\n // Reset input\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n\n // Clear errors\n setErrors([]);\n\n // Set new files or clear\n const initializedFiles: FileUploadItem[] = (newFiles ?? []).map(\n (file) => ({\n file,\n id: file.id,\n preview: file.url,\n progress: 100,\n status: \"complete\" as const,\n uploadedUrl: file.url,\n }),\n );\n\n setFilesState(initializedFiles);\n onFilesChange?.(initializedFiles);\n\n // Increment instance key to force remount\n setInstanceKey((prev) => prev + 1);\n },\n [cancelAllUploads, files, onFilesChange],\n );\n\n const setFiles = useCallback(\n (\n newFiles:\n | FileUploadItem[]\n | ((prev: FileUploadItem[]) => FileUploadItem[]),\n ) => {\n setFilesState((prev) => {\n const nextFiles =\n typeof newFiles === \"function\" ? newFiles(prev) : newFiles;\n onFilesChange?.(nextFiles);\n return nextFiles;\n });\n },\n [onFilesChange],\n );\n\n const retryUpload = useCallback(\n async (id: string) => {\n const file = files.find((f) => f.id === id);\n if (file && file.status === \"error\") {\n setFilesState((prev) =>\n prev.map((f) =>\n f.id === id\n ? { ...f, status: \"idle\" as const, error: undefined }\n : f,\n ),\n );\n await uploadSingleFile({ ...file, status: \"idle\", error: undefined });\n }\n },\n [files, uploadSingleFile],\n );\n\n const cancelUpload = useCallback((id: string) => {\n const controller = abortControllersRef.current.get(id);\n if (controller) {\n controller.abort();\n abortControllersRef.current.delete(id);\n }\n\n setFilesState((prev) =>\n prev.map((f) =>\n f.id === id ? { ...f, status: \"idle\" as const, progress: 0 } : f,\n ),\n );\n }, []);\n\n const handleDragEnter = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.currentTarget.contains(e.relatedTarget as Node)) return;\n setIsDragging(false);\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n if (inputRef.current?.disabled) return;\n\n if (e.dataTransfer.files?.length > 0) {\n if (!multiple) {\n addFiles([e.dataTransfer.files[0]]);\n } else {\n addFiles(e.dataTransfer.files);\n }\n }\n },\n [addFiles, multiple],\n );\n\n const handleFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files?.length) {\n addFiles(e.target.files);\n }\n },\n [addFiles],\n );\n\n const openFileDialog = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const getInputProps = useCallback(\n (props: InputHTMLAttributes<HTMLInputElement> = {}) => ({\n ...props,\n accept: props.accept || accept,\n multiple: props.multiple !== undefined ? props.multiple : multiple,\n onChange: handleFileChange,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n ref: inputRef as any,\n type: \"file\" as const,\n }),\n [accept, multiple, handleFileChange],\n );\n\n return {\n // State\n files,\n isDragging,\n isUploading,\n errors,\n\n // Core Actions\n addFiles,\n removeFile,\n clearFiles,\n clearErrors,\n\n // Form integration\n reset,\n setFiles,\n instanceKey,\n\n // Upload Actions\n uploadFiles,\n retryUpload,\n cancelUpload,\n\n // Drag/Drop + Input\n handleDragEnter,\n handleDragLeave,\n handleDragOver,\n handleDrop,\n handleFileChange,\n openFileDialog,\n getInputProps,\n };\n};\n\n// Legacy type exports for backwards compatibility\nexport type FileWithPreview = FileUploadItem;\nexport type FileWithUploadStatus = FileUploadItem;\nexport type FileUploadOptions = UseFileUploadOptions;\nexport type FileUploadWithUploaderOptions = UseFileUploadOptions;\n","import * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener(\"change\", onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return !!isMobile;\n}\n"],"mappings":"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"}