@px-ui/ui 0.1.3 → 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.
- package/dist/avatar-BAkmIOVe.d.ts +41 -0
- package/dist/avatar-BAkmIOVe.d.ts.map +1 -0
- package/dist/avatar-DDdL9xDH.js +119 -0
- package/dist/avatar-DDdL9xDH.js.map +1 -0
- package/dist/button-BiiFfKiR.d.ts +19 -0
- package/dist/button-BiiFfKiR.d.ts.map +1 -0
- package/dist/button-hBUFMmsZ.js +47 -0
- package/dist/button-hBUFMmsZ.js.map +1 -0
- package/dist/combobox-CnpyzZ7B.js +334 -0
- package/dist/combobox-CnpyzZ7B.js.map +1 -0
- package/dist/combobox-JXY6PiDq.d.ts +109 -0
- package/dist/combobox-JXY6PiDq.d.ts.map +1 -0
- package/dist/components/accordion.d.ts +25 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +56 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +59 -0
- package/dist/components/alert-dialog.d.ts.map +1 -0
- package/dist/components/alert-dialog.js +99 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.d.ts +29 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +47 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/aspect-ratio.d.ts +13 -0
- package/dist/components/aspect-ratio.d.ts.map +1 -0
- package/dist/components/aspect-ratio.js +16 -0
- package/dist/components/aspect-ratio.js.map +1 -0
- package/dist/components/avatar-group.d.ts +30 -0
- package/dist/components/avatar-group.d.ts.map +1 -0
- package/dist/components/avatar-group.js +69 -0
- package/dist/components/avatar-group.js.map +1 -0
- package/dist/components/avatar.d.ts +2 -0
- package/dist/components/avatar.js +5 -0
- package/dist/components/badge.d.ts +18 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +31 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +38 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb.js +75 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button-group.d.ts +29 -0
- package/dist/components/button-group.d.ts.map +1 -0
- package/dist/components/button-group.js +44 -0
- package/dist/components/button-group.js.map +1 -0
- package/dist/components/button.d.ts +2 -0
- package/dist/components/button.js +4 -0
- package/dist/components/calendar.d.ts +32 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +119 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +38 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +59 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.d.ts +57 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +136 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/chart.d.ts +79 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.js +148 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/checkbox.d.ts +11 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +24 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/collapsible.d.ts +25 -0
- package/dist/components/collapsible.d.ts.map +1 -0
- package/dist/components/collapsible.js +28 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.d.ts +3 -0
- package/dist/components/combobox.js +13 -0
- package/dist/components/command.d.ts +78 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +125 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/context-menu.d.ts +87 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/context-menu.js +137 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/currency-select-field.d.ts +105 -0
- package/dist/components/currency-select-field.d.ts.map +1 -0
- package/dist/components/currency-select-field.js +266 -0
- package/dist/components/currency-select-field.js.map +1 -0
- package/dist/components/dialog.d.ts +61 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +5 -0
- package/dist/components/direction.d.ts +2 -0
- package/dist/components/direction.js +3 -0
- package/dist/components/drawer.d.ts +45 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +86 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +2 -0
- package/dist/components/dropdown-menu.js +4 -0
- package/dist/components/empty.d.ts +36 -0
- package/dist/components/empty.d.ts.map +1 -0
- package/dist/components/empty.js +62 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field.d.ts +72 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +122 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/file-upload-field.d.ts +58 -0
- package/dist/components/file-upload-field.d.ts.map +1 -0
- package/dist/components/file-upload-field.js +90 -0
- package/dist/components/file-upload-field.js.map +1 -0
- package/dist/components/file-upload.d.ts +4 -0
- package/dist/components/file-upload.js +6 -0
- package/dist/components/hover-card.d.ts +21 -0
- package/dist/components/hover-card.d.ts.map +1 -0
- package/dist/components/hover-card.js +40 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input-group.d.ts +46 -0
- package/dist/components/input-group.d.ts.map +1 -0
- package/dist/components/input-group.js +9 -0
- package/dist/components/input-otp.d.ts +24 -0
- package/dist/components/input-otp.d.ts.map +1 -0
- package/dist/components/input-otp.js +40 -0
- package/dist/components/input-otp.js.map +1 -0
- package/dist/components/input.d.ts +2 -0
- package/dist/components/input.js +4 -0
- package/dist/components/item.d.ts +62 -0
- package/dist/components/item.d.ts.map +1 -0
- package/dist/components/item.js +124 -0
- package/dist/components/item.js.map +1 -0
- package/dist/components/kbd.d.ts +14 -0
- package/dist/components/kbd.d.ts.map +1 -0
- package/dist/components/kbd.js +22 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.d.ts +2 -0
- package/dist/components/label.js +6 -0
- package/dist/components/menubar.d.ts +89 -0
- package/dist/components/menubar.d.ts.map +1 -0
- package/dist/components/menubar.js +140 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/native-select.d.ts +23 -0
- package/dist/components/native-select.d.ts.map +1 -0
- package/dist/components/native-select.js +41 -0
- package/dist/components/native-select.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +48 -0
- package/dist/components/navigation-menu.d.ts.map +1 -0
- package/dist/components/navigation-menu.js +85 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/pagination.d.ts +46 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +89 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/phone-input.d.ts +28 -0
- package/dist/components/phone-input.d.ts.map +1 -0
- package/dist/components/phone-input.js +60 -0
- package/dist/components/phone-input.js.map +1 -0
- package/dist/components/popover.d.ts +34 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +4 -0
- package/dist/components/progress.d.ts +29 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +48 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.d.ts +16 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +29 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/resizable.d.ts +21 -0
- package/dist/components/resizable.d.ts.map +1 -0
- package/dist/components/resizable.js +32 -0
- package/dist/components/resizable.js.map +1 -0
- package/dist/components/scroll-area.d.ts +17 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +39 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +56 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +102 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +2 -0
- package/dist/components/separator.js +4 -0
- package/dist/components/sheet.d.ts +43 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +7 -0
- package/dist/components/sidebar.d.ts +162 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.js +390 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.d.ts +10 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +4 -0
- package/dist/components/slider.d.ts +15 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +36 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/spinner.d.ts +11 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +4 -0
- package/dist/components/switch.d.ts +14 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +21 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +39 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +71 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +31 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +55 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +11 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +4 -0
- package/dist/components/toast.d.ts +2 -0
- package/dist/components/toast.js +6 -0
- package/dist/components/toggle-group.d.ts +29 -0
- package/dist/components/toggle-group.d.ts.map +1 -0
- package/dist/components/toggle-group.js +55 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.d.ts +2 -0
- package/dist/components/toggle.js +6 -0
- package/dist/components/tooltip.d.ts +2 -0
- package/dist/components/tooltip.js +4 -0
- package/dist/dialog-CTqRrytc.js +103 -0
- package/dist/dialog-CTqRrytc.js.map +1 -0
- package/dist/direction-BKSh6e6q.js +3 -0
- package/dist/dropdown-menu-BEARLcDj.d.ts +91 -0
- package/dist/dropdown-menu-BEARLcDj.d.ts.map +1 -0
- package/dist/dropdown-menu-CcumvwhM.js +139 -0
- package/dist/dropdown-menu-CcumvwhM.js.map +1 -0
- package/dist/file-upload-D8hgfjvA.d.ts +145 -0
- package/dist/file-upload-D8hgfjvA.d.ts.map +1 -0
- package/dist/file-upload-DeCIv13t.js +434 -0
- package/dist/file-upload-DeCIv13t.js.map +1 -0
- package/dist/hooks/use-async-options.d.ts +2 -0
- package/dist/hooks/use-async-options.js +3 -0
- package/dist/hooks/use-debounce.d.ts +5 -0
- package/dist/hooks/use-debounce.d.ts.map +1 -0
- package/dist/hooks/use-debounce.js +3 -0
- package/dist/hooks/use-file-upload.d.ts +2 -0
- package/dist/hooks/use-file-upload.js +3 -0
- package/dist/hooks/use-infinite-scroll.d.ts +21 -0
- package/dist/hooks/use-infinite-scroll.d.ts.map +1 -0
- package/dist/hooks/use-infinite-scroll.js +4 -0
- package/dist/hooks/use-intersection-observer.d.ts +2 -0
- package/dist/hooks/use-intersection-observer.js +3 -0
- package/dist/hooks/use-mobile.d.ts +5 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +3 -0
- package/dist/input-8jqdnUZl.js +18 -0
- package/dist/input-8jqdnUZl.js.map +1 -0
- package/dist/input-DwxhsFRP.d.ts +12 -0
- package/dist/input-DwxhsFRP.d.ts.map +1 -0
- package/dist/input-group-DqEkmpXW.js +81 -0
- package/dist/input-group-DqEkmpXW.js.map +1 -0
- package/dist/label-AaH9ZYCZ.js +16 -0
- package/dist/label-AaH9ZYCZ.js.map +1 -0
- package/dist/label-D5SCGMZl.d.ts +11 -0
- package/dist/label-D5SCGMZl.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +3 -0
- package/dist/popover-C9D43EuT.js +57 -0
- package/dist/popover-C9D43EuT.js.map +1 -0
- package/dist/providers/px-ui-provider.d.ts +36 -0
- package/dist/providers/px-ui-provider.d.ts.map +1 -0
- package/dist/providers/px-ui-provider.js +26 -0
- package/dist/providers/px-ui-provider.js.map +1 -0
- package/dist/separator-BS3ilczC.js +17 -0
- package/dist/separator-BS3ilczC.js.map +1 -0
- package/dist/separator-ct9ZvuTk.d.ts +12 -0
- package/dist/separator-ct9ZvuTk.d.ts.map +1 -0
- package/dist/sheet-CLjNDrfL.js +91 -0
- package/dist/sheet-CLjNDrfL.js.map +1 -0
- package/dist/skeleton-BcIxI5Wq.js +15 -0
- package/dist/skeleton-BcIxI5Wq.js.map +1 -0
- package/dist/spinner-Bo0sUZEg.js +17 -0
- package/dist/spinner-Bo0sUZEg.js.map +1 -0
- package/dist/styles.css +196 -0
- package/dist/textarea-Cq0o323P.js +16 -0
- package/dist/textarea-Cq0o323P.js.map +1 -0
- package/dist/toast-COWAQbIk.js +211 -0
- package/dist/toast-COWAQbIk.js.map +1 -0
- package/dist/toast-CXkP5Jwp.d.ts +74 -0
- package/dist/toast-CXkP5Jwp.d.ts.map +1 -0
- package/dist/toggle-BXBPgIQh.d.ts +19 -0
- package/dist/toggle-BXBPgIQh.d.ts.map +1 -0
- package/dist/toggle-DhJ_qwgw.js +38 -0
- package/dist/toggle-DhJ_qwgw.js.map +1 -0
- package/dist/tooltip-BWjVzK67.d.ts +26 -0
- package/dist/tooltip-BWjVzK67.d.ts.map +1 -0
- package/dist/tooltip-DkPxCJIL.js +43 -0
- package/dist/tooltip-DkPxCJIL.js.map +1 -0
- package/dist/use-async-options-DHR8q5qX.d.ts +45 -0
- package/dist/use-async-options-DHR8q5qX.d.ts.map +1 -0
- package/dist/use-async-options-wZ9LJ2BJ.js +46 -0
- package/dist/use-async-options-wZ9LJ2BJ.js.map +1 -0
- package/dist/use-debounce-_qaEZqtt.js +24 -0
- package/dist/use-debounce-_qaEZqtt.js.map +1 -0
- package/dist/{index.js → use-file-upload-Dxrej28u.js} +3 -204
- package/dist/use-file-upload-Dxrej28u.js.map +1 -0
- package/dist/use-file-upload-yy-xLBtn.d.ts +133 -0
- package/dist/use-file-upload-yy-xLBtn.d.ts.map +1 -0
- package/dist/use-infinite-scroll-CpbhGGT5.js +38 -0
- package/dist/use-infinite-scroll-CpbhGGT5.js.map +1 -0
- package/dist/use-intersection-observer-C2xDq2SW.d.ts +11 -0
- package/dist/use-intersection-observer-C2xDq2SW.d.ts.map +1 -0
- package/dist/use-intersection-observer-CZfnep4z.js +33 -0
- package/dist/use-intersection-observer-CZfnep4z.js.map +1 -0
- package/dist/use-mobile-l5ebOdQl.js +21 -0
- package/dist/use-mobile-l5ebOdQl.js.map +1 -0
- package/dist/utils-mWJR2N24.js +28 -0
- package/dist/utils-mWJR2N24.js.map +1 -0
- package/package.json +290 -26
- package/dist/index.css +0 -133
- package/dist/index.d.ts +0 -229
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { t as cn } from "./utils-mWJR2N24.js";
|
|
2
|
+
import { t as Button } from "./button-hBUFMmsZ.js";
|
|
3
|
+
import { t as Spinner } from "./spinner-Bo0sUZEg.js";
|
|
4
|
+
import { CloudUploadIcon, FileArchiveIcon, FileAudioIcon, FileCodeIcon, FileIcon, FileSpreadsheetIcon, FileTextIcon, FileVideoIcon, ImageIcon, RotateCwIcon, XIcon } from "lucide-react";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import * as React$1 from "react";
|
|
7
|
+
import { cva } from "class-variance-authority";
|
|
8
|
+
|
|
9
|
+
//#region src/components/file-upload.tsx
|
|
10
|
+
const extensionMap = {
|
|
11
|
+
pdf: FileTextIcon,
|
|
12
|
+
doc: FileTextIcon,
|
|
13
|
+
docx: FileTextIcon,
|
|
14
|
+
rtf: FileTextIcon,
|
|
15
|
+
odt: FileTextIcon,
|
|
16
|
+
xls: FileSpreadsheetIcon,
|
|
17
|
+
xlsx: FileSpreadsheetIcon,
|
|
18
|
+
csv: FileSpreadsheetIcon,
|
|
19
|
+
ods: FileSpreadsheetIcon,
|
|
20
|
+
png: ImageIcon,
|
|
21
|
+
jpg: ImageIcon,
|
|
22
|
+
jpeg: ImageIcon,
|
|
23
|
+
gif: ImageIcon,
|
|
24
|
+
webp: ImageIcon,
|
|
25
|
+
svg: ImageIcon,
|
|
26
|
+
bmp: ImageIcon,
|
|
27
|
+
ico: ImageIcon,
|
|
28
|
+
tiff: ImageIcon,
|
|
29
|
+
tif: ImageIcon,
|
|
30
|
+
mp4: FileVideoIcon,
|
|
31
|
+
webm: FileVideoIcon,
|
|
32
|
+
mov: FileVideoIcon,
|
|
33
|
+
avi: FileVideoIcon,
|
|
34
|
+
mkv: FileVideoIcon,
|
|
35
|
+
wmv: FileVideoIcon,
|
|
36
|
+
flv: FileVideoIcon,
|
|
37
|
+
mp3: FileAudioIcon,
|
|
38
|
+
wav: FileAudioIcon,
|
|
39
|
+
ogg: FileAudioIcon,
|
|
40
|
+
flac: FileAudioIcon,
|
|
41
|
+
aac: FileAudioIcon,
|
|
42
|
+
m4a: FileAudioIcon,
|
|
43
|
+
wma: FileAudioIcon,
|
|
44
|
+
zip: FileArchiveIcon,
|
|
45
|
+
rar: FileArchiveIcon,
|
|
46
|
+
"7z": FileArchiveIcon,
|
|
47
|
+
tar: FileArchiveIcon,
|
|
48
|
+
gz: FileArchiveIcon,
|
|
49
|
+
bz2: FileArchiveIcon,
|
|
50
|
+
js: FileCodeIcon,
|
|
51
|
+
jsx: FileCodeIcon,
|
|
52
|
+
ts: FileCodeIcon,
|
|
53
|
+
tsx: FileCodeIcon,
|
|
54
|
+
json: FileCodeIcon,
|
|
55
|
+
html: FileCodeIcon,
|
|
56
|
+
css: FileCodeIcon,
|
|
57
|
+
scss: FileCodeIcon,
|
|
58
|
+
less: FileCodeIcon,
|
|
59
|
+
py: FileCodeIcon,
|
|
60
|
+
rb: FileCodeIcon,
|
|
61
|
+
java: FileCodeIcon,
|
|
62
|
+
c: FileCodeIcon,
|
|
63
|
+
cpp: FileCodeIcon,
|
|
64
|
+
h: FileCodeIcon,
|
|
65
|
+
go: FileCodeIcon,
|
|
66
|
+
rs: FileCodeIcon,
|
|
67
|
+
php: FileCodeIcon,
|
|
68
|
+
sql: FileCodeIcon,
|
|
69
|
+
sh: FileCodeIcon,
|
|
70
|
+
bash: FileCodeIcon,
|
|
71
|
+
yml: FileCodeIcon,
|
|
72
|
+
yaml: FileCodeIcon,
|
|
73
|
+
xml: FileCodeIcon,
|
|
74
|
+
txt: FileTextIcon,
|
|
75
|
+
md: FileTextIcon,
|
|
76
|
+
markdown: FileTextIcon,
|
|
77
|
+
log: FileTextIcon
|
|
78
|
+
};
|
|
79
|
+
const mimeTypeMap = {
|
|
80
|
+
"application/pdf": FileTextIcon,
|
|
81
|
+
"application/msword": FileTextIcon,
|
|
82
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": FileTextIcon,
|
|
83
|
+
"application/rtf": FileTextIcon,
|
|
84
|
+
"application/vnd.oasis.opendocument.text": FileTextIcon,
|
|
85
|
+
"application/vnd.ms-excel": FileSpreadsheetIcon,
|
|
86
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": FileSpreadsheetIcon,
|
|
87
|
+
"text/csv": FileSpreadsheetIcon,
|
|
88
|
+
"application/vnd.oasis.opendocument.spreadsheet": FileSpreadsheetIcon,
|
|
89
|
+
"application/zip": FileArchiveIcon,
|
|
90
|
+
"application/x-rar-compressed": FileArchiveIcon,
|
|
91
|
+
"application/x-7z-compressed": FileArchiveIcon,
|
|
92
|
+
"application/x-tar": FileArchiveIcon,
|
|
93
|
+
"application/gzip": FileArchiveIcon,
|
|
94
|
+
"application/javascript": FileCodeIcon,
|
|
95
|
+
"application/typescript": FileCodeIcon,
|
|
96
|
+
"application/json": FileCodeIcon,
|
|
97
|
+
"text/html": FileCodeIcon,
|
|
98
|
+
"text/css": FileCodeIcon,
|
|
99
|
+
"application/xml": FileCodeIcon,
|
|
100
|
+
"text/xml": FileCodeIcon,
|
|
101
|
+
"text/plain": FileTextIcon,
|
|
102
|
+
"text/markdown": FileTextIcon
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Get the appropriate file type icon component for a file.
|
|
106
|
+
* Uses MIME type first, then falls back to file extension.
|
|
107
|
+
*/
|
|
108
|
+
function getFileTypeIcon(file) {
|
|
109
|
+
if (file.type) {
|
|
110
|
+
if (file.type.startsWith("image/")) return ImageIcon;
|
|
111
|
+
if (file.type.startsWith("video/")) return FileVideoIcon;
|
|
112
|
+
if (file.type.startsWith("audio/")) return FileAudioIcon;
|
|
113
|
+
const mimeIcon = mimeTypeMap[file.type];
|
|
114
|
+
if (mimeIcon) return mimeIcon;
|
|
115
|
+
}
|
|
116
|
+
const extension = file.name.split(".").pop()?.toLowerCase();
|
|
117
|
+
if (extension) {
|
|
118
|
+
const extIcon = extensionMap[extension];
|
|
119
|
+
if (extIcon) return extIcon;
|
|
120
|
+
}
|
|
121
|
+
return FileIcon;
|
|
122
|
+
}
|
|
123
|
+
const FileUploadContext = React$1.createContext(null);
|
|
124
|
+
function useFileUploadContext() {
|
|
125
|
+
const context = React$1.useContext(FileUploadContext);
|
|
126
|
+
if (!context) throw new Error("FileUpload components must be used within FileUpload.Root");
|
|
127
|
+
return context;
|
|
128
|
+
}
|
|
129
|
+
function Root({ children, upload, accept, multiple = false, disabled = false, className }) {
|
|
130
|
+
const contextValue = {
|
|
131
|
+
upload,
|
|
132
|
+
accept,
|
|
133
|
+
multiple,
|
|
134
|
+
disabled
|
|
135
|
+
};
|
|
136
|
+
return /* @__PURE__ */ jsx(FileUploadContext.Provider, {
|
|
137
|
+
value: contextValue,
|
|
138
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
139
|
+
"data-slot": "file-upload",
|
|
140
|
+
className: cn("flex flex-col gap-4", className),
|
|
141
|
+
children
|
|
142
|
+
})
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
const dropzoneVariants = cva("flex flex-col items-center justify-center gap-4 rounded-md bg-muted transition-colors outline-none focus-visible:ring-3 focus-visible:ring-ring/50", {
|
|
146
|
+
variants: {
|
|
147
|
+
size: {
|
|
148
|
+
default: "p-8 min-h-[200px]",
|
|
149
|
+
sm: "p-6 min-h-[160px]",
|
|
150
|
+
lg: "p-10 min-h-[260px]"
|
|
151
|
+
},
|
|
152
|
+
isDragActive: {
|
|
153
|
+
true: "border-2 border-dashed border-primary bg-primary/5",
|
|
154
|
+
false: ""
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
defaultVariants: {
|
|
158
|
+
size: "default",
|
|
159
|
+
isDragActive: false
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
function Dropzone({ className, size, dropzoneText = "Paste Or Drag & Drop Files Here", browseText = "Browse for files", render, ...props }) {
|
|
163
|
+
const { upload, accept, multiple, disabled } = useFileUploadContext();
|
|
164
|
+
const { isDragging, isUploading, files, openFileDialog, getInputProps, handleDragEnter, handleDragLeave, handleDragOver, handleDrop, addFiles } = upload;
|
|
165
|
+
const descriptionId = React$1.useId();
|
|
166
|
+
const instructionsId = React$1.useId();
|
|
167
|
+
const [announcement, setAnnouncement] = React$1.useState("");
|
|
168
|
+
const inputProps = getInputProps();
|
|
169
|
+
const handleKeyDown = React$1.useCallback((e) => {
|
|
170
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
171
|
+
e.preventDefault();
|
|
172
|
+
openFileDialog();
|
|
173
|
+
}
|
|
174
|
+
}, [openFileDialog]);
|
|
175
|
+
const handlePaste = React$1.useCallback((e) => {
|
|
176
|
+
if (disabled) return;
|
|
177
|
+
const pastedFiles = e.clipboardData.files;
|
|
178
|
+
if (pastedFiles.length > 0) {
|
|
179
|
+
e.preventDefault();
|
|
180
|
+
const filesArray = Array.from(pastedFiles);
|
|
181
|
+
addFiles(filesArray);
|
|
182
|
+
setAnnouncement(`${filesArray.length} file${filesArray.length > 1 ? "s" : ""} pasted`);
|
|
183
|
+
}
|
|
184
|
+
}, [disabled, addFiles]);
|
|
185
|
+
const handleClick = React$1.useCallback(() => {
|
|
186
|
+
if (disabled || isUploading) return;
|
|
187
|
+
openFileDialog();
|
|
188
|
+
}, [
|
|
189
|
+
disabled,
|
|
190
|
+
isUploading,
|
|
191
|
+
openFileDialog
|
|
192
|
+
]);
|
|
193
|
+
const state = {
|
|
194
|
+
isDragging,
|
|
195
|
+
isUploading,
|
|
196
|
+
disabled,
|
|
197
|
+
files
|
|
198
|
+
};
|
|
199
|
+
const renderProps = {
|
|
200
|
+
onDragEnter: handleDragEnter,
|
|
201
|
+
onDragLeave: handleDragLeave,
|
|
202
|
+
onDragOver: handleDragOver,
|
|
203
|
+
onDrop: handleDrop,
|
|
204
|
+
onPaste: handlePaste,
|
|
205
|
+
onKeyDown: handleKeyDown,
|
|
206
|
+
onClick: handleClick,
|
|
207
|
+
tabIndex: disabled ? -1 : 0,
|
|
208
|
+
role: "button",
|
|
209
|
+
"aria-disabled": disabled,
|
|
210
|
+
"data-dragging": isDragging
|
|
211
|
+
};
|
|
212
|
+
const hiddenInput = /* @__PURE__ */ jsx("input", {
|
|
213
|
+
...inputProps,
|
|
214
|
+
className: "sr-only",
|
|
215
|
+
accept,
|
|
216
|
+
multiple,
|
|
217
|
+
disabled,
|
|
218
|
+
tabIndex: -1,
|
|
219
|
+
"aria-hidden": "true"
|
|
220
|
+
});
|
|
221
|
+
const srElements = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
222
|
+
/* @__PURE__ */ jsx("div", {
|
|
223
|
+
role: "status",
|
|
224
|
+
"aria-live": "polite",
|
|
225
|
+
"aria-atomic": "true",
|
|
226
|
+
className: "sr-only",
|
|
227
|
+
children: announcement
|
|
228
|
+
}),
|
|
229
|
+
/* @__PURE__ */ jsx("div", {
|
|
230
|
+
id: descriptionId,
|
|
231
|
+
className: "sr-only",
|
|
232
|
+
children: dropzoneText
|
|
233
|
+
}),
|
|
234
|
+
/* @__PURE__ */ jsx("div", {
|
|
235
|
+
id: instructionsId,
|
|
236
|
+
className: "sr-only",
|
|
237
|
+
children: "Press Enter or Space to browse files, or drag and drop files here."
|
|
238
|
+
})
|
|
239
|
+
] });
|
|
240
|
+
if (render) return /* @__PURE__ */ jsxs("div", {
|
|
241
|
+
"data-slot": "file-upload-dropzone",
|
|
242
|
+
children: [
|
|
243
|
+
hiddenInput,
|
|
244
|
+
srElements,
|
|
245
|
+
render(renderProps, state)
|
|
246
|
+
]
|
|
247
|
+
});
|
|
248
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
249
|
+
"data-slot": "file-upload-dropzone",
|
|
250
|
+
className: cn(dropzoneVariants({
|
|
251
|
+
size,
|
|
252
|
+
isDragActive: isDragging
|
|
253
|
+
}), disabled && "cursor-not-allowed opacity-60", className),
|
|
254
|
+
...renderProps,
|
|
255
|
+
"aria-describedby": `${descriptionId} ${instructionsId}`,
|
|
256
|
+
"aria-label": "File upload dropzone",
|
|
257
|
+
...props,
|
|
258
|
+
children: [
|
|
259
|
+
srElements,
|
|
260
|
+
hiddenInput,
|
|
261
|
+
/* @__PURE__ */ jsxs("div", {
|
|
262
|
+
className: "text-muted-foreground flex items-center gap-3",
|
|
263
|
+
children: [/* @__PURE__ */ jsx(CloudUploadIcon, {
|
|
264
|
+
size: 40,
|
|
265
|
+
"aria-hidden": "true"
|
|
266
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
267
|
+
className: "text-base text-foreground font-medium",
|
|
268
|
+
children: dropzoneText
|
|
269
|
+
})]
|
|
270
|
+
}),
|
|
271
|
+
/* @__PURE__ */ jsxs("div", {
|
|
272
|
+
className: "flex w-full items-center gap-3",
|
|
273
|
+
"aria-hidden": "true",
|
|
274
|
+
children: [
|
|
275
|
+
/* @__PURE__ */ jsx("div", { className: "bg-border h-px flex-1" }),
|
|
276
|
+
/* @__PURE__ */ jsx("span", {
|
|
277
|
+
className: "text-sm text-muted-foreground font-medium",
|
|
278
|
+
children: "OR"
|
|
279
|
+
}),
|
|
280
|
+
/* @__PURE__ */ jsx("div", { className: "bg-border h-px flex-1" })
|
|
281
|
+
]
|
|
282
|
+
}),
|
|
283
|
+
/* @__PURE__ */ jsx(Button, {
|
|
284
|
+
type: "button",
|
|
285
|
+
variant: "default",
|
|
286
|
+
disabled: disabled || isUploading,
|
|
287
|
+
children: isUploading ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Spinner, { className: "size-4" }), "Uploading..."] }) : browseText
|
|
288
|
+
})
|
|
289
|
+
]
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
function HiddenInput({ className, ...props }) {
|
|
293
|
+
const { upload, accept, multiple, disabled } = useFileUploadContext();
|
|
294
|
+
return /* @__PURE__ */ jsx("input", {
|
|
295
|
+
...upload.getInputProps(),
|
|
296
|
+
...props,
|
|
297
|
+
className: cn("sr-only", className),
|
|
298
|
+
accept,
|
|
299
|
+
multiple,
|
|
300
|
+
disabled,
|
|
301
|
+
tabIndex: -1,
|
|
302
|
+
"aria-hidden": "true"
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
function List({ className, children, ...props }) {
|
|
306
|
+
const { upload } = useFileUploadContext();
|
|
307
|
+
const { files } = upload;
|
|
308
|
+
if (files.length === 0) return null;
|
|
309
|
+
return /* @__PURE__ */ jsx("div", {
|
|
310
|
+
"data-slot": "file-upload-list",
|
|
311
|
+
className: cn("flex flex-col gap-2", className),
|
|
312
|
+
...props,
|
|
313
|
+
children: typeof children === "function" ? children(files) : children
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
function ListItem({ file, className, showIcon = true, showProgress = true, showError = true, showRemove = true, showRetry = true, icon, onItemClick, ...props }) {
|
|
317
|
+
const { upload, disabled } = useFileUploadContext();
|
|
318
|
+
const { removeFile, retryUpload } = upload;
|
|
319
|
+
const isUploading = file.status === "uploading";
|
|
320
|
+
const isError = file.status === "error";
|
|
321
|
+
const FileTypeIcon = getFileTypeIcon({
|
|
322
|
+
name: file.file.name,
|
|
323
|
+
type: file.file.type
|
|
324
|
+
});
|
|
325
|
+
const isImageType = file.file.type?.startsWith("image/");
|
|
326
|
+
const shouldShowImagePreview = file.preview && isImageType;
|
|
327
|
+
const handleClick = (e) => {
|
|
328
|
+
if (e.target.closest("button")) return;
|
|
329
|
+
onItemClick?.(file);
|
|
330
|
+
props.onClick?.(e);
|
|
331
|
+
};
|
|
332
|
+
const handleKeyDown = (e) => {
|
|
333
|
+
if (onItemClick && (e.key === "Enter" || e.key === " ")) {
|
|
334
|
+
e.preventDefault();
|
|
335
|
+
onItemClick(file);
|
|
336
|
+
}
|
|
337
|
+
props.onKeyDown?.(e);
|
|
338
|
+
};
|
|
339
|
+
const interactiveProps = onItemClick ? {
|
|
340
|
+
role: "button",
|
|
341
|
+
tabIndex: 0
|
|
342
|
+
} : {};
|
|
343
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
344
|
+
"data-slot": "file-upload-list-item",
|
|
345
|
+
"data-status": file.status,
|
|
346
|
+
className: cn("flex items-center gap-3 rounded-md border bg-card p-3", isError && "border-destructive bg-destructive/10", onItemClick && "cursor-pointer hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", className),
|
|
347
|
+
...props,
|
|
348
|
+
...interactiveProps,
|
|
349
|
+
onClick: handleClick,
|
|
350
|
+
onKeyDown: handleKeyDown,
|
|
351
|
+
children: [
|
|
352
|
+
showIcon && /* @__PURE__ */ jsx("div", {
|
|
353
|
+
className: "flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-sm bg-muted",
|
|
354
|
+
children: shouldShowImagePreview ? /* @__PURE__ */ jsx("img", {
|
|
355
|
+
src: file.preview,
|
|
356
|
+
alt: file.file.name,
|
|
357
|
+
className: "size-full object-cover"
|
|
358
|
+
}) : icon ? icon : /* @__PURE__ */ jsx(FileTypeIcon, { className: "size-5" })
|
|
359
|
+
}),
|
|
360
|
+
/* @__PURE__ */ jsxs("div", {
|
|
361
|
+
className: "flex min-w-0 flex-1 flex-col gap-1",
|
|
362
|
+
children: [
|
|
363
|
+
/* @__PURE__ */ jsx("span", {
|
|
364
|
+
className: "text-sm text-foreground truncate font-medium",
|
|
365
|
+
children: file.file.name
|
|
366
|
+
}),
|
|
367
|
+
/* @__PURE__ */ jsxs("div", {
|
|
368
|
+
className: "flex items-center gap-2",
|
|
369
|
+
children: [showProgress && isUploading && /* @__PURE__ */ jsx("div", {
|
|
370
|
+
className: "bg-muted h-1.5 flex-1 overflow-hidden rounded-full",
|
|
371
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
372
|
+
className: "bg-primary h-full transition-all duration-300",
|
|
373
|
+
style: { width: `${file.progress}%` }
|
|
374
|
+
})
|
|
375
|
+
}), isUploading && /* @__PURE__ */ jsxs("span", {
|
|
376
|
+
className: "text-xs text-muted-foreground shrink-0",
|
|
377
|
+
children: [file.progress, "%"]
|
|
378
|
+
})]
|
|
379
|
+
}),
|
|
380
|
+
showError && isError && file.error && /* @__PURE__ */ jsx("span", {
|
|
381
|
+
className: "text-xs text-destructive",
|
|
382
|
+
children: file.error
|
|
383
|
+
})
|
|
384
|
+
]
|
|
385
|
+
}),
|
|
386
|
+
/* @__PURE__ */ jsxs("div", {
|
|
387
|
+
className: "flex shrink-0 items-center gap-1",
|
|
388
|
+
children: [showRetry && isError && /* @__PURE__ */ jsx(Button, {
|
|
389
|
+
type: "button",
|
|
390
|
+
variant: "ghost",
|
|
391
|
+
size: "icon-sm",
|
|
392
|
+
onClick: () => retryUpload(file.id),
|
|
393
|
+
disabled,
|
|
394
|
+
"aria-label": `Retry uploading ${file.file.name}`,
|
|
395
|
+
children: /* @__PURE__ */ jsx(RotateCwIcon, { className: "size-4" })
|
|
396
|
+
}), showRemove && /* @__PURE__ */ jsx(Button, {
|
|
397
|
+
type: "button",
|
|
398
|
+
variant: "ghost",
|
|
399
|
+
size: "icon-sm",
|
|
400
|
+
onClick: () => removeFile(file.id),
|
|
401
|
+
disabled,
|
|
402
|
+
"aria-label": `Remove ${file.file.name}`,
|
|
403
|
+
children: /* @__PURE__ */ jsx(XIcon, { className: "size-4" })
|
|
404
|
+
})]
|
|
405
|
+
})
|
|
406
|
+
]
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
function ClearAll({ children, ...props }) {
|
|
410
|
+
const { upload, disabled } = useFileUploadContext();
|
|
411
|
+
const { clearFiles, files } = upload;
|
|
412
|
+
if (files.length === 0) return null;
|
|
413
|
+
return /* @__PURE__ */ jsx(Button, {
|
|
414
|
+
type: "button",
|
|
415
|
+
variant: "ghost",
|
|
416
|
+
onClick: clearFiles,
|
|
417
|
+
disabled,
|
|
418
|
+
"data-slot": "file-upload-clear-all",
|
|
419
|
+
...props,
|
|
420
|
+
children: children ?? "Remove all files"
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
const FileUpload = {
|
|
424
|
+
Root,
|
|
425
|
+
Dropzone,
|
|
426
|
+
HiddenInput,
|
|
427
|
+
List,
|
|
428
|
+
ListItem,
|
|
429
|
+
ClearAll
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
//#endregion
|
|
433
|
+
export { getFileTypeIcon as n, FileUpload as t };
|
|
434
|
+
//# sourceMappingURL=file-upload-DeCIv13t.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-upload-DeCIv13t.js","names":["extensionMap: Record<string, LucideIcon>","mimeTypeMap: Record<string, LucideIcon>","React","contextValue: FileUploadContextValue","state: DropzoneState","renderProps: DropzoneRenderProps"],"sources":["../src/components/file-upload.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport {\n CloudUploadIcon,\n XIcon,\n RotateCwIcon,\n FileIcon,\n FileTextIcon,\n FileSpreadsheetIcon,\n ImageIcon,\n FileVideoIcon,\n FileAudioIcon,\n FileArchiveIcon,\n FileCodeIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport { cn } from \"@px-ui/ui/lib/utils\";\nimport { Button } from \"@px-ui/ui/components/button\";\nimport { Spinner } from \"@px-ui/ui/components/spinner\";\nimport type {\n FileUploadItem,\n UseFileUploadReturn,\n} from \"@px-ui/ui/hooks/use-file-upload\";\n\n// ============================================================================\n// File type icon\n// ============================================================================\n\ntype FileInfo = { name: string; type?: string };\n\nconst extensionMap: Record<string, LucideIcon> = {\n pdf: FileTextIcon,\n\n // Word documents\n doc: FileTextIcon,\n docx: FileTextIcon,\n rtf: FileTextIcon,\n odt: FileTextIcon,\n\n // Excel / spreadsheets\n xls: FileSpreadsheetIcon,\n xlsx: FileSpreadsheetIcon,\n csv: FileSpreadsheetIcon,\n ods: FileSpreadsheetIcon,\n\n // Images\n png: ImageIcon,\n jpg: ImageIcon,\n jpeg: ImageIcon,\n gif: ImageIcon,\n webp: ImageIcon,\n svg: ImageIcon,\n bmp: ImageIcon,\n ico: ImageIcon,\n tiff: ImageIcon,\n tif: ImageIcon,\n\n // Video\n mp4: FileVideoIcon,\n webm: FileVideoIcon,\n mov: FileVideoIcon,\n avi: FileVideoIcon,\n mkv: FileVideoIcon,\n wmv: FileVideoIcon,\n flv: FileVideoIcon,\n\n // Audio\n mp3: FileAudioIcon,\n wav: FileAudioIcon,\n ogg: FileAudioIcon,\n flac: FileAudioIcon,\n aac: FileAudioIcon,\n m4a: FileAudioIcon,\n wma: FileAudioIcon,\n\n // Archives\n zip: FileArchiveIcon,\n rar: FileArchiveIcon,\n \"7z\": FileArchiveIcon,\n tar: FileArchiveIcon,\n gz: FileArchiveIcon,\n bz2: FileArchiveIcon,\n\n // Code\n js: FileCodeIcon,\n jsx: FileCodeIcon,\n ts: FileCodeIcon,\n tsx: FileCodeIcon,\n json: FileCodeIcon,\n html: FileCodeIcon,\n css: FileCodeIcon,\n scss: FileCodeIcon,\n less: FileCodeIcon,\n py: FileCodeIcon,\n rb: FileCodeIcon,\n java: FileCodeIcon,\n c: FileCodeIcon,\n cpp: FileCodeIcon,\n h: FileCodeIcon,\n go: FileCodeIcon,\n rs: FileCodeIcon,\n php: FileCodeIcon,\n sql: FileCodeIcon,\n sh: FileCodeIcon,\n bash: FileCodeIcon,\n yml: FileCodeIcon,\n yaml: FileCodeIcon,\n xml: FileCodeIcon,\n\n // Text\n txt: FileTextIcon,\n md: FileTextIcon,\n markdown: FileTextIcon,\n log: FileTextIcon,\n};\n\nconst mimeTypeMap: Record<string, LucideIcon> = {\n \"application/pdf\": FileTextIcon,\n\n // Word\n \"application/msword\": FileTextIcon,\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n FileTextIcon,\n \"application/rtf\": FileTextIcon,\n \"application/vnd.oasis.opendocument.text\": FileTextIcon,\n\n // Excel\n \"application/vnd.ms-excel\": FileSpreadsheetIcon,\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\":\n FileSpreadsheetIcon,\n \"text/csv\": FileSpreadsheetIcon,\n \"application/vnd.oasis.opendocument.spreadsheet\": FileSpreadsheetIcon,\n\n // Archives\n \"application/zip\": FileArchiveIcon,\n \"application/x-rar-compressed\": FileArchiveIcon,\n \"application/x-7z-compressed\": FileArchiveIcon,\n \"application/x-tar\": FileArchiveIcon,\n \"application/gzip\": FileArchiveIcon,\n\n // Code\n \"application/javascript\": FileCodeIcon,\n \"application/typescript\": FileCodeIcon,\n \"application/json\": FileCodeIcon,\n \"text/html\": FileCodeIcon,\n \"text/css\": FileCodeIcon,\n \"application/xml\": FileCodeIcon,\n \"text/xml\": FileCodeIcon,\n\n // Text\n \"text/plain\": FileTextIcon,\n \"text/markdown\": FileTextIcon,\n};\n\n/**\n * Get the appropriate file type icon component for a file.\n * Uses MIME type first, then falls back to file extension.\n */\nfunction getFileTypeIcon(file: FileInfo): LucideIcon {\n if (file.type) {\n if (file.type.startsWith(\"image/\")) return ImageIcon;\n if (file.type.startsWith(\"video/\")) return FileVideoIcon;\n if (file.type.startsWith(\"audio/\")) return FileAudioIcon;\n\n const mimeIcon = mimeTypeMap[file.type];\n if (mimeIcon) return mimeIcon;\n }\n\n const extension = file.name.split(\".\").pop()?.toLowerCase();\n if (extension) {\n const extIcon = extensionMap[extension];\n if (extIcon) return extIcon;\n }\n\n return FileIcon;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface FileUploadContextValue {\n upload: UseFileUploadReturn;\n accept?: string;\n multiple: boolean;\n disabled: boolean;\n}\n\nconst FileUploadContext = React.createContext<FileUploadContextValue | null>(\n null,\n);\n\nfunction useFileUploadContext() {\n const context = React.useContext(FileUploadContext);\n if (!context) {\n throw new Error(\n \"FileUpload components must be used within FileUpload.Root\",\n );\n }\n return context;\n}\n\n// ============================================================================\n// Root Component\n// ============================================================================\n\nexport interface RootProps {\n children: React.ReactNode;\n /** The upload hook return value */\n upload: UseFileUploadReturn;\n /** Accepted file types (e.g., \"image/*,.pdf\") */\n accept?: string;\n /** Allow multiple file selection */\n multiple?: boolean;\n /** Whether the upload is disabled */\n disabled?: boolean;\n className?: string;\n}\n\nfunction Root({\n children,\n upload,\n accept,\n multiple = false,\n disabled = false,\n className,\n}: RootProps) {\n const contextValue: FileUploadContextValue = {\n upload,\n accept,\n multiple,\n disabled,\n };\n\n return (\n <FileUploadContext.Provider value={contextValue}>\n <div\n data-slot=\"file-upload\"\n className={cn(\"flex flex-col gap-4\", className)}\n >\n {children}\n </div>\n </FileUploadContext.Provider>\n );\n}\n\n// ============================================================================\n// Dropzone Component\n// ============================================================================\n\nconst dropzoneVariants = cva(\n \"flex flex-col items-center justify-center gap-4 rounded-md bg-muted transition-colors outline-none focus-visible:ring-3 focus-visible:ring-ring/50\",\n {\n variants: {\n size: {\n default: \"p-8 min-h-[200px]\",\n sm: \"p-6 min-h-[160px]\",\n lg: \"p-10 min-h-[260px]\",\n },\n isDragActive: {\n true: \"border-2 border-dashed border-primary bg-primary/5\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isDragActive: false,\n },\n },\n);\n\n/** State passed to the render prop */\nexport interface DropzoneState {\n /** Whether files are being dragged over the dropzone */\n isDragging: boolean;\n /** Whether files are currently uploading */\n isUploading: boolean;\n /** Whether the dropzone is disabled */\n disabled: boolean;\n /** Current files in the upload */\n files: FileUploadItem[];\n}\n\n/** Props passed to the render prop element */\nexport interface DropzoneRenderProps {\n onDragEnter: React.DragEventHandler;\n onDragLeave: React.DragEventHandler;\n onDragOver: React.DragEventHandler;\n onDrop: React.DragEventHandler;\n onPaste: React.ClipboardEventHandler;\n onKeyDown: React.KeyboardEventHandler;\n onClick: React.MouseEventHandler;\n tabIndex: number;\n role: string;\n \"aria-disabled\": boolean;\n \"data-dragging\": boolean;\n}\n\nexport interface DropzoneProps\n extends Omit<React.ComponentProps<\"div\">, \"children\">,\n Omit<VariantProps<typeof dropzoneVariants>, \"isDragActive\"> {\n /** Custom text for the dropzone */\n dropzoneText?: string;\n /** Custom text for the browse button */\n browseText?: string;\n /**\n * Render prop for complete customization.\n * When provided, replaces the default dropzone element.\n * Receives props to spread and state for conditional styling.\n */\n render?: (\n props: DropzoneRenderProps,\n state: DropzoneState,\n ) => React.ReactElement;\n}\n\nfunction Dropzone({\n className,\n size,\n dropzoneText = \"Paste Or Drag & Drop Files Here\",\n browseText = \"Browse for files\",\n render,\n ...props\n}: DropzoneProps) {\n const { upload, accept, multiple, disabled } = useFileUploadContext();\n const {\n isDragging,\n isUploading,\n files,\n openFileDialog,\n getInputProps,\n handleDragEnter,\n handleDragLeave,\n handleDragOver,\n handleDrop,\n addFiles,\n } = upload;\n\n const descriptionId = React.useId();\n const instructionsId = React.useId();\n const [announcement, setAnnouncement] = React.useState(\"\");\n\n const inputProps = getInputProps();\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n openFileDialog();\n }\n },\n [openFileDialog],\n );\n\n const handlePaste = React.useCallback(\n (e: React.ClipboardEvent) => {\n if (disabled) return;\n const pastedFiles = e.clipboardData.files;\n if (pastedFiles.length > 0) {\n e.preventDefault();\n const filesArray = Array.from(pastedFiles);\n addFiles(filesArray);\n setAnnouncement(\n `${filesArray.length} file${filesArray.length > 1 ? \"s\" : \"\"} pasted`,\n );\n }\n },\n [disabled, addFiles],\n );\n\n const handleClick = React.useCallback(() => {\n if (disabled || isUploading) return;\n openFileDialog();\n }, [disabled, isUploading, openFileDialog]);\n\n // State passed to render prop\n const state: DropzoneState = {\n isDragging,\n isUploading,\n disabled,\n files,\n };\n\n // Props passed to render prop (to be spread on custom element)\n const renderProps: DropzoneRenderProps = {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n onPaste: handlePaste,\n onKeyDown: handleKeyDown,\n onClick: handleClick,\n tabIndex: disabled ? -1 : 0,\n role: \"button\",\n \"aria-disabled\": disabled,\n \"data-dragging\": isDragging,\n };\n\n // Hidden input element (always rendered)\n const hiddenInput = (\n <input\n {...inputProps}\n className=\"sr-only\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n );\n\n // Screen reader elements\n const srElements = (\n <>\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n >\n {announcement}\n </div>\n <div id={descriptionId} className=\"sr-only\">\n {dropzoneText}\n </div>\n <div id={instructionsId} className=\"sr-only\">\n Press Enter or Space to browse files, or drag and drop files here.\n </div>\n </>\n );\n\n // If render prop is provided, use it for full customization\n if (render) {\n return (\n <div data-slot=\"file-upload-dropzone\">\n {hiddenInput}\n {srElements}\n {render(renderProps, state)}\n </div>\n );\n }\n\n // Default rendering\n return (\n <div\n data-slot=\"file-upload-dropzone\"\n className={cn(\n dropzoneVariants({ size, isDragActive: isDragging }),\n disabled && \"cursor-not-allowed opacity-60\",\n className,\n )}\n {...renderProps}\n aria-describedby={`${descriptionId} ${instructionsId}`}\n aria-label=\"File upload dropzone\"\n {...props}\n >\n {srElements}\n {hiddenInput}\n\n <div className=\"text-muted-foreground flex items-center gap-3\">\n <CloudUploadIcon size={40} aria-hidden=\"true\" />\n <span className=\"text-base text-foreground font-medium\">\n {dropzoneText}\n </span>\n </div>\n\n <div className=\"flex w-full items-center gap-3\" aria-hidden=\"true\">\n <div className=\"bg-border h-px flex-1\" />\n <span className=\"text-sm text-muted-foreground font-medium\">OR</span>\n <div className=\"bg-border h-px flex-1\" />\n </div>\n\n <Button\n type=\"button\"\n variant=\"default\"\n disabled={disabled || isUploading}\n >\n {isUploading ? (\n <>\n <Spinner className=\"size-4\" />\n Uploading...\n </>\n ) : (\n browseText\n )}\n </Button>\n </div>\n );\n}\n\n// ============================================================================\n// HiddenInput Component\n// ============================================================================\n\nexport interface HiddenInputProps\n extends Omit<React.ComponentProps<\"input\">, \"type\"> {}\n\nfunction HiddenInput({ className, ...props }: HiddenInputProps) {\n const { upload, accept, multiple, disabled } = useFileUploadContext();\n const inputProps = upload.getInputProps();\n\n return (\n <input\n {...inputProps}\n {...props}\n className={cn(\"sr-only\", className)}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n );\n}\n\n// ============================================================================\n// List Component\n// ============================================================================\n\nexport interface ListProps\n extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n children?: React.ReactNode | ((files: FileUploadItem[]) => React.ReactNode);\n}\n\nfunction List({ className, children, ...props }: ListProps) {\n const { upload } = useFileUploadContext();\n const { files } = upload;\n\n if (files.length === 0) return null;\n\n return (\n <div\n data-slot=\"file-upload-list\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n >\n {typeof children === \"function\" ? children(files) : children}\n </div>\n );\n}\n\n// ============================================================================\n// ListItem Component (Consolidated)\n// ============================================================================\n\nexport interface ListItemProps extends React.ComponentProps<\"div\"> {\n file: FileUploadItem;\n /** Show file type icon (default: true) */\n showIcon?: boolean;\n /** Show progress bar when uploading (default: true) */\n showProgress?: boolean;\n /** Show error message when error (default: true) */\n showError?: boolean;\n /** Show remove button (default: true) */\n showRemove?: boolean;\n /** Show retry button when error (default: true) */\n showRetry?: boolean;\n /** Custom icon component */\n icon?: React.ReactNode;\n /** Click handler for the list item */\n onItemClick?: (file: FileUploadItem) => void;\n}\n\nfunction ListItem({\n file,\n className,\n showIcon = true,\n showProgress = true,\n showError = true,\n showRemove = true,\n showRetry = true,\n icon,\n onItemClick,\n ...props\n}: ListItemProps) {\n const { upload, disabled } = useFileUploadContext();\n const { removeFile, retryUpload } = upload;\n\n const isUploading = file.status === \"uploading\";\n const isError = file.status === \"error\";\n\n // Get the appropriate icon\n const FileTypeIcon = getFileTypeIcon({\n name: file.file.name,\n type: file.file.type,\n });\n\n // Check if file is an image type (should show preview)\n const isImageType = file.file.type?.startsWith(\"image/\");\n const shouldShowImagePreview = file.preview && isImageType;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n onItemClick?.(file);\n props.onClick?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (onItemClick && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onItemClick(file);\n }\n props.onKeyDown?.(e);\n };\n\n const interactiveProps = onItemClick\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n }\n : {};\n\n return (\n <div\n data-slot=\"file-upload-list-item\"\n data-status={file.status}\n className={cn(\n \"flex items-center gap-3 rounded-md border bg-card p-3\",\n isError && \"border-destructive bg-destructive/10\",\n onItemClick &&\n \"cursor-pointer hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n className,\n )}\n {...props}\n {...interactiveProps}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Icon/Preview */}\n {showIcon && (\n <div className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-sm bg-muted\">\n {shouldShowImagePreview ? (\n <img\n src={file.preview}\n alt={file.file.name}\n className=\"size-full object-cover\"\n />\n ) : icon ? (\n icon\n ) : (\n <FileTypeIcon className=\"size-5\" />\n )}\n </div>\n )}\n\n {/* File info */}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"text-sm text-foreground truncate font-medium\">\n {file.file.name}\n </span>\n\n <div className=\"flex items-center gap-2\">\n {/* Progress bar */}\n {showProgress && isUploading && (\n <div className=\"bg-muted h-1.5 flex-1 overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full transition-all duration-300\"\n style={{ width: `${file.progress}%` }}\n />\n </div>\n )}\n\n {/* Progress percentage */}\n {isUploading && (\n <span className=\"text-xs text-muted-foreground shrink-0\">\n {file.progress}%\n </span>\n )}\n </div>\n\n {/* Error message */}\n {showError && isError && file.error && (\n <span className=\"text-xs text-destructive\">{file.error}</span>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex shrink-0 items-center gap-1\">\n {/* Retry button */}\n {showRetry && isError && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => retryUpload(file.id)}\n disabled={disabled}\n aria-label={`Retry uploading ${file.file.name}`}\n >\n <RotateCwIcon className=\"size-4\" />\n </Button>\n )}\n\n {/* Remove button */}\n {showRemove && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => removeFile(file.id)}\n disabled={disabled}\n aria-label={`Remove ${file.file.name}`}\n >\n <XIcon className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// ClearAll Component\n// ============================================================================\n\nexport interface ClearAllProps extends React.ComponentProps<typeof Button> {}\n\nfunction ClearAll({ children, ...props }: ClearAllProps) {\n const { upload, disabled } = useFileUploadContext();\n const { clearFiles, files } = upload;\n\n if (files.length === 0) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={clearFiles}\n disabled={disabled}\n data-slot=\"file-upload-clear-all\"\n {...props}\n >\n {children ?? \"Remove all files\"}\n </Button>\n );\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { getFileTypeIcon };\n\nexport const FileUpload = {\n Root,\n Dropzone,\n HiddenInput,\n List,\n ListItem,\n ClearAll,\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-debounce.d.ts","names":[],"sources":["../../src/hooks/use-debounce.ts"],"sourcesContent":[],"mappings":";iBAEwB,0DAGhB,KAAA,CAAM"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as FileWithPreview, c as UploadConfig, d as UseFileUploadReturn, f as formatBytes, i as FileUploadWithUploaderOptions, l as UploadStatus, n as FileUploadItem, o as FileWithUploadStatus, p as useFileUpload, r as FileUploadOptions, s as PresignedUrlResponse, t as FileMetadata, u as UseFileUploadOptions } from "../use-file-upload-yy-xLBtn.js";
|
|
2
|
+
export { FileMetadata, FileUploadItem, FileUploadOptions, FileUploadWithUploaderOptions, FileWithPreview, FileWithUploadStatus, PresignedUrlResponse, UploadConfig, UploadStatus, UseFileUploadOptions, UseFileUploadReturn, formatBytes, useFileUpload };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { t as UseIntersectionObserverOptions } from "../use-intersection-observer-C2xDq2SW.js";
|
|
2
|
+
|
|
3
|
+
//#region src/hooks/use-infinite-scroll.d.ts
|
|
4
|
+
type UseInfiniteScrollHookArgs = Pick<UseIntersectionObserverOptions, "rootMargin" | "threshold" | "root"> & {
|
|
5
|
+
isLoadingMore: boolean;
|
|
6
|
+
hasMore: boolean;
|
|
7
|
+
onLoadMore: () => unknown;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
};
|
|
10
|
+
declare function useInfiniteScroll({
|
|
11
|
+
isLoadingMore,
|
|
12
|
+
hasMore,
|
|
13
|
+
onLoadMore,
|
|
14
|
+
rootMargin,
|
|
15
|
+
root,
|
|
16
|
+
disabled,
|
|
17
|
+
threshold
|
|
18
|
+
}: UseInfiniteScrollHookArgs): readonly [(node: Element | null) => void];
|
|
19
|
+
//#endregion
|
|
20
|
+
export { UseInfiniteScrollHookArgs, useInfiniteScroll as default };
|
|
21
|
+
//# sourceMappingURL=use-infinite-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-scroll.d.ts","names":[],"sources":["../../src/hooks/use-infinite-scroll.ts"],"sourcesContent":[],"mappings":";;;KAQY,yBAAA,GAA4B,KACtC;;EADU,OAAA,EAAA,OAAA;EAUH,UAAA,EAAA,GAAA,GAAA,OAAiB;EACxB,QAAA,CAAA,EAAA,OAAA;CACA;iBAFO,iBAAA,CAGP;EAAA,aAAA;EAAA,OAAA;EAAA,UAAA;EAAA,UAAA;EAAA,IAAA;EAAA,QAAA;EAAA;AAAA,CAAA,EAKC,yBALD,CAAA,EAAA,SAAA,CAAA,CAAA,IAAA,EAK0B,OAL1B,GAAA,IAAA,EAAA,GAAA,IAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mobile.d.ts","names":[],"sources":["../../src/hooks/use-mobile.ts"],"sourcesContent":[],"mappings":";iBAIgB,WAAA,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { t as cn } from "./utils-mWJR2N24.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import "react";
|
|
4
|
+
import { Input } from "@base-ui/react/input";
|
|
5
|
+
|
|
6
|
+
//#region src/components/input.tsx
|
|
7
|
+
function Input$1({ className, type, ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(Input, {
|
|
9
|
+
type,
|
|
10
|
+
"data-slot": "input",
|
|
11
|
+
className: cn("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 ppx-md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", className),
|
|
12
|
+
...props
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Input$1 as t };
|
|
18
|
+
//# sourceMappingURL=input-8jqdnUZl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-8jqdnUZl.js","names":["Input","InputPrimitive"],"sources":["../src/components/input.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\n\nimport { cn } from \"@px-ui/ui/lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 ppx-md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n"],"mappings":";;;;;;AAKA,SAASA,QAAM,EAAE,WAAW,MAAM,GAAG,SAAwC;AAC3E,QACE,oBAACC;EACO;EACN,aAAU;EACV,WAAW,GACT,0nBACA,UACD;EACD,GAAI;GACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime138 from "react/jsx-runtime";
|
|
2
|
+
import * as React$1 from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/components/input.d.ts
|
|
5
|
+
declare function Input({
|
|
6
|
+
className,
|
|
7
|
+
type,
|
|
8
|
+
...props
|
|
9
|
+
}: React$1.ComponentProps<"input">): react_jsx_runtime138.JSX.Element;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { Input as t };
|
|
12
|
+
//# sourceMappingURL=input-DwxhsFRP.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-DwxhsFRP.d.ts","names":[],"sources":["../src/components/input.tsx"],"sourcesContent":[],"mappings":";;;;iBAKS,KAAA;;;;GAAqC,OAAA,CAAM,0BAAuB,oBAAA,CAAA,GAAA,CAAA"}
|