ultra-image-uploader 0.0.2 → 2.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.
@@ -1,27 +1,207 @@
1
- "use client";
1
+ 'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { TrashIcon, UploadCloudIcon } from "lucide-react";
4
- import { useState } from "react";
5
- export function ImageUploader({ images, setImages, mode, defaultImages = [], multiple = false, inputStyles = "", containerStyles = "", uploadText = "Browse files or drag & drop", typeText = "PNG, JPG, JPEG, WEBP", }) {
6
- const [removedDefaultImages, setRemovedDefaultImages] = useState([]);
7
- console.log(removedDefaultImages);
8
- const handleImageChange = (e) => {
9
- if (e.target.files && e.target.files.length > 0) {
10
- const files = Array.from(e.target.files);
11
- if (!multiple && files.length > 1) {
12
- alert("Only one image can be uploaded at a time.");
3
+ import { useState, useRef, useCallback, useEffect } from 'react';
4
+ import { Upload, X, Image as ImageIcon, AlertCircle, Loader2 } from 'lucide-react';
5
+ import { uploadImage } from '../providers';
6
+ import { isImageFile, formatFileSize } from '../utils/validation';
7
+ // Theme presets
8
+ export const themes = {
9
+ light: {
10
+ primary: '#6366f1',
11
+ background: '#ffffff',
12
+ border: '#e5e7eb',
13
+ text: '#1f2937',
14
+ textSecondary: '#6b7280',
15
+ error: '#ef4444',
16
+ success: '#10b981',
17
+ radius: '12px',
18
+ },
19
+ dark: {
20
+ primary: '#8b5cf6',
21
+ background: '#1f2937',
22
+ border: '#374151',
23
+ text: '#f9fafb',
24
+ textSecondary: '#9ca3af',
25
+ error: '#f87171',
26
+ success: '#34d399',
27
+ radius: '12px',
28
+ },
29
+ modern: {
30
+ primary: '#ec4899',
31
+ background: '#fdf2f8',
32
+ border: '#f9a8d4',
33
+ text: '#831843',
34
+ textSecondary: '#9d174d',
35
+ error: '#dc2626',
36
+ success: '#059669',
37
+ radius: '16px',
38
+ },
39
+ ocean: {
40
+ primary: '#0891b2',
41
+ background: '#ecfeff',
42
+ border: '#a5f3fc',
43
+ text: '#164e63',
44
+ textSecondary: '#155e75',
45
+ error: '#dc2626',
46
+ success: '#059669',
47
+ radius: '14px',
48
+ },
49
+ sunset: {
50
+ primary: '#f97316',
51
+ background: '#fff7ed',
52
+ border: '#fdba74',
53
+ text: '#7c2d12',
54
+ textSecondary: '#9a3412',
55
+ error: '#dc2626',
56
+ success: '#059669',
57
+ radius: '12px',
58
+ },
59
+ };
60
+ export function ImageUploader({ images, setImages, mode = 'add', defaultImages = [], multiple = false, theme = 'light', uploadText = 'Drop images here or click to browse', maxSize = 10 * 1024 * 1024, allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/gif'], showFileSize = true, dragAndDrop = true, previewWidth = 140, previewHeight = 140, className = '', autoUpload = false, uploadConfig, onUploadComplete, onUploadError, }) {
61
+ const [removedDefaults, setRemovedDefaults] = useState([]);
62
+ const [isDragging, setIsDragging] = useState(false);
63
+ const [progress, setProgress] = useState({});
64
+ const [uploading, setUploading] = useState(false);
65
+ const [errors, setErrors] = useState([]);
66
+ const fileInputRef = useRef(null);
67
+ const dragCounter = useRef(0);
68
+ const currentTheme = typeof theme === 'string' ? themes[theme] : theme;
69
+ const mergedTheme = { ...themes.light, ...currentTheme };
70
+ // Auto-upload effect
71
+ useEffect(() => {
72
+ if (autoUpload && uploadConfig && images.length > 0 && !uploading) {
73
+ handleAutoUpload();
74
+ }
75
+ }, [images]);
76
+ const handleAutoUpload = async () => {
77
+ if (!uploadConfig)
78
+ return;
79
+ setUploading(true);
80
+ try {
81
+ const results = await Promise.all(images.map((file) => uploadImage(file, uploadConfig.provider, uploadConfig.config, {
82
+ onProgress: (p) => {
83
+ setProgress((prev) => ({ ...prev, [file.name]: p.percentage }));
84
+ },
85
+ })));
86
+ const urls = results.map((r) => r.url);
87
+ onUploadComplete?.(urls);
88
+ }
89
+ catch (err) {
90
+ const error = err instanceof Error ? err : new Error('Upload failed');
91
+ onUploadError?.(error);
92
+ }
93
+ finally {
94
+ setUploading(false);
95
+ setProgress({});
96
+ }
97
+ };
98
+ const validateFiles = useCallback((files) => {
99
+ const valid = [];
100
+ const invalid = [];
101
+ Array.from(files).forEach((file) => {
102
+ if (!isImageFile(file)) {
103
+ invalid.push({ ...file, error: 'Not an image file' });
104
+ return;
105
+ }
106
+ if (file.size > maxSize) {
107
+ invalid.push({ ...file, error: `File too large (max ${formatFileSize(maxSize)})` });
108
+ return;
109
+ }
110
+ if (!allowedTypes.includes(file.type)) {
111
+ invalid.push({ ...file, error: 'File type not allowed' });
13
112
  return;
14
113
  }
15
- setImages(multiple ? [...images, ...files] : [files[0]]);
114
+ valid.push(file);
115
+ });
116
+ return { valid, invalid };
117
+ }, [maxSize, allowedTypes]);
118
+ const handleFiles = useCallback((files) => {
119
+ const { valid, invalid } = validateFiles(files);
120
+ if (invalid.length > 0) {
121
+ setErrors((prev) => [...prev, ...invalid]);
122
+ }
123
+ if (valid.length === 0)
124
+ return;
125
+ if (!multiple && valid.length > 1) {
126
+ alert('Only one image allowed');
127
+ return;
128
+ }
129
+ setImages(multiple ? [...images, ...valid] : [valid[0]]);
130
+ }, [images, multiple, setImages, validateFiles]);
131
+ const handleChange = (e) => {
132
+ if (e.target.files?.length) {
133
+ handleFiles(e.target.files);
134
+ e.target.value = '';
135
+ }
136
+ };
137
+ const handleDragEnter = (e) => {
138
+ if (!dragAndDrop)
139
+ return;
140
+ e.preventDefault();
141
+ e.stopPropagation();
142
+ dragCounter.current++;
143
+ if (e.dataTransfer.items?.length)
144
+ setIsDragging(true);
145
+ };
146
+ const handleDragLeave = (e) => {
147
+ if (!dragAndDrop)
148
+ return;
149
+ e.preventDefault();
150
+ e.stopPropagation();
151
+ dragCounter.current--;
152
+ if (dragCounter.current === 0)
153
+ setIsDragging(false);
154
+ };
155
+ const handleDragOver = (e) => {
156
+ if (!dragAndDrop)
157
+ return;
158
+ e.preventDefault();
159
+ };
160
+ const handleDrop = (e) => {
161
+ if (!dragAndDrop)
162
+ return;
163
+ e.preventDefault();
164
+ e.stopPropagation();
165
+ setIsDragging(false);
166
+ dragCounter.current = 0;
167
+ if (e.dataTransfer.files?.length) {
168
+ handleFiles(e.dataTransfer.files);
16
169
  }
17
170
  };
18
171
  const removeImage = (index) => {
19
172
  setImages(images.filter((_, i) => i !== index));
20
173
  };
21
- // Function to remove a default image
22
- const removeDefaultImage = (index) => {
23
- setRemovedDefaultImages((prev) => [...prev, index]);
174
+ const removeDefault = (index) => {
175
+ setRemovedDefaults((prev) => [...prev, index]);
176
+ };
177
+ const dismissError = (index) => {
178
+ setErrors((prev) => prev.filter((_, i) => i !== index));
24
179
  };
25
- return (_jsx("div", { className: `space-y-4 ${containerStyles}`, children: _jsxs("div", { className: "flex flex-wrap gap-4", children: [_jsxs("div", { className: `${inputStyles} h-40 w-full bg-gray-100 border border-gray-200 cursor-pointer flex justify-center items-center text-white text-center relative rounded-xs duration-300`, children: [_jsxs("div", { className: "flex flex-col items-center text-black", children: [_jsx(UploadCloudIcon, { className: "text-3xl text-gray-900 mb-1" }), _jsx("span", { className: "text-sm text-gray-800 font-semibold", children: uploadText }), _jsx("span", { className: "text-gray-600 text-xs", children: typeText })] }), _jsx("input", { type: "file", accept: "image/*", multiple: multiple, onChange: handleImageChange, className: "absolute inset-0 opacity-0 cursor-pointer rounded-lg" })] }), mode === "update" &&
26
- defaultImages.map((url, index) => !removedDefaultImages.includes(index) && (_jsxs("div", { className: "relative w-fit", children: [_jsx("img", { src: url, alt: `Existing Image ${index + 1}`, width: 100, height: 100, className: "h-32 w-32 object-cover rounded-sm border border-gray-200 cursor-pointer hover:shadow-lg transition-shadow duration-200" }), _jsx(TrashIcon, { onClick: () => removeDefaultImage(index), className: "absolute -top-2 -right-2 rounded-full bg-red-600 text-2xl text-white cursor-pointer p-1 hover:bg-red-700 transition-colors duration-200" })] }, `default-${index}`))), images.map((image, index) => (_jsxs("div", { className: "relative w-fit", children: [_jsx("img", { src: URL.createObjectURL(image), alt: `Preview ${index + 1}`, width: 100, height: 100, className: "h-32 w-32 object-cover rounded-sm border border-gray-200 cursor-pointer hover:shadow-lg duration-200" }), _jsx(TrashIcon, { onClick: () => removeImage(index), className: "absolute -top-2 -right-2 rounded-full bg-red-600 text-2xl text-white cursor-pointer p-1 hover:bg-red-700 transition-colors duration-200" })] }, index)))] }) }));
180
+ return (_jsxs("div", { className: `image-uploader ${className}`, children: [errors.length > 0 && (_jsx("div", { className: "space-y-2 mb-4", children: errors.map((file, i) => (_jsxs("div", { className: "flex items-center gap-2 p-3 rounded-lg", style: {
181
+ backgroundColor: `${mergedTheme.error}15`,
182
+ border: `1px solid ${mergedTheme.error}40`,
183
+ }, children: [_jsx(AlertCircle, { size: 18, style: { color: mergedTheme.error, flexShrink: 0 } }), _jsxs("span", { className: "text-sm flex-1", style: { color: mergedTheme.text }, children: [_jsx("strong", { children: file.name }), ": ", file.error] }), _jsx("button", { onClick: () => dismissError(i), className: "p-1 hover:opacity-70", style: { color: mergedTheme.textSecondary }, children: _jsx(X, { size: 16 }) })] }, i))) })), _jsxs("div", { className: "relative h-44 w-full flex flex-col items-center justify-center text-center cursor-pointer transition-all duration-300", style: {
184
+ backgroundColor: isDragging ? `${mergedTheme.primary}10` : mergedTheme.background,
185
+ border: `2px dashed ${isDragging ? mergedTheme.primary : mergedTheme.border}`,
186
+ borderRadius: mergedTheme.radius,
187
+ transform: isDragging ? 'scale(1.01)' : 'scale(1)',
188
+ }, onClick: () => fileInputRef.current?.click(), onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, children: [_jsx("div", { className: "p-3 rounded-full mb-3", style: { backgroundColor: `${mergedTheme.primary}15` }, children: uploading ? (_jsx(Loader2, { size: 32, className: "animate-spin", style: { color: mergedTheme.primary } })) : (_jsx(Upload, { size: 32, style: { color: mergedTheme.primary } })) }), _jsx("p", { className: "font-semibold mb-1", style: { color: mergedTheme.text }, children: uploadText }), _jsxs("p", { className: "text-sm", style: { color: mergedTheme.textSecondary }, children: ["PNG, JPG, WEBP up to ", formatFileSize(maxSize)] }), uploading && (_jsx("p", { className: "text-sm mt-2", style: { color: mergedTheme.primary }, children: "Uploading..." })), _jsx("input", { ref: fileInputRef, type: "file", accept: allowedTypes.join(','), multiple: multiple, onChange: handleChange, className: "absolute inset-0 opacity-0 cursor-pointer" })] }), _jsxs("div", { className: "flex flex-wrap gap-3 mt-4", children: [mode === 'update' &&
189
+ defaultImages.map((url, i) => !removedDefaults.includes(i) && (_jsxs("div", { className: "relative group", style: { width: `${previewWidth}px` }, children: [_jsx("img", { src: url, alt: `Existing ${i + 1}`, className: "w-full object-cover shadow-md hover:shadow-xl transition-all duration-300", style: {
190
+ height: `${previewHeight}px`,
191
+ borderRadius: mergedTheme.radius,
192
+ } }), _jsx("button", { onClick: () => removeDefault(i), className: "absolute -top-2 -right-2 p-1.5 rounded-full shadow-lg opacity-0 group-hover:opacity-100 transition-opacity", style: { backgroundColor: mergedTheme.error }, children: _jsx(X, { size: 14, className: "text-white" }) })] }, `default-${i}`))), images.map((file, i) => {
193
+ const fileProgress = progress[file.name];
194
+ return (_jsxs("div", { className: "relative group", style: { width: `${previewWidth}px` }, children: [_jsx("img", { src: URL.createObjectURL(file), alt: `Preview ${i + 1}`, className: "w-full object-cover shadow-md hover:shadow-xl transition-all duration-300", style: {
195
+ height: `${previewHeight}px`,
196
+ borderRadius: mergedTheme.radius,
197
+ } }), fileProgress !== undefined && fileProgress < 100 && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center rounded-lg", style: {
198
+ backgroundColor: 'rgba(0,0,0,0.6)',
199
+ borderRadius: mergedTheme.radius,
200
+ }, children: _jsxs("span", { className: "text-white font-semibold text-sm", children: [fileProgress, "%"] }) })), showFileSize && (_jsx("div", { className: "absolute bottom-2 left-2 px-2 py-1 rounded text-xs font-medium", style: {
201
+ backgroundColor: `${mergedTheme.background}EE`,
202
+ color: mergedTheme.text,
203
+ }, children: formatFileSize(file.size) })), _jsx("button", { onClick: () => removeImage(i), className: "absolute -top-2 -right-2 p-1.5 rounded-full shadow-lg opacity-0 group-hover:opacity-100 transition-opacity", style: { backgroundColor: mergedTheme.error }, children: _jsx(X, { size: 14, className: "text-white" }) })] }, i));
204
+ })] }), images.length === 0 &&
205
+ defaultImages.filter((_, i) => !removedDefaults.includes(i)).length === 0 && (_jsxs("div", { className: "flex items-center justify-center gap-2 py-6", style: { color: mergedTheme.textSecondary }, children: [_jsx(ImageIcon, { size: 18 }), _jsx("span", { className: "text-sm", children: "No images selected" })] }))] }));
27
206
  }
207
+ //# sourceMappingURL=ImageUploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUploader.js","sourceRoot":"","sources":["../../src/components/ImageUploader.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,11 @@
1
- export { ImageUploader } from './components/ImageUploader';
1
+ /**
2
+ * Ultra Image Uploader
3
+ * Modern image upload component with ImgBB & Cloudinary support
4
+ */
5
+ export { ImageUploader, themes } from './components/ImageUploader';
2
6
  export type { ImageUploaderProps } from './components/ImageUploader';
3
- export { uploadImagesToImageBB } from './utils/imageUpload';
4
- export type { ImageBBUrlResult } from './utils/imageUpload';
7
+ export type { ThemeConfig } from './types';
8
+ export { uploadImage, uploadImages, uploadImagesToImageBB, uploadImagesToCloudinary, } from './providers';
9
+ export type { UploadProvider, UploadResult, UploadProgress, UploadOptions, ImageTransformOptions, ProviderConfig, FileValidationOptions, ValidationResult, ValidationError, } from './types';
10
+ export { validateImageFile, validateImageDimensions, validateFileComplete, formatFileSize, isImageFile, } from './utils/validation';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,GAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,11 @@
1
- export { ImageUploader } from './components/ImageUploader';
2
- export { uploadImagesToImageBB } from './utils/imageUpload';
1
+ /**
2
+ * Ultra Image Uploader
3
+ * Modern image upload component with ImgBB & Cloudinary support
4
+ */
5
+ // Component
6
+ export { ImageUploader, themes } from './components/ImageUploader';
7
+ // Upload functions
8
+ export { uploadImage, uploadImages, uploadImagesToImageBB, uploadImagesToCloudinary, } from './providers';
9
+ // Validation
10
+ export { validateImageFile, validateImageDimensions, validateFileComplete, formatFileSize, isImageFile, } from './utils/validation';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAInE,mBAAmB;AACnB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAerB,aAAa;AACb,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Upload providers - ImgBB and Cloudinary
3
+ */
4
+ import type { UploadProvider, UploadResult, ProviderConfig, UploadOptions } from '../types';
5
+ /**
6
+ * Upload a single image
7
+ */
8
+ export declare function uploadImage(file: File, provider: UploadProvider, config: ProviderConfig, options?: UploadOptions): Promise<UploadResult>;
9
+ /**
10
+ * Upload multiple images
11
+ */
12
+ export declare function uploadImages(files: File[], provider: UploadProvider, config: ProviderConfig, options?: UploadOptions): Promise<UploadResult[]>;
13
+ /**
14
+ * Upload to ImgBB (convenience function)
15
+ */
16
+ export declare function uploadImagesToImageBB(images: File[], apiKey: string): Promise<{
17
+ urls: string[];
18
+ }>;
19
+ /**
20
+ * Upload to Cloudinary (convenience function)
21
+ */
22
+ export declare function uploadImagesToCloudinary(files: File[], config: {
23
+ cloudName: string;
24
+ uploadPreset?: string;
25
+ }, options?: UploadOptions): Promise<UploadResult[]>;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiI5F;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC,CAKvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,IAAI,EAAE,EACb,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAEzB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,IAAI,EAAE,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAG7B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAEzB"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Upload providers - ImgBB and Cloudinary
3
+ */
4
+ /**
5
+ * Upload to ImgBB
6
+ */
7
+ async function uploadToImgBB(file, config, options) {
8
+ const formData = new FormData();
9
+ formData.append('image', file);
10
+ const response = await fetchWithProgress(`https://api.imgbb.com/1/upload?key=${config.apiKey}`, formData, options?.onProgress);
11
+ const data = await response.json();
12
+ if (!data.success || !data.data?.url) {
13
+ throw new Error(data.error?.message || 'ImgBB upload failed');
14
+ }
15
+ return {
16
+ url: data.data.url,
17
+ provider: 'imgbb',
18
+ originalFile: file,
19
+ metadata: {
20
+ deleteUrl: data.data.delete_url,
21
+ size: data.data.size,
22
+ width: data.data.width,
23
+ height: data.data.height,
24
+ },
25
+ };
26
+ }
27
+ /**
28
+ * Upload to Cloudinary
29
+ */
30
+ async function uploadToCloudinary(file, config, options) {
31
+ if (!config.cloudName) {
32
+ throw new Error('Cloudinary cloudName is required');
33
+ }
34
+ const formData = new FormData();
35
+ formData.append('file', file);
36
+ formData.append('upload_preset', config.uploadPreset || 'unsigned_preset');
37
+ if (options?.transformOptions) {
38
+ const transforms = [];
39
+ if (options.transformOptions.width)
40
+ transforms.push(`w_${options.transformOptions.width}`);
41
+ if (options.transformOptions.height)
42
+ transforms.push(`h_${options.transformOptions.height}`);
43
+ if (options.transformOptions.crop)
44
+ transforms.push(`c_${options.transformOptions.crop}`);
45
+ if (options.transformOptions.quality)
46
+ transforms.push(`q_${options.transformOptions.quality}`);
47
+ if (transforms.length > 0) {
48
+ formData.append('transformation', transforms.join(','));
49
+ }
50
+ }
51
+ const response = await fetchWithProgress(`https://api.cloudinary.com/v1_1/${config.cloudName}/image/upload`, formData, options?.onProgress);
52
+ const data = await response.json();
53
+ if (!data.secure_url) {
54
+ throw new Error(data.error?.message || 'Cloudinary upload failed');
55
+ }
56
+ return {
57
+ url: data.secure_url,
58
+ provider: 'cloudinary',
59
+ originalFile: file,
60
+ metadata: {
61
+ publicId: data.public_id,
62
+ width: data.width,
63
+ height: data.height,
64
+ format: data.format,
65
+ },
66
+ };
67
+ }
68
+ /**
69
+ * Fetch with progress tracking
70
+ */
71
+ function fetchWithProgress(url, formData, onProgress) {
72
+ return new Promise((resolve, reject) => {
73
+ const xhr = new XMLHttpRequest();
74
+ if (onProgress) {
75
+ xhr.upload.addEventListener('progress', (e) => {
76
+ if (e.lengthComputable) {
77
+ onProgress({
78
+ loaded: e.loaded,
79
+ total: e.total,
80
+ percentage: Math.round((e.loaded / e.total) * 100),
81
+ });
82
+ }
83
+ });
84
+ }
85
+ xhr.onload = () => {
86
+ if (xhr.status >= 200 && xhr.status < 300) {
87
+ resolve(new Response(xhr.responseText, { status: xhr.status }));
88
+ }
89
+ else {
90
+ reject(new Error(`HTTP ${xhr.status}`));
91
+ }
92
+ };
93
+ xhr.onerror = () => reject(new Error('Network error'));
94
+ xhr.ontimeout = () => reject(new Error('Request timeout'));
95
+ xhr.open('POST', url);
96
+ xhr.timeout = 60000;
97
+ xhr.send(formData);
98
+ });
99
+ }
100
+ /**
101
+ * Upload a single image
102
+ */
103
+ export async function uploadImage(file, provider, config, options) {
104
+ if (provider === 'imgbb') {
105
+ return uploadToImgBB(file, config, options);
106
+ }
107
+ return uploadToCloudinary(file, config, options);
108
+ }
109
+ /**
110
+ * Upload multiple images
111
+ */
112
+ export async function uploadImages(files, provider, config, options) {
113
+ return Promise.all(files.map((file) => uploadImage(file, provider, config, options)));
114
+ }
115
+ /**
116
+ * Upload to ImgBB (convenience function)
117
+ */
118
+ export async function uploadImagesToImageBB(images, apiKey) {
119
+ const results = await uploadImages(images, 'imgbb', { apiKey });
120
+ return { urls: results.map((r) => r.url) };
121
+ }
122
+ /**
123
+ * Upload to Cloudinary (convenience function)
124
+ */
125
+ export async function uploadImagesToCloudinary(files, config, options) {
126
+ return uploadImages(files, 'cloudinary', config, options);
127
+ }
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAU,EACV,MAAsB,EACtB,OAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE/B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,sCAAsC,MAAM,CAAC,MAAM,EAAE,EACrD,QAAQ,EACR,OAAO,EAAE,UAAU,CACpB,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,qBAAqB,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG;QAClB,QAAQ,EAAE,OAAO;QACjB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE;YACR,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;SACzB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAAU,EACV,MAAsB,EACtB,OAAuB;IAEvB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,IAAI,iBAAiB,CAAC,CAAC;IAE3E,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,gBAAgB,CAAC,KAAK;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,gBAAgB,CAAC,OAAO;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/F,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,mCAAmC,MAAM,CAAC,SAAS,eAAe,EAClE,QAAQ,EACR,OAAO,EAAE,UAAU,CACpB,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,UAAU;QACpB,QAAQ,EAAE,YAAY;QACtB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,GAAW,EACX,QAAkB,EAClB,UAAsF;IAEtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;QAEjC,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC5C,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;oBACvB,UAAU,CAAC;wBACT,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;qBACnD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;YAChB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC1C,OAAO,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC;QAEF,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QACvD,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtB,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAU,EACV,QAAwB,EACxB,MAAsB,EACtB,OAAuB;IAEvB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAa,EACb,QAAwB,EACxB,MAAsB,EACtB,OAAuB;IAEvB,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAa,EACb,MAAoD,EACpD,OAAuB;IAEvB,OAAO,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Core types for Ultra Image Uploader
3
+ */
4
+ export type UploadProvider = 'imgbb' | 'cloudinary';
5
+ export interface UploadResult {
6
+ url: string;
7
+ provider: UploadProvider;
8
+ originalFile: File;
9
+ metadata?: Record<string, unknown>;
10
+ }
11
+ export interface UploadProgress {
12
+ loaded: number;
13
+ total: number;
14
+ percentage: number;
15
+ }
16
+ export interface UploadOptions {
17
+ onProgress?: (progress: UploadProgress) => void;
18
+ transformOptions?: ImageTransformOptions;
19
+ }
20
+ export interface ImageTransformOptions {
21
+ width?: number;
22
+ height?: number;
23
+ crop?: string;
24
+ quality?: number;
25
+ format?: string;
26
+ }
27
+ export interface ProviderConfig {
28
+ apiKey?: string;
29
+ cloudName?: string;
30
+ uploadPreset?: string;
31
+ baseUrl?: string;
32
+ }
33
+ export interface FileValidationOptions {
34
+ maxSize?: number;
35
+ minWidth?: number;
36
+ maxWidth?: number;
37
+ minHeight?: number;
38
+ maxHeight?: number;
39
+ allowedTypes?: string[];
40
+ }
41
+ export interface ValidationError {
42
+ code: string;
43
+ message: string;
44
+ field?: string;
45
+ }
46
+ export interface ValidationResult {
47
+ valid: boolean;
48
+ errors?: ValidationError[];
49
+ }
50
+ export interface ThemeConfig {
51
+ primary?: string;
52
+ background?: string;
53
+ border?: string;
54
+ text?: string;
55
+ textSecondary?: string;
56
+ error?: string;
57
+ success?: string;
58
+ radius?: string;
59
+ }
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,YAAY,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IAChD,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core types for Ultra Image Uploader
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Validation utilities for image uploads
3
+ */
4
+ import type { FileValidationOptions, ValidationResult } from '../types';
5
+ export declare function validateImageFile(file: File, options?: FileValidationOptions): ValidationResult;
6
+ export declare function validateImageDimensions(file: File, options?: FileValidationOptions): Promise<ValidationResult>;
7
+ export declare function validateFileComplete(file: File, options?: FileValidationOptions): Promise<ValidationResult>;
8
+ export declare function formatFileSize(bytes: number): string;
9
+ export declare function getFileExtension(filename: string): string;
10
+ export declare function isImageFile(file: File): boolean;
11
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAmB,MAAM,UAAU,CAAC;AAWzF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,qBAA0B,GAClC,gBAAgB,CA4BlB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,gBAAgB,CAAC,CAiE3B;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,gBAAgB,CAAC,CAgB3B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE/C"}