ultra-image-uploader 2.0.3 → 3.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/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  <div align="center">
4
4
 
5
- A modern, fancy React image upload component with responsive grid layout, drag-and-drop reordering, and beautiful animations.
5
+ A modern, production-ready React image upload component with shadcn/ui-inspired design, beautiful themes, and smooth animations.
6
6
 
7
7
  [![npm version](https://badge.fury.io/js/ultra-image-uploader.svg)](https://www.npmjs.com/package/ultra-image-uploader)
8
8
  ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue)
9
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-green)](https://opensource.org/licenses/MIT)
10
10
 
11
- **Modern UI** • **Dark/Light Themes** • **Grid Layout** • **Drag Reorder**
11
+ **shadcn/ui Design** • **3 Themes** • **ImgBB & Cloudinary** • **Customizable**
12
12
 
13
13
  </div>
14
14
 
@@ -16,18 +16,18 @@ A modern, fancy React image upload component with responsive grid layout, drag-a
16
16
 
17
17
  ## Features
18
18
 
19
- - **Modern UI** - Beautiful card-based design with shadows and rounded corners
20
- - **Responsive Grid** - Adaptive grid layout (2-6 columns) for all screen sizes
21
- - **Drag & Drop** - Upload files by dragging or clicking
22
- - **Live Previews** - Instant image thumbnails with metadata
23
- - **Drag Reorder** - Rearrange images by dragging
24
- - **Progress Tracking** - Real-time upload progress with animations
25
- - **Theme Support** - Built-in light/dark theme toggle
26
- - **Smooth Animations** - Hover effects, fade transitions, scale animations
27
- - **Keyboard Accessible** - Full keyboard navigation support
28
- - **File Validation** - Size and type validation
19
+ - **Modern UI** - Clean, minimal shadcn/ui-inspired design
20
+ - **3 Built-in Themes** - Nature (green), Modern (neutral), Fresh (blue)
21
+ - **Drag & Drop** - Beautiful drag-and-drop with smooth animations
22
+ - **Live Previews** - Responsive grid with image thumbnails
23
+ - **Progress Tracking** - Real-time upload progress with visual feedback
24
+ - **Remove Images** - Easy removal in both create and update modes
25
+ - **Custom Themes** - Create your own theme with custom colors
29
26
  - **Multiple Providers** - ImgBB & Cloudinary support
27
+ - **File Validation** - Size, type, and count validation
28
+ - **Accessible** - Keyboard navigation and ARIA support
30
29
  - **Auto Import** - Works with VS Code, WebStorm, and all editors
30
+ - **Customization API** - Border radius, preview size, show/hide elements
31
31
 
32
32
  ## Installation
33
33
 
@@ -59,7 +59,6 @@ function App() {
59
59
  images={images}
60
60
  setImages={setImages}
61
61
  multiple
62
- gridCols={4}
63
62
  />
64
63
  );
65
64
  }
@@ -69,91 +68,102 @@ function App() {
69
68
 
70
69
  | Prop | Type | Default | Description |
71
70
  |------|------|---------|-------------|
71
+ | **Core** |
72
72
  | `images` | `File[]` | **Required** | Selected image files |
73
73
  | `setImages` | `(files: File[]) => void` | **Required** | Update images state |
74
+ | **Mode** |
75
+ | `mode` | `'add' \| 'update'` | `'add'` | Upload mode |
76
+ | `defaultImages` | `string[]` | `[]` | Default images (update mode) |
77
+ | **File Constraints** |
74
78
  | `multiple` | `boolean` | `true` | Allow multiple files |
75
79
  | `maxSize` | `number` | `52428800` | Max file size (50MB) |
76
80
  | `allowedTypes` | `string[]` | Image types | Allowed MIME types |
77
81
  | `maxImages` | `number` | `20` | Maximum images allowed |
78
- | `theme` | `'light' \| 'dark'` | `undefined` | Theme (uses internal if not set) |
79
- | `onThemeChange` | `(theme) => void` | `undefined` | Theme change callback |
80
- | `showThemeToggle` | `boolean` | `true` | Show theme toggle button |
81
- | `showImageCount` | `boolean` | `true` | Show image count header |
82
- | `enableReorder` | `boolean` | `true` | Enable drag reordering |
83
- | `gridCols` | `number` | `4` | Grid columns (2-6) |
84
- | `cardClassName` | `string` | `''` | Custom card class |
85
- | `containerClassName` | `string` | `'max-w-5xl mx-auto'` | Container styling |
86
- | `uploadText` | `string` | `'Click or drag...'` | Upload area text |
87
- | `dragText` | `string` | `'Drop images here'` | Drag over text |
88
- | `autoUpload` | `boolean` | `false` | Auto-upload on selection |
82
+ | **Upload** |
89
83
  | `uploadConfig` | `{ provider, config }` | `undefined` | Upload configuration |
84
+ | `autoUpload` | `boolean` | `false` | Auto-upload on selection |
90
85
  | `onUploadComplete` | `(urls: string[]) => void` | `undefined` | Success callback |
91
86
  | `onUploadError` | `(error: Error) => void` | `undefined` | Error callback |
87
+ | **Theme & Styling** |
88
+ | `theme` | `'nature' \| 'modern' \| 'fresh'` | `'nature'` | Built-in theme |
89
+ | `customTheme` | `Theme` | `undefined` | Custom theme object |
90
+ | `showThemeSelector` | `boolean` | `false` | Show theme selector |
91
+ | `borderRadius` | `'none' \| 'sm' \| 'md' \| 'lg' \| 'full'` | `'md'` | Border radius |
92
+ | `previewSize` | `'sm' \| 'md' \| 'lg'` | `'md'` | Upload icon size |
93
+ | `className` | `string` | `''` | Custom class name |
94
+ | `containerClassName` | `string` | `'max-w-5xl mx-auto mt-10'` | Container styling |
95
+ | **UI Toggles** |
96
+ | `showImageCount` | `boolean` | `true` | Show image count badge |
97
+ | `showFileName` | `boolean` | `true` | Show file name under preview |
98
+ | `showFileSize` | `boolean` | `true` | Show file size under preview |
92
99
 
93
100
  ## Examples
94
101
 
95
- ### Basic Grid Layout
102
+ ### Basic Usage
96
103
 
97
104
  ```tsx
98
- <ImageUploader
99
- images={images}
100
- setImages={setImages}
101
- multiple
102
- gridCols={4}
103
- />
104
- ```
105
-
106
- ### Dark Theme
105
+ import { ImageUploader } from "ultra-image-uploader";
106
+ import { useState } from "react";
107
107
 
108
- ```tsx
109
- function DarkExample() {
110
- const [theme, setTheme] = useState<'light' | 'dark'>('dark');
108
+ function BasicExample() {
111
109
  const [images, setImages] = useState<File[]>([]);
112
110
 
113
111
  return (
114
- <div className={theme === 'dark' ? 'dark' : ''}>
115
- <ImageUploader
116
- images={images}
117
- setImages={setImages}
118
- theme={theme}
119
- onThemeChange={setTheme}
120
- multiple
121
- gridCols={3}
122
- />
123
- </div>
112
+ <ImageUploader
113
+ images={images}
114
+ setImages={setImages}
115
+ multiple
116
+ />
124
117
  );
125
118
  }
126
119
  ```
127
120
 
128
- ### Custom Grid & Styling
121
+ ### Different Themes
129
122
 
130
123
  ```tsx
131
- <ImageUploader
132
- images={images}
133
- setImages={setImages}
134
- gridCols={3}
135
- maxImages={10}
136
- maxSize={10 * 1024 * 1024}
137
- containerClassName="max-w-4xl mx-auto"
138
- cardClassName="border-2"
139
- />
124
+ // Nature theme (green) - Default
125
+ <ImageUploader theme="nature" images={images} setImages={setImages} />
126
+
127
+ // Modern theme (neutral/monochrome)
128
+ <ImageUploader theme="modern" images={images} setImages={setImages} />
129
+
130
+ // Fresh theme (blue)
131
+ <ImageUploader theme="fresh" images={images} setImages={setImages} />
140
132
  ```
141
133
 
142
- ### Without Reordering
134
+ ### Upload with ImgBB
143
135
 
144
136
  ```tsx
145
- <ImageUploader
146
- images={images}
147
- setImages={setImages}
148
- enableReorder={false}
149
- gridCols={5}
150
- />
137
+ import { ImageUploader } from "ultra-image-uploader";
138
+
139
+ function ImgBBUpload() {
140
+ const [images, setImages] = useState<File[]>([]);
141
+
142
+ return (
143
+ <ImageUploader
144
+ images={images}
145
+ setImages={setImages}
146
+ multiple
147
+ theme="nature"
148
+ uploadConfig={{
149
+ provider: 'imgbb',
150
+ config: { apiKey: process.env.IMGBB_API_KEY! }
151
+ }}
152
+ onUploadComplete={(urls) => {
153
+ console.log('Uploaded URLs:', urls);
154
+ }}
155
+ onUploadError={(error) => {
156
+ console.error('Upload failed:', error.message);
157
+ }}
158
+ />
159
+ );
160
+ }
151
161
  ```
152
162
 
153
- ### With Upload (ImgBB)
163
+ ### Upload with Cloudinary
154
164
 
155
165
  ```tsx
156
- function UploadExample() {
166
+ function CloudinaryUpload() {
157
167
  const [images, setImages] = useState<File[]>([]);
158
168
 
159
169
  return (
@@ -161,134 +171,271 @@ function UploadExample() {
161
171
  images={images}
162
172
  setImages={setImages}
163
173
  multiple
164
- gridCols={4}
174
+ theme="fresh"
165
175
  uploadConfig={{
166
- provider: 'imgbb',
167
- config: { apiKey: process.env.IMGBB_API_KEY }
176
+ provider: 'cloudinary',
177
+ config: {
178
+ cloudName: process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME!,
179
+ uploadPreset: process.env.NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET!
180
+ }
168
181
  }}
169
182
  onUploadComplete={(urls) => {
170
- console.log('Uploaded:', urls);
183
+ console.log('Uploaded URLs:', urls);
171
184
  }}
172
185
  />
173
186
  );
174
187
  }
175
188
  ```
176
189
 
177
- ### Responsive Grid
190
+ ### Auto Upload
178
191
 
179
192
  ```tsx
180
- // 2 columns on mobile, 4 on desktop
181
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
182
- <ImageUploader images={images} setImages={setImages} gridCols={1} />
183
- </div>
193
+ function AutoUploadExample() {
194
+ const [images, setImages] = useState<File[]>([]);
195
+
196
+ return (
197
+ <ImageUploader
198
+ images={images}
199
+ setImages={setImages}
200
+ autoUpload
201
+ uploadConfig={{
202
+ provider: 'imgbb',
203
+ config: { apiKey: process.env.IMGBB_API_KEY! }
204
+ }}
205
+ onUploadComplete={(urls) => {
206
+ // Automatically upload when images are selected
207
+ saveUrlsToDatabase(urls);
208
+ }}
209
+ />
210
+ );
211
+ }
184
212
  ```
185
213
 
186
- ## Theme Support
214
+ ### Update Mode (Existing Images)
215
+
216
+ ```tsx
217
+ function UpdateExample() {
218
+ const [newImages, setNewImages] = useState<File[]>([]);
187
219
 
188
- The component includes built-in light and dark themes:
220
+ const existingImages = [
221
+ 'https://example.com/image1.jpg',
222
+ 'https://example.com/image2.jpg'
223
+ ];
224
+
225
+ return (
226
+ <ImageUploader
227
+ images={newImages}
228
+ setImages={setNewImages}
229
+ mode="update"
230
+ defaultImages={existingImages}
231
+ theme="modern"
232
+ multiple
233
+ />
234
+ );
235
+ }
236
+ ```
237
+
238
+ ### Custom Theme
189
239
 
190
240
  ```tsx
191
- // Controlled theme
192
- <ImageUploader
193
- images={images}
194
- setImages={setImages}
195
- theme="dark"
196
- showThemeToggle={false}
197
- />
241
+ import { ImageUploader, type CustomTheme } from "ultra-image-uploader";
198
242
 
199
- // Uncontrolled theme (with toggle)
200
- <ImageUploader
201
- images={images}
202
- setImages={setImages}
203
- showThemeToggle={true}
204
- />
243
+ function CustomThemeExample() {
244
+ const [images, setImages] = useState<File[]>([]);
245
+
246
+ const customTheme: CustomTheme = {
247
+ name: 'MyBrand',
248
+ colors: {
249
+ primary: '#FF6B35',
250
+ primaryHover: '#E55A2B',
251
+ background: '#FFF5F0',
252
+ border: '#FFE5D9',
253
+ text: '#2D3142',
254
+ textSecondary: '#4F5D75',
255
+ cardBg: '#FFFFFF',
256
+ cardBorder: '#FFE5D9',
257
+ shadow: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',
258
+ },
259
+ };
260
+
261
+ return (
262
+ <ImageUploader
263
+ images={images}
264
+ setImages={setImages}
265
+ customTheme={customTheme}
266
+ showThemeSelector={false}
267
+ />
268
+ );
269
+ }
205
270
  ```
206
271
 
207
- ## Animations
272
+ ### Customization Options
208
273
 
209
- The component includes smooth animations:
210
- - Scale effect on drag over
211
- - Fade-in/out for previews
212
- - Hover scale on image cards
213
- - Smooth progress bar transitions
214
- - Button hover effects
274
+ ```tsx
275
+ function CustomizedExample() {
276
+ const [images, setImages] = useState<File[]>([]);
215
277
 
216
- ## Accessibility
278
+ return (
279
+ <ImageUploader
280
+ images={images}
281
+ setImages={setImages}
282
+ // Border radius
283
+ borderRadius="lg"
284
+ // Preview size (affects upload icon)
285
+ previewSize="lg"
286
+ // Container width
287
+ containerClassName="max-w-3xl mx-auto mt-8"
288
+ // Show/hide elements
289
+ showImageCount={true}
290
+ showFileName={true}
291
+ showFileSize={true}
292
+ // Constraints
293
+ multiple={true}
294
+ maxImages={10}
295
+ maxSize={10 * 1024 * 1024} // 10MB
296
+ // Theme
297
+ theme="fresh"
298
+ />
299
+ );
300
+ }
301
+ ```
217
302
 
218
- - Keyboard accessible (Enter/Space to upload)
219
- - Focus indicators on drag area
220
- - ARIA-compatible markup
221
- - Screen reader friendly
303
+ ### Single Image Upload
222
304
 
223
- ## Responsive Design
305
+ ```tsx
306
+ function SingleImageExample() {
307
+ const [avatar, setAvatar] = useState<File[]>([]);
224
308
 
225
- The grid layout adapts to screen sizes:
226
- - Default: `max-w-5xl mx-auto` container
227
- - Configurable grid columns (2-6)
228
- - Works on mobile, tablet, and desktop
309
+ return (
310
+ <ImageUploader
311
+ images={avatar}
312
+ setImages={setAvatar}
313
+ multiple={false}
314
+ maxImages={1}
315
+ theme="modern"
316
+ showImageCount={false}
317
+ showFileName={false}
318
+ showFileSize={false}
319
+ />
320
+ );
321
+ }
322
+ ```
229
323
 
230
- ## Upload Functions
324
+ ### Product Gallery
231
325
 
232
326
  ```tsx
233
- import {
234
- uploadImage,
235
- uploadImages,
236
- uploadImagesToImageBB,
237
- uploadImagesToCloudinary
238
- } from "ultra-image-uploader";
239
-
240
- // Upload with progress
241
- const result = await uploadImage(file, 'imgbb', { apiKey }, {
242
- onProgress: (p) => console.log(p.percentage)
243
- });
244
-
245
- // Multiple uploads
246
- const results = await uploadImages(files, 'cloudinary', {
247
- cloudName: 'your-cloud'
248
- });
327
+ function ProductGallery() {
328
+ const [productImages, setProductImages] = useState<File[]>([]);
329
+
330
+ const handleUploadComplete = async (urls: string[]) => {
331
+ // Save to database
332
+ await fetch('/api/products/images', {
333
+ method: 'POST',
334
+ headers: { 'Content-Type': 'application/json' },
335
+ body: JSON.stringify({ images: urls }),
336
+ });
337
+ };
338
+
339
+ return (
340
+ <ImageUploader
341
+ images={productImages}
342
+ setImages={setProductImages}
343
+ multiple={true}
344
+ maxImages={8}
345
+ maxSize={5 * 1024 * 1024} // 5MB
346
+ theme="nature"
347
+ borderRadius="lg"
348
+ uploadConfig={{
349
+ provider: 'cloudinary',
350
+ config: {
351
+ cloudName: process.env.CLOUDINARY_CLOUD_NAME!,
352
+ uploadPreset: 'products'
353
+ }
354
+ }}
355
+ onUploadComplete={handleUploadComplete}
356
+ />
357
+ );
358
+ }
249
359
  ```
250
360
 
251
- ## API Configuration
361
+ ## Built-in Themes
252
362
 
253
- ### ImgBB
254
- 1. Get API key from [imgbb.com/settings/api](https://imgbb.com/settings/api)
255
- 2. Use `{ provider: 'imgbb', config: { apiKey } }`
363
+ ### Nature (Green)
364
+ - Soft greens with organic feel
365
+ - Primary: `#16a34a`
366
+ - Background: `#f0fdf4`
367
+ - Perfect for: Nature, health, eco-friendly apps
256
368
 
257
- ### Cloudinary
258
- 1. Sign up at [cloudinary.com](https://cloudinary.com)
259
- 2. Get cloud name and create upload preset
260
- 3. Use `{ provider: 'cloudinary', config: { cloudName, uploadPreset } }`
369
+ ### Modern (Neutral)
370
+ - Clean monochrome design
371
+ - Primary: `#09090b`
372
+ - Background: `#fafafa`
373
+ - Perfect for: Professional apps, portfolios, dashboards
374
+
375
+ ### Fresh (Blue)
376
+ - Light blue airy design
377
+ - Primary: `#0284c7`
378
+ - Background: `#f0f9ff`
379
+ - Perfect for: Social apps, SaaS, modern web apps
261
380
 
262
381
  ## Customization
263
382
 
264
- ### Card Styling
383
+ ### Border Radius Options
265
384
 
266
385
  ```tsx
267
- <ImageUploader
268
- images={images}
269
- setImages={setImages}
270
- cardClassName="border-2 border-purple-500"
271
- />
386
+ borderRadius="none" // 0
387
+ borderRadius="sm" // 0.25rem
388
+ borderRadius="md" // 0.375rem (default)
389
+ borderRadius="lg" // 0.5rem
390
+ borderRadius="full" // 9999px (circular)
391
+ ```
392
+
393
+ ### Preview Size Options
394
+
395
+ ```tsx
396
+ previewSize="sm" // Small icon
397
+ previewSize="md" // Medium icon (default)
398
+ previewSize="lg" // Large icon
272
399
  ```
273
400
 
274
- ### Container Size
401
+ ### Show/Hide Elements
275
402
 
276
403
  ```tsx
277
404
  <ImageUploader
278
- images={images}
279
- setImages={setImages}
280
- containerClassName="max-w-7xl mx-auto"
405
+ showImageCount={false} // Hide image count badge
406
+ showFileName={false} // Hide file names
407
+ showFileSize={false} // Hide file sizes
281
408
  />
282
409
  ```
283
410
 
284
- ### Grid Columns
411
+ ## Upload Providers
412
+
413
+ ### ImgBB
414
+
415
+ 1. Get API key from [imgbb.com/settings/api](https://imgbb.com/settings/api)
416
+ 2. Configure:
285
417
 
286
418
  ```tsx
287
- // 2 columns
288
- <ImageUploader gridCols={2} />
419
+ uploadConfig={{
420
+ provider: 'imgbb',
421
+ config: { apiKey: 'your-api-key' }
422
+ }}
423
+ ```
424
+
425
+ ### Cloudinary
289
426
 
290
- // 6 columns
291
- <ImageUploader gridCols={6} />
427
+ 1. Sign up at [cloudinary.com](https://cloudinary.com)
428
+ 2. Get cloud name and create upload preset
429
+ 3. Configure:
430
+
431
+ ```tsx
432
+ uploadConfig={{
433
+ provider: 'cloudinary',
434
+ config: {
435
+ cloudName: 'your-cloud-name',
436
+ uploadPreset: 'your-upload-preset'
437
+ }
438
+ }}
292
439
  ```
293
440
 
294
441
  ## TypeScript
@@ -296,29 +443,57 @@ const results = await uploadImages(files, 'cloudinary', {
296
443
  Full TypeScript support:
297
444
 
298
445
  ```tsx
299
- import type { ImageUploaderProps } from "ultra-image-uploader";
446
+ import type { ImageUploaderProps, ThemeName, CustomTheme } from "ultra-image-uploader";
300
447
  ```
301
448
 
449
+ ## Animations
450
+
451
+ The component includes smooth, performance-friendly animations:
452
+ - Drag-over state with border color change
453
+ - Fade-in for image previews
454
+ - Hover effects with shadow and scale
455
+ - Progress overlay with backdrop blur
456
+ - Done indicator with checkmark
457
+ - All transitions use CSS transforms for 60fps performance
458
+
459
+ ## Accessibility
460
+
461
+ - Keyboard accessible (Tab to focus, Enter/Space to upload)
462
+ - Focus visible on drag area
463
+ - ARIA-compatible markup
464
+ - Screen reader friendly
465
+ - Semantic HTML structure
466
+
467
+ ## Responsive Design
468
+
469
+ The grid layout adapts to screen sizes:
470
+ - Mobile (2 columns): 320px+
471
+ - Tablet (3 columns): 640px+
472
+ - Desktop (4 columns): 768px+
473
+ - Wide (5 columns): 1024px+
474
+ - Default container: `max-w-5xl mx-auto mt-10`
475
+
302
476
  ## Browser Support
303
477
 
304
478
  - Chrome/Edge (latest)
305
479
  - Firefox (latest)
306
480
  - Safari (latest)
307
- - Mobile browsers
481
+ - Mobile browsers (iOS Safari, Chrome Mobile)
308
482
 
309
483
  ## Troubleshooting
310
484
 
311
485
  ### Auto imports not working
312
- - Restart TypeScript server in your editor
313
- - Ensure `node_modules` exists
486
+ - Restart TypeScript server in your editor (Cmd+Shift+P > "Restart TypeScript Server")
487
+ - Ensure `node_modules` exists (`npm install`)
314
488
 
315
- ### Theme not applying
316
- - Wrap parent div with `dark` class for dark mode
317
- - Check Tailwind CSS dark mode config
489
+ ### Images not uploading
490
+ - Verify API credentials in environment variables
491
+ - Check browser console for errors
492
+ - Ensure CORS is configured for your upload provider
318
493
 
319
- ### Grid not responsive
320
- - Adjust `gridCols` prop for different breakpoints
321
- - Use wrapper with responsive classes
494
+ ### Theme not applying
495
+ - Check that theme name matches: `'nature'` | `'modern'` | `'fresh'`
496
+ - For custom themes, verify the structure matches `CustomTheme` type
322
497
 
323
498
  ## License
324
499
 
@@ -1,18 +1,76 @@
1
1
  import type { UploadProvider, ProviderConfig } from '../types';
2
+ export declare const themes: {
3
+ nature: {
4
+ name: string;
5
+ colors: {
6
+ primary: string;
7
+ primaryHover: string;
8
+ background: string;
9
+ border: string;
10
+ text: string;
11
+ textSecondary: string;
12
+ cardBg: string;
13
+ cardBorder: string;
14
+ shadow: string;
15
+ };
16
+ };
17
+ modern: {
18
+ name: string;
19
+ colors: {
20
+ primary: string;
21
+ primaryHover: string;
22
+ background: string;
23
+ border: string;
24
+ text: string;
25
+ textSecondary: string;
26
+ cardBg: string;
27
+ cardBorder: string;
28
+ shadow: string;
29
+ };
30
+ };
31
+ fresh: {
32
+ name: string;
33
+ colors: {
34
+ primary: string;
35
+ primaryHover: string;
36
+ background: string;
37
+ border: string;
38
+ text: string;
39
+ textSecondary: string;
40
+ cardBg: string;
41
+ cardBorder: string;
42
+ shadow: string;
43
+ };
44
+ };
45
+ };
46
+ export type ThemeName = keyof typeof themes;
47
+ export type CustomTheme = typeof themes[ThemeName];
2
48
  export interface ImageUploaderProps {
3
49
  images: File[];
4
50
  setImages: (images: File[]) => void;
51
+ mode?: 'add' | 'update';
52
+ defaultImages?: string[];
5
53
  multiple?: boolean;
6
54
  maxSize?: number;
7
55
  allowedTypes?: string[];
8
- className?: string;
9
- onUploadComplete?: (urls: string[]) => void;
10
- onUploadError?: (error: Error) => void;
11
- autoUpload?: boolean;
56
+ maxImages?: number;
12
57
  uploadConfig?: {
13
58
  provider: UploadProvider;
14
59
  config: ProviderConfig;
15
60
  };
61
+ autoUpload?: boolean;
62
+ onUploadComplete?: (urls: string[]) => void;
63
+ onUploadError?: (error: Error) => void;
64
+ theme?: ThemeName;
65
+ customTheme?: CustomTheme;
66
+ showThemeSelector?: boolean;
67
+ previewSize?: 'sm' | 'md' | 'lg';
68
+ borderRadius?: 'none' | 'sm' | 'md' | 'lg' | 'full';
69
+ className?: string;
70
+ containerClassName?: string;
71
+ showImageCount?: boolean;
72
+ showFileSize?: boolean;
73
+ showFileName?: boolean;
16
74
  }
17
- export declare function ImageUploader({ images, setImages, multiple, maxSize, allowedTypes, className, onUploadComplete, onUploadError, autoUpload, uploadConfig, }: ImageUploaderProps): import("react/jsx-runtime").JSX.Element;
75
+ export declare function ImageUploader({ images, setImages, mode, defaultImages, multiple, maxSize, allowedTypes, maxImages, uploadConfig, autoUpload, onUploadComplete, onUploadError, theme, customTheme, showThemeSelector, previewSize, borderRadius, className, containerClassName, showImageCount, showFileSize, showFileName, }: ImageUploaderProps): import("react/jsx-runtime").JSX.Element;
18
76
  //# sourceMappingURL=ImageUploader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUploader.d.ts","sourceRoot":"","sources":["../../src/components/ImageUploader.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,cAAc,CAAC;QACzB,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC;CACH;AAQD,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,EACT,QAAe,EACf,OAA0B,EAC1B,YAAkF,EAClF,SAAc,EACd,gBAAgB,EAChB,aAAa,EACb,UAAkB,EAClB,YAAY,GACb,EAAE,kBAAkB,2CA8SpB"}
1
+ {"version":3,"file":"ImageUploader.d.ts","sourceRoot":"","sources":["../../src/components/ImageUploader.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK/D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC;AAC5C,MAAM,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IAEjC,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAGpC,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAGzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,cAAc,CAAC;QACzB,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC;IACF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAGvC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAG5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAiBD,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,EACT,IAAY,EACZ,aAAkB,EAClB,QAAe,EACf,OAA0B,EAC1B,YAAmG,EACnG,SAAc,EACd,YAAY,EACZ,UAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,KAAgB,EAChB,WAAW,EACX,iBAAyB,EACzB,WAAkB,EAClB,YAAmB,EACnB,SAAc,EACd,kBAA8C,EAC9C,cAAqB,EACrB,YAAmB,EACnB,YAAmB,GACpB,EAAE,kBAAkB,2CAydpB"}
@@ -1,25 +1,84 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useRef, useCallback, useEffect } from 'react';
4
- import { Upload, X, FileText, Loader2 } from 'lucide-react';
4
+ import { Upload, X, Image as ImageIcon, Loader2 } from 'lucide-react';
5
5
  import { uploadImage } from '../providers';
6
6
  import { isImageFile, formatFileSize } from '../utils/validation';
7
- export function ImageUploader({ images, setImages, multiple = true, maxSize = 50 * 1024 * 1024, allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/gif'], className = '', onUploadComplete, onUploadError, autoUpload = false, uploadConfig, }) {
7
+ // Theme definitions - shadcn/ui inspired
8
+ export const themes = {
9
+ nature: {
10
+ name: 'Nature',
11
+ colors: {
12
+ primary: '#16a34a',
13
+ primaryHover: '#15803d',
14
+ background: '#f0fdf4',
15
+ border: '#bbf7d0',
16
+ text: '#14532d',
17
+ textSecondary: '#166534',
18
+ cardBg: '#ffffff',
19
+ cardBorder: '#dcfce7',
20
+ shadow: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',
21
+ },
22
+ },
23
+ modern: {
24
+ name: 'Modern',
25
+ colors: {
26
+ primary: '#09090b',
27
+ primaryHover: '#18181b',
28
+ background: '#fafafa',
29
+ border: '#e4e4e7',
30
+ text: '#18181b',
31
+ textSecondary: '#71717a',
32
+ cardBg: '#ffffff',
33
+ cardBorder: '#e4e4e7',
34
+ shadow: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',
35
+ },
36
+ },
37
+ fresh: {
38
+ name: 'Fresh',
39
+ colors: {
40
+ primary: '#0284c7',
41
+ primaryHover: '#0369a1',
42
+ background: '#f0f9ff',
43
+ border: '#bae6fd',
44
+ text: '#0c4a6e',
45
+ textSecondary: '#075985',
46
+ cardBg: '#ffffff',
47
+ cardBorder: '#e0f2fe',
48
+ shadow: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',
49
+ },
50
+ },
51
+ };
52
+ const borderRadiusMap = {
53
+ none: '0',
54
+ sm: '0.25rem',
55
+ md: '0.375rem',
56
+ lg: '0.5rem',
57
+ full: '9999px',
58
+ };
59
+ export function ImageUploader({ images, setImages, mode = 'add', defaultImages = [], multiple = true, maxSize = 50 * 1024 * 1024, allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/gif', 'image/svg+xml'], maxImages = 20, uploadConfig, autoUpload = false, onUploadComplete, onUploadError, theme = 'nature', customTheme, showThemeSelector = false, previewSize = 'md', borderRadius = 'md', className = '', containerClassName = 'max-w-5xl mx-auto mt-10', showImageCount = true, showFileSize = true, showFileName = true, }) {
60
+ const [selectedTheme, setSelectedTheme] = useState(theme);
8
61
  const [isDragging, setIsDragging] = useState(false);
9
62
  const [fileStates, setFileStates] = useState(new Map());
10
63
  const [uploading, setUploading] = useState(false);
64
+ const [removedDefaults, setRemovedDefaults] = useState([]);
11
65
  const fileInputRef = useRef(null);
12
66
  const dragCounter = useRef(0);
13
- // Initialize file states
67
+ const currentTheme = customTheme || themes[selectedTheme];
68
+ const t = currentTheme.colors;
69
+ const radius = borderRadiusMap[borderRadius];
70
+ // Generate previews
14
71
  useEffect(() => {
15
72
  const newStates = new Map();
16
73
  images.forEach((file) => {
17
74
  const key = `${file.name}-${file.size}`;
18
- if (!fileStates.has(key)) {
19
- newStates.set(key, { ...file, progress: 0, status: 'pending' });
75
+ const existing = fileStates.get(key);
76
+ if (existing?.preview) {
77
+ newStates.set(key, existing);
20
78
  }
21
79
  else {
22
- newStates.set(key, fileStates.get(key));
80
+ const preview = isImageFile(file) ? URL.createObjectURL(file) : undefined;
81
+ newStates.set(key, { ...file, progress: 0, status: 'pending', preview });
23
82
  }
24
83
  });
25
84
  setFileStates(newStates);
@@ -79,7 +138,7 @@ export function ImageUploader({ images, setImages, multiple = true, maxSize = 50
79
138
  const valid = [];
80
139
  const invalid = [];
81
140
  Array.from(files).forEach((file) => {
82
- if (!isImageFile(file)) {
141
+ if (!isImageFile(file) && !allowedTypes.includes(file.type)) {
83
142
  invalid.push(file);
84
143
  return;
85
144
  }
@@ -87,14 +146,13 @@ export function ImageUploader({ images, setImages, multiple = true, maxSize = 50
87
146
  invalid.push(file);
88
147
  return;
89
148
  }
90
- if (!allowedTypes.includes(file.type)) {
91
- invalid.push(file);
149
+ if (maxImages && images.length + valid.length >= maxImages) {
92
150
  return;
93
151
  }
94
152
  valid.push(file);
95
153
  });
96
154
  return { valid, invalid };
97
- }, [maxSize, allowedTypes]);
155
+ }, [maxSize, allowedTypes, maxImages, images.length]);
98
156
  const handleFiles = useCallback((files) => {
99
157
  const { valid } = validateFiles(files);
100
158
  if (valid.length === 0)
@@ -104,7 +162,7 @@ export function ImageUploader({ images, setImages, multiple = true, maxSize = 50
104
162
  return;
105
163
  }
106
164
  setImages(multiple ? [...images, ...valid] : [valid[0]]);
107
- }, [images, multiple, setImages, validateFiles]);
165
+ }, [images, multiple, setImages, validateFiles, maxImages]);
108
166
  const handleChange = (e) => {
109
167
  if (e.target.files?.length) {
110
168
  handleFiles(e.target.files);
@@ -137,24 +195,74 @@ export function ImageUploader({ images, setImages, multiple = true, maxSize = 50
137
195
  handleFiles(e.dataTransfer.files);
138
196
  }
139
197
  };
140
- const removeFile = (file) => {
141
- setImages(images.filter((f) => f !== file));
198
+ const removeFile = (index) => {
199
+ setImages(images.filter((_, i) => i !== index));
200
+ };
201
+ const removeDefaultImage = (index) => {
202
+ setRemovedDefaults((prev) => [...prev, index]);
142
203
  };
143
204
  const getFileState = (file) => {
144
205
  const key = `${file.name}-${file.size}`;
145
206
  return fileStates.get(key) || { ...file, progress: 0, status: 'pending' };
146
207
  };
147
- return (_jsxs("div", { className: `image-uploader ${className}`, children: [_jsxs("div", { className: "relative border-2 border-dashed border-gray-300 rounded-lg p-12 transition-colors duration-200", style: {
148
- borderColor: isDragging ? '#1E88E5' : undefined,
149
- backgroundColor: isDragging ? '#F5F5F5' : 'white',
150
- }, onClick: () => fileInputRef.current?.click(), onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, children: [_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-col items-center justify-center", children: [_jsxs("div", { className: "relative mb-4", children: [_jsx("div", { className: "w-16 h-16 rounded-full border-2 border-gray-300 flex items-center justify-center bg-white", children: _jsx(FileText, { size: 32, className: "text-gray-400" }) }), _jsx("div", { className: "absolute -bottom-1 -right-1 w-8 h-8 bg-gray-800 rounded-full flex items-center justify-center", children: _jsx(Upload, { size: 16, className: "text-white" }) })] }), _jsxs("p", { className: "text-base text-gray-700 mb-2", children: [_jsx("span", { className: "underline decoration-1 underline-offset-2 cursor-pointer hover:text-gray-900", children: "Click to upload" }), ' ', "or drag and drop"] }), _jsxs("p", { className: "text-sm text-gray-500", children: ["Maximum file size ", formatFileSize(maxSize)] })] })] }), images.length > 0 && (_jsx("div", { className: "mt-6 grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4", children: images.map((file) => {
151
- const state = getFileState(file);
152
- const isUploading = state.status === 'uploading';
153
- const isDone = state.status === 'done';
154
- return (_jsxs("div", { className: "relative group", children: [_jsxs("div", { className: "relative aspect-square rounded-lg overflow-hidden border border-gray-300", children: [_jsx("img", { src: URL.createObjectURL(file), alt: file.name, className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" }), _jsx("button", { onClick: (e) => {
155
- e.stopPropagation();
156
- removeFile(file);
157
- }, className: "absolute top-2 right-2 w-8 h-8 flex items-center justify-center bg-red-500 hover:bg-red-600 rounded-full text-white opacity-0 group-hover:opacity-100 transition-all shadow-lg hover:scale-110", children: _jsx(X, { size: 16 }) }), isUploading && (_jsx("div", { className: "absolute inset-0 bg-black/60 flex items-center justify-center", children: _jsxs("div", { className: "text-center", children: [_jsx(Loader2, { size: 32, className: "animate-spin text-white mx-auto mb-2" }), _jsxs("p", { className: "text-white font-semibold text-sm", children: [state.progress, "%"] })] }) })), isDone && (_jsx("div", { className: "absolute inset-0 bg-black/40 flex items-center justify-center", children: _jsx("div", { className: "w-16 h-16 bg-green-500 rounded-full flex items-center justify-center", children: _jsx("svg", { className: "w-8 h-8 text-white", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 3, d: "M5 13l4 4L19 7" }) }) }) }))] }), _jsxs("div", { className: "mt-2", children: [_jsx("p", { className: "text-sm font-medium text-gray-900 truncate", children: file.name }), _jsx("p", { className: "text-xs text-gray-500", children: formatFileSize(file.size) })] })] }, `${file.name}-${file.size}`));
158
- }) })), images.length > 0 && !autoUpload && (_jsxs("div", { className: "mt-6 flex items-center justify-end gap-3", children: [_jsx("button", { onClick: () => setImages([]), className: "px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors", children: "Cancel" }), _jsx("button", { onClick: handleAutoUpload, disabled: uploading, className: "px-4 py-2 text-sm font-medium text-white bg-gray-900 rounded-lg hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center gap-2", children: uploading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { size: 16, className: "animate-spin" }), "Uploading..."] })) : ('Attach files') })] }))] }));
208
+ return (_jsxs("div", { className: `image-uploader ${containerClassName} ${className}`, children: [_jsxs("div", { className: "flex items-center justify-between mb-6", children: [_jsxs("div", { children: [_jsxs("h2", { className: "text-2xl font-semibold tracking-tight", style: { color: t.text }, children: [mode === 'update' ? 'Update' : 'Upload', " Images"] }), _jsx("p", { className: "text-sm", style: { color: t.textSecondary }, children: multiple ? 'Drag and drop or click to upload' : 'Select an image to upload' })] }), showImageCount && (_jsxs("div", { className: "inline-flex items-center gap-2 px-3 py-1.5 text-sm font-medium rounded-md border", style: {
209
+ backgroundColor: t.cardBg,
210
+ borderColor: t.cardBorder,
211
+ color: t.text,
212
+ }, children: [_jsx("span", { children: images.length }), maxImages && _jsxs("span", { className: "text-muted", style: { color: t.textSecondary }, children: ["/ ", maxImages] })] }))] }), showThemeSelector && (_jsx("div", { className: "mb-6 inline-flex gap-1 p-1 rounded-lg border", style: { backgroundColor: t.background, borderColor: t.cardBorder }, children: Object.keys(themes).map((key) => (_jsx("button", { onClick: () => setSelectedTheme(key), className: "px-3 py-1.5 text-sm font-medium rounded-md transition-colors", style: {
213
+ backgroundColor: selectedTheme === key ? t.cardBg : 'transparent',
214
+ color: selectedTheme === key ? t.text : t.textSecondary,
215
+ }, children: themes[key].name }, key))) })), _jsxs("div", { className: "relative group cursor-pointer overflow-hidden transition-all duration-200", style: {
216
+ borderRadius: radius,
217
+ border: `2px dashed ${isDragging ? t.primary : t.cardBorder}`,
218
+ backgroundColor: t.background,
219
+ }, onClick: () => fileInputRef.current?.click(), onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, children: [_jsx("input", { ref: fileInputRef, type: "file", accept: allowedTypes.join(','), multiple: multiple, onChange: handleChange, className: "absolute inset-0 opacity-0 cursor-pointer", style: { zIndex: 10 } }), _jsxs("div", { className: "flex flex-col items-center justify-center p-12", children: [_jsx("div", { className: "mb-4 flex items-center justify-center transition-transform duration-200", style: { color: isDragging ? t.primary : t.textSecondary }, children: _jsx("div", { className: "flex items-center justify-center rounded-full", style: {
220
+ width: previewSize === 'lg' ? '64px' : previewSize === 'md' ? '56px' : '48px',
221
+ height: previewSize === 'lg' ? '64px' : previewSize === 'md' ? '56px' : '48px',
222
+ backgroundColor: t.cardBg,
223
+ border: `1px solid ${t.cardBorder}`,
224
+ }, children: _jsx(ImageIcon, { size: 24 }) }) }), _jsxs("div", { className: "text-center space-y-1", children: [_jsx("p", { className: "text-sm font-medium", style: { color: t.text }, children: isDragging ? 'Drop images here' : multiple ? 'Drop images here' : 'Drop image here' }), _jsx("p", { className: "text-xs", style: { color: t.textSecondary }, children: "or click to browse" })] }), _jsxs("div", { className: "mt-4 text-xs space-y-0.5", style: { color: t.textSecondary }, children: [_jsxs("p", { children: ["Max size: ", formatFileSize(maxSize)] }), maxImages && _jsxs("p", { children: ["Up to ", maxImages, " image", maxImages > 1 ? 's' : ''] })] })] })] }), (images.length > 0 || defaultImages.length > 0) && (_jsx("div", { className: "mt-6", children: _jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4", children: [mode === 'update' &&
225
+ defaultImages.map((url, index) => !removedDefaults.includes(index) && (_jsx("div", { className: "relative group aspect-square", style: { animation: 'fadeIn 0.2s ease-out' }, children: _jsxs("div", { className: "relative w-full h-full overflow-hidden border transition-all duration-200 hover:shadow-md", style: {
226
+ borderRadius: radius,
227
+ borderColor: t.cardBorder,
228
+ backgroundColor: t.cardBg,
229
+ }, children: [_jsx("img", { src: url, alt: `Preview ${index + 1}`, className: "w-full h-full object-cover" }), _jsx("button", { onClick: () => removeDefaultImage(index), className: "absolute top-2 right-2 w-7 h-7 flex items-center justify-center rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-200", style: {
230
+ backgroundColor: 'rgba(0,0,0,0.7)',
231
+ backdropFilter: 'blur(4px)',
232
+ }, children: _jsx(X, { size: 14, className: "text-white" }) })] }) }, `default-${index}`))), images.map((file, index) => {
233
+ const state = getFileState(file);
234
+ const isUploading = state.status === 'uploading';
235
+ const isDone = state.status === 'done';
236
+ return (_jsxs("div", { className: "relative group aspect-square", style: { animation: 'fadeIn 0.2s ease-out', animationDelay: `${index * 30}ms` }, children: [_jsxs("div", { className: "relative w-full h-full overflow-hidden border transition-all duration-200 hover:shadow-md", style: {
237
+ borderRadius: radius,
238
+ borderColor: t.cardBorder,
239
+ backgroundColor: t.cardBg,
240
+ }, children: [state.preview ? (_jsx("img", { src: state.preview, alt: file.name, className: "w-full h-full object-cover" })) : (_jsx("div", { className: "w-full h-full flex items-center justify-center", style: { backgroundColor: t.border }, children: _jsx(ImageIcon, { size: 32, style: { color: t.primary } }) })), _jsx("button", { onClick: () => removeFile(index), className: "absolute top-2 right-2 w-7 h-7 flex items-center justify-center rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-200", style: {
241
+ backgroundColor: 'rgba(0,0,0,0.7)',
242
+ backdropFilter: 'blur(4px)',
243
+ }, children: _jsx(X, { size: 14, className: "text-white" }) }), isUploading && (_jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center", children: _jsxs("div", { className: "text-center", children: [_jsx(Loader2, { size: 24, className: "animate-spin text-white mx-auto mb-2" }), _jsxs("p", { className: "text-white text-xs font-medium", children: [state.progress, "%"] })] }) })), isDone && (_jsx("div", { className: "absolute inset-0 bg-black/20 backdrop-blur-sm flex items-center justify-center", children: _jsx("div", { className: "w-12 h-12 bg-green-500 rounded-full flex items-center justify-center", style: {
244
+ boxShadow: '0 4px 12px rgba(34, 197, 94, 0.4)',
245
+ }, children: _jsx("svg", { className: "w-6 h-6 text-white", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 3, d: "M5 13l4 4L19 7" }) }) }) }))] }), (showFileName || showFileSize) && (_jsxs("div", { className: "mt-2 space-y-0.5", children: [showFileName && (_jsx("p", { className: "text-xs font-medium truncate", style: { color: t.text }, children: file.name })), showFileSize && (_jsx("p", { className: "text-xs", style: { color: t.textSecondary }, children: formatFileSize(file.size) }))] }))] }, `${file.name}-${file.size}`));
246
+ })] }) })), images.length > 0 && !autoUpload && uploadConfig && (_jsxs("div", { className: "mt-6 flex items-center justify-end gap-3", children: [_jsx("button", { onClick: () => {
247
+ setImages([]);
248
+ setRemovedDefaults([]);
249
+ }, className: "px-4 py-2 text-sm font-medium rounded-md border transition-colors duration-200 hover:bg-opacity-80", style: {
250
+ backgroundColor: t.cardBg,
251
+ color: t.text,
252
+ borderColor: t.cardBorder,
253
+ }, children: "Clear" }), _jsx("button", { onClick: handleAutoUpload, disabled: uploading, className: "px-4 py-2 text-sm font-medium rounded-md text-white transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center gap-2", style: {
254
+ backgroundColor: t.primary,
255
+ }, children: uploading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { size: 16, className: "animate-spin" }), "Uploading..."] })) : (_jsxs(_Fragment, { children: [_jsx(Upload, { size: 16 }), "Upload ", images.length, " ", images.length === 1 ? 'image' : 'images'] })) })] })), _jsx("style", { children: `
256
+ @keyframes fadeIn {
257
+ from {
258
+ opacity: 0;
259
+ transform: translateY(4px);
260
+ }
261
+ to {
262
+ opacity: 1;
263
+ transform: translateY(0);
264
+ }
265
+ }
266
+ ` })] }));
159
267
  }
160
268
  //# sourceMappingURL=ImageUploader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUploader.js","sourceRoot":"","sources":["../../src/components/ImageUploader.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ImageUploader.js","sourceRoot":"","sources":["../../src/components/ImageUploader.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAElE,yCAAyC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,SAAS;YACvB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,SAAS;YACxB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,+DAA+D;SACxE;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,SAAS;YACvB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,SAAS;YACxB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,+DAA+D;SACxE;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,SAAS;YACvB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,SAAS;YACxB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,+DAA+D;SACxE;KACF;CACF,CAAC;AAqDF,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,GAAG;IACT,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,EACT,IAAI,GAAG,KAAK,EACZ,aAAa,GAAG,EAAE,EAClB,QAAQ,GAAG,IAAI,EACf,OAAO,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAC1B,YAAY,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,EACnG,SAAS,GAAG,EAAE,EACd,YAAY,EACZ,UAAU,GAAG,KAAK,EAClB,gBAAgB,EAChB,aAAa,EACb,KAAK,GAAG,QAAQ,EAChB,WAAW,EACX,iBAAiB,GAAG,KAAK,EACzB,WAAW,GAAG,IAAI,EAClB,YAAY,GAAG,IAAI,EACnB,SAAS,GAAG,EAAE,EACd,kBAAkB,GAAG,yBAAyB,EAC9C,cAAc,GAAG,IAAI,EACrB,YAAY,GAAG,IAAI,EACnB,YAAY,GAAG,IAAI,GACA;IACnB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAY,KAAK,CAAC,CAAC;IACrE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgC,IAAI,GAAG,EAAE,CAAC,CAAC;IACvF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,YAAY,GAAG,WAAW,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAE7C,oBAAoB;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAErC,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;gBACtB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1E,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC,CAAC,CAAC;QACH,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,qBAAqB;IACrB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClE,gBAAgB,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACxC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC7D,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,MAAM,EAAE;oBACjF,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;wBAChB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;4BACrB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;4BAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BAC9B,IAAI,OAAO,EAAE,CAAC;gCACZ,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;4BACxD,CAAC;4BACD,OAAO,IAAI,CAAC;wBACd,CAAC,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC,CAAC;gBAEH,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC9B,IAAI,OAAO,EAAE,CAAC;wBACZ,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC/D,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACtE,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,KAAe,EAAsC,EAAE;QACtD,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,MAAM,OAAO,GAAW,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC3D,OAAO;YACT,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC,EACD,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAClD,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAe,EAAE,EAAE;QAClB,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/B,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,EACD,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC,CACxD,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,CAAsC,EAAE,EAAE;QAC9D,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YAC3B,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,CAAkB,EAAE,EAAE;QAC7C,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM;YAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,CAAkB,EAAE,EAAE;QAC7C,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,WAAW,CAAC,OAAO,KAAK,CAAC;YAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CAAkB,EAAE,EAAE;QAC5C,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,CAAkB,EAAE,EAAE;QACxC,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC;QAExB,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACjC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE;QACnC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE;QAC3C,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,IAAU,EAAoB,EAAE;QACpD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC5E,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,kBAAkB,kBAAkB,IAAI,SAAS,EAAE,aAEjE,eAAK,SAAS,EAAC,wCAAwC,aACrD,0BACE,cAAI,SAAS,EAAC,uCAAuC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,aAC3E,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,eACrC,EACL,YAAG,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,YACrD,QAAQ,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,2BAA2B,GAC1E,IACA,EAEL,cAAc,IAAI,CACjB,eACE,SAAS,EAAC,kFAAkF,EAC5F,KAAK,EAAE;4BACL,eAAe,EAAE,CAAC,CAAC,MAAM;4BACzB,WAAW,EAAE,CAAC,CAAC,UAAU;4BACzB,KAAK,EAAE,CAAC,CAAC,IAAI;yBACd,aAED,yBAAO,MAAM,CAAC,MAAM,GAAQ,EAC3B,SAAS,IAAI,gBAAM,SAAS,EAAC,YAAY,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,mBAAK,SAAS,IAAQ,IAC9F,CACP,IACG,EAGL,iBAAiB,IAAI,CACpB,cAAK,SAAS,EAAC,8CAA8C,EAAC,KAAK,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,YAC7H,MAAM,CAAC,IAAI,CAAC,MAAM,CAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjD,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,EACpC,SAAS,EAAC,8DAA8D,EACxE,KAAK,EAAE;wBACL,eAAe,EAAE,aAAa,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa;wBACjE,KAAK,EAAE,aAAa,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;qBACxD,YAEA,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,IARZ,GAAG,CASD,CACV,CAAC,GACE,CACP,EAGD,eACE,SAAS,EAAC,2EAA2E,EACrF,KAAK,EAAE;oBACL,YAAY,EAAE,MAAM;oBACpB,MAAM,EAAE,cAAc,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE;oBAC7D,eAAe,EAAE,CAAC,CAAC,UAAU;iBAC9B,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,EAC5C,WAAW,EAAE,eAAe,EAC5B,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,UAAU,aAElB,gBACE,GAAG,EAAE,YAAY,EACjB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAC9B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAC,2CAA2C,EACrD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GACrB,EAEF,eAAK,SAAS,EAAC,gDAAgD,aAC7D,cACE,SAAS,EAAC,yEAAyE,EACnF,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,YAE1D,cACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE;wCACL,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wCAC7E,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wCAC9E,eAAe,EAAE,CAAC,CAAC,MAAM;wCACzB,MAAM,EAAE,aAAa,CAAC,CAAC,UAAU,EAAE;qCACpC,YAED,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,GACnB,GACF,EAEN,eAAK,SAAS,EAAC,uBAAuB,aACpC,YAAG,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,YACxD,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,GAClF,EACJ,YAAG,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,mCAEpD,IACA,EAEN,eAAK,SAAS,EAAC,0BAA0B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,aACzE,sCAAc,cAAc,CAAC,OAAO,CAAC,IAAK,EACzC,SAAS,IAAI,kCAAU,SAAS,YAAQ,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAK,IAClE,IACF,IACF,EAGL,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAClD,cAAK,SAAS,EAAC,MAAM,YACnB,eAAK,SAAS,EAAC,qEAAqE,aAEjF,IAAI,KAAK,QAAQ;4BAChB,aAAa,CAAC,GAAG,CACf,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACb,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAClC,cAEE,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,YAE5C,eACE,SAAS,EAAC,2FAA2F,EACrG,KAAK,EAAE;wCACL,YAAY,EAAE,MAAM;wCACpB,WAAW,EAAE,CAAC,CAAC,UAAU;wCACzB,eAAe,EAAE,CAAC,CAAC,MAAM;qCAC1B,aAED,cACE,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,EAAE,EAC3B,SAAS,EAAC,4BAA4B,GACtC,EAGF,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EACxC,SAAS,EAAC,gJAAgJ,EAC1J,KAAK,EAAE;gDACL,eAAe,EAAE,iBAAiB;gDAClC,cAAc,EAAE,WAAW;6CAC5B,YAED,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,GAAG,GAC/B,IACL,IA7BD,WAAW,KAAK,EAAE,CA8BnB,CACP,CACJ,EAGF,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;4BAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;4BACjC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC;4BACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;4BAEvC,OAAO,CACL,eAEE,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,cAAc,EAAE,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,aAE/E,eACE,SAAS,EAAC,2FAA2F,EACrG,KAAK,EAAE;4CACL,YAAY,EAAE,MAAM;4CACpB,WAAW,EAAE,CAAC,CAAC,UAAU;4CACzB,eAAe,EAAE,CAAC,CAAC,MAAM;yCAC1B,aAEA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CACf,cACE,GAAG,EAAE,KAAK,CAAC,OAAO,EAClB,GAAG,EAAE,IAAI,CAAC,IAAI,EACd,SAAS,EAAC,4BAA4B,GACtC,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,gDAAgD,EAAC,KAAK,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,YAClG,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,GAAI,GAChD,CACP,EAGD,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAChC,SAAS,EAAC,gJAAgJ,EAC1J,KAAK,EAAE;oDACL,eAAe,EAAE,iBAAiB;oDAClC,cAAc,EAAE,WAAW;iDAC5B,YAED,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,GAAG,GAC/B,EAGR,WAAW,IAAI,CACd,cAAK,SAAS,EAAC,gFAAgF,YAC7F,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,sCAAsC,GAAG,EACtE,aAAG,SAAS,EAAC,gCAAgC,aAAE,KAAK,CAAC,QAAQ,SAAM,IAC/D,GACF,CACP,EAGA,MAAM,IAAI,CACT,cAAK,SAAS,EAAC,gFAAgF,YAC7F,cACE,SAAS,EAAC,sEAAsE,EAChF,KAAK,EAAE;wDACL,SAAS,EAAE,mCAAmC;qDAC/C,YAED,cAAK,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,YACvF,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAC,gBAAgB,GAAG,GACpF,GACF,GACF,CACP,IACG,EAGL,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,CACjC,eAAK,SAAS,EAAC,kBAAkB,aAC9B,YAAY,IAAI,CACf,YAAG,SAAS,EAAC,8BAA8B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,YACjE,IAAI,CAAC,IAAI,GACR,CACL,EACA,YAAY,IAAI,CACf,YAAG,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,YACrD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GACxB,CACL,IACG,CACP,KA7EI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CA8E5B,CACP,CAAC;wBACJ,CAAC,CAAC,IACE,GACF,CACP,EAGA,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,YAAY,IAAI,CACnD,eAAK,SAAS,EAAC,0CAA0C,aACvD,iBACE,OAAO,EAAE,GAAG,EAAE;4BACZ,SAAS,CAAC,EAAE,CAAC,CAAC;4BACd,kBAAkB,CAAC,EAAE,CAAC,CAAC;wBACzB,CAAC,EACD,SAAS,EAAC,oGAAoG,EAC9G,KAAK,EAAE;4BACL,eAAe,EAAE,CAAC,CAAC,MAAM;4BACzB,KAAK,EAAE,CAAC,CAAC,IAAI;4BACb,WAAW,EAAE,CAAC,CAAC,UAAU;yBAC1B,sBAGM,EACT,iBACE,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAC,gKAAgK,EAC1K,KAAK,EAAE;4BACL,eAAe,EAAE,CAAC,CAAC,OAAO;yBAC3B,YAEA,SAAS,CAAC,CAAC,CAAC,CACX,8BACE,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,GAAG,oBAE7C,CACJ,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,aACZ,MAAM,CAAC,MAAM,OAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAC/D,CACJ,GACM,IACL,CACP,EAED,0BAAQ;;;;;;;;;;;OAWP,GAAS,IACN,CACP,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ultra-image-uploader",
3
- "version": "2.0.3",
4
- "description": "A modern, beautiful React image upload component with ImgBB & Cloudinary support",
3
+ "version": "3.0.0",
4
+ "description": "A modern, shadcn/ui-inspired React image upload component with beautiful themes, drag-and-drop, and smooth animations",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",